MySQL之主从复制

docker搭建mysql主从复制

一、下载镜像

docker pull mysql:5.7.32

二、创建目录及配置文件

$ mkdir /trs/mysql/
$ cd /trs/mysql/
$ mkdir master slave
$ cd /trs/mysql/master
$ mkdir data logs
$ cd /trs/mysql/slave
$ mkdir data logs
# 进入mater目录创建配置文件 my.cnf
$ vi my.cnf
--------------------------------------
[mysqld]
# [必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配(每个mysql节点必须不一样)
server-id=1
# [必须]启用二进制日志
log-bin=mysql-bin
# 进入mater目录创建配置文件 my.cnf
$ vi my.cnf
--------------------------------------
[mysqld]
server-id=2
log-bin=mysql-bin

三、启动容器

master

sudo docker run -p 3316:3306 --name mysql_master \
-v /trs/mysql/master:/etc/mysql \
-v /trs/mysql/master/logs:/var/log/mysql \
-v /trs/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.32

slave

sudo docker run -p 3317:3306 --name mysql_slave \
-v /trs/mysql/slave:/etc/mysql \
-v /trs/mysql/slave/logs:/var/log/mysql \
-v /trs/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.32

查看结果

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS                                     NAMES
22c4c9e03476        mysql:5.7.32        "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds                    33060/tcp, 0.0.0.0:3317->3306/tcp         mysql_slave
723646be27ef        mysql:5.7.32        "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes                    33060/tcp, 0.0.0.0:3316->3306/tcp         mysql_master

四、授权

因为从节点需要读取主节点的bin_log日志,所以要在主节点为从节点开放权限

1、在master节点创建主从复制专用用户并赋权

# 进入容器
$ docker exec -it mysql_master bash 
# 连接mysql
root@723646be27ef:/# mysql -uroot -p123456
# 创建rep用户,任意ip访问,密码:test@A123456
mysql> create user 'rep'@'%' identified by 'test@A123456';
# 授权rep权限
mysql> grant replication slave,replication client on *.* to 'rep'@'%'; 

2、在slave测试

注意slave容器并不能直接连到宿主机,所以要通过docker0网桥转发,docker0虚拟网桥的默认ip是172.17.0.1

如果使用172.17.0.1还是连不通,可以尝试关掉防火墙

# 进入容器
$ docker exec -it mysql_slave bash 
# 连接mysql,连接上说明授权成功
root@723646be27ef:/# mysql -h 172.17.0.1 -P 3316 -u'rep' -p'test@A123456'

五、配置主从同步

1、查看master节点当前bin-log日志的文件名及位置

# 进入容器
$ docker exec -it mysql_master bash 
# 连接mysql
root@723646be27ef:/# mysql -uroot -p123456
# 查看bin-log
mysql> show master status;

到这里为止,主库千万不要再做任何操作,防止状态改变

2、在slave节点配置主从复制

# 进入容器
$ docker exec -it mysql_slave bash 
# 连接mysql
root@723646be27ef:/# mysql -uroot -p123456
# **配置主从同步**
mysql> change master to
    master_host='172.17.0.1',
    master_port=3316,
    master_user='rep',
    master_password='test@A123456',
    master_log_file='mysql-bin.000004',
    master_log_pos=613;

3、开始主从复制

# 开始主从复制
mysql> start slave;
# 查看状态 以下两项都为Yes,说明成功。
mysql> show slave status\G;
-----------
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
-----------

4、(如果成功不需要)错误情况

  • connect:

检查ip端口用户名密码是否正确

ip是否能ping通,mysql是否允许远程链接等

  • no:

检查bin-log 文件名或者位置是否正确

状态失败后,执行stop slave;然后修改相应的配置后,重新start slave;

六、测试

在master上建表,查看从库是否出现同样的表

在master上执行增删改查,查看从库是否执行相应的操作

参考文章

使用docker 实现MySQL主从同步/读写分离 - 西柚柠檬 - 博客园 (cnblogs.com)

MySQL主从同步详解与配置 - 知乎 (zhihu.com)

你可能感兴趣的:(MySQL之主从复制)