mysql 主从同步不一致_涨知识!MySQL 主从同步原理原来是这样的
什么是 MySQL 主從同步
當 master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。
主從同步有什么好處
水平擴展數據庫的負載能力
容錯,高可用。Failover/High Availability
數據備份
主從同步的原理是什么
首先我們來了解 master-slave 的體系結構。
如下圖:
不管是 delete、update、insert,還是創建函數、存儲過程,所有的操作都在 master 上。
當 master 有操作的時候,slave 會快速的接收到這些操作,從而做同步。
但是,這個機制是怎么實現的呢?
在 master 機器上,主從同步事件會被寫到特殊的 log 文件中(binary-log);
在 slave 機器上,slave 讀取主從同步事件,并根據讀取的事件變化,在 slave 庫上做相應的更改。
如此,就實現了主從同步了!下面我們來詳細的了解。
主從同步事件有哪些
上面說到,在 master 機器上,主從同步事件會被寫到特殊的 log 文件中(binary-log);
主從同步事件有3種形式:statement、row、mixed。
statement:會將對數據庫操作的 sql 語句寫入到 binlog 中。
row:會將每一條數據的變化寫入到 binlog 中。
mixed:statement 與 row 的混合。MySQL 決定什么時候寫 statement 格式的,什么時候寫 row 格式的 binlog。
在 master 上的操作
當 master 上的數據發生改變的時候,該事件(insert、update、delete)變化會按照順序寫入到binlog中。
binlog dump線程
當 slave 連接到 master 的時候,master機器會為slave開啟binlog dump線程。
當 master 的 binlog 發生變化的時候,binlog dump線程會通知slave,并將相應的binlog內容發送給slave。
在 slave 上的操作
當主從同步開啟的時候,slave上會創建2個線程。I/O線程:該線程連接到 master 機器,master 機器上的 binlog dump 線程會將 binlog的內容發送給該 I/O 線程。該 I/O 線程接收到 binlog 內容后,再將內容寫入到本地的relay log。SQL線程:該線程讀取 I/O 線程寫入的 relay log。并且根據 relay log 的內容對 slave 數據庫做相應的操作。查看上述線程
使用 SHOW PROCESSLIST 命令可以查看,如圖,在 master 機器上查看 binlog dump線程。
如圖,在 slave 機器上查看I/O、SQL線程。
一圖以蔽之
講了這么多,一圖以蔽之
下面的實戰演練,都是基于上面的環境。當然,其他環境也大同小異。
os:ubuntu16.04mysql:5.7.17工具
2臺機器:
master 機器上的操作
1、更改配置文件
我們找到文件
/etc/mysql/mysql.conf.d/mysqld.cnf配置如下:
#your master ipbind-address = 192.168.33.22#在master-slave架構中,每臺機器節點都需要有唯一的server-idserver-id = 1#開啟binlog log_bin = /var/log/mysql/mysql-bin.log2、重啟 MySQL,以使配置文件生效。
sudo systemctl restart mysql3、創建主從同步的 MySQL?user
$ mysql -u root -pPassword:##創建slave1用戶,并指定該用戶只能在主機192.168.33.33上登錄。mysql> CREATE USER 'slave1'@'192.168.33.33' IDENTIFIED BY 'slavepass';Query OK, 0 rows affected (0.00 sec)##為slave1賦予REPLICATION SLAVE權限。mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.33.33';Query OK, 0 rows affected (0.00 sec)4、為 MySQL 加讀鎖
為了主庫與從庫的數據保持一致,我們先為 MySQL 加入讀鎖,使其變為只讀。
mysql> FLUSH TABLES WITH READ LOCK;Query OK, 0 rows affected (0.00 sec)5、記錄下來?MASTER?REPLICATION?LOG?的位置
mysql> SHOW MASTER STATUS;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 613 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)6、將 master DB 中現有的數據信息導出
$ mysqldump -u root -p --all-databases --master-data > dbdump.sql7、解除 master DB 的讀鎖
mysql> UNLOCK TABLES;8、將步驟 6 中的 dbdump.sql 文件 copy 到 slave
scp dbdump.sql ubuntu@192.168.33.33:/home/ubuntuslave 機器上的操作
1、更改配置文件
我們找到文件
/etc/mysql/mysql.conf.d/mysqld.cnf更改配置如下:
#your slave ipbind-address = 192.168.33.33#master-slave結構中,唯一的server-idserver-id = 2 #開啟binloglog_bin = /var/log/mysql/mysql-bin.log2、重啟 MySQL,以使配置文件生效
sudo systemctl restart mysql3、導入從 master DB。導出的 dbdump.sql 文件,以使 master-slave 數據一致
$ mysql -u root -p < /home/ubuntu/dbdump.sql4、使 slave 與 master 建立連接,從而同步
$ mysql -u root -pPassword:mysql> STOP SLAVE;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.33.22', -> MASTER_USER='slave1', -> MASTER_PASSWORD='slavepass', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=613;Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> START SLAVE;Query OK, 0 rows affected (0.00 sec)經過如此設置之后,就可以進行 master-slave 同步了~
來源:公眾號聊聊代碼。
9月25日-26日,2020 GOPS 全球運維大會相聚深圳,17 個專場,近 80 位技術大咖。2020年首站 GOPS,精彩不重樣~工行、中行、農行、平安、騰訊、阿里、京東多個國內頂尖企業 DevOps 運維體系首度揭秘,機會難得~
專場一覽???近期好文:Nginx 在運維領域中的應用,看這一篇就夠了
Docker 容器監控方案怎么選?看看這套開源方案
神州泰岳專家團全面解讀“大IT”浪潮下的智慧運營 | 精彩大片
“高效運維”公眾號誠邀廣大技術人員投稿,投稿郵箱:jiachen@greatops.net,或添加聯系人微信:greatops1118.
點個“在看”,一年不宕機總結
以上是生活随笔為你收集整理的mysql 主从同步不一致_涨知识!MySQL 主从同步原理原来是这样的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恏字怎么读?
- 下一篇: php mysql log文件怎么打开_