基于 docker 的mysql 5.7 主备集群搭建

创建挂载目录和配置文件

  • 主节点
bash 复制代码
mkdir -p /mysql_master/mysql/log
mkdir -p /mysql_master/mysql/data
mkdir -p /mysql_master/mysql/conf
vim /mysql_master/mysql/conf/my.cnf
bash 复制代码
[mysqld]
datadir=/var/lib/mysql #MySQL 数据库文件存放路径
server_id = 1 #指定数据库服务器的唯一标识。同一个复制组下的所有实例的server_id都必须唯一
log-bin= mysql-bin #开启MySQL的bin log日志功能,自定义的值将作为bin log的名称的前缀信息
binlog_ignore_db=mysql #设置不需要同步的库(多个数据库设置可以写多行)
binlog_ignore_db=sys
binlog_ignore_db=information_schema
binlog_ignore_db=performance_schema
# binlog_do_db #设置需要同步的库(多个数据库设置可以写多行)
relay_log_recovery=on #当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启。
read-only=0 #1表示将MySQL设置为只读状态
relay_log=mysql-relay-bin 
sync_binlog=1 #事务提交后立即写入二进制日志,而不是放内存中,避免主服务器故障时事务没有写入日志,最好设为1,但是插入速度很慢,该参数的有效值为0 、1、N, 默认:0 查询语句: select @@sync_binlog;
innodb_flush_log_at_trx_commit=1 #每次事务提交后立即将日志写入磁盘的配置 默认:1 查询语句: select @@innodb_flush_log_at_trx_commit;
log-slave-updates=on
auto-increment-offset=1 #自增值
auto-increment-increment=2 #漂移值,也就是步长(也就是你准备搞几个实例)
binlog_cache_size=100M #日志的缓存大小
binlog_format=mixed #设置bin-log日志文件格式为:mixed,防止主键重复
expire_logs_days=7 #设置bin-log日志文件保存的天数
slave_skip_errors=ddl_exist_errors,1032 #slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
master_info_repository=table
relay_log_info_repository=table
slave-parallel-type=LOGICAL_CLOCK #DATABASE:默认值,基于库的并行复制方式 LOGICAL_CLOCK:基于组提交的并行复制方式
slave-parallel-workers=20
max_allowed_packet=1024M
log-bin-trust-function-creators=1
max_connections=1000
max_user_connections=500
wait_timeout=31536000
interactive_timeout=31536000
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
  • 从节点
bash 复制代码
mkdir -p /mysql_slave/mysql/log
mkdir -p /mysql_slave/mysql/data
mkdir -p /mysql_slave/mysql/conf
vim /mysql_slave/mysql/conf/my.cnf
bash 复制代码
[mysqld]
datadir=/var/lib/mysql #MySQL 数据库文件存放路径
server_id = 2 #指定数据库服务器的唯一标识。同一个复制组下的所有实例的server_id都必须唯一
log-bin= mysql-bin #开启MySQL的bin log日志功能,自定义的值将作为bin log的名称的前缀信息
replicate_ignore_db=mysql #设置不需要同步的库
replicate_ignore_db=sys
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
# replicate_do_db #设置需要同步的库
# replicate_ignore_table #设置不需要同步的表
# replicate_do_table #设置需要同步的表
relay_log_recovery=on #当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启。
read-only=1 #1表示将MySQL设置为只读状态
relay_log=mysql-relay-bin 
sync_binlog=1 #事务提交后立即写入二进制日志,而不是放内存中,避免主服务器故障时事务没有写入日志,最好设为1,但是插入速度很慢,该参数的有效值为0 、1、N, 默认:0 查询语句: select @@sync_binlog;
innodb_flush_log_at_trx_commit=1 #每次事务提交后立即将日志写入磁盘的配置 默认:1 查询语句: select @@innodb_flush_log_at_trx_commit;
log-slave-updates=on
auto-increment-offset=1 #自增值
auto-increment-increment=2 #漂移值,也就是步长(也就是你准备搞几个实例)
binlog_cache_size=100M #日志的缓存大小
binlog_format=mixed #设置bin-log日志文件格式为:mixed,防止主键重复
expire_logs_days=7 #设置bin-log日志文件保存的天数
slave_skip_errors=ddl_exist_errors,1032 #slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
master_info_repository=table
relay_log_info_repository=table
slave-parallel-type=LOGICAL_CLOCK #DATABASE:默认值,基于库的并行复制方式 LOGICAL_CLOCK:基于组提交的并行复制方式
slave-parallel-workers=20
max_allowed_packet=1024M
log-bin-trust-function-creators=1
max_connections=1000
max_user_connections=500
wait_timeout=31536000
interactive_timeout=31536000
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

Mysql 容器启动

  • 拉取镜像
bash 复制代码
docker pull mysql:5.7
  • 启动主节点
bash 复制代码
docker run -p 33061:3306 --name mysql_master \
-v /mysql_master/mysql/log:/var/log/mysql \
-v /mysql_master/mysql/data:/var/lib/mysql \
-v /mysql_master/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
--restart=always \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
  • 启动从节点
bash 复制代码
docker run -p 33062:3306 --name mysql_slave \
-v /mysql_slave/mysql/log:/var/log/mysql \
-v /mysql_slave/mysql/data:/var/lib/mysql \
-v /mysql_slave/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
--restart=always \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

Mysql主从复制设置

主节点设置
  • 进入容器
bash 复制代码
docker exec -it mysql_master /bin/bash
  • 连接mysql
bash 复制代码
mysql -uroot -p123456
  • 设置主备同步的专用帐号
bash 复制代码
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
  • 刷新权限
bash 复制代码
flush privileges;
  • 查看用户
bash 复制代码
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; 
  • 查询master的状态,记录File、Position的值,File表示当前日志文件名称,Position表示当前日志的位置,用于从节点日志同步
bash 复制代码
show master status;
从节点设置
  • 进入容器
bash 复制代码
docker exec -it mysql_slave /bin/bash
  • 连接mysql
bash 复制代码
mysql -uroot -p123456
  • 设置主节点连接,master_host为主节点容器IP(docker inspect mysql_master查看ip),master_user为主备账号,master_password为主备账号密码,master_log_file和master_log_pos为主节点容器中通过show master status查出来的File和Position值
bash 复制代码
change master to master_host='172.18.0.2',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=600;
  • 启动同步
bash 复制代码
start slave; 
  • 查看从节点状态
bash 复制代码
show slave status\G;
相关推荐
吐泡泡_3 小时前
MySQL(事物上)
数据库·mysql
遇见火星6 小时前
OpenEuler-22.03-LTS上利用Ansible轻松部署MySQL 5.7
mysql·ansible·openeuler
首席令狐冲7 小时前
docker 小记
运维·docker·容器
CL_IN7 小时前
高效集成销售订单数据到MySQL的方法
android·数据库·mysql
LCY1337 小时前
docker compose的使用
运维·docker·容器
Vesper638 小时前
【Android】‘adb shell input text‘ 模拟器输入文本工具使用教程
android·adb
Code额9 小时前
MySQL的事务机制
android·mysql·adb
元气满满的热码式9 小时前
MySQL启动报错解决
运维·数据库·mysql
猿小喵9 小时前
MySQL异常SQL排查
数据库·sql·mysql
TechStack 创行者9 小时前
Docker 构建 nginx-redis-alpine 项目详解
运维·redis·nginx·docker·容器