作者:秋田君
鏈接:https://my.oschina.net/u/3773384/blog/1810111
摘要: 本篇博文相對簡單,因?yàn)槭浅醮问褂肈ocker,MySQL的主從復(fù)制之前也在Centos環(huán)境下搭建過,但是也忘的也差不多了,因此本次嘗試在Docker中搭建。
本篇博文相對簡單,因?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
接下來,我們將會在一臺服務(wù)器上安裝docker,并使用docker運(yùn)行三個MySQL容器,分別為一主兩從。
安裝docker
執(zhí)行命令
如果有提示,一路y下去
安裝成功啟動Docker后,查看版本
出現(xiàn)版本信息,則安裝成功
啟動Docker
啟動Docker并設(shè)置為開機(jī)自啟動
安裝MySQL
使用Docker拉取MySQL鏡像
運(yùn)行主容器
--name 為容器指定名稱,這里是master
-p 將容器的指定端口映射到主機(jī)的指定端口,這里是將容器的3306端口映射到主機(jī)的3306端口
-e 設(shè)置環(huán)境變量,這里是指定root賬號的密碼為root
-d 后臺運(yùn)行容器,并返回容器ID
mysql:5.7.13 指定運(yùn)行的mysql版本
檢驗(yàn)是否啟動成功
docker ps -a 顯示所有的容器,包括未運(yùn)行的
[root@VM_0_17_centos ~]# docker ps -a
ee86c19336f8? ? ? ? mysql:5.7.13? ? ? ? "docker-entrypoint..."? About an hour ago? Up About an hour? ? 0.0.0.0:3306->3306/tcp? master
注意,是UP狀態(tài),表示正在運(yùn)行中
開放3306端口
--permanent 永久開啟,避免下次開機(jī)需要再次手動開啟端口
使用Navicat連接測試
MySQL主容器已經(jīng)啟動成功
創(chuàng)建主容器的復(fù)制賬號
使用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 , 讓配置生效
啟動后,重新測試連接,連接成功表示主容器配置成功
運(yùn)行MySQL從容器
首先運(yùn)行從容器
與主容器相似,拷貝配置文件至slave1目錄修改后覆蓋回Docker中
別忘記,重啟slave1容器,使配置生效
配置主從復(fù)制
使用Navicat連接slave1后新建查詢,執(zhí)行以下SQL
MASTER_HOST 填Navicat連接配置中的ip應(yīng)該就可以
MASTER_PORT 主容器的端口
MASTER_USER 同步賬號的用戶名
MASTER_PASSWORD 同步賬號的密碼
檢查是否配置成功
Slave_IO_State 如果是Waiting for master to send event,那么就成功一半了,如果是Connecting to master,基本就是配置失敗了,建議重新檢查下配置,具體失敗的原因可以查看日志追蹤
我遇到的是MASTER_USER和MASTER_PASSWORD是否手打輸錯了,貼出錯誤日志
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,那么恭喜你,可以測試主從復(fù)制的效果了,如果有一個不是Yes,一半是重啟從容器后,事務(wù)回滾引起的,那么給出解決方法如下
執(zhí)行后,再次觀察三個關(guān)鍵字段應(yīng)該就都沒問題了
至此,一主一從已經(jīng)搭建完成,再添加從實(shí)例的方式與上文一致,這里就不在贅述了。
測試主從復(fù)制
首先,在主實(shí)例中創(chuàng)建一個測試數(shù)據(jù)庫
打開(刷新)從實(shí)例,可見test庫已存在
在test庫中創(chuàng)建一個表t_test,添加一個id測試字段
向表中添加幾個數(shù)據(jù)
刷新從庫,可見t_test表及其中1、2、3、4數(shù)據(jù)已存在
至此,一個具備主從復(fù)制的一主兩從的MySQL就已搭建完成。