主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库中, 然后从库对这些日志重新执行(也叫重做), 从而使得从库与主库的数据保持同步
MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库, 实现链状复制
1. 服务器准备
CentOS7 + 2核4G + 1Mbps + 50G + 公网IP + 一个月
2. Docker安装
安装手册:https://docs.docker.com/install/linux/docker-ce/centos(CE-社区版)
2.1、安装需要的软件包
yy -utils提供了yy-config-manager相关功能,device-mapper-persistent-data和lvm2是设备映射器驱动程序所需要的。
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
2.2、设置docker下载镜像
推荐阿里云下载地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.3、更新yum软件包索引
我们在更新或配置yum源之后,通常都会使用yum makecache 生成缓存,这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
yum makecache fast
2.4、安装docker ce
yum install -y docker-ce
2.5、启动docker
systemctl start docker
2.6、版本验证
docker version
2.7、设置开机启动
#查看服务是否自动启动(是:enabled | 否:disabled)
systemctl list-unit-files|grep docker.service
#设置开机启动:如不是enabled可以运行如下命令设置自启动
systemctl enable docker
#重新加载服务配置
systemctl daemon-reload
#如果希望不进行自启动,运行如下命令设置
systemctl disable docker
#重新加载服务配置
systemctl daemon-reload
3. MySQL主从部署
3.1 部署MySQL master节点*1
3.1.1 创建容器
- 端口:
3307
密码: tiantian
docker run -d \
-p 3307:3306 \
-v /tiantian/mysql/master/conf:/etc/mysql/conf.d \
-v /tiantian/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=tiantian \
--name tt-mysql-master \
mysql:8.0.29
3.1.2 设置唯一Id
# 编辑my.cnf文件
vi /tiantian/mysql/master/conf/my.cnf
# 追加以下内容
[mysqld]
# mysql服务ID, 保证整个集群中唯一
server-id=2
# 是否只读, 1:只读 0:读和写
read-only=0
binlog_format=STATEMENT
# 设置需要复制的数据库,默认复制全部
# binlog-do-db=xxx
# 设置不需要复制的数据库
# binlog-ignore-do-db=xxx
3.1.3 重启mysql
docker restart tt-mysql-master
3.1.3 master中创建slave用户并授权[可直接用可视化工具创建]
- 账号: tt_salve
- 密码: tiantian
create user 'tt_salve'@'%';
alter user 'tt_salve'@'%' IDENTIFIED WITH mysql_native_password BY 'tiantian';
GRANT REPLICATION SLAVE ON *.* TO 'tt_slave'@'%';
FLUSH PRIVILEGES;
3.1.4 记录主库binlog
日志中的初始位置, 等会搭建主从时要用到
字段含义说明
- File: 从哪个日志文件中开始推送日志
- Position: 从哪个位置开始推送日志
- binlog_ignore_db: 指定不需要同步的数据库
3.2 部署MySQL slave节点*2
3.2.1 启动容器
- 端口
3308
,3309
- 密码 tiantian
- 将所有slave1替换slave2
- 将slave1的server-id改为3
- 将slave2的server-id改为4
docker run -d \
-p 3308:3306 \
-v /tiantian/mysql/slave1/conf:/etc/mysql/conf.d \
-v /tiantian/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=tiantian \
--name tt-mysql-slave1 \
mysql:8.0.29
# 编辑文件my.cnf
vi /tiantian/mysql/slave1/conf/my.cnf
# 写入以下内容
[mysqld]
server-id=3
# 是否只读, 1:只读 0:读和写
read-only=1
binlog_format=STATEMENT
# 重启mysql
docker restart tt-mysql-slave1
3.2.2 在从机上配置主从关系, 将一开始查询到的binlog日志中的
MASTER_USER
: 主库的IP地址MASTER_PORT
: 主库的端口MASTER_USER
: 主库账号MASTER_PASSWORD
: 主库密码File
填入MASTER_LOG_FILE
中Position
填入MASTER_LOG_POS
中
CHANGE MASTER TO
MASTER_HOST='8.138.xxx.9',
MASTER_PORT=3307,
MASTER_USER='tt_slave',
MASTER_PASSWORD='tiantian',
MASTER_LOG_FILE='binlog.000003',
MASTER_LOG_POS=1072;
-- 开始复制,执行:
START SLAVE;
-- 检查复制状态 观察Slave_IO_Running和Slave_SQL_Running两个字段的值,如果它们都为Yes,则表示当前处于主从同步状态。
SHOW SLAVE STATUS
3.2.3 测试: 主库创建数据库表从库能查询到
4. 关闭主从同步
4.1 停止从服务器的复制进程
在从服务器上,执行STOP SLAVE;命令来停止复制进程。这个命令会立即停止从服务器从主服务器接收和应用二进制日志中的事件。
4.2 清除从服务器的复制配置(可选)
如果希望彻底关闭主从同步,并且不再希望将来恢复它,可以执行RESET SLAVE;命令。这个命令会删除从服务器上的所有复制信息,包括二进制日志的位置和从服务器ID等,使得从服务器不再尝试与主服务器进行同步。
5. 主从复制的原理
从上图来看, 复制分成三步
- Master主库在事务提交时, 会把数据变更记录在二进制日志文件
Binlog
中 - 从库读取主库的二进制日志文件
Binlog
, 写入到从库的中继日志Relay Log
- slave重做中继日志的事件, 将改变反映它自己的数据