mysql 主从同步不一致_涨知识!MySQL 主从同步原理原来是这样的
什么是 MySQL 主從同步
當(dāng) master(主)庫的數(shù)據(jù)發(fā)生變化的時候,變化會實(shí)時的同步到slave(從)庫。
主從同步有什么好處
水平擴(kuò)展數(shù)據(jù)庫的負(fù)載能力
容錯,高可用。Failover/High Availability
數(shù)據(jù)備份
主從同步的原理是什么
首先我們來了解 master-slave 的體系結(jié)構(gòu)。
如下圖:
不管是 delete、update、insert,還是創(chuàng)建函數(shù)、存儲過程,所有的操作都在 master 上。
當(dāng) master 有操作的時候,slave 會快速的接收到這些操作,從而做同步。
但是,這個機(jī)制是怎么實(shí)現(xiàn)的呢?
在 master 機(jī)器上,主從同步事件會被寫到特殊的 log 文件中(binary-log);
在 slave 機(jī)器上,slave 讀取主從同步事件,并根據(jù)讀取的事件變化,在 slave 庫上做相應(yīng)的更改。
如此,就實(shí)現(xiàn)了主從同步了!下面我們來詳細(xì)的了解。
主從同步事件有哪些
上面說到,在 master 機(jī)器上,主從同步事件會被寫到特殊的 log 文件中(binary-log);
主從同步事件有3種形式:statement、row、mixed。
statement:會將對數(shù)據(jù)庫操作的 sql 語句寫入到 binlog 中。
row:會將每一條數(shù)據(jù)的變化寫入到 binlog 中。
mixed:statement 與 row 的混合。MySQL 決定什么時候?qū)?statement 格式的,什么時候?qū)?row 格式的 binlog。
在 master 上的操作
當(dāng) master 上的數(shù)據(jù)發(fā)生改變的時候,該事件(insert、update、delete)變化會按照順序?qū)懭氲絙inlog中。
binlog dump線程
當(dāng) slave 連接到 master 的時候,master機(jī)器會為slave開啟binlog dump線程。
當(dāng) master 的 binlog 發(fā)生變化的時候,binlog dump線程會通知slave,并將相應(yīng)的binlog內(nèi)容發(fā)送給slave。
在 slave 上的操作
當(dāng)主從同步開啟的時候,slave上會創(chuàng)建2個線程。I/O線程:該線程連接到 master 機(jī)器,master 機(jī)器上的 binlog dump 線程會將 binlog的內(nèi)容發(fā)送給該 I/O 線程。該 I/O 線程接收到 binlog 內(nèi)容后,再將內(nèi)容寫入到本地的relay log。SQL線程:該線程讀取 I/O 線程寫入的 relay log。并且根據(jù) relay log 的內(nèi)容對 slave 數(shù)據(jù)庫做相應(yīng)的操作。查看上述線程
使用 SHOW PROCESSLIST 命令可以查看,如圖,在 master 機(jī)器上查看 binlog dump線程。
如圖,在 slave 機(jī)器上查看I/O、SQL線程。
一圖以蔽之
講了這么多,一圖以蔽之
下面的實(shí)戰(zhàn)演練,都是基于上面的環(huán)境。當(dāng)然,其他環(huán)境也大同小異。
os:ubuntu16.04mysql:5.7.17工具
2臺機(jī)器:
master 機(jī)器上的操作
1、更改配置文件
我們找到文件
/etc/mysql/mysql.conf.d/mysqld.cnf配置如下:
#your master ipbind-address = 192.168.33.22#在master-slave架構(gòu)中,每臺機(jī)器節(jié)點(diǎn)都需要有唯一的server-idserver-id = 1#開啟binlog log_bin = /var/log/mysql/mysql-bin.log2、重啟 MySQL,以使配置文件生效。
sudo systemctl restart mysql3、創(chuàng)建主從同步的 MySQL?user
$ mysql -u root -pPassword:##創(chuàng)建slave1用戶,并指定該用戶只能在主機(jī)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權(quán)限。mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.33.33';Query OK, 0 rows affected (0.00 sec)4、為 MySQL 加讀鎖
為了主庫與從庫的數(shù)據(jù)保持一致,我們先為 MySQL 加入讀鎖,使其變?yōu)橹蛔x。
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 中現(xiàn)有的數(shù)據(jù)信息導(dǎo)出
$ 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 機(jī)器上的操作
1、更改配置文件
我們找到文件
/etc/mysql/mysql.conf.d/mysqld.cnf更改配置如下:
#your slave ipbind-address = 192.168.33.33#master-slave結(jié)構(gòu)中,唯一的server-idserver-id = 2 #開啟binloglog_bin = /var/log/mysql/mysql-bin.log2、重啟 MySQL,以使配置文件生效
sudo systemctl restart mysql3、導(dǎo)入從 master DB。導(dǎo)出的 dbdump.sql 文件,以使 master-slave 數(shù)據(jù)一致
$ 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)經(jīng)過如此設(shè)置之后,就可以進(jìn)行 master-slave 同步了~
來源:公眾號聊聊代碼。
9月25日-26日,2020 GOPS 全球運(yùn)維大會相聚深圳,17 個專場,近 80 位技術(shù)大咖。2020年首站 GOPS,精彩不重樣~工行、中行、農(nóng)行、平安、騰訊、阿里、京東多個國內(nèi)頂尖企業(yè) DevOps 運(yùn)維體系首度揭秘,機(jī)會難得~
專場一覽???近期好文:Nginx 在運(yùn)維領(lǐng)域中的應(yīng)用,看這一篇就夠了
Docker 容器監(jiān)控方案怎么選?看看這套開源方案
神州泰岳專家團(tuán)全面解讀“大IT”浪潮下的智慧運(yùn)營 | 精彩大片
“高效運(yùn)維”公眾號誠邀廣大技術(shù)人員投稿,投稿郵箱:jiachen@greatops.net,或添加聯(lián)系人微信:greatops1118.
點(diǎn)個“在看”,一年不宕機(jī)總結(jié)
以上是生活随笔為你收集整理的mysql 主从同步不一致_涨知识!MySQL 主从同步原理原来是这样的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恏字怎么读?
- 下一篇: 线性稀疏自编码机_特征工程之特征缩放am