docker 下 实现MySQL主从复制

说明:

数据库是否适合容器化,目前来说还是一个比较有争议的话题,但是在开发过程中,主从数据库的实现,在资源有限的条件下,使用docker来部署数据库是确实有需要的,所以记录下过程

一. MySql原理:

  1. 主数据库进行增删改操作后,相应操作记录的语句(比如 create database test)会记录到binlog日志文件中(binlog日志文件一般和数据库data文件夹在一起
  2. 从数据库会请求主数据库的binlog日志文件,获取到新的操作语句,然后在自己的从数据库上自动执行相同的操作语句,进而实现主从的同步。

二. 主从数据库复制过程

  1. Master开启bin-log功能,binlog日志主要记录数据库的增删改的操作,
  2. 需要开启三个线程,主数据库Master:开启I/O线程,;从数据库Slave:I/O线程,SQL线程
  3. 从数据库 Slave start;通过I/O线程连接Master,并且请求某个Bin-log,position 之后的内容
  4. 主数据库Master服务器收到从数据库Slave I/O 线程发过来的日志请求信息,然后主数据库Master I/O线程将bin-log内容,position返回给从数据库据Slave I/O线程
  5. 从数据库Slave收到bin-log日志内容,将Bin-log日志写入到relay-log中继日志,创建一个master.info文件,该文件记录master IP,用户名,密码,master bin-log名称,bin-log position
  6. 从数据库 Slave 已经开启了sql线程,由sql线程实时监测relay-log日志内容是否有更新,如果有更新,解析文件中的sql语句,并在从数据库Slave中执行相同的操作语句

三. 主从复制的实现

1). 配置主数据库Master

  1. 创建主数据库容器
docker run -p 3380:3306 --name MasterSql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
  1. 进入主数据库Master容器,修改mysql配置文件,设置bind-address和server-id,以及开启bin-log
# 进入主数据库容器
docker exec -it MasterSql /bin/bash

# 修改mysql配置文件
vim /etc/my.cnf

# 在[mysql]下添加如下内容
server-id = 105  # 实际上值可以随便添加
log-bin   # 开启bin-log

# 重启数据库
systemctl restart mysqld
  1. 创建用户从数据库slave机器上获取主master机器上binlog文件的账号(即主从复制账号)
grant replication slave on . to 'USER'@'%' identified by 'USERPWD';
  1. 查看主数据库Master状态,并记录下binlog日志文件名以及position
# 登录mysql执行查询语句
show master status;
image.png

2). 配置从数据库Slave

  1. 创建从数据库容器
docker run -p 3381:3306 --name SlaveSql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
  1. 同样修改从数据库配置文件
# 进入从数据库容器
docker exec -it SlaveSql /bin/bash
# 添加从数据库serverid
server-id=106
# 重启数据库
systemctl restart mysqld
  1. 导入出数据库内容,保持一致

  2. 设置从数据库Slave监听的主数据库Master

    (注: docker 下 通过" docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id)"来查询主数据库下的IP

# 进入从数据库下执行sql
change master to master_host='主数据库ip' ,  
master_port=3380,  # 
master_user='Master上设置的账户', 
master_password='Master上设置的密码', 
master_log_file='Master上mysql-binID',
master_log_pos=Master上的position
  1. 开启Slave
# 在从数据库下执行sql语句
start Slave;
  1. 验证数据库的主从状态(Slave_IO_Running和Slave_SQL_Running为YES即成功)
# 在从数据库下执行sql语句
show Slave status;
image.png

四. 检验是否成功

主数据库Master下,任意修改内容,检查下从数据库Slave是否同步

你可能感兴趣的:(docker 下 实现MySQL主从复制)