?作者:秋田君
原文:開源中國(guó)
摘要: 本篇博文相對(duì)簡(jiǎn)單哀军,因?yàn)槭浅醮问褂肈ocker沉眶,MySQL的主從復(fù)制之前也在Centos環(huán)境下搭建過,但是也忘的也差不多了杉适,因此本次嘗試在Docker中搭建谎倔。
本篇博文相對(duì)簡(jiǎn)單,因?yàn)槭浅醮问褂肈ocker猿推,MySQL的主從復(fù)制之前也在Centos環(huán)境下搭建過片习,但是也忘的也差不多了,因此本次嘗試在Docker中搭建蹬叭。根據(jù)網(wǎng)上教程走還是踩了一些坑藕咏,不過所幸最終搭建成功,因此記錄下來秽五,避免以后踩了重復(fù)的坑孽查。
搭建環(huán)境
Centos 7.2 64位
MySQL 5.7.13
Docker 1.13.1
接下來,我們將會(huì)在一臺(tái)服務(wù)器上安裝docker筝蚕,并使用docker運(yùn)行三個(gè)MySQL容器卦碾,分別為一主兩從。
安裝docker
執(zhí)行命令
移除
?如果有提示起宽,一路y下去
安裝成功啟動(dòng)Docker后洲胖,查看版本
移除
?出現(xiàn)版本信息,則安裝成功
啟動(dòng)Docker
啟動(dòng)Docker并設(shè)置為開機(jī)自啟動(dòng)
移除
?安裝MySQL
使用Docker拉取MySQL鏡像
移除
?運(yùn)行主容器
移除
?--name 為容器指定名稱坯沪,這里是master
-p?將容器的指定端口映射到主機(jī)的指定端口绿映,這里是將容器的3306端口映射到主機(jī)的3306端口
-e?設(shè)置環(huán)境變量,這里是指定root賬號(hào)的密碼為root
-d?后臺(tái)運(yùn)行容器,并返回容器ID
mysql:5.7.13 指定運(yùn)行的mysql版本
檢驗(yàn)是否啟動(dòng)成功
docker ps -a 顯示所有的容器叉弦,包括未運(yùn)行的
移除
?更多精彩內(nèi)容請(qǐng)關(guān)注開源中國(guó)公眾號(hào)(oschina2013)
注意丐一,是UP狀態(tài),表示正在運(yùn)行中
開放3306端口
移除
?--permanent 永久開啟淹冰,避免下次開機(jī)需要再次手動(dòng)開啟端口
使用Navicat連接測(cè)試
移除
?MySQL主容器已經(jīng)啟動(dòng)成功
創(chuàng)建主容器的復(fù)制賬號(hào)
移除
?使用Navicat友好的圖像化界面執(zhí)行SQL
移除
?出現(xiàn)如下信息表示授權(quán)成功
移除
?修改MySQL配置環(huán)境
創(chuàng)建配置文件目錄
目錄結(jié)構(gòu)如下
/usr/local/mysql/master
/usr/local/mysql/slave1
/usr/local/mysql/slave2
拷貝一份MySQL配置文件
移除
?進(jìn)到master目錄下库车,已存在拷貝的my.cnf
移除
?修改my.cnf,在 [mysqld] 節(jié)點(diǎn)最后加上后保存
移除
?log-bin=mysql-bin 使用binary logging樱拴,mysql-bin是log文件名的前綴
server-id=1 唯一服務(wù)器ID柠衍,非0整數(shù),不能和其他服務(wù)器的server-id重復(fù)
將修改后的文件覆蓋Docker中MySQL中的配置文件
移除
?重啟 mysql 的docker , 讓配置生效
移除
?啟動(dòng)后晶乔,重新測(cè)試連接珍坊,連接成功表示主容器配置成功
運(yùn)行MySQL從容器
首先運(yùn)行從容器
移除
?與主容器相似,拷貝配置文件至slave1目錄修改后覆蓋回Docker中
移除
?別忘記正罢,重啟slave1容器阵漏,使配置生效
配置主從復(fù)制
使用Navicat連接slave1后新建查詢,執(zhí)行以下SQL
移除
?MASTER_HOST 填Navicat連接配置中的ip應(yīng)該就可以
MASTER_PORT 主容器的端口
MASTER_USER 同步賬號(hào)的用戶名
MASTER_PASSWORD 同步賬號(hào)的密碼
檢查是否配置成功
移除
移除
?Slave_IO_State 如果是Waiting for master to send event翻具,那么就成功一半了履怯,如果是Connecting to master,基本就是配置失敗了呛占,建議重新檢查下配置虑乖,具體失敗的原因可以查看日志追蹤
移除
?我遇到的是MASTER_USER和MASTER_PASSWORD是否手打輸錯(cuò)了,貼出錯(cuò)誤日志
2018-05-10T02:57:00.688887Z 11 [ERROR] Slave I/O for channel '': error connecting to master 'bakcup@ip:3306' - retry-time: 60? retries: 2, Error_code: 1045
2018-05-10T02:58:00.690476Z 11 [ERROR] Slave I/O for channel '': error connecting to master 'bakcup@ip:3306' - retry-time: 60? retries: 3, Error_code: 1045
注意看日志中的bakcup晾虑,解決方法如下
移除
?接著上文疹味,我們說成功一半,并沒有說成功了帜篇,那么另一半在于Slave_IO_Running與Slave_SQL_Running
如果都是Yes糙捺,那么恭喜你,可以測(cè)試主從復(fù)制的效果了笙隙,如果有一個(gè)不是Yes洪灯,一半是重啟從容器后,事務(wù)回滾引起的竟痰,那么給出解決方法如下
移除
?執(zhí)行后签钩,再次觀察三個(gè)關(guān)鍵字段應(yīng)該就都沒問題了
至此,一主一從已經(jīng)搭建完成坏快,再添加從實(shí)例的方式與上文一致铅檩,這里就不在贅述了。
測(cè)試主從復(fù)制
首先莽鸿,在主實(shí)例中創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫(kù)
移除
?打開(刷新)從實(shí)例昧旨,可見test庫(kù)已存在
移除
?在test庫(kù)中創(chuàng)建一個(gè)表t_test拾给,添加一個(gè)id測(cè)試字段
向表中添加幾個(gè)數(shù)據(jù)
移除
?刷新從庫(kù),可見t_test表及其中1兔沃、2蒋得、3、4數(shù)據(jù)已存在
至此乒疏,一個(gè)具備主從復(fù)制的一主兩從的MySQL就已搭建完成额衙。