MySql主从复制(多主多从)

本文详细介绍了如何使用Docker搭建MySQL多主多从环境,包括配置各个节点的my.cnf文件,启动和同步过程,以及从节点之间的复制。重点展示了主从关系的建立和维护,以及测试数据同步的效果。
摘要由CSDN通过智能技术生成

序言

在另一篇文章中,已经搭建了一主一从。可是有的小伙伴还希望了解一下多主多从。那么,今天他来了。
现在让我们一起完成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状态

show master status;

启动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,验证是否同步数据。

可关注公众号 佳哇程序员
或直接扫码关注
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值