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