主/從原理

原理圖
從庫生成兩個線程,一個I/O線程,一個SQL線程;
I/O線程去請求主庫 的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 I/O線程傳binlog;
SQL 線程,會讀取relay log文件中的日志,并解析成具體操作,來實現(xiàn)主從的操作一致,而最終數(shù)據(jù)一致;
用途及必要條件
-
mysql主從復制用途
- 實時災備,用于故障切換
- 讀寫分離,提供查詢服務
- 備份,避免影響業(yè)務
-
主從部署必要條件:
- 主庫開啟binlog日志(設置log-bin參數(shù))
- 主從server-id不同
- 從庫服務器能連通主庫
實踐操作
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)有兩個需要注意的地方:- read_only=1只讀模式,不會影響slave同步復制的功能,所以在MySQL slave庫中設定了read_only=1后,通過 show slave status\G 命令查看salve狀態(tài),可以看到salve仍然會讀取master上的日志,并且在slave庫中應用日志,保證主從數(shù)據(jù)庫同步一致;
- 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)從庫只讀。