docker搭建mysql5.7主從複製實現讀寫分離

拉取鏡像

docker pull mysql:5.7

Master(主):

docker run --restart=always --name mysql5.7-master -p 3307:3306  -e MYSQL_ROOT_PASSWORD=dsj123456 -d mysql:5.7

如果要把配置和數據映射出來可以加上參數:前提是創建好配置文件
-v /root/mysql5.7/master/data/:/var/lib/mysql 
-v /root/mysql5.7/master/conf/master.cnf:/etc/mysql/my.cnf 

Slave(從):

docker run --restart=always --name mysql5.7-slave1 -p 3308:3306  -e MYSQL_ROOT_PASSWORD=dsj123456 -d mysql:5.7

如果要映射配置文件和數據出來步驟同master

Master對外映射的端口是3307,Slave對外映射的端口是3308。因爲docker容器是相互獨立的,每個容器有其獨立的ip,所以不同容器使用相同的端口並不會衝突。這裏我們應該儘量使用mysql默認的3306端口,否則可能會出現無法通過ip連接docker容器內mysql的問題。

配置Master(主)

通過docker exec -it mysql5.7-master /bin/bash命令進入到Master容器內部

執行命令安裝vim工具:
apt-get update
apt-get install vim
1,cd /etc/mysql切換到/etc/mysql目錄下
2,然後vi my.cnf對my.cnf進行編輯
添加master配置文件:
[mysqld] #這個一定要加,不加就是大坑,代表一組配置文件
# 主從同步設置 - master
server-id = 1
log-bin=mysql-bin
binlog-ignore-db=mysql  #忽略的數據庫
binlog-ignore-db=information-schema

# 系統數據庫編碼設置,排序規則
character_set_server = utf8mb4
collation_server = utf8mb4_bin
back_log = 1024
explicit_defaults_for_timestamp = ON
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
lower_case_table_names=0

# 默認使用InnoDB存儲引擎
default_storage_engine = InnoDB
innodb_buffer_pool_size = 64M
innodb_purge_threads = 1
innodb_log_buffer_size = 2M
innodb_log_file_size = 128M
innodb_lock_wait_timeout = 120

# 時區設置
default-time_zone = '+8:00'

配置完成之後,需要重啓mysql服務使配置生效。使用service mysql restart完成重啓。重啓mysql服務時會使得docker容器停止,我們還需要docker start mysql-master啓動容器

下一步在Master數據庫創建數據同步用戶,授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用於在主從庫之間同步數據。

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

配置Slave(從)

和配置Master(主)一樣,在Slave配置文件my.cnf中添加如下配置:

[mysqld]
# 主從同步設置 - slave1
server-id = 2
log-bin=mysql-bin
replicate_ignore_db=mysql       #被忽略的數據庫
replicate-ignore-db=information-schema
slave-skip-errors=all           #跳過所有錯誤

#系統數據庫編碼設置,排序規則
character_set_server = utf8mb4
collation_server = utf8mb4_bin
back_log = 1024
explicit_defaults_for_timestamp = ON
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
lower_case_table_names=0

#默認使用InnoDB存儲引擎
default_storage_engine = InnoDB
innodb_buffer_pool_size = 64M
innodb_purge_threads = 1
innodb_log_buffer_size = 2M
innodb_log_file_size = 128M
innodb_lock_wait_timeout = 120

# 時區設置
default-time_zone = '+8:00'

配置完成後也需要重啓mysql服務和docker容器,操作和配置Master(主)一致。

配置主從複製

1,在Master進入mysql,執行show master status;

2,File和Position字段的值後面將會用到,在後面的操作完成之前,需要保證Master庫不能做任何操作,否則將會引起狀態變化,File和Position字段的值變化。

3,在Slave的mysql中執行命令

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;

4,命令解析

1,master_host :Master的地址,指的是容器的獨立ip,可以通過docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱 或者 容器id查詢容器的ip
2,master_port:Master的端口號,指的是容器的端口號
3,master_user:用於數據同步的用戶
4,master_password:用於同步的用戶的密碼
5,master_log_file:指定 Slave 從哪個日誌文件開始複製數據,即上文中提到的 File 字段的值
6,master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值
7,master_connect_retry:如果連接失敗,重試的時間間隔,單位是秒,默認是60秒
8,在Slave 中的mysql終端執行show slave status;用於查看主從同步狀態。
9,發現slave_IO_Running: NO 和Slave_SQL_Running:No
10,正常情況下,SlaveIORunning 和 SlaveSQLRunning 都是No,因爲我們還沒有開啓主從複製過程。使用start slave開啓主從複製過程,然後再次查詢主從同步狀態show slave status;
11,SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明主從複製已經開啓。此時可以測試數據同步是否成功;

測試主從複製

最簡單的是在Master創建一個數據庫,然後檢查Slave是否存在此數據庫

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