第20章_Docker实现主从复制
友情提示
转载须知: 以下所有文章整理于B站宋红康老师的《MySQL数据库入门到大牛》。MySQL (opens new window)
# 1. 前言
mysql主从复制用途
- 实时灾备,用于故障切换
- 读写分离,提供查询服务
- 备份,避免影响业务
主从部署必要条件:
- 主库开启binlog日志(设置log-bin参数)
- 主从server-id不同
- 从库服务器能连通主库
利用docker实现mysql的主从复制,首先需要在服务器上安装好docker 及拉取相关mysql镜像:
关于docker的环境配置可以参考这里https://note.wym123.cn/docker/install/ (opens new window)
# 2. 拉取镜像到本地
docker pull mysql:tag # tag 默认不加是最新版
docker pull mysql:8.0.27 # 目前最新版本为 8.0.27
2
3
然后利用镜像分别启动两个容器,一个主机master
,一个从机slave
, master端口为3307,slave为3308对应的root密码为123456,映射配置文件和数据存储目录到 mysql。
MySQL在容器启动时创建的文件和目录都会直接出现在宿主机的挂载目录中,实现了宿主机目录和容器内目录之间的实时同步。注意宿主机路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它
启动 Master
docker run -d \
--name master \
--restart always \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /docker/master/data:/var/lib/mysql \
-v /docker/master/conf:/etc/mysql/conf.d \
-v /docker/master/log:/var/log \
mysql:8.0.27
2
3
4
5
6
7
8
9
启动Slave
docker run -d \
--name slave \
--restart always \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /docker/slave/data:/var/lib/mysql \
-v /docker/slave/conf:/etc/mysql/conf.d \
-v /docker/slave/log:/var/log \
mysql:8.0.27
2
3
4
5
6
7
8
9
# 3. 配置主机(master)配置文件
提示
这里说明一下:容器内主配置文件名叫 my.cnf,位置在 /etc/mysql
,但是官方不建议直接操作 my.cnf 主配置文件所以官方提供了 conf.d 目录,只要在 conf.d 目录下创建 xx.cnf
配置文件,那么该配置文件自动被引入 my.cnf
主配置文件,避免直接操作 my.cnf
引起安全问题。
conf目录
映射了容器内的con.d目录
,所以在master/conf/ 路径下创建 my.cnf :vim /docker/master/conf/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=1
#[必须]启用二进制日志,对应是二进制日志名称前缀。可以指定路径本地的路径/log/my-binlog,默认在/var/lib/mysql路径下
log-bin=my-binlog
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000
#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M
#[可选]设置不要复制的数据库
binlog-ignore-db=test
#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=atguigu_master_slave
# binlog-do-db=需要复制的主数据库名字
#[可选]设置binlog格式
binlog_format=STATEMENT
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 4. 配置从机(slave)配置文件
在slave /conf/路径下 创建 my.cnf 内容如下,执行命令 :vim /docker/slave/conf/my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=2
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password #设置密码规则
max_connections=1000 #最大连接数设置 根据实际需要 自行调整
2
3
4
5
6
7
8
9
10
启动完成后,分别测试下连接,发现都可以正常连接,接下来开始具体的主从配置
# 5. 主从数据同步配置
使用navicat连接 master数据库
,进行slave账户
创建及相关授权
-- 创建一个名为 'slave1' 的用户,允许从任何主机连接,密码设置为 '123456'
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
-- 授予 'slave1' 用户复制从服务器的权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
-- 为了兼容性,改变 'slave1' 用户的密码加密方式为 'mysql_native_password',
-- MySQL 8.0 默认使用 'caching_sha2_password' 加密方式,这可能会导致旧客户端连接失败
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 刷新权限,使之前的更改立即生效
FLUSH PRIVILEGES;
2
3
4
5
6
7
8
9
10
11
12
在Master进入mysql,执行show master status;
-- 显示当前MySQL服务器的二进制日志状态,此状态信息对设置复制非常重要,
-- 包括当前正在使用的二进制日志文件名和位置
SHOW MASTER STATUS;
2
3
回到linux服务器,执行命令查看master容器的ip地址
[root@wuyimin]# docker inspect --format={{.NetworkSettings.IPAddress}} master
172.17.0.2
2
然后在slave数据库服务器中根据上面得到的信息执行命令,主要是
master_log_file
和 master_log_pos
这两个参数需要根据上面语句查出来的结果进行配置,IP分配的内部地址基本就是172.17.0.2,如果不是这个地址改为 上述 查询出来的地址即可。
CHANGE MASTER TO \
MASTER_HOST='172.17.0.2', \
MASTER_USER='slave1', \
MASTER_PASSWORD='123456', \
MASTER_PORT=3306, \
MASTER_LOG_FILE='my-binlog.000001', \
MASTER_LOG_POS=156, \
MASTER_CONNECT_RETRY=30;
2
3
4
5
6
7
8
master_port
:Master的端口号,指的是容器的端口号,不要填映射的端口号
.master_user
:用于数据同步的用户master_password
:用于同步的用户的密码master_log_file
:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段
的值master_log_pos
:从哪个Position开始读,即上文中提到的Position字段
的值master_connect_retry
:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
查询下当前从服务器的状态
show slave status \G;
由于navicat 不支持 \G格式化展示,所以我们进入slave从服务器内查看
docker exec -it slave mysql -uroot -p123456
show slave status \G
2
3
可以看到这两个属性都为No 设置从数据库开启主从服务
# 启动slave同步
start slave;
2
如果中途报错,之类的,可以使用reset slave进行从服务器重置
# 先关闭同步
stop SLAVE;
# 然后重置从服务器的复制配置,包括删除现有的中继日志文件并重新初始化中继日志
reset slave;
2
3
4
如果之前的配置没配置好,第一个yes将不会正常显示 再次强调!!!即:下面这段配置一定要对应好!!
change master to master_host='172.17.0.2', master_user='slave1', master_password='123456',
master_port=3306, master_log_file='my-binlog.000001', master_log_pos=156, master_connect_retry=30;
2
执行语句后,可以看到主从服务已经开启了。
# 6. 主从同步测试
利用navicat 在主数据库新建一个TestDB数据库,然后刷新从数据库连接
刷新: 发现在主数据库添加的新库TestDB也被同步到从数据库上了,至此主从同步配置完成。 后续对主数据库做的操作都会基于binlog发送给从数据库的relaylog上进行同步。