同一臺機器用docker實現mysql的主從同步

1.創建映射的文件夾已經配置文件

/usr/mysql/mysql-master/my.cnf  (配置文件)
/usr/mysql/mysql-master/conf.d
/usr/mysql/mysql-master/data

 

/usr/mysql/mysql-slave/my.cnf  (配置文件)
/usr/mysql/mysql-slave/conf.d
/usr/mysql/mysql-slave/data

 

2.編寫配置文件

2.1  編寫/usr/mysql/mysql-master/my.cnf     

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
pid-file		= /var/run/mysqld/mysqld.pid
socket			= /var/run/mysqld/mysqld.sock
datadir			= /var/lib/mysql
#log-error		= /var/log/mysql/error.log
#bind-address   = 127.0.0.1
expire_logs_days = 7
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=200
slow_query_log = ON
slow_query_log_file = /mnt/data/mysqlData/mysql/sql.log
long_query_time = 1
lower_case_table_names = 1
event_scheduler = ON
server-id = 3310
log-bin = mysql-bin
explicit_defaults_for_timestamp

[client]
default-character-set=utf8

2.2  編寫/usr/mysql/mysql-slave/my.cnf

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
pid-file		= /var/run/mysqld/mysqld.pid
socket			= /var/run/mysqld/mysqld.sock
datadir			= /var/lib/mysql
#log-error		= /var/log/mysql/error.log
#bind-address   = 127.0.0.1
expire_logs_days = 7
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=200
slow_query_log = ON
slow_query_log_file = /mnt/data/mysqlData/mysql/sql.log
long_query_time = 1
lower_case_table_names = 1
event_scheduler = ON
server-id = 3311
log-bin = mysql-slave-bin
relay_log=edu-mysql-relay-bin
explicit_defaults_for_timestamp

[client]
default-character-set=utf8

 

3.安裝docker,以及下載mysql鏡像(如果沒有安裝過的話)

 

yum install docker
systemctl start docker
docker pull mysql:5.7

 

4.啓動master數據庫和slave數據庫

-name :容器命名爲mysql_server_3310
-p :將容器的3306端口映射到宿主機的3310端口(slave將容器的3306端口映射到宿主機的3311端口)
-d : 後臺運行
--restart=always : docker重啓後,容器也隨之啓動
-v :目錄掛載
-e MYSQL_ROOT_PASSWORD :初始化root賬號的密碼爲123456

 

docker run --name mysql_server_3310 -d -p 3310:3306 --restart=always -v /usr/mysql/mysql-master/data/:/var/lib/mysql -v /usr/mysql/mysql-master/conf.d:/etc/mysql/conf.d -v /usr/mysql/mysql-master/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


docker run --name mysql_server_3311 -d -p 3311:3306 --restart=always -v /usr/mysql/mysql-slave/data/:/var/lib/mysql -v /usr/mysql/mysql-slave/conf.d:/etc/mysql/conf.d -v /usr/mysql/mysql-slave/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 

5.關聯master和slave

5.1  在master服務器中進入mysql查看master狀態

-- 進入mysql
docker exec -it mysql_server_3310 /bin/bash
mysql -uroot -p123456

--  創建用戶slave,密碼123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

-- 授予slave用戶 `REPLICATION SLAVE`權限和`REPLICATION CLIENT`權限,用於在`主` `從` 數據庫之間同步數據
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-- 授予所有權限則執行命令: GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%';

-- 使操作生效
FLUSH PRIVILEGES;


-- 查看狀態
show master status; 

注:File和Position字段的值slave中將會用到,在slave操作完成之前不要操作master,否則將會引起狀態變化,即File和Position字段的值變化 !!!

 

注:在給用戶授權時,mysql出現如下報錯:

Last_SQL_Error: Error 'Operation CREATE USER failed for 'slave'@'%'' on query. Default database: ''. Query: 'CREATE USER 'slave'@'%' IDENTIFIED BY PASSWORD '*2F7A17C3E76FB561456B2111C0E78CFB5E5030A5''

這個報錯的原因可能是由於:(1)已創建過該用戶 (2)已有該用戶的授權信息
解決方法:

刪除此用戶,刷新,並重啓slave

#刪除該用戶
mysql> drop user 'slave'@'%';
 
mysql> FLUSH PRIVILEGES;
 
# 重啓同步
mysql> stop slave;
 
mysql> start slave;
 
# 最後查看是否同步正常
mysql> show slave status\G

 

5.2  在slave服務器中進入mysql,啓動主從同步

master_host :master服務器地址(公網ip或者Navicat for MySQL填的ip地址)
master_port :端口號
master_user :用於數據同步的用戶(之前在master中創建授權的用戶)
master_password :用於同步用戶的密碼
master_log_file :指定slave從哪個日誌文件開始複製數據,即之前提到的File字段值
master_log_pos :從哪個Position開始讀,即之前master中的Position字段值,0則是從頭開始完整的拷貝master庫
master_connect_retry :連接失敗時重試的時間間隔,默認是60秒

docker exec -it mysql_server_3311 /bin/bash
mysql -uroot -p123456

change master to master_host='47.98.172.34',master_port=3310, master_user='slave', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos= 769, master_connect_retry=30;

# 開啓主從同步過程  【停止命令:stop slave;】
start slave;

5.3 查看主從同步狀態

show slave status \G;

 

如下Slave_IO_RunningSlave_SQL_Running 都是Yes的話,就說明主從同步已經配置好了!

 

注意:

Slave_IO_State 如果是Waiting for master to send event,那麼就成功一半了,如果是Connecting to master,基本就是配置失敗了,建議重新檢查下配置,具體失敗的原因可以查看日誌追蹤 或者Last_IO_Error字段

 

我們說成功一半,並沒有說成功了,那麼另一半在於Slave_IO_Running與Slave_SQL_Running

如果都是Yes,那麼恭喜你,可以測試主從複製的效果了,如果有一個不是Yes,一半是重啓從容器後,事務回滾引起的,那麼給出解決方法如下

 

stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;

執行後,再次觀察三個關鍵字段應該就都沒問題了

至此,一主一從已經搭建完成,再添加從實例的方式與上文一致,這裏就不在贅述了。

 

6.測試主從複製

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章