1. 程式人生 > >Docker進行MySQL主從複製操作

Docker進行MySQL主從複製操作

>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