MySQL实现主从复制
1. 使用docker compose文件配置启动镜像
- docker-compose.yml配置文件
version: '3'
services:
mysql-master:
# 镜像
image: mysql:8.0.30
# 设置容器名称
container_name: mysql-master
# 设置映射端口
ports:
- "3306:3306"
# 设置挂载目录
volumes:
- 主机目录:/etc/mysql/conf.d
- 主机目录:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=密码
restart: unless-stopped
healthcheck: # 为主库添加健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p@&oGQXVz)Y&e6EpUpy4H4rQuXy2EDxGsvQ8"]
interval: 10s
timeout: 5s
retries: 5
networks:
- mysql-network
mysql-slave1:
image: mysql:8.0.30
container_name: mysql-slave1
ports:
- "3307:3306"
volumes:
- 主机目录:/etc/mysql/conf.d
- 主机目录:/var/lib/mysql
# 配置主服务健康的状态下部署
depends_on:
mysql-master:
condition: service_healthy
environment:
- MYSQL_ROOT_PASSWORD=目录
restart: unless-stopped
healthcheck: # 为从库添加健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p@&oGQXVz)Y&e6EpUpy4H4rQuXy2EDxGsvQ8"]
interval: 10s
timeout: 5s
retries: 5
networks:
- mysql-network
mysql-slave2:
image: mysql:8.0.30
container_name: mysql-slave2
ports:
- "3308:3306"
volumes:
- 主机目录:/etc/mysql/conf.d
- 主机目录:/var/lib/mysql
depends_on:
mysql-master:
condition: service_healthy
environment:
- MYSQL_ROOT_PASSWORD=密码
restart: unless-stopped
healthcheck: # 为从库添加健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p@&oGQXVz)Y&e6EpUpy4H4rQuXy2EDxGsvQ8"]
interval: 10s
timeout: 5s
retries: 5
networks:
- mysql-network
networks:
mysql-network:
driver: bridge
2. 主机配置
1. my.cnf配置文件
my.cnf文件配置
[mysqld] # 服务器唯一id,默认值1 server-id=1 # 设置日志格式,默认值ROW binlog_format=STATEMENT #设置密码默认加密方式 default_authentication_plugin=mysql_native_password # 二进制日志名,默认binlog # log-bin=binlog # 设置需要复制的数据库,默认复制全部数据库 #binlog-do-db=database #binlog-do-db=mydb # 设置不需要复制的数据库 #binlog-ignore-db=mytestdb3 #binlog-ignore-db=mytestdb4
binlog_format说明
- row(默认):日志记录的是主机数据库
写后的数据
,批量操作性能较差,解决NOW()或者user()或者@@hostname等操作在主从机不一致的问题。 - statement:日志记录的是主数据库的
写指令
,性能高,但是NOW()之类的函数和获取系统参数的操作会造成主从不同步问题。 - mixed:是
row
和statement
的两种日志格式的混合使用,有函数使用row
,没有函数使用statement
。
- row(默认):日志记录的是主机数据库
2.mysq服务配置
配置主从复制账号并设置权限
-- 创建用户 create user '用户名'@'%'; -- 设置密码,密码最高长度为32位 alter user '用户名'@'%' identified with mysql_native_password by '密码'; -- 设置你限 grant replication slave on *.* to '用户名'@'%'; -- 刷新权限 flush privileges;
3. 查看主机此时的状态
查看主机转状态,后面从机需要配置
show master status;
3. 从机配置
1. 从机的my.cnf配置文件配置
- my.cnf文件配置
[mysqld]
# 不可以重复
server-id=从机id
# 配置密码加密方式
default_authentication_plugin=mysql_native_password
2. 配置主从关系
change master to
# 主机地址,这里使用docker网络可以直接填主机的容器名称
master_host='主机地址',
master_user='在主机中创建的主从复制账号',
master_password='密码',
master_psot=主机端口,
# 主机show master status 指令查询出的file字段
master_log_fiel='binlog.xxxx',
# 主机show master status 指令查询出的position字段
master_log_pos=position字段