Q:为什么要实现读写分离延迟检测?


A:就好比你在ATM机存钱,你老婆收到短信后乐呵呵的拿网银APP查看,结果钱没过来。其实钱已经到账了,只是查询的ATM机节点钱还没过来。所以我们dba要监控数据,一旦发现钱没有复制到另一ATM机节点,会强制你从存钱的那个ATM机节点去查看。


读写分离可以通过php yii框架、java mybatis框架实现,但主从复制的延迟检测一直是重难点,OneProxy内部支持主从复制延迟检测的功能,主要通过如下两种方式进行实现。


  1. 通过检测从库的Seconds_Behind_Master参数的值来实现。这也是OneProxy检测主从同步复制延迟的默认方式,在后台中可以看到延迟的Seconds,超过设定的延迟时间,OneProxy会停止向延迟从库分发流量(已经过测试)。

oneproxy检测主从复制同步延迟_第1张图片


2.OneProxy自己建立一张table,每秒进行update,来检测同步复制延迟,很像Percona的pt-heartbeat工作 原理(pt-heartbeat通过真实的复制数据来确认mysql复制延迟,这个避免了对复制机制的依赖,从而能得出准确的落后复制时间,包含两部分: 第一部分在主上pt-heartbeat的–update线程会在指定的时间间隔更新一个时间戳,第二部分是pt-heartbeat的–monitor 线程或者–check线程连接到从上检查复制的心跳记录(前面更新的时间戳),并和当前系统时间进行比较,得出时间的差异。) 超过设定的延迟时间,OneProxy会停止向延迟从库分发流量(已经过测试)。

表名:oneproxy_replication_check

oneproxy检测主从复制同步延迟_第2张图片


可以通过控制SQL,加上/* master */来强制走主库,例如涉及到金额的查询。


注:采用中间件的好处是前段代码改动小。


如下图所示:

oneproxy检测主从复制同步延迟_第3张图片