MySql 主庫/從庫原理及實戰(zhàn)

主/從原理

原理圖

從庫生成兩個線程,一個I/O線程,一個SQL線程;
I/O線程去請求主庫 的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 I/O線程傳binlog;
SQL 線程,會讀取relay log文件中的日志,并解析成具體操作,來實現(xiàn)主從的操作一致,而最終數(shù)據(jù)一致;

用途及必要條件

  • mysql主從復制用途

    1. 實時災備,用于故障切換
    2. 讀寫分離,提供查詢服務
    3. 備份,避免影響業(yè)務
  • 主從部署必要條件:

    1. 主庫開啟binlog日志(設置log-bin參數(shù))
    2. 主從server-id不同
    3. 從庫服務器能連通主庫

實踐操作

1、設置主/從服務器配置

#主庫
#此配置文件可能mysql不同版本,名稱不盡相同
vim /etc/mysql/conf.d/mysql.cnf 
#寫入以下內容
[mysqld]
log-bin=mysql-bin  #啟用二進制日志
server-id=1        #服務器唯一ID 

#從庫
#此配置文件可能mysql不同版本,名稱不盡相同
vim /etc/mysql/conf.d/mysql.cnf 
#寫入以下內容
[mysqld]
log-bin=mysql-bin  #啟用二進制日志
server-id=2        #服務器唯一ID   

#重啟主、從兩個MySql,因操作系統(tǒng)不盡相同,重啟命令視具體版本
systemctl restart mysql

2、創(chuàng)建主/從服務器容器
此處為盡量排除版本不一致導致各種未知問題,所以采用docker構建部署MySql

#主庫
docker run --name=mysql -p 3307:3306  -v /home/mysql/mysql:/var/lib/mysql -e REPLICATION_MASTER=true  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

#從庫
docker run --name=mysql-backup  --link mysql:mysql -p 3308:3306 -v /home/mysql_backup/mysql:/var/lib/mysql -e REPLICATION_SLAVE=true -e MYSQL_ROOT_PASSWORD=123456  -d mysql:5.6

3、登錄主服務器的mysql,查詢master的狀態(tài)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     2781 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
#master
#主庫創(chuàng)建用戶
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
GRANT REPLICATION SLAVE ON *.* to 'slaveuser'@'%' identified by '123456';
#slave
#登錄從服務器的mysql,設置與主服務器相關的配置參數(shù)
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
change master to master_host='172.17.0.13',master_port=3306,master_user='slaveuser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=2781;
#master_host為主服務器的地址
#master_user是在主庫創(chuàng)建的用戶
#master_log_pos是主庫show master status,查詢出的Position

#啟動服務
start slave;

#查看服務狀態(tài)
show slave status;

Slave_IO_State 提示:Waiting for master to send event 就是成功了,可在主庫添加或修改數(shù)據(jù),在到從庫查看是否同步
Connecting to master 多半是網(wǎng)絡連接不通,可查看日志文件確認
到此你已經(jīng)可以實現(xiàn)主從同步了
溫馨提示: 以上弱密碼需自行修改

拓展話題

  • 對于需要保證master-slave主從同步的salve庫不被修改,可設置salve庫為只讀狀態(tài),進入slave庫執(zhí)行的命令為
mysql> set global read_only=1;
  • 將salve庫從只讀狀態(tài)變?yōu)樽x寫狀態(tài),需要執(zhí)行的命令是:
mysql> set global read_only=0;
  • 數(shù)據(jù)庫讀寫狀態(tài)設置原理
    對于數(shù)據(jù)庫讀寫狀態(tài),主要靠 “read_only”全局參數(shù)來設定;默認情況下,數(shù)據(jù)庫是用于讀寫操作的,所以read_only參數(shù)也是0或false狀態(tài),這時候不論是本地用戶還是遠程訪問數(shù)據(jù)庫的用戶,都可以進行讀寫操作;如需設置為只讀狀態(tài),將該read_only參數(shù)設置為1或TRUE狀態(tài),但設置 read_only=1 狀態(tài)有兩個需要注意的地方:
    1. read_only=1只讀模式,不會影響slave同步復制的功能,所以在MySQL slave庫中設定了read_only=1后,通過 show slave status\G 命令查看salve狀態(tài),可以看到salve仍然會讀取master上的日志,并且在slave庫中應用日志,保證主從數(shù)據(jù)庫同步一致;
    2. read_only=1只讀模式,可以限定普通用戶進行數(shù)據(jù)修改的操作,但不會限定具有super權限的用戶的數(shù)據(jù)修改操作;在MySQL中設置read_only=1后,普通的應用用戶進行insert、update、delete等會產(chǎn)生數(shù)據(jù)變化的DML操作時,都會報出數(shù)據(jù)庫處于只讀模式不能發(fā)生數(shù)據(jù)變化的錯誤,但具有super權限的用戶,例如在本地或遠程通過root用戶登錄到數(shù)據(jù)庫,還是可以進行數(shù)據(jù)變化的DML操作;
  • 從庫用戶管理規(guī)范標準
    一般具有super權限的root等用戶只能在本地登錄,不會發(fā)生數(shù)據(jù)變化,其他遠程連接的應用用戶只按需分配為select,insert,update,delete等權限,保證沒有super權限,則只需要將salve設定“read_only=1”模式,即可保證主從同步,又可以實現(xiàn)從庫只讀。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容