參考: http://www.reibang.com/p/faf0127f1cb2
1.主從復(fù)制是什么
主從復(fù)制也叫AB復(fù)制衔憨,允許將主服務(wù)器的數(shù)據(jù)復(fù)制到另外一個(gè)從服務(wù)器作郭,從而實(shí)現(xiàn)服務(wù)器的讀寫分離除秀。
2.MySql主從復(fù)制是什么
MySql主從復(fù)制即 允許將來(lái)自一個(gè)Mysql的服務(wù)器(主服務(wù)器)數(shù)據(jù)復(fù)制到一個(gè)或者多個(gè)Mysql服務(wù)器(從服務(wù)器)上等限。從而實(shí)現(xiàn)對(duì)Mysql服務(wù)器的讀寫分離饼煞。
也就是說(shuō):
如果需要對(duì)MySql服務(wù)器進(jìn)行寫時(shí),就可以操作主MySql服務(wù)器脖律,操作完成后喇澡,從服務(wù)器就會(huì)同步主服務(wù)器的數(shù)據(jù)。
如果需要對(duì)MySql服務(wù)器進(jìn)行讀時(shí),那么就可以操作MySql從服務(wù)器张漂。這樣在一定程度上實(shí)現(xiàn)了讀寫分離晶默。從而減輕數(shù)據(jù)庫(kù)的壓力。
3.MySql主從復(fù)制原理
如圖所示:
當(dāng)只有一個(gè)從數(shù)據(jù)庫(kù)服務(wù)器時(shí)原理如上圖所示航攒,具體解釋如下:
1.主數(shù)據(jù)庫(kù)服務(wù)器發(fā)生改變時(shí)荤胁,那么就會(huì)開啟一個(gè)IO線程
將改變保存到二進(jìn)制文件(Binary log)里面(一定要是主服務(wù)器必須開啟二進(jìn)制日志,否則就沒(méi)法產(chǎn)生二進(jìn)制文件)
2.從數(shù)據(jù)庫(kù)服務(wù)器也會(huì)開啟一個(gè)IO線程去主數(shù)據(jù)庫(kù)服務(wù)器讀取這個(gè)二進(jìn)制文件
3.從數(shù)據(jù)庫(kù)服務(wù)器將從主服務(wù)器二進(jìn)制文件中讀取內(nèi)容寫入到本地二進(jìn)制文件(Realy log)里面
4屎债,從服務(wù)器同時(shí)也會(huì)開啟一個(gè)SQL線程去定時(shí)檢查本地文件有沒(méi)有更新,如果有更新垢油,那么就會(huì)立馬去執(zhí)行更新的內(nèi)容盆驹。
這樣就實(shí)現(xiàn)了MySql主從復(fù)制原理。
當(dāng)然如果時(shí)一個(gè)主服務(wù)器和多個(gè)從服務(wù)器滩愁,其原理類似躯喇,具體如下:
1.需要對(duì)主服務(wù)器進(jìn)行修改,從而讓從服務(wù)器也產(chǎn)生二進(jìn)制文件
2.其他從服務(wù)器就從產(chǎn)生二進(jìn)制文件的從服務(wù)器里面讀取二進(jìn)制文件
3.將二進(jìn)制文件存入到本地的二進(jìn)制文件中硝枉,同時(shí)開啟一個(gè)SQL線程去檢查本地的二進(jìn)制文件是否有更新廉丽,如果有更新那么就執(zhí)行更新的內(nèi)容,同步數(shù)據(jù)妻味。
當(dāng)然我們也可以將中間的從服務(wù)器直接配置成轉(zhuǎn)發(fā)二進(jìn)制文件正压,這樣架構(gòu)也會(huì)好很多。具體怎么搭建還是要看具體的業(yè)務(wù)需求责球。
注意:
主從復(fù)制焦履,復(fù)制是異步的,從服務(wù)器不需要建立永久連接來(lái)接收主服務(wù)器的更新雏逾。
4.二進(jìn)制文件解釋
mysqld將數(shù)字?jǐn)U展名附加到二進(jìn)制日志基本名稱以生成二進(jìn)制日志文件名嘉裤。每次服務(wù)器創(chuàng)建新日志文件時(shí),該數(shù)字都會(huì)增加栖博,從而創(chuàng)建一系列有序的文件屑宠。每次啟動(dòng)或刷新日志時(shí),服務(wù)器都會(huì)在系列中創(chuàng)建一個(gè)新文件仇让。服務(wù)器還會(huì)在當(dāng)前日志大小達(dá)到
max_binlog_size
參數(shù)設(shè)置的大小后自動(dòng)創(chuàng)建新的二進(jìn)制日志文件 典奉。二進(jìn)制日志文件可能會(huì)比max_binlog_size
使用大型事務(wù)時(shí)更大, 因?yàn)槭聞?wù)是以一個(gè)部分寫入文件丧叽,而不是在文件之間分割秋柄。為了跟蹤已使用的二進(jìn)制日志文件, mysqld還創(chuàng)建了一個(gè)二進(jìn)制日志索引文件蠢正,其中包含所有使用的二進(jìn)制日志文件的名稱骇笔。默認(rèn)情況下,它具有與二進(jìn)制日志文件相同的基本名稱,并帶有擴(kuò)展名
'.index'
笨触。在mysqld運(yùn)行時(shí)懦傍,不應(yīng)手動(dòng)編輯此文件。作者:運(yùn)維開發(fā)_西瓜甜
鏈接:http://www.reibang.com/p/faf0127f1cb2
5.配置
-
前提
以Ubuntu 18.04為例芦劣,且安裝docker粗俱,docker用法請(qǐng)參考docker教程
在這里我們配置一個(gè)主服務(wù)器和一個(gè)從服務(wù)器。
-
拉取mysql鏡像
docker pull mysql:5.7
-
運(yùn)行容器
docker run -di --name=master_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 docker run -di --name=slave_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
查看容器運(yùn)行狀態(tài):
docker ps -a
從上圖可知兩個(gè)mysql容器正在運(yùn)行虚吟,當(dāng)然我們也可以用Navicat進(jìn)行連接寸认,如下:
-
連接 master_mysql
-
連接slave_mysql
-
-
配置主服務(wù)器
進(jìn)入主服務(wù)器內(nèi)部
docker exec -it master_mysql /bin/bash
進(jìn)入
/etc/mysql
目錄下,修改my.cnf
文件串慰。如圖所示:發(fā)現(xiàn)沒(méi)有vim命令偏塞,我們?cè)谌萜鲀?nèi)部安裝vim命令
apt-get update apt-get install vim
修改
my.cnf
文件vim /etc/mysql/my.cnf
在該文件增加以下內(nèi)容:
-
server-id=10
同一個(gè)局域網(wǎng)這個(gè)值必須唯一
如果其值是 0 那么主服務(wù)器就拒絕來(lái)自從服務(wù)器的任何連接
-
log-bin=mysql-bin
開啟二進(jìn)制文件功能
-
為了在使用帶事務(wù)的InnoDB進(jìn)行復(fù)制設(shè)置時(shí)盡可能提交持久性和一致性,
增加:
innodb_flush_log_at_trx_commit = 1 sync_binlog = 1
保存退出邦鲫,要想配置生效灸叼,那么就需要重啟容器
exit docker restart master_mysql
-
-
創(chuàng)建一個(gè)用戶專門用來(lái)復(fù)制數(shù)據(jù)
當(dāng)進(jìn)行主從復(fù)制時(shí),每個(gè)從服務(wù)器都需要主服務(wù)器的用戶名和密碼去連接到主服務(wù)器庆捺。
進(jìn)入主服務(wù)器 創(chuàng)建用戶古今,并且賦權(quán)限
docker exec -it master_mysql /bin/bash -- 登陸mysql mysql -uroot -proot -- 創(chuàng)建用戶 CREATE user 'slave'@'%' identified by 'slave'; -- 賦予權(quán)限 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
這樣我們的主服務(wù)武器就配置完成了。
-
配置從服務(wù)器
與主服務(wù)器配置類似滔以,先進(jìn)入容器中捉腥,然后安裝vim
docker exec -it slave_mysql /bin/bash apt-get update apt-get install vim
編輯從服務(wù)器配置文件
vim /etc/mysql/my.cnf
在文件中添加以下內(nèi)容
server-id和log-bin與主服務(wù)器相同,這里不再解釋
relay_log=edu-mysql-relay-bin 配置中繼日志你画,就是當(dāng)從服務(wù)器讀取到主服務(wù)器的日志文件內(nèi)容但狭,將該內(nèi)容存儲(chǔ)到本地日志文件里面,這個(gè)日志就是中繼日志撬即。
重啟從服務(wù)器容器
exit docker restart slave_mysql
-
配置主服務(wù)器
進(jìn)入主服務(wù)器容器內(nèi),并登陸mysql
docker exec -it master_mysql /bin/bash mysql -uroot -proot
查看主服務(wù)器狀態(tài)
show master status;
- File 就是主服務(wù)器產(chǎn)生的二進(jìn)制文件名稱
- Position 代表從該二進(jìn)制文件哪個(gè)位置開始讀取
-
配置從服務(wù)器
進(jìn)入從服務(wù)器容器內(nèi),并登陸mysql
docker exec -it slave_mysql /bin/bash mysql -uroot -proot
執(zhí)行下面指令立磁,從而與主服務(wù)器進(jìn)行綁定
change master to master_host='172.17.0.2', master_user='slave', master_password='slave', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
解釋如下:
-
master_host 主服務(wù)器容器的ip地址,指的是容器的獨(dú)立ip,可以通過(guò)
docker inspect --format='{{.NetworkSettings.IPAddress}}' master_mysql
查詢?nèi)萜鞯膇p master_user 數(shù)據(jù)復(fù)制的用戶剥槐,就是上文中主服務(wù)器建立的用戶名
master_password 數(shù)據(jù)復(fù)制的密碼 就是上文中主服務(wù)器建立的用戶密碼
master_port 主服務(wù)器端口
master_log_file 主服務(wù)器的二進(jìn)制文件唱歧,就是上面介紹的File
master_log_pos 代表從哪個(gè)位置開始讀取,就是上面介紹的Postion
-
master_connect_retry 如果連接時(shí)間粒竖,重新建立連接的間隔時(shí)間颅崩,但是是秒,默認(rèn)60s
查看主從同步狀態(tài)在從服務(wù)器中
show slave status \G;
發(fā)現(xiàn)IO線程和SQL線程運(yùn)行狀態(tài)都是NO,這是因?yàn)槟J(rèn)情況下蕊苗,主從復(fù)制沿后,并沒(méi)有開啟,需要用戶手動(dòng)開啟朽砰,因此執(zhí)行指令
start slave
開啟主從復(fù)制再去查看狀態(tài)
這樣就搭建成功了尖滚。
-
6.測(cè)試
在主服務(wù)器創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
從數(shù)據(jù)庫(kù)服務(wù)器也會(huì)自動(dòng)增加test數(shù)據(jù)庫(kù)