docker中mysql主从

docker中mysql主从


在这里插入图片描述

在这里插入图片描述

一、下载mysql镜像并创建容器

  • 搜索MySQL容器
docker search mysql
  • 拉去MySQL容器
docker pull mysql

docker详细可以参考:https://blog.csdn.net/qq_41853447/article/details/103242644

二、配置主MySQL

  • 创建容器并登录
docker exec -it main_mysql的ID /bin/bash

这个容器并不使用,只用于提前参考一下容器里的目录结构。

在这里插入图片描述

进入 /etc/mysql目录下修改 my.cnf 配置文件。这里容器中并没有编辑器,但是将这个文件复制到宿主机,修改完毕在复制进来,或者可以将该文件直接挂载到宿主机的某个目录里,直接在宿主机里修改就OK。这里我采用直接docker中相关问件直接挂载到宿主机,方便操作。

2.1、在宿主机创建主数据库挂载目录

  • 创建目录
mkdir -p /opt/mysql/master/conf
  • 创建my.cnf文件
vim /opt/mysql/master/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0
# 忽略应用程序想要设置的其他字符集
skip-character-set-client-handshake
# 为设置binlog格式
binlog_format=ROW
# 在row模式下开启该参数,将把sql语句打印到binlog日志里面,默认是0(off);
binlog_rows_query_log_events=1
# 这个的值必需所有mysql实例都不重复
server_id = 1
# binlog的名称
log-bin= mysql-bin
# 开启GTID,用来代替classic的复制方法
gtid_mode=on
# 开启gtid的一些安全限制,阻止不安全的语句执行
enforce_gtid_consistency=ON
# master_info_repository=table和relay_log_info_repository=table:master.info和relay.info保
# 存在表中
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并# 且重新从master上获取日志,这样就保证了relay-log的完整性
relay_log_recovery=ON
# 每个事务都会刷新master.info
sync_master_info=1
# 默认为NONE, 表示在图1的箭头1 不生成checksum, 这样就可以兼容旧版本的mysql。
# 此外,就只能设置为CRC32了
binlog_checksum=CRC32
# DATABASE为默认值,基于库的并行复制方式;LOGICAL_CLOCK基于组提交的并行复制方式
slave-parallel-type=LOGICAL_CLOCK
# 设置多少个SQL Thread(coordinator线程)来进行并行复制
slave_parallel_workers=4
# 控制是否使用WRITESET策略,WRITESET_SESSION是在写集合的基础上增加约束,保证按照前后顺序执行
binlog_transaction_dependency_tracking=WRITESET_SESSION
# 控制检测事务依赖关系时采用的HASH算法
transaction_write_set_extraction=XXHASH64
# 事务隔离级别
transaction-isolation=READ-COMMITTED
# 是否只读,0为否,1为是
read-only=0
# 配置忽略同步的数据库,mysql自带的这些数据库不需要同步
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
# binlog日志过期时间,默认不过期
expire_logs_days=30
# mysql最大连接数
max_connections=3600

# Custom config should go here
!includedir /etc/mysql/conf.d/

2.2、创建启动脚本启动

  • 创建启动脚本
vim /opt/mysql/master/start.sh
MYSQL_DIR=/opt/mysql/master
docker stop mysql-master
docker rm mysql-master
docker run -d \
    -p 3306:3306 \
    --name mysql-master \
    -v ${MYSQL_DIR}/conf/my.cnf:/etc/mysql/my.cnf \
    -v ${MYSQL_DIR}/data/mysql:/var/lib/mysql \
    -v ${MYSQL_DIR}/log:/opt/mysql/log \
    -e MYSQL_ROOT_PASSWORD=GU@Nli8n9 \
    容器ID

注意修改一下密码和容器ID

将docker中mysql容器的相关目录映射到宿主机。

该docker创建的容器名称为mysql-master,所以避免有容器重复,先发送 docker stop mysql-master 命令停止同名的容器,在发送 docker rm mysql-master命令删除同名的容器,在发送创建容器命令创建。

-v :表示地址映射,宿主机目录:容器映射目录

-p:端口映射,宿主机端口:容器映射端口

-e:表示添加环境变量。

  • 该启动问价设置权限并启动

cd /opt/mysql/master

chmod a+x start.sh
./start.sh

查看是否启动成功

docker ps

在这里插入图片描述

使用navicat工具链接

在这里插入图片描述

2.3、创建账号

该账号用户同步数据时使用,可以随便,不一定要 db_flow

  • 创建 db_flow账号用于主从复制的账号

这里可以直接登录容器操作,也可以直接使用mysql客服端工具链接操作。

  • 登录容器
docker exec -it mysql-master bash
  • 登录mysql数据库
mysql -uroot -pGU@Nli8n9
  • 主库创建 db_flow用户
create user 'db_flow'@'%' identified by '123456';
  • 并赋予 REPLICATION SLAVE权限。
GRANT REPLICATION SLAVE ON *.* to 'db_flow'@'%' with grant option;

创建用户和授权在8.0.11以后该过了,不能直接一步搞定了。 GRANT REPLICATION SLAVE ON *.* to 'db_flow'@'%' identified by '123456';

  • 刷新权限
FLUSH PRIVILEGES;
  • on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
  • to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”db_flow”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0IP段登录
  • identified by:指定用户的登录密码

创建权限可以参考:https://blog.csdn.net/anzhen0429/article/details/78296814

三、配置从MySQL

3.1、在宿主机创建挂载目录

  • 创建目录
mkdir -p /opt/mysql/slave/conf
  • 创建 my.conf文件
vim /opt/mysql/slave/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0
# 忽略应用程序想要设置的其他字符集
skip-character-set-client-handshake
# 为设置binlog格式
binlog_format=ROW
# 在row模式下开启该参数,将把sql语句打印到binlog日志里面,默认是0(off);
binlog_rows_query_log_events=1
# 这个的值必需所有mysql实例都不重复
server_id = 2
# binlog的名称
# log-bin= mysql-bin
# 开启GTID,用来代替classic的复制方法
gtid_mode=on
# 开启gtid的一些安全限制,阻止不安全的语句执行
enforce_gtid_consistency=ON
# master_info_repository=table和relay_log_info_repository=table:master.info和relay.info保
# 存在表中
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并# 且重新从master上获取日志,这样就保证了relay-log的完整性
relay_log_recovery=ON
# 每个事务都会刷新master.info
sync_master_info=1
# 默认为NONE, 表示在图1的箭头1 不生成checksum, 这样就可以兼容旧版本的mysql。
# 此外,就只能设置为CRC32了
binlog_checksum=CRC32
# DATABASE为默认值,基于库的并行复制方式;LOGICAL_CLOCK基于组提交的并行复制方式
slave-parallel-type=LOGICAL_CLOCK
# 设置多少个SQL Thread(coordinator线程)来进行并行复制
slave_parallel_workers=4
# 控制是否使用WRITESET策略,WRITESET_SESSION是在写集合的基础上增加约束,保证按照前后顺序执行
binlog_transaction_dependency_tracking=WRITESET_SESSION
# 控制检测事务依赖关系时采用的HASH算法
transaction_write_set_extraction=XXHASH64
# 事务隔离级别
transaction-isolation=READ-COMMITTED
# 是否只读,0为否,1为是,从库需要设置为只读
read-only=1
# 配置忽略同步的数据库,mysql自带的这些数据库不需要同步
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
# binlog日志过期时间,默认不过期
expire_logs_days=30
# mysql最大连接数
max_connections=3600

# Custom config should go here
!includedir /etc/mysql/conf.d/

与主库配置不同的有两个地方

server_id = 2 mysql的这个实例不能相同,需要设置为唯一的数字。

read-only=1 需要设置为只读属性

3.2、创建启动脚本并启动

  • 创建启动脚本
vim /opt/mysql/slave/start.sh
MYSQL_DIR=/opt/mysql/slave
docker stop mysql-slave
docker rm mysql-slave
docker run -d \
    -p 3307:3306 \
    --name mysql-slave \
    -v ${MYSQL_DIR}/conf/my.cnf:/etc/mysql/my.cnf \
    -v ${MYSQL_DIR}/data/mysql:/var/lib/mysql \
    -v ${MYSQL_DIR}/log:/opt/mysql/log \
    -e MYSQL_ROOT_PASSWORD=GU@Nli8n9 \
    容器ID

注意:如果主从数据库都是同一台主机,注意端口不要一致。

注意修改一下密码和容器ID

将docker中mysql容器的相关目录映射到宿主机。

该docker创建的容器名称为mysql-master,所以避免有容器重复,先发送 docker stop mysql-master 命令停止同名的容器,在发送 docker rm mysql-master命令删除同名的容器,在发送创建容器命令创建。

-v :表示地址映射,宿主机目录:容器映射目录

-p:端口映射,宿主机端口:容器映射端口

-e:表示添加环境变量。

**特备注意:**如果主从mysql都是在同一台机,需要修改挂载的数据目录,不然会主从数据都保存在一起了。

  • 设置启动设置权限并启动

cd /opt/mysql/slave

chmod a+x start.sh
./start.sh

查看是否启动成功

docker ps

3.3、主从关联

  • 登录从库的mysql容器内

可以直接使用navicat工具链接,直接在工具中操作。

docker exec -it mysql-slave bash
  • 登录mysql
mysql -uroot -pGU@Nli8n9
  • 先停止同步
STOP SLAVE;
  • 执行关联master语句
change master to master_host='192.168.209.148',master_port=3306,master_user='db_flow',master_password='123456',MASTER_AUTO_POSITION=1;

master_host:为主库ip
master_port:主库端口
master_user:主库用于同步的帐号
master_password:主库用于同步的帐号密码
master_auto_position:slave连接master将使用基于GTID的复制协议

如果之前此备库已有主库指向 需要先执行以下命令清空——在从表中执行

先停止同步 
STOP SLAVE; 
# 清空主库执行
STOP SLAVE IO_THREAD FOR CHANNEL ''; 
reset slave all; 
  • 启动slave
start slave;
  • 查看slave的状态
show slave status\G

Slave_IO_Running和Slave_SQL_Running 都为Yes就代表配置成功了
Seconds_Behind_Master:为主从延时(ms)

  • 如果 Slave_SQL_Running没有为yes

设置从库向主库同步数据、并检查链路

数据库中执行 show master status;

在这里插入图片描述

数据库中执行

CHANGE MASTER TO
master_host = '192.168.209.148',
master_user = 'db_flow',
master_password = '123465',
master_log_file = 'mysql-bin.000003',
master_log_pos = 195;

master_host 主数据库IP

master_user 主数据库中创建的主备复制账号

master_password 主数据库中创建的主备复制账号的密码

在这里插入图片描述

  • mysql主从同步从库上Slave_IO_Running: Connecting问题

参考:博客:https://blog.csdn.net/gb4215287/article/details/90601929

四、查看同步信息

  • 登录主数据库

  • 查看binlog线程,执行以下语句查看正在执行的线程

show processlist;
  • 查看所有从库信息
show slave hosts;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值