基于 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;
相关推荐
_Eden_1 小时前
Docker技术相关学习二
学习·spring cloud·docker
Uncommon.3 小时前
MySQL-索引下推
数据库·mysql
苹果醋33 小时前
机器学习算法在网络安全中的实践
java·运维·spring boot·mysql·nginx
不想起昵称9293 小时前
MySQL
数据库·mysql
_Eden_3 小时前
Docker技术相关学习三
java·学习·docker
tan77º3 小时前
【MySQL】表的操作
开发语言·数据库·c++·mysql
大丈夫立于天地间5 小时前
Linux 系统上安装 Docker 并进行配置
linux·运维·docker
Lang_xi_5 小时前
SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言
sql·学习·mysql
又是被bug折磨的一天5 小时前
如何获取sql数据中时间的月份、年份(类型为date)
数据库·sql·mysql