mysql 主备从

创建mysql服务

ip端口  
192.168.153.19:3307 master
192.168.153.19:3308 slave
192.168.153.19:3309 master01
192.168.153.19:3310 slave01
# docker 拉取mysql镜像
docker pull mysql:5.7

# 宿主机创建文件夹
mkdir /data/docker/mysql-master/{conf,data,log}
mkdir /data/docker/mysql-master01/{conf,data,log}
mkdir /data/docker/mysql-slave/{conf,data,log}
mkdir /data/docker/mysql-slave01/{conf,data,log}

如图:

 

 

 启动镜像:

docker run -p 3307:3306 --privileged=true --name mysql-master \
-v /data/docker/mysql-master/log:/var/log/mysql \
-v /data/docker/mysql-master/data:/var/lib/mysql \
-v /data/docker/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

docker run -p 3308:3306 --privileged=true --name mysql-slave \
-v /data/docker/mysql-slave/log:/var/log/mysql \
-v /data/docker/mysql-slave/data:/var/lib/mysql \
-v /data/docker/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

docker run -p 3309:3306 --privileged=true --name mysql-master01 \
-v /data/docker/mysql-master01/log:/var/log/mysql \
-v /data/docker/mysql-master01/data:/var/lib/mysql \
-v /data/docker/mysql-master01/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

docker run -p 3310:3306 --privileged=true --name mysql-slave01 \
-v /data/docker/mysql-slave01/log:/var/log/mysql \
-v /data/docker/mysql-slave01/data:/var/lib/mysql \
-v /data/docker/mysql-slave01/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

编辑master my.cnf

vim /data/docker/mysql-master/conf/my.cnf

[mysqld]
server_id=1
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mysql-bin
## 需要复制的数据库
binlog-do-db=mydb1
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=statement
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 在作为从数据库时,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,默认值是1,取值范围1--65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1--65535
auto-increment-offset=1

编辑master01 my.cnf

vim /data/docker/mysql-master01/conf/my.cnf

[mysqld]
server_id=3
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mysql-bin
## 需要复制的数据库
binlog-do-db=mydb1
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=statement
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 在作为从数据库时,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,默认值是1,取值范围1--65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1--65535
auto-increment-offset=2

编辑slave my.cnf

vim /data/docker/mysql-slave/conf/my.cnf 

[mysqld]
server_id=3

# 启用中继日志
relay-log=mysql-relay

编辑slave01 my.cnf

vim /data/docker/mysql-slave01/conf/my.cnf

[mysqld]
server_id=4
relay-log=mysql-relay

重启容器

docker restart mysql-master mysql-master01 mysql-slave mysql-slave01

进入mysql-mysql容器数据库创建主从同步用户

docker exec -it mysql-master /bin/bash
# 进入mysql
mysql -uroot -p123456
# 创建同步数据用户
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';   
# 刷新权限  
FLUSH PRIVILEGES;

进入mysql-mysql01容器数据库创建主从同步用户

docker exec -it mysql-master01 /bin/bash
# 进入mysql
mysql -uroot -p123456
# 创建同步数据用户
GRANT REPLICATION SLAVE ON *.* TO 'slave01'@'%' IDENTIFIED BY '123123';   
# 刷新权限  
FLUSH PRIVILEGES;

slave[3308]同步master[3307],slave01[3310]同步master01[3309]

# 进入slave从库
docker exec -it mysql-slave /bin/bash

# 登录mysql
mysql -uroot -p123456

CHANGE MASTER TO MASTER_HOST='192.168.153.19',
MASTER_PORT=3307,
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000001',  # 登陆主服务器 show master status; 查询 取File列值 参考下图
MASTER_LOG_POS=612;             # 登陆主服务器 show master status; 查询 取Position列值 参考下图

# 开始从库同步
start slave;

# 查看主从同步状态
show slave status\G

如图:

# 进入slave01从库
docker exec -it mysql-slave01 /bin/bash

# 登录mysql
mysql -uroot -p123456

CHANGE MASTER TO MASTER_HOST='192.168.153.19',
MASTER_PORT=3309,MASTER_USER='slave01',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000001',  # 登陆主服务器 show master status; 查询 取File列值 参考下图
MASTER_LOG_POS=612;

# 开始从库同步
start slave;

# 查看主从同步状态
show slave status\G

如图:

 

master、master01互为主备配置:

master01复制master

# 进入master01节点数据库执行
CHANGE MASTER TO MASTER_HOST='192.168.153.19',
MASTER_PORT=3307,MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000001',  # 登陆主服务器 show master status; 查询 取File列值 参考下图
MASTER_LOG_POS=612;

# 启动
start slave;

# 查看状态
show slave status\G

master复制master01

# 进入master节点数据库执行
CHANGE MASTER TO MASTER_HOST='192.168.153.19',
MASTER_PORT=3309,MASTER_USER='slave01',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000001',  # 登陆主服务器 show master status; 查询 取File列值 参考下图
MASTER_LOG_POS=612;

# 启动
start slave;

# 查看状态
show slave status\G

 

 测试:因为数据库设置只允许同步mydb1数据库,所以切记测试时,要吗去掉只同步mydb1的配置,要么直接创建mydb1数据库。

插入测试语句

 

binlog为statement所以insert的@@hostname为系统变量,每台服务器的hostname数据都为该服务器的服务器名称。所以 生产环境binlog建议用row格式,确保不会因为系统变量导致每台mysql的数据有区别

 master

 

master01

 

 slave

 

 slave01

 

 

 
posted @ 2022-07-08 18:25  php的自我修养  阅读(84)  评论(0编辑  收藏  举报