基於Docker實現Mysql主從同步
阿新 • • 發佈:2020-12-21
<!doctype html>基於Docker實現Mysql主從同步
基於Docker實現Mysql主從同步
Docker搭建主從服務
-
MySQL Docker Image 安裝
docker pull mysql:8.0
-
執行容器
Master 對外對映埠 3307
docker run -p 3307:3306 --name master_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
Slave 對外對映埠 3308
docker run -p 3308:3306 --name
-
檢視正在執行的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1dd97714edd mysql:8.0 "docker-entrypoint.s…" 44 seconds ago Up 43 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp slave_mysql
c9c213ae2ba1 mysql:8.0 "docker-entrypoint.s…" 50 seconds ago Up 49 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp master_mysql
配置
主節點
-
修改ids
# 進入 master 容器內部
docker exec -it master_mysql /bin/bash
# 同步時間
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
# 更換源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
# 安裝vim
apt-get update
apt-get install vim -y
# 修改 my.cnf
vim /etc/mysql/my.cnf
-
my.cnf 新增內容:
[mysqld]
# 同一區域網內唯一ID
server-id=1
# 開啟二進位制日誌功能
log-bin=mysql-bin
# 開啟日誌
# general_log = 1
# general_log_file = /var/log/mysql/general_sql.log
# 需要忽略的庫,忽略後不同步此庫
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
# 需要同步的庫
# binlog-do-db=test
-
重啟 master 容器
docker restart master_mysql
-
驗證server id
-- 連線mysql
mysql -h127.0.0.1 -P3307 -uroot -p123456
show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
注意:如果不修改ID會報錯
13117: Fatal error: The slave IO thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the replicatesameserverid option must be used on slave but this does not always make sense; please check the manual before using it).
-
檢視 master 的 binlog,此時需要保證Master庫不能做任何操作,否則將會引起狀態變化
show master status;
+------------------+----------+--------------+----------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+----------------------------------+-------------------+
| mysql-bin.000003 | 156 | | information_schema,cluster,mysql | |
+------------------+----------+--------------+----------------------------------+-------------------+
-
建立資料同步使用者
這使用者需要授予
slave REPLICATION SLAVE
,REPLICATION CLIENT
許可權,用於同步資料CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* TO 'slave'@'%';
可用
show grants for slave;
來驗證是否授權成功, 使用mysql -h127.0.0.1 -P3307 -uslave -p123456
來驗證是否可以登入
從節點
-
修改ids
# 進入 slave 容器內部
docker exec -it slave_mysql /bin/bash
# 同步時間
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
# 更換源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
# 安裝vim
apt-get update
apt-get install vim -y
# 修改 my.cnf
vim /etc/mysql/my.cnf
-
my.cnf 新增內容:
[mysqld]
# 同一區域網內唯一ID
server-id=2
# 開啟二進位制日誌功能,以備Slave作為其它Slave的Master時使用
log-bin=mysql-slave-bin
# relay_log配置中繼日誌
relay_log=mysql-relay-bin
# 開啟日誌
# general_log = 1
# general_log_file = /var/log/mysql/general_sql.log
# 需要忽略的庫,忽略後不同步此庫
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
replicate-ignore-db=mysql
# 需要複製的庫
# replicate-do-db=ufind_db
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
-
重啟 slave 容器
docker restart slave_mysql
-
驗證server id
# 連線mysql
mysql -h127.0.0.1 -P3308 -uroot -p123456
show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
-
連結主節點
查詢主節點容器的獨立IP
-- 連結配置
CHANGE MASTER TO MASTER_HOST='你的網路IP,不能是 127.0.0.1', MASTER_PORT=3307, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=156, MASTER_CONNECT_RETRY=30, MASTER_BIND='';
-- 啟動
start slave user='slave' password='123456';
-- 如果 slave 報錯: [ERROR] [MY-010584] [Repl] Slave I/O for channel , 嘗試使用 root
-- start slave user='root' password='123456';
-- 檢視 slave 狀態,確保: Slave_IO_Running: Connecting, Slave_SQL_Running: Yes
show slave status\G
說明:
master_host Master的地址
master_port Master的埠號
master_user 用於資料同步的使用者
master_password 用於同步的使用者的密碼
master_log_file 指定 Slave 從哪個日誌檔案開始複製資料,即上文中提到的 File 欄位的值
master_log_pos 從哪個 Position 開始讀,即上文中提到的 Position 欄位的值
master_connect_retry 如果連線失敗,重試的時間間隔,單位是秒,預設是60秒
注意: 可用
docker logs -f slave_mysql
檢視連線錯誤時的日誌
測試
主節點建立資料庫,檢視從節點是否有同步
主:
create database test default character set utf8;
create table test.tbl_test (`user` varchar(64) not null, age int(11) not null) default charset utf8;
insert into test.tbl_test values ('li',22);
從:
show databases;
show tables from test;
select * from test.tbl_test;
+------+-----+
| user | age |
+------+-----+
| li | 22 |
+------+-----+