Docker進行MySQL主從複製操作
阿新 • • 發佈:2021-01-09
>Docker的相關操作 與 Docker下MySQL容器的安裝
https://www.cnblogs.com/yumq/p/14253360.html
>本次實驗我是在單機狀態下進行mysql的主從複製,和多機的原理一樣
# 準備多個mysql容器
> 相關引數
```txt
--name 容器的名稱命名
-p 暴露埠,埠的對映 上述是本機的3307埠對映到容器內的3306埠,訪問本機3307就能訪問容器內的資料庫(3306埠)
--privileged=true 賦予容器內以root使用者來操作
-it 互動執行
--hostname docker1 容器內hostname,我是為了區分docker新增的,如果用不到可以去掉
-e MYSQL_ROOT_PASSWORD=123456 環境引數配置,配置mysql root角色的密碼
-e MYSQL_DATABASE=ymq 建立一個ymq的資料庫,用不到的可以刪除掉
-e MYSQL_USER=user
-e MYSQL_PASSWORD=pass
`-v 非常重要,相當於docker容器的寶貴檔案(相關配置,相關資料,相關日誌)存放到容器外(即雲伺服器中),這樣做的目的是不把資料放在容器內,保障資料安全`
-v /home/mysql/docker-data/3307/conf:/etc/mysql/conf.d
-v /home/mysql/docker-data/3307/data/:/var/lib/mysql
-v /home/mysql/docker-data/3307/logs/:/var/log/mysql -d mysql:5.7
-d 後臺執行容器,並返回容器ID;
mysql:5.7 執行的映象檔案
```
> 直接執行下面程式碼就能啟動mysql
## mysql1
```shell
docker run --name mysqldocker1 -p 3306:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker1 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql1/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql1/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql1/logs/:/var/log/mysql -d mysql:5.7
```
## mysql2
```shell
docker run --name mysqldocker2 -p 3307:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker2 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql2/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql2/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql2/logs/:/var/log/mytsql -d mysql:5.7
```
## mysql3
```shell
docker run --name mysqldocker3 -p 3308:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker3 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql3/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql3/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql3/logs/:/var/log/mytsql -d mysql:5.7
```
#配置相關容器
檢視Docker內容器狀態
```shell
docker ps
```
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108224206077-306830953.png)
現在是啟動成功了,但是沒有配置主從相關配置,所以我們下一步要配置MySQL。
因為執行的時候我們將容器內的配置目錄掛載到本機的`/home/mysql/docker-data/`下
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108224436895-841000808.png)
所以我們將對應容器的配置檔案複製到對應目錄下的conf目錄下
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108224635064-1417288217.png)
> my.cnf 檔案內容如下
```text
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#datadir=/home/mysql/docker-data/3307/data
#socket=/home/mysql/docker-data/3307/mysql.sock
character_set_server=utf8
init_connect='SET NAMES utf8'
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/home/mysql/docker-data/3307/logs/mysqld.log
#pid-file=/home/mysql/docker-data/3307/mysqld.pid
lower_case_table_names=1
server-id=4122
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=1
#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=10000
```
> 配置說明
> 三個容器的my.conf 中不能相同server-id
> 如上圖我的第一個mysql的server-id為4122,那個我第二個server-id我就設定為4123
log-bin=mysql-bin 是開啟bin-log
auto_increment_offset 表示自增長欄位從哪個數開始,指欄位一次遞增多少,他的取值範圍是1 .. 65535
auto_increment_increment 表示自增長欄位每次遞增的量,指自增欄位的起始值,其預設值是1,取值範圍是1 .. 65535
為了避免兩臺伺服器同時做更新時自增長欄位的值之間發生衝突,一般在主主同步配置時,
需要將兩臺伺服器的auto_increment_increment增長量都配置為2,
而要把auto_increment_offset分別配置為1和2。
當然如果三臺就需要auto_increment_increment增長量都配置為3
auto_increment_offset分別設定為1和2和3
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108230105652-163565124.png)
#重啟所有mysql容器
```shell
#先檢視所有容器
docker ps
#然後一個個重啟相應的容器
docker restart 容器id
#因為我容器只有這三個mysql 所以我以這樣方式重啟全部容器
docker restart $(docker ps -aq)
```
# 配置master
>我是以docker1下的mysql作為master主機
進入docker1
```shell
docker exec -it 容器ID/容器名字 /bin/bash
```
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108230729793-1784599073.png)
>看到`root@docker1`時表示在docker1容器內
如果操作完畢就exit退出容器
## 進入mysql
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108230941881-2146418011.png)
根據容器的配置 我設定的密碼為123456
## 在master mysql新增許可權
```shell
GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
```
## 檢視master的二進位制檔案
```shell
show master status;
```
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108231351403-708528441.png)
> 這樣master配置就成功了
#配置slave
>分別進入docker2 和 docker3
```shell
docker exec -it 容器ID/容器名字 /bin/bash
```
注意當看到游標前顯示 root@docker2 和 root@docker3 時才表明進入成功
如果需要退出用exit進行退出。
## 在slave中設定master資訊
```shell
change master to master_host='172.24.7.187',master_port=3306,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
```
> master_host='172.24.7.187' 主機我是用的雲伺服器內網地址 master_port=3306 是master主機的埠,master_user='repluser' master主機上的角色
master_log_file='mysql-bin.000001',master_log_pos=154; 必須與主機的二進位制一樣
## 開啟slave,啟動SQL和IO執行緒
```shell
start slave;
```
>如果需要關閉就 stop slave;
## 檢視slave的狀態
```shell
show slave status\G;
```
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108232052866-1742122837.png)
如果都為YES 就表明配置成功,主從複製搭建完成!!
>如果 Slave_IO_Running: NO 但 Slave_SQL_Running: Yes
可能是在slave中設定master資訊的sql中master_host地址填的127.0.0.1 或者 localhost。
因為這兩個地址會先去訪問容器內的本機,而不是容器外的mysql,所以需要換成雲伺服器的公網或內網ip
>如果 Slave_IO_Running: Yes 但 Slave_SQL_Running: NO
可能是主從同步的時候相關資料同步上的錯誤,在slave端 刪除衝突的資料就行,具體的錯誤資訊會在
`show slave status\G`下面的資訊中指出NO的原因
# 測試結果
![](https://img2020.cnblogs.com/blog/1538452/202101/1538452-20210108233655996-17682923