docker环境下mysql主从复制的简单实现

主节点配置

1、获取mysql5.7镜像

docker pull mysql:5.7

2、创建主节点

docker run -d --name mysql-5.7-master \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD="root" \
-v /opt/software/docker/mysql-master/conf/:/etc/mysql/conf.d \
-v /opt/software/docker/mysql-master/data:/var/lib/mysql \
-v /opt/software/docker/mysql-master/logs:/logs docker.io/mysql:5.7 

3、修改主节点配置文件

vim /opt/software/docker/mysql-master/conf/my.cnf

将下面的配置写进my.cnf文件中

[mysqld]
# 同一局域网内需要唯一
server-id=1
# 开启二进制日志功能, 名称随便取
log-bin=master-bin

innodb-file-per-table=ON
skip_name_resolve=ON

4、重启master节点

docker restart mysql-5.7-master

5、查看masterbin_log状态

进入容器

docker exec -it mysql-5.7-master /bin/bash

进入容器后连接容器内的mysql

mysql -u root -p

输入密码,连接上后,查看bin_log信息

mysql> show global variables like '%log_bin%';
image-20211019154629200

可以看到log_bin已经开启了。

再查看下日志文件

mysql> show master logs; -- 或者 show binary logs;
image-20211019160617610

6、在master节点创建有复制权限的用户,用户名为repluser,密码为replpassword,授权REPLIACTION SLAVEREOPLIATION CLIENT

grant replication slave, replication client on *.* to 'repluser'@'172.17.0.%' identified by 'replpassword';

刷新权限

flush privileges;

172.17.0.%表示用户repluser只有在ip地址为172.17.0.xxx的时候才能连接,为了省事,可以直接设置为%,可从任意地址访问。这个地址是我docker容器的地址网段,可以通过inspect命令查看容器环境。如下的命令可得到容器对应的ip地址。

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-5.7-master

执行上述命令后得到master节点的ip地址:172.17.0.2,这个地址后面需要配置到从节点中。

从节点配置

这里暂时只配置一主一从,所以从节点只有一个。

1、创建从节点slave,与创建master时一样,但换个宿主机端口,3306已被master节点占用了

docker run -d --name mysql-5.7-slave\
-p 3307:3306\
-e MYSQL_ROOT_PASSWORD="root"\
-v /opt/software/docker/mysql-slave/conf/:/etc/mysql/conf.d\
-v /opt/software/docker/mysql-slave/data:/var/lib/mysql\
-v /opt/software/docker/mysql-slave/logs:/logs docker.io/mysql:5.7 

2、修改主节点配置文件

# 创建并修改文件
vim /opt/software/docker/mysql-slave/conf/my.cnf

将下面的配置写进my.cnf文件中,开启中继日志

[mysqld]
relay-log=relay-log
relay-log-index=relay-log.index
# id不能与master一样
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON

3、重启master节点

docker restart mysql-5.7-slave

4、查看masterbin_log状态

进入容器

docker exec -it mysql-5.7-slave /bin/bash

进入容器后连接容器内的mysql

mysql -u root -p

输入密码,连接上后,查看日志配置信息

image-20211019163331538

5、设置主节点信息,并设置主节点日志文件信息

在上面查看日志信息无误后,先断开当前从节点的mysql连接,不用退出容器,然后连接到主节点的mysql

mysql> exit;
Bye
root@698aa1342290:/# mysql -h 172.17.0.2 -u root -p
Enter password: 

输入密码后,连接到master节点,查看日志信息

mysql> show master logs;
image-20211019170744140

先记住上面的最后一个日志文件信息,接下来断开master节点的连接,回到slave节点进行配置。

mysql> CHANGE MASTER TO MASTER_HOST='172.17.0.2',MMASTER_USER='repluser',MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=632;

查看状态

mysql> show slave status\G;
image-20211019171043802

可以看到IO线程和SQL线程都没有启动,这是因为没有启动从节点的复制线程,接下来启动它。

mysql> start slave;

start slave不带参数则同时启动IO线程和SQL线程,相当于start slave io_thread;+start slave sql_thread;

image-20211019171303997

6、测试

master中创建一个数据库,看看slave中是否也存在这个库。

master

mysql> create database `ms_db` default character set utf8mb4;

slave

mysql> show databases;

如果在slave中存在数据库ms_db,则说明测试成功,主从复制已实现。

优化

虽然主从复制是实现了,但还有好多地方需要在实践中进行优化,例如主从同步延迟,事务数据一致性问题等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值