1. 程式人生 > >docker下的mysql主從同步

docker下的mysql主從同步

docker 安裝mysql主從

一、準備

1、一個docker:

我使用的docker版本為:

2、使用docker 下載並安裝mysql映象

 [root@bogon ~]# docker search mysql
 [root@bogon ~]# docker pull 你想要下載的版本號,最好是5版本的。8目前不支援

注意。使用docker拉取映象的時候 會很慢,這是因為翻牆導致的。可以選擇阿里或者中文映象,會很快,具體網上有教程。不贅述了

3、在拉取成功映象後啟動映象,也就是建立容器(master主庫)

 docker run -p 3308:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -d 映象id

解釋一下,docker 執行 對外對映埠為3308,容器名字為mysql03,並制定root使用者的密碼為123456,設定時間-d 並指定使用映象

因為我的mysql01 被我建立mysql 8版本的容器了對外還是3306(尷尬)。。所以我就使用了mysql03命名;

4、建立從庫(slave)

 docker run -p 3307:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -d 映象id

這樣呢。主庫與從庫就建立完成了。但。兩個庫還沒實現資料通訊。

5、進入容器內部修改配置(主庫)

 進入容器內部
 docker exec -it 容器id /bin/bash
 進入mysql 的根目錄
 cd etc/mysql
 編輯my.cnf 檔案
 vim my.cnf

這裡可能會遇到 沒有vim命令的報錯。

需要安裝相關功能才行

 apt-get update
 apt-get install vim

再編輯my.cnf檔案時,新增

 ## 同一區域網內注意要唯一
 server-id=100  
 ## 開啟二進位制日誌功能,可以隨便取(關鍵)
 log-bin=mysql-bin

配置完成後,exit 出容器,並重啟容器,docker restart 容器id;

到這裡就要開始操作一個管家的步驟了。要不建立一個使用者,給從庫提供資料用。

要不就使用root進行,我呢,為了圖方便就直接使用root了。

給root使用者賦許可權。其實吧我感覺都不用賦許可權

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';

6、配置從庫

1、與主庫一樣,配置my.cnf檔案

 [mysqld]
 ## 設定server_id,注意要唯一
 server-id=101  
 ## 開啟二進位制日誌功能,以備Slave作為其它Slave的Master時使用
 log-bin=mysql-slave-bin   
 ## relay_log配置中繼日誌
 relay_log=edu-mysql-relay-bin  

重啟容器

7、連線主從

1、進入主mysql容器,並登陸mysql

 mysql -uroot -p

2、檢視主庫的屬性 show master status; 並記錄下file 和position 兩個引數

3、查出主mysql 的容器內部地址,並記錄下來

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id

4、進入到從庫,並登陸

mysql -uroot -p
執行下面的命令
change master to master_host='172.17.0.2', master_user='root', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;

引數說明:

master_host :Master的容器在docker中的地址

master_port:master的容器內部埠,不是對外的埠號

master_user:要連線master那個使用者

master_password:使用者的密碼

master_log_file:指定 Slave 從哪個日誌檔案開始複製資料,即上文中提到的 File 欄位的值

master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 欄位的值

master_connect_retry:如果連線失敗,重試的時間間隔,單位是秒,預設是60秒

在Slave 中的mysql終端執行show slave status \G;用於檢視主從同步狀態。

正常情況下,SlaveIORunning 和 SlaveSQLRunning 都是No,因為我們還沒有開啟主從複製過程。使用start slave開啟主從複製過程,然後再次查詢主從同步狀態show slave status \G;

SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明主從複製已經開啟。此時可以測試資料同步是否成功。比如,在master上,執行 create database test;再去從庫中看,是不是同樣有了一個test庫,如果是,就沒有問題了。

8、主從排錯:

出現上述問題 原因是真的難分析。因為我第一次搭建也是上述報錯。錯誤原因也是同一類。在這裡呢。分享一下我的經驗。

1、在從庫中執行change命令時,引數不準確,比如port 寫成了對外的,使用者寫成了從庫的等等

2、記錄的file 與position 不準確,這裡要注意,在配置主從的時候,不要在對主庫有任何操作否則都會使得position值發生變化。

3、docker容器內部網路問題。

4、密碼錄錯了。

基本上都是自己疏忽大意,導致的問題。只能仔細一點點排查。。

參考:https://www.cnblogs.com/songwenj