Docker進行MySQL主從複製操做

Docker的相關操做 與 Docker下MySQL容器的安裝
https://www.cnblogs.com/yumq/p/14253360.htmlhtml

本次實驗我是在單機狀態下進行mysql的主從複製,和多機的原理同樣mysql

準備多個mysql容器

相關參數sql

--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 運行的鏡像文件

直接運行下面代碼就能啓動mysqldocker

mysql1

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

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

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


如今是啓動成功了,可是沒有配置主從相關配置,因此咱們下一步要配置MySQL。
由於運行的時候咱們將容器內的配置目錄掛載到本機的/home/mysql/docker-data/

因此咱們將對應容器的配置文件複製到對應目錄下的conf目錄下
數據庫

my.cnf 文件內容以下安全

# 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和3bash

重啓全部mysql容器

#先查看全部容器 
docker ps
#而後一個個重啓相應的容器
docker restart 容器id

#由於我容器只有這三個mysql 因此我以這樣方式重啓所有容器
docker restart $(docker ps -aq)

配置master

我是以docker1下的mysql做爲master主機服務器

進入docker1socket

docker exec -it 容器ID/容器名字 /bin/bash

看到root@docker1時表示在docker1容器內
若是操做完畢就exit退出容器

進入mysql


根據容器的配置 我設置的密碼爲123456

在master mysql添加權限

GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

查看master的二進制文件

show master status;

這樣master配置就成功了

配置slave

分別進入docker2 和 docker3

docker exec -it 容器ID/容器名字 /bin/bash

注意當看到光標前顯示 root@docker2 和 root@docker3 時才代表進入成功
若是須要退出用exit進行退出。

在slave中設置master信息

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線程

start slave;

若是須要關閉就 stop slave;

查看slave的狀態

show slave status\G;

若是都爲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的緣由

測試結果

相關文章
相關標籤/搜索