从零搭建 MySQL 主从复制-一主二从

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库中, 然后从库对这些日志重新执行(也叫重做), 从而使得从库与主库的数据保持同步

MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库, 实现链状复制

1. 服务器准备

CentOS7 + 2核4G + 1Mbps + 50G + 公网IP + 一个月
在这里插入图片描述

2. Docker安装

官网:http://www.docker.com

安装手册: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
  1. 将所有slave1替换slave2
  2. 将slave1的server-id改为3
  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日志中的
  1. MASTER_USER: 主库的IP地址
  2. MASTER_PORT: 主库的端口
  3. MASTER_USER: 主库账号
  4. MASTER_PASSWORD: 主库密码
  5. File填入MASTER_LOG_FILE
  6. 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. 主从复制的原理

在这里插入图片描述
从上图来看, 复制分成三步

  1. Master主库在事务提交时, 会把数据变更记录在二进制日志文件Binlog
  2. 从库读取主库的二进制日志文件Binlog, 写入到从库的中继日志Relay Log
  3. slave重做中继日志的事件, 将改变反映它自己的数据
  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiantian17)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值