基于Docker的MySQL主从集群部署
##没有docker环境先安装
##准备好docker-20.10.9.tgz、docker.service
tar -xvf docker-20.10.9.tgz
cp docker/* /usr/bin/
cp docker.service /etc/systemd/system/
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker
systemctl enable docker.service
systemctl status docker
一、准备工作
1.1、在每台机器上都创建配置和数据目录
创建配置文件目录
mkdir -p /data/mysql/conf/conf.d
创建数据存放目录
mkdir -p /data/mysql/data
赋予权限
chmod 777 -R /data/mysql
1.2、拉取镜像
docker pull mysql:8.0.35
相关命令:
- 查看镜像:
docker images
二、启动容器
先启动mysql主节点:(作为master主机)
docker run -d \
-p 4417:3306 \
--restart=always \
-v /data/mysql/conf:/etc/mysql \
-v /data/test/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql mysql-master:8.0.35
启动从节点:(slave)
docker run -d \
-p 4417:3306 \
--restart=always \
-v /data/mysql/conf:/etc/mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave mysql:8.0.35
命令解释:
-d
: 后台运行容器,并返回容器ID-p 4417:3306
:将容器的3306端口映射到宿主机4417端口-e MYSQL_ROOT_PASSWORD=123456
:配置数据库连接密码,生产环境注意修改-v /data/mysql/conf:/etc/mysql
:将配置文件夹挂载到宿主机-v /data/mysql/data:/var/lib/mysql
:将数据目录文件夹挂载到宿主机–name mysql-master
将容器命名为 mysql-master
三、连接测试
搭建过程中,为了减少错误的产生,可以直接拿Navicat
来进行连接测试。
注意事项
: 记得打开安全组,虚拟机的话记得处理好防火墙。(另外我这里是4417,可根据实际需要更改端口)
测试启动成功后,再来进行下一步。
四、编写主从复制配置文件
之前我们启动的时候写了这句-v /data/mysql/conf:/etc/mysql
,将mysql 的配置文件夹和宿主机的文件夹挂载起来的。
那么我们就可以直接在宿主机下的/data/mysql/conf/
编写配置文件了。
4.1、编写主机配置文件
我们先编写主机上的配置文件:
vi /data/mysql/conf/my.cnf
配置文件内容:
[mysqld]
# 设置server_id,需要唯一
server_id=1001
# 最大连接数
max_connections=512
# 每个用户最大连接数
max_user_connections=50
# InnoDB 存储引擎的缓冲池大小
innodb_buffer_pool_size=512
log_timestamps=SYSTEM
# 指定不需要同步的数据库名称
# binlog-ignore-db=testdb
# 同步的数据库名称(可以多个),如果不配置,表示同步所有的库
# binlog-do-db=wfjb_hlw
# binlog-do-db=wfjb_gaw
# 开启二进制日志功能
log-bin=mysql-bin
# 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row
# 开始事件调度器
event_scheduler=ON
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=5M
# 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
4.2、编写从机配置文件
从机上的my.cnf也是同样的方式
vi /data/mysql/conf/my.cnf
配置文件内容:
[mysqld]
# 从服务器唯一ID,不可重复
server-id=1002
# 最大连接数
max_connections=512
# 每个用户最大连接数
max_user_connections=50
# InnoDB 存储引擎的缓冲池大小
innodb_buffer_pool_size=512
log_timestamps=SYSTEM
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
全都修改完毕后重启docker容器。
五、搭建主从复制
5.1、主机设置
docker exec -it mysql-master /bin/bash #进入容器
mysql -uroot -p123456 #连接mysql
5.2、主机上建立帐户并授权slave
在master容器实例内创建数据数据同步用户
# 新建一个数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 给这个用户授予权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 考虑到MySQL8 ,密码必须修改为mysql_native_password的plugin才能被连接,不然无法连接
# 该问题未验证,先不执行该语句,若真有问题再执行
# ALTER USER 'slave'@'%' IDENTIFIED WITH caching_sha2_password BY '123456';
# 刷新权限
FLUSH PRIVILEGES;
5.3、查询master状态
show master status; # 查询master的状态
把这里的File和Position
记下来,等下在从机上要用到。
File: mysql-bin.000001
Position: 1162
Binlog_Do_DB
:需要复制的数据库。
Binlog_Ignore_DB
:不需要复制的数据库。
注意:此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化
5.4、从机设置
进入slave
容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
设置主服务器的信息
CHANGE MASTER TO MASTER_HOST='192.168.146.101',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=4417,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=157;
解释:
-
CHANGE MASTER TO MASTER_HOST=‘主机的IP地址’,
-
MASTER_USER=‘slave’(刚刚配置的用户名),
-
MASTER_PASSWORD=‘123456’(刚刚授权的密码),
-
master_port=主机开放的端口 我这里是4417端口,
-
MASTER_LOG_FILE=‘mysql-bin.具体数字’,
-
MASTER_LOG_POS=具体值(之前的Position);
启动从服务器复制功能
start slave;
查看从服务器状态
show slave status\G
注意事项
:如果在这里出现错误,执行下面两条命令重置。
stop slave;
reset master;
六、测试主从复制
在主服务器中创建新库或插入记录,查看从服务器中是否同步成功,有则主从部署成功。
七、重置配置主从
如何停止从服务复制功能
stop slave;
如何重新配置主从 (即清除之前的主从配置)
stop slave;
reset master;