从零搭建MySQL主从复制-一主二从
文章目录
- 从零搭建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=db1
# 设置不需要复制的数据库
binlog-ignore-do-db=db2
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.114.9',
MASTER_PORT=3307,
MASTER_USER='tt_slave',
MASTER_PASSWORD='tiantian',
MASTER_LOG_FILE='binlog.000003',
MASTER_LOG_POS=1072;
-- 开始复制,执行:
START SLAVE;
-- 检查复制状态 若 "Last_XX_Error" 字段没有内容则搭建成功了
SHOW SLAVE STATUS
3.2.3 测试: 当主库创建数据库表从库能查询到
4. 主从复制的原理
从上图来看, 复制分成三步
- Master主库在事务提交时, 会把数据变更记录在二进制日志文件
Binlog
中 - 从库读取主库的二进制日志文件
Binlog
, 写入到从库的中继日志Relay Log
- slave重做中继日志的事件, 将改变反映它自己的数据