主从复制
AB(主从)复制是一种数据复制技术,是myslq数据库提供的一种高可用、高性能的解决方案
必须先将从数据库数据清空后做完数据同步再进行主从复制
AB复制的工作原理
1.主数据库开启二进制日志,并开启一个与从数据库不同的服务ID号
2.从数据库通过I/O线程向主数据库请求二进制日志
3.从数据库将请求的二进制日志内容写入中继日志中
4.从数据库通过SQl线程读取中继日志中的内容并在数据库中执行相应动作,所有动作执行完后从数据库进入等待状态,等待主数据库执行新的动作
各个线程的作用
1.I/O线程:向主数据库请求二进制日志,并存入中继日志中
2.SQL线程:读取中继日志,并在数据库执行动作
3.binlog dump线程:发送二进制日志文件
AB复制的模式
1.一主一从
2.双主复制
3.一主多从
4.多主一从
5.联级复制
搭建MySQL主从复制
主数据库
# yum install mariadb-server
# vim /etc/my.cnf
[mysqld]
log-bin=binlog // 开启二进制日志
server-id=1 // 制定服务ID号
# systemctl start mariadb
> grant reolication slave,relication client on *.* to 'ABuser'@'192.168.210.10'
-> identified by '123'; // 授权一个实时复制数据的账号
> show master\G;
*************** 1. row***************
File: binlog.000003
Position: 1196
Binlog_Do_DB:
Binlog_Ignore_DB:
从数据库
# yum install mariadb
# vim /etc/my.cnf
[mysqld]
server-id=2 // 指定和主数据库不一样的服务号
> help change master to;
CHANGE MASTER TO MASTER_HOST='master2.mycompany.com',
MASTER_USER='replication',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
> chane master to master_host='192.168.210.5',
-> master_user='ABuser',
-> master_password='123',
-> master_port=3306,
-> master_log_file='binlog.000003',
-> master_log_pos=1196;
> start slave; // stop slavve关闭
> show slave status\G
Slave_IO_Running: Yes // I/O线程状态为Yes
Slave_SQL_Running: Yes // SQL线程状态为Yes
主从同步的延迟问题,原因及解决方案
从服务器配置过低导致延迟-->
原因:一般是主节点拥有较大规格的配置,而只读节点却购买了一个最小规格的配置,只读节点进行AB复制胡开启两个线程,分别是IO线程和SQL线程,这两个线程会消耗掉只读节点的IO资源,只读节点IOPS配置不够的时候,会导致只读节点的数据出现延迟
解决办法: 升级从服务器的配置,让只读节点的配置大于或者等于主节点的配置
主库的QPS过高导致只读节点延迟-->
原因:由于只读节点与主库的同步采用的是单线程同步,而主库的压力是并发多线程写入,导致只读节点的数据延迟
解决办法:开启只读节点的并行复制 (mysql5.6.3以后支持多线程复制)
在MySQL5.6中,引入了并发复制,这个并发复制是数据库级别的,一个SQL线程可以处理一个数据库的连续事务,而不用等待其它数据库完成.这个版本的并发复制,可以理解成一个数据库一个SQL线程
与并发有关的参数如下:
slave_parallel_workers // worker线程的个数
slave-checkpoint-group // 隔几个事务做一次
checkpointslave-checkpoint-period // 隔多长时间做一次
checkpointslave-pending-jobs-size-max // 分发给worker的,处于等待状态的event的大小上限
MySQL5.6基于库级别的并发复制可以解决业务表放在不同的database同步延迟的问题,但是在实际生产中大部分表还是放在同一个库中的,这种情况即使设置slave_parallel_workers,也无法进行并发,在高并发的情况下,依然会造成主从复制延迟.
在MySQL5.7中,引入了新的并发复制方法,基于LOGICAL_CLOCK的并发复制,可以支持在一个database中,并发执行relaylog中的事务, 相同的二进制日志组在master上提交并行应用到slave节点上,没有跨数据库的限制,并且不需要把数据分割到多个数据库
具体配置参数如下:
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
在MySQL5.7中,已经解决了主从复制延迟的问题
主库的DDL语句导致只读节点延迟-->
原因1.只读节点与主库的DDL同步是串行进行,备库消耗主库DDL操作同样的执行时间.
解决方法:无,执行之前考虑可能带来的影响
原因2.只读节点上有一个执行时间非常长的查询正在执行,那么这个查询会堵塞来自主库的DDL,读节点表被锁,直到查询结束为止,进而导致了只读节点的数据延迟
解决方法:把只读节点的查询操作杀掉,不使用"select *"命令查询
网友评论