MySQL -- docker部署集群之主从复制方案

mysql 集群部署方案之主从复制

环境准备

  • OS: win10
  • docker engine: v20.10.14

创建MySQL服务容器

创建 master 节点服务

  • 编辑数据库配置文件,将配置文件以及数据存储目录挂载到宿主机上

master节点配置文件mysql-master.cnf如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[mysqld]
# 定义服务id 
server-id=1

#启用二进制日志
log-bin=mysql-bin

# 设置不要复制的数据库(可设置多个,多行配置)
# binlog-ignore-db=information_schema

# 设置需要复制的数据库 需要复制的主数据库名字(可设置多个,多行配置)
binlog-do-db=testdb

#设置logbin格式
binlog_format=STATEMENT

# 开启gtid
enforce-gtid-consistency=on
gtid-mode=on
  • 创建master节点服务的容器mysql-master
1
docker run -d -p 3310:3306 -v D:\workspace\docker-volumes\mysql\master\mysql-master.cnf:/etc/mysql/conf.d/mysql-master.cnf -v D:\workspace\docker-volumes\mysql\master\data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql-master mysql:5.7

创建 slave 节点服务

  • 创建配置文件 mysql-slave-1.cnf 如下:
1
2
3
4
5
6
7
8
[mysqld]
# 设置 server-id 注意不要与 master 节点重复
server-id=2
binlog-format=STATEMENT
relay-log=mysql-relay
gtid-mode=ON
enforce-gtid-consistency=true
read-only=1
  • 创建 slave 节点服务
1
docker run -d -p 3311:3306 -v D:\workspace\docker-volumes\mysql\slave-1\mysql-slave-1.cnf:/etc/mysql/conf.d/mysql-slave-1.cnf -v D:\workspace\docker-volumes\mysql\slave-1\data\:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql-slave-1 mysql:5.7

创建同步数据使用的用户

  • 进入master节点
1
docker exec -it mysql-master mysql -uroot -p123456
  • 创建用户,记住此时创建的用户密码
1
2
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
  • 查看 master 节点状态,在master 节点执行
1
mysql> show master status;
File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
mysql-bin.000002 157 testdb mysql,information_schema

记住File和Position,后面关联主从节点的时候会用

  • 查看 master 节点的IP地址,关联主从节点的时候要用
1
docker inspect mysql-master

master-ip

  • 进入 slave 节点
1
docker exec -it mysql-slave-1 mysql -uroot -p123456

执行SQL关联主从复制节点

1
2
3
4
5
6
7
mysql> CHANGE MASTER TO 
  MASTER_HOST='172.17.0.2', # master 节点IP
  MASTER_PORT=3306, # master 节点端口
  MASTER_USER='slave',  # 上面创建的主从同步用户
  MASTER_PASSWORD='123456', # 用户密码
  MASTER_LOG_FILE='mysql-bin.000003',   # master 节点的日志文件
  MASTER_LOG_POS=0;   

开启 slave

1
2
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)

查看 slave开启状态

1
mysql> show slave status\G;

slave-status

创建连接用户并授权

  • 进入 master 节点,执行
1
2
3
4
5
# 创建用户
CREATE USER 'test'@'%' IDENTIFIED BY '123456';

# 授权
grant select,insert,update,delete on testdb.* to 'test'@'%';

[注]测试过程中不要使用root账号测试从库的read-only权限,因为拥有 super 权限的账号会忽略限制

  • master 节点上的testdb 库新建数据表 user

master-connection

master-t1

查看 slave 节点数据库,user 已经同步成功,至此mysql 的主从架构集群就已经部署完成,如果想增加 slave节点的话,重复2.2

slave-t1

[注意]

  • 关联主从节点时,确保IP和端口是通的,不然在从节点执行 start slave 时,查看结果 show slave status 连接结果是失败的;
  • 测试账号不要用 root 权限,会忽略从节点的读写限制,从节点也一样可以插入、更新、删除数据;
  • slave 节点服务一定要将 read_only 设置成1,可以在.cnf配置文件中配置,也可以在mysql终端中设置set global read_only=1;不然有写权限的账号在 slave 节点也一样可以插入或更新数据;
皖ICP备20014602号
Built with Hugo
Theme Stack designed by Jimmy