说明:
数据库是否适合容器化,目前来说还是一个比较有争议的话题,但是在开发过程中,主从数据库的实现,在资源有限的条件下,使用docker来部署数据库是确实有需要的,所以记录下过程
一. MySql原理:
- 主数据库进行增删改操作后,相应操作记录的语句(比如 create database test)会记录到binlog日志文件中(binlog日志文件一般和数据库data文件夹在一起
- 从数据库会请求主数据库的binlog日志文件,获取到新的操作语句,然后在自己的从数据库上自动执行相同的操作语句,进而实现主从的同步。
二. 主从数据库复制过程
- Master开启bin-log功能,binlog日志主要记录数据库的增删改的操作,
- 需要开启三个线程,主数据库Master:开启I/O线程,;从数据库Slave:I/O线程,SQL线程
- 从数据库 Slave start;通过I/O线程连接Master,并且请求某个Bin-log,position 之后的内容
- 主数据库Master服务器收到从数据库Slave I/O 线程发过来的日志请求信息,然后主数据库Master I/O线程将bin-log内容,position返回给从数据库据Slave I/O线程
- 从数据库Slave收到bin-log日志内容,将Bin-log日志写入到relay-log中继日志,创建一个master.info文件,该文件记录master IP,用户名,密码,master bin-log名称,bin-log position
- 从数据库 Slave 已经开启了sql线程,由sql线程实时监测relay-log日志内容是否有更新,如果有更新,解析文件中的sql语句,并在从数据库Slave中执行相同的操作语句
三. 主从复制的实现
1). 配置主数据库Master
- 创建主数据库容器
docker run -p 3380:3306 --name MasterSql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
- 进入主数据库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
- 创建用户从数据库slave机器上获取主master机器上binlog文件的账号(即主从复制账号)
grant replication slave on . to 'USER'@'%' identified by 'USERPWD';
- 查看主数据库Master状态,并记录下binlog日志文件名以及position
# 登录mysql执行查询语句
show master status;
image.png
2). 配置从数据库Slave
- 创建从数据库容器
docker run -p 3381:3306 --name SlaveSql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
- 同样修改从数据库配置文件
# 进入从数据库容器
docker exec -it SlaveSql /bin/bash
# 添加从数据库serverid
server-id=106
# 重启数据库
systemctl restart mysqld
-
导入出数据库内容,保持一致
-
设置从数据库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
- 开启Slave
# 在从数据库下执行sql语句
start Slave;
- 验证数据库的主从状态(Slave_IO_Running和Slave_SQL_Running为YES即成功)
# 在从数据库下执行sql语句
show Slave status;
image.png
四. 检验是否成功
主数据库Master下,任意修改内容,检查下从数据库Slave是否同步
网友评论