环境准备
- 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
|
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
|
创建同步数据使用的用户
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
|
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;
|
创建连接用户并授权
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
查看 slave
节点数据库,user
已经同步成功,至此mysql 的主从架构集群就已经部署完成,如果想增加 slave节点的话,重复2.2
[注意]
- 关联主从节点时,确保IP和端口是通的,不然在从节点执行
start slave
时,查看结果 show slave status
连接结果是失败的;
- 测试账号不要用
root
权限,会忽略从节点的读写限制,从节点也一样可以插入、更新、删除数据;
slave
节点服务一定要将 read_only
设置成1,可以在.cnf
配置文件中配置,也可以在mysql
终端中设置set global read_only=1;
不然有写权限的账号在 slave
节点也一样可以插入或更新数据;