2.36 延迟检测

主从复制延迟检查功能,可以有效的对主从复制延迟做到监控,感知,自动化处理,来应对部分对主从数据一致性敏感的业务,防止超过容忍度的主从数据延迟导致的数据不一致问题。
主从复制延迟时间超过定义延迟时间时,dble会将该salve从dbInstance的负载均衡中剔除,直到主从复制延迟时间重新恢复到定义的延迟时间内才会再次将salve加入到dbInstance的负载均衡中。

2.36.1 延迟检测配置

启用延迟检测需要在db.xml中配置三个参数,分别为delayThreshold,delayPeriodMillis,delayDatabase,具体参数介绍可参考db.xml的章节。

 <dbGroup name="dbGroup1" rwSplitMode="1" delayThreshold="1000" delayPeriodMillis="2000" delayDatabase="test">
        <heartbeat errorRetryCount="1" timeout="10" keepAlive="60">show slave status</heartbeat>
        <dbInstance name="instanceM1" url="ip5:3306" user="your_user" password="your_psw" maxCon="200" minCon="50" primary="true">
        </dbInstance>

        <!-- can have multi read instances -->
        <dbInstance name="instanceS1" url="ip6:3306" user="your_user" password="your_psw" maxCon="200" minCon="50" primary="false">
            <property name="heartbeatPeriodMillis">60000</property>
        </dbInstance>
    </dbGroup>

配置注意事项
1.在delayPeriodMillis,delayDatabase和delayThreshold同时配置下启用该延迟检测,如果仅配置delayThreshold,那么就使用之前的延迟检测逻辑
2.开启该延迟检测会导致rwStickyTime参数失效
3.如果主节点下发语句结果失败,那么从节点默认没有延迟

2.36.2 原理

1.dble在primary="true"的mysql中新增监控表u_delay

create table if not exists delaydatabase.u_delay(
source VARCHAR(256)  NOT NULL, 
real_timestamp varchar(26) NOT NULL,
logic_timestamp BIGINT default 0);

列名解释
Source :哪个dble发起的请求,命名方式为dble_dbGgroupName_instanceName,instanceName为-DinstanceName参数
real_timestamp:物理时间戳,dble中的物理时间, dble的检测机制不依赖该字段,为保留字段
logic_timestamp:逻辑时间戳,dble的检测机制依赖该字段

2.以delayPeriodMillis周期向master-mysql发送replace into语句
3.以delayPeriodMillis周期向slave-mysql发送select语句
4.slave-mysql读取logic_timestamp字段的信息,并与master-mysql更新的logic_timestamp字段作比较,两者差值 delayPeriodMillis > delayThreshold,那么该slave-mysql将从dbInstance的负载均衡中剔除 两者差值 delayPeriodMillis < delayThreshold,如果该slave-mysql已经从dbInstance的负载均衡中剔除,那么重新将该slave-mysql加入到dbInstance的负载均衡中,如果该slave-mysql在dbInstance的负载均衡中,不做处理

2.36.2.1 如何检测延迟

master会以自增的方式更新logic_timestamp字段,slave会读取logic_timestamp字段的信息,如果结果有差值,那么差值*delayPeriodMillis就是延迟时间。

2.36.3 管理端介绍

delay_detection表

+---------------+------+-------------------+-------+--------+-------------------------+---------------------+-----------------+--------------+
| db_group_name | name | host              | delay | status | message                 | last_active_time    | backend_conn_id | logic_update |
+---------------+------+-------------------+-------+--------+-------------------------+---------------------+-----------------+--------------+
| dbGroup1      | M1   | 10.186.62.41:3312 |     0 | ok     | NULL                    | 2022-12-09 15:09:45 |             293 |            0 |
| dbGroup1      | S1   | 10.186.62.41:3309 |     0 | ok     | NULL                    | 2022-12-09 15:09:45 |             295 |            0 |
+---------------+------+-------------------+-------+--------+-------------------------+---------------------+-----------------+--------------+
2 rows in set (0.00 sec)

列描述 db_group_name:dbGroup名称
name:dbInstanceName名称
host:mysql ip和端口
delay:从节点与主节点的延迟时间
status:连接状态:ok(连接正常),error(连接异常),init(连接建立中),timeout(超时)
message:当连接不是ok时的信息
last_active_time:最后一次延迟检测响应时间
backend_conn_id:后端连接id
logic_update:逻辑更新次数,仅用于重置后端连接使用
说明:由于延迟检测连接可能在实际使用中遇到不可知的问题,会导致延迟检测一直处于无法正常工作状态,所以提供重置连接方式通过更新表中logic_update字段,来重置该mysql的连接
举例:

update delay_detection set logic_update = 1 where backend_conn_id = 26;

results matching ""

    No results matching ""