docker安装mysql并配置一主两从

docker 离线安装MySQL8并配置一主二从

工作需要安装mysql8.0,鉴于在离线centos7主机上安装mysql8容易出现依赖缺失的问题。采用docker并离线导入镜像安装。

软件及环境参数

centos7、docker20.0.5

在一台可以外网访问、已经安装docker的主机上下拉镜像。

docker pull mysql:8

导出镜像

docker save -o mysql8.tar mysql:8

下载镜像,推荐使用sz命令

sz mysql8.tar

导入镜像

docker load -i mysql8.tar

在目标主机上创建配置文件和数据持久化文件夹

这里我创建到 /mnt/base_soft/mysql_docker 文件夹下
创建一主二从的所需文件夹
mkdir -p master/cnf master/data slave/cnf slave/data slave2/cnf slave2/data

创建两个从服务器的配置是因为MySQL配置的server-id不能重复

配置主服务器的配置文件
vim master/cnf/mysql.cnf

配置文件如下:

[mysqld]
## 配置最大连接数和连接时间,时间单位为秒
max_connections=300
wait_timeout=600
## 设置sql的mode
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
## 默认为0 0:表名大小写敏感,也就是说,MySQL 将区分表名的大小写。1:表名大小写不敏感,并且将所有表名转换为小写存储。这意味着在创建或查询表时,不会区分表名的大小写。2:表名大小写不敏感,并且将所有表名转换为大写存储。
lower_case_table_names = 1
## 设置server_id,注意要唯一
server-id=1
## 开启binlog
log-bin=mysql-bin
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
##设置字符编码为utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4

配置从服务器配置文件,主从配置是有些不一样的,salve的server-id设置为2,salve2的server-id设置为3,不重复即可

[mysqld]
## 配置最大连接数和连接时间,时间单位为秒
max_connections=300
wait_timeout=600
## 设置sql的mode
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
## 默认为0 0:表名大小写敏感,也就是说,MySQL 将区分表名的大小写。1:表名大小写不敏感,并且将所有表名转换为小写存储。这意味着在创建或查询表时,不会区分表名的大小写。2:表名大小写不敏感,并且将所有表名转换为大写存储。
lower_case_table_names = 1
## 设置server_id,注意要唯一
server-id=2
## 开启binlog
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
##设置字符编码为utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
slave_skip_errors=1062
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4

启动镜像,构建容器,运行容器,设置为自动重启,开机启动

# 主服务器实例化
docker run -itd -p 3306:3306 --name master --restart=always -v /mnt/base_soft/mysql_docker/master/cnf:/etc/mysql/conf.d -v /mnt/base_soft/mysql_docker/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=itx5Yh mysql:8 

# 1号从服务器实例化
docker run -itd -p 3307:3306 --name slaver --restart=always -v /mnt/base_soft/mysql_docker/slave/cnf:/etc/mysql/conf.d -v /mnt/base_soft/mysql_docker/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=itx5Yh mysql:8 

# 2号从服务器实例化
docker run -itd -p 3308:3306 --name slaver2 --restart=always -v /mnt/base_soft/mysql_docker/slave2/cnf:/etc/mysql/conf.d -v /mnt/base_soft/mysql_docker/slave2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=itx5Yh mysql:8

参数解释

-p 指定容器暴露的端口,宿主机(物理机)端口: docker实例端口
-p 3307:3306 把物理机的3307端口给实例的端口3306端口进行映射

-v 给容器挂载存储卷,挂载到容器的某个目录
-v /usr/local/mysqlData/master/cnf:/etc/mysql/conf.d 把刚创建的配置文件夹映射成实例的/etc/mysql/conf.d
-v /usr/local/mysqlData/master/data:/var/lib/mysql 数据文件夹的映射

-e 指定环境变量,容器中可以使用该环境变量
-e MYSQL_ROOT_PASSWORD=123456 设置MySQL的root账号密码为123456

配置主从

以下命令要进入MySQL中操作
docker exec -it master mysql -uroot -pitx5Yh

  1. 在主服务器上创建mysql连接用户
# 创建用户 reader设置密码为reader
CREATE USER reader IDENTIFIED BY 'reader';
# 给予reader同步权限
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%';
FLUSH PRIVILEGES;

注解:其余的用户,远程连接的自行设置

  1. 获取主服务器的连接信息(也可以直接使用宿主机的IP有更强的稳定性,我这里使用查询出来的容器IP会导致slave一直连接中)
# MySQL的连接信息,这个值有时候在添加slaver之后会发生变化,每次添加要刷新查看
SHOW MASTER STATUS;

#新开连接 获取master实例的在docker的地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' master

image

  1. 从服务器连接主服务器(两台均是以下操作)
# 配置连接的参数
change master to master_host='172.17.0.2',master_user='reader',master_password='reader',master_log_file='mysql-bin.000003',master_log_pos=2259;
# 启动同步
start slave;
# 查看是否成功
show slave status\G

# 两项都为Yes时代表成功。
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes

# 失败需要使用停止连接后检查其他账号密码,地址,pos等参数

# 停止连接,如果一次成功无需使用该命令
stop slave;

image

  1. 结果
    主服务器执行命令
    SHOW SLAVE HOSTS;

image

引自:https://blog.csdn.net/qq_37181910/article/details/118905118 并做了相关细化和改进

posted @ 2024-03-01 09:57  abelkeith  阅读(290)  评论(0)    收藏  举报