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、密碼錄錯了。
基本上都是自己疏忽大意,導致的問題。只能仔細一點點排查。。