搭建MySQL主从集群,主从复制过程中同

上一节我们成功搭建了主从复制、读写分离,实际上并发量和数据量不大的情况下,使用起来也是非常的流畅,无任何问题,可以正常运行了。

但是,要保证高可用,高并发的情况,可以写数据库master就有累了,从服务器slave读取数据也很累,在复制的过程中就产生了数据同步延迟问题,导致主服务器上有数据,从服务器没有数据情况,最终导致读写分离失效,访问数据失败。

有的网友就说我们可以升级主服务器的配置来解决,我说可以解决暂时的,一台服务器再怎么升级也有极限,如果使用多台服务器并且可以扩容的话,我们不是很好处理这个问题吗?

好了,我们这一节正要讲解同步延迟问题,解决掉数据同步延迟问题。

一、主从优势

其中Master主服务器负责写操作的负载,也就是说一切写的操作都在Master上,而读的操作则分摊到Slave从服务器上,这样一来的可以大大提高读取的效率。

为什么要分离读和写呢?写操作涉及到锁的问题,不管是行锁还是表锁还是块锁,都是比较降低系统执行效率的事情。

我们这样的分离是把写操作集中在一个节点上,而读操作其他的N个节点上进行,有效的提高了读的效率,保证了系统的高可用性。

二、复制过程

1)、Mysql的主从同步就是当master(主库)发生数据变化的时候,会实时同步到slave(从库)。

2)、主从复制可以水平扩展数据库的负载能力,容错,高可用,数据备份。

3)、不管是delete、update、insert都是在master上,当master有操作的时候,slave会快速的接受到这些操作,从而做同步。

三、主从同步的延迟的原因:

(1)、主库延迟问题

当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。

首要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高。

次要原因:读写binlog带来的性能影响,网络传输延迟。

(2)、从库同步延迟问题

1)、相关同步参数:首先在服务器上执行showslavesatus; 

Master_Log_File:SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称Read_Master_Log_Pos:在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置

Relay_Log_File:SQL线程当前正在读取和执行的中继日志文件的名称Relay_Log_Pos:在当前的中继日志中,SQL线程已读取和执行的位置Relay_Master_Log_File:由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称Slave_IO_Running:I/O线程是否被启动并成功地连接到主服务器上Slave_SQL_Running:SQL线程是否被启动Seconds_Behind_Master:从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。

●showslavestatus显示参数Seconds_Behind_Master不为0,这个数值可能会很大●showslavestatus显示参数Relay_Master_Log_File和Master_Log_File显示bin-log的编号相差很大,说明bin-log在从库上没有及时同步,所以近期执行的bin-log和当前IO线程所读的bin-log相差很大

●mysql从库数据目录下存在大量mysql-relay-log日志,该日志同步完成之后就会被系统自动删除,存在大量日志,说明主从同步延迟很厉害。

2)、DDL的IO问题

DML和DDL的IO操作是随机的,不是顺序的,成本高很多,还可能slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延迟,比如:主库上那个相同的DDL也需要执行5分钟,为什么slave会延时?,答案是master可以并发,Slave_SQL_Running线程却不可以。

四、主从同步的延迟的解决方案(重点):

1)、架构方面

1.业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力。

2.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。

3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。

4.不同业务的mysql物理上放在不同机器,分散压力。

2)、硬件方面

1.采用好服务器,比如4u比2u性能明显好,2u比1u性能明显好。2.存储用ssd或者盘阵或者san,提升随机写的性能。

3.主从间保证处在同一个交换机下面,并且是万兆环境。

总结,硬件强劲,延迟自然会变小。一句话,缩小延迟的解决方案就是花钱和花时间。

3)、mysql主从同步加速

1、sync_binlog在slave端设置为0

2、logs-slave-updates从服务器从主服务器接收到的更新不记入它的二进制日志。

3、直接禁用slave端的binlog

4、slave端,如果使用的存储引擎是innodb,设置innodb_flush_log_at_trx_


转载请注明:http://www.aierlanlan.com/rzdk/1722.html