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;