🌸🌸 Linux/docker-compose/mysql8
互为主从 优雅部署 🌸🌸
-
记录下两台
Linux
的mysql
需要热备份,互为主从,后期加上keepalived
实现高可用切换 -
参考博客:答 案
🌸 一、准备文件
- 这里有个问题,新版mysql配置文件位置可能有变动,可以安装下进入看下位置,确认下
- 我这里是
/etc/mysql/conf.d/my.cnf
,编写docker-compose
时不要写错 - 注意
8.0.31
是my.cnf
,有些博主写的mysql.conf
,mysql
读取不了 - 后面启动后查看是否配置成功,若没有,则说明没有成功
- 我这里是
master
(看下注释,不要盲目复制,不然后面更改要重启,麻烦)
[mysqld]
# 设置服务器唯一标识号
server-id=1
# 启用二进制日志,后面是名称,随意更改
log-bin=master-bin
# 指定需要复制的数据库 为空则所有数据库都复制
# binlog-do-db=
# 指定需要忽略的数据库
binlog-ignore-db=ttt
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON
slave
(看下注释,不要盲目复制,不然后面更改要重启,麻烦)
[mysqld]
# 设置服务器唯一标识号
server-id=2
# 启用二进制日志,后面是名称,随意更改
log-bin=slave-bin
# 指定需要复制的数据库 为空则所有数据库都复制
# binlog-do-db=
# 指定需要复制的数据库
binlog-ignore-db=ttt
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON
docker-compose
(注意这里不要用tab进行格式化,请使用空格)
master
version: '3'
services:
mysql-master:
image: mysql:8.0.31
container_name: mysql-master
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码
MYSQL_DATABASE: ttt # 要创建的数据库名称
ports:
- "3308:3306" # 映射到从服务器的端口
volumes:
- ./mysql-master/data:/var/lib/mysql # 挂载数据目录
- ./mysql-master/log:/var/log/mysql # 挂载日志目录
- ./mysql-master/config/:/etc/mysql/conf.d/ # 挂载从服务器的配置文件,注意版本,可能不同
command:
# 主服务器的命令参数,配置文件写了,这里可以不写,若配置文件没有挂载成功,这里可以写一下
# --server-id=1
# --log-bin=master-bin
# --binlog-ignore-db=ttt
# --binlog-format=row
# --gtid-mode=ON
# --enforce-gtid-consistency=ON
# 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
privileged: true
slave
version: '3'
services:
mysql-slave:
image: mysql:8.0.31
container_name: mysql-slave
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码
MYSQL_DATABASE: ttt # 要创建的数据库名称
ports:
- "3310:3306" # 映射到从服务器的端口
volumes:
- ./mysql-slave/data:/var/lib/mysql # 挂载数据目录
- ./mysql-slave/log:/var/log/mysql # 挂载日志目录
- ./mysql-slave/config/:/etc/mysql/conf.d/ # 挂载从服务器的配置文件,注意版本,可能不同
command:
# 主服务器的命令参数,配置文件写了,这里可以不写,若配置文件没有挂载成功,这里可以写一下
# --server-id=3
# --log-bin=slave-bin
# --binlog-ignore-db=ttt
# --binlog-format=row
# --gtid-mode=ON
# --enforce-gtid-consistency=ON
# 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
privileged: true
🌸 二、启动容器
- 在
mysql
文件夹下执行docker-compose up -d
- 也可指定运行哪一个
docker-compose up -d mysql-master mysql-slave
- 看下配置文件有没有挂载成功,以下说明成功,若没有挂载成功,可尝试在
docker-compose
的command
加配置,一样的效果,都是需要重启的,command
是启动时设置配置项,文件中已有注释。
🌸 三、配置主从信息
- 主要两步
- 进入主容器,获取主服务器状态信息
#进入容器内部
docker-compose exec mysql-master bash
#输入用户密码
mysql -u root -p
#为了避免从服务复制出现权限不足的情况需要执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 查看状态
SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+------------------------------------------+
| master-bin.000003 | 197 | | ttt | d732688d-197d-11ef-b514-0242ac120003:1-6 |
+-------------------+----------+--------------+------------------+------------------------------------------+
- 进入从容器,在服务下执行开始监听复制
#进入容器
docker-compose exec mysql-slave bash
#输入用户密码
mysql -u root -p
#配置从服务器复制
CHANGE MASTER TO MASTER_HOST='192.168.1.xxx', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3310, MASTER_LOG_FILE='master-bin.000003', MASTER_LOG_POS=197;
# 开启复制
START SLAVE;
#查看主从配置状态
SHOW REPLICA STATUS\G;
- 以下为成功
🌸 四、配置互为主从
- 第三步反过来
- 进入从容器,获取主服务器状态信息
- 进入主容器,在服务下执行开始监听复制