多主多从
- 序言
- 前期准备工作
- 创建主机和从机的配置文件和数据存储目录
- 配置master1配置文件
- 配置master2配置文件
- 配置slave1配置文件
- 配置slave2配置文件
- docker-compose-mysql.yml启动文件
- 启动master1
- 启动master2
- 两个主机分别创建用户
- 两个主机分别刷新权限
- 查看两个主机binlog状态
- master1的binlog状态
- master2的binlog状态
- 启动slave1
- 启动slave2
- 从节点复制的主机节点
- slave1 复制 master1
- slave2 复制 master2
- slave1开启复制
- 查看复制状态
- slave2开启复制
- 查看复制状态
- 两台主机相互复制
- master2 复制master 1
- master1 复制 master2
- 两台master开启节点的复制功能
- 查看两台从主机的复制
- 测试效果
序言
在另一篇文章中,已经搭建了一主一从。可是有的小伙伴还希望了解一下多主多从。那么,今天他来了。
现在让我们一起完成MySQL的多主多从。完成数据库的集群搭建。 本次使用了docker 启动了四个MySQL搭建主从复制。
master1端口号是13306 master2端口号是13307 slave1端口号是13308 slave2端口号是13309
采用两个主机互备,slave1 复制 master1,slave2 复制 master2。
前期准备工作
创建主机和从机的配置文件和数据存储目录
mkdir -p /lx/mysql/master1/conf
mkdir -p /lx/mysql/master2/conf
mkdir -p /lx/mysql/master1/data
mkdir -p /lx/mysql/master2/data
mkdir -p /lx/mysql/slave1/conf
mkdir -p /lx/mysql/slave2/conf
mkdir -p /lx/mysql/slave1/data
mkdir -p /lx/mysql/slave2/data
配置master1配置文件
vim /lx/mysql/master1/conf/my.cnf
复制一下内容
[mysqld]
# 设置授权访问的加密策略
default_authentication_plugin=mysql_native_password
# 主从复制配置
# 服务器ID 保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=202413306
# 启用二进制日志
log-bin=master1-bin
# 设置logbin格式:STATEMENT(同步SQL脚本) / ROW(同步数据行) / MIXED(混合同步)
binlog_format=ROW
# 设置日志最长保存时间
expire_logs_days=30
# 0-读写,1-只读
read-only=0
# 设置忽略同步的数据库 可以配置多个
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 设置需要同步的数据库
#binlog-do-db=pdd
#binlog-do-db=taob
# 主节点宕机恢复之后变成从数据库之后,写入操作写入二进制文件中
log-slave-updates
# 自增字段每次增长的值
auto-increment-increment=2
# 自增字段的起始值
auto-increment-offset=1
# 设置自增字段的起始和增长值是为了保证多个主节点的情况下自增的字段不会重复
配置master2配置文件
vim /lx/mysql/master2/conf/my.cnf
复制一下内容
[mysqld]
# 设置授权访问的加密策略
default_authentication_plugin=mysql_native_password
# 主从复制配置
# 服务器ID 保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=202413307
# 启用二进制日志
log-bin=master2-bin
# 设置logbin格式:STATEMENT(同步SQL脚本) / ROW(同步数据行) / MIXED(混合同步)
binlog_format=ROW
# 设置日志最长保存时间
expire_logs_days=30
# 0-读写,1-只读
read-only=0
# 设置忽略同步的数据库 可以配置多个
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 设置需要同步的数据库
#binlog-do-db=pdd
#binlog-do-db=taob
# 主节点宕机恢复之后变成从数据库之后,写入操作写入二进制文件中
log-slave-updates
# 自增字段每次增长的值
auto-increment-increment=2
# 自增字段的起始值
auto-increment-offset=2
# 设置自增字段的起始和增长值是为了保证多个主节点的情况下自增的字段不会重复
配置slave1配置文件
vim /lx/mysql/slave1/conf/my.cnf
复制以下内容
[mysqld]
# 设置授权验证的加密策略
default_authentication_plugin=mysql_native_password
# 服务器ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2024013308
# 启用中继日志
relay-log=slave1-relay-bin
relay-log-index=slave1-relay-bin.index
# 设置日志最长保存时间
expire_logs_days=30
# 0-读写,1-只读;slave设置为只读(具有super权限的用户除外)
read_only=0
# 开启二进制日志功能,以便本机可以作为其它Slave的Master时使用
log-bin=slave1-bin
# 设置logbin格式:STATEMENT(同步SQL脚本) / ROW(同步数据行) / MIXED(混合同步)
# binlog_format=MIXED
# 1表示slave将复制事件写进自己的二进制日志,以便从服务器也可以作为主服务器向其他从服务器复制数据
log_slave_updates=1
# 设置允许复制的库
# replicate-do-db=pmonitor-cloud
# replicate-do-db=ucoal
# 设置忽略复制的库
# replicate-ignore-db=mysql
# replicate-ignore-db=information_schema
# replicate-ignore-db=performance_schema
配置slave2配置文件
vim /lx/mysql/slave2/conf/my.cnf
复制以下内容
[mysqld]
# 设置授权验证的加密策略
default_authentication_plugin=mysql_native_password
# 服务器ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2024013309
# 启用中继日志
relay-log=slave2-relay-bin
relay-log-index=slave2-relay-bin.index
# 设置日志最长保存时间
expire_logs_days=30
# 0-读写,1-只读;slave设置为只读(具有super权限的用户除外)
read_only=0
# 开启二进制日志功能,以便本机可以作为其它Slave的Master时使用
log-bin=slave2-bin
# 设置logbin格式:STATEMENT(同步SQL脚本) / ROW(同步数据行) / MIXED(混合同步)
# binlog_format=MIXED
# 1表示slave将复制事件写进自己的二进制日志,以便从服务器也可以作为主服务器向其他从服务器复制数据
log_slave_updates=1
# 设置允许复制的库
# replicate-do-db=pmonitor-cloud
# replicate-do-db=ucoal
# 设置忽略复制的库
# replicate-ignore-db=mysql
# replicate-ignore-db=information_schema
# replicate-ignore-db=performance_schema
docker-compose-mysql.yml启动文件
version: '3'
services:
lx-mysql-master1:
image: mysql:8.0.29
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_PASSWORD: 123456
ports:
- 13306:3306
volumes:
- "/lx/mysql/master1/conf:/etc/mysql/conf.d"
- "/lx/mysql/master1/data:/var/lib/mysql"
container_name: "lx-mysql-master1"
lx-mysql-master2:
image: mysql:8.0.29
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_PASSWORD: 123456
ports:
- 13307:3306
volumes:
- "/lx/mysql/master2/conf:/etc/mysql/conf.d"
- "/lx/mysql/master2/data:/var/lib/mysql"
container_name: "lx-mysql-master2"
lx-mysql-slave1:
image: mysql:8.0.29
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_PASSWORD: 123456
ports:
- 13308:3306
volumes:
- "/lx/mysql/slave1/conf:/etc/mysql/conf.d"
- "/lx/mysql/slave1/data:/var/lib/mysql"
container_name: "lx-mysql-slave1"
lx-mysql-slave2:
image: mysql:8.0.29
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_PASSWORD: 123456
ports:
- 13309:3306
volumes:
- "/lx/mysql/slave2/conf:/etc/mysql/conf.d"
- "/lx/mysql/slave2/data:/var/lib/mysql"
container_name: "lx-mysql-slave2"
启动master1
docker-compose -f docker-compose-mysql.yml up -d lx-mysql-master1
启动master2
docker-compose -f docker-compose-mysql.yml up -d lx-mysql-master2
两个主机分别创建用户
CREATE USER 'slaveuser'@'%' IDENTIFIED WITH mysql_native_password BY '123456' ;
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%';
两个主机分别刷新权限
flush privileges;
查看两个主机binlog状态
show master status;
master1的binlog状态
master2的binlog状态
启动slave1
docker-compose -f docker-compose-mysql.yml up -d lx-mysql-slave1
启动slave2
docker-compose -f docker-compose-mysql.yml up -d lx-mysql-slave2
从节点复制的主机节点
slave1 复制 master1
CHANGE MASTER TO
MASTER_HOST='192.168.0.106',
MASTER_USER='slaveuser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master1-bin.000003', # master1主机binlog文件的名称
MASTER_LOG_POS=157, # binlog文件的偏移量
master_port=13306;
注意更改为自己的相关配置
slave2 复制 master2
CHANGE MASTER TO
MASTER_HOST='192.168.0.106',
MASTER_USER='slaveuser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master2-bin.000003', # master1主机binlog文件的名称
MASTER_LOG_POS=157, # binlog文件的偏移量
master_port=13307;
注意更改为自己的相关配置
slave1开启复制
start slave;
查看复制状态
如果搭建失败请查看
主从复制一主一从问题处理
show slave status;
查看slave1两个选项是否为Yes;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
slave2开启复制
start slave;
查看复制状态
show slave status;
查看slave2两个选项是否为Yes;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两台主机相互复制
master2 复制master 1
CHANGE MASTER TO
MASTER_HOST='192.168.0.106',
MASTER_USER='slaveuser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master1-bin.000003', # master1主机binlog文件的名称
MASTER_LOG_POS=157, # binlog文件的偏移量
master_port=13306;
master1 复制 master2
CHANGE MASTER TO
MASTER_HOST='192.168.0.106',
MASTER_USER='slaveuser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master2-bin.000003', # master1主机binlog文件的名称
MASTER_LOG_POS=157, # binlog文件的偏移量
master_port=13307;
两台master开启节点的复制功能
start slave;
查看两台从主机的复制
show slave status;
查看两个选项是否为Yes;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试效果
一:master1创建数据库、创建表、添加数据。查看master2、slave1和slave2是否成功复制数据。
二:停止master1和slave1。之后使用master2进行添加数据或者修改数据。随后启动master1和slave1,验证是否同步数据。