#集群服务高可用

集群服务高可用指的是当软件、硬件或者操作失误等原因导致集群中节点发生故障时,该节点将被踢出集群,节点上承载的业务迁移到其他节点,保证数据库服务能够正常进行。同时,当该节点的故障恢复后,将其重新纳入集群中。

# 心跳机制

YCS通过心跳机制来监控故障的发生与恢复,当检测到故障时,进入对应的故障处理流程;当检测到故障恢复时,将节点或者资源重新纳入集群管理之中。

为确保及时感知节点和资源的状态变化,YCS建立了多种心跳机制,包括:

  • 磁盘心跳

    主节点定时将心跳序号(朝代信息)写入投票盘,其他节点读取磁盘心跳,根据是否及时写入的情况判断主节点是否异常。当主节点发生异常时,其他存活节点中将会仲裁出一个节点来接管主节点的工作。

    配置参数DISK_HB_KEEP_ALIVE决定了其他节点对主节点进行探活的超时时间,一旦在DISK_HB_KEEP_ALIVE配置的时间内,主节点都没有写入磁盘心跳,则接管主节点成为新的主节点。

  • 网络心跳

    包括网络心跳一和网络心跳二:

    • 网络心跳一:所有YCS节点,两两之间都会定时发送心跳,一旦不能及时收到心跳,会认为节点异常。
    • 网络心跳二:DB通过UDS连接,定时发送心跳给YCS服务端,一旦不能及时收到心跳,会认为该资源异常。

    配置参数NETWORK_HB_TIMEOUT决定了判定资源异常的等待时间,当资源在NETWORK_HB_TIMEOUT设置的时间之间内没有心跳,则认为该资源异常,并启动异常处理流程。

# I/O Fence功能

当集群节点发生故障时,会进入故障处理流程,经过故障处理后,如果某个节点被驱逐出集群,那么与它相关联的数据库会检测到这一信息,会阻断新的IO请求,并在旧的IO处理完成后退出集群。同时如果集群节点在备升主的场景下,会等待旧的IO处理完成,再执行备升主的动作,以防止双主错误。

# 投票仲裁

当集群中的主节点在规定的超时时间内,连续丢失网络心跳(由NETWORK_HB_TIMEOUT的配置决定)或者磁盘心跳(由DISK_HB_KEEP_ALIVE配置决定),则集群会进入投票流程,将故障节点裁决掉,并选择出新的主节点。

投票流程会首先选出计票节点,然后由计票节点选中新的主节点,当原来的主节点在线时,优先选择原来的主节点作为新的主节点,以保证集群的稳定运行。

# 拓扑状态查看

通过ycsctl status命令可以查看YCS拓扑的状态,包含朝代信息、主节点、资源等等。

示例

1.发生故障前两个YCS节点的拓扑信息:

$ ycsctl status
-----------------------------------------------------------------------------------------
age    |self node id|cluster master id|yasfs master id|yasdb master id|active node count
-----------------------------------------------------------------------------------------
1       1            1                 1               1               2         
-----------------------------------------------------------------------------------------
Node      |Target    |State     |YasFS     |YasDB
-----------------------------------------------------------------------------------------
1          online     online     online     online     
2          online     online     online     online    
3          offline    offline    offline    offline    
4          offline    offline    offline    offline                   

2.当一个YCS主节点发生故障时,会进入投票流程。例如Node1磁盘心跳故障,Node2检测到Node1故障后,进入投票流程,投票结果是将Node2选为新的主节点,并驱逐原主节点Node1,拓扑信息如下:

$ ycsctl status
-----------------------------------------------------------------------------------------
age    |self node id|cluster master id|yasfs master id|yasdb master id|active node count
-----------------------------------------------------------------------------------------
2       2            2                 2               2                1         
-----------------------------------------------------------------------------------------
Node      |Target    |State     |YasFS     |YasDB
-----------------------------------------------------------------------------------------
1          online     offline    offline    offline     
2          online     online     online     online    
3          offline    offline    offline    offline    
4          offline    offline    offline    offline                   

3.当集群发起投票时,会在日志打印“abnormal found,trigger a new vote cycle”字样的信息,例如:

abnormal found, trigger a new vote cycle

4.当集群投票成功后,对于新的主节点,日志打印如下信息:

ycs run as primary successfully

对于非主节点,日志打印如下信息:

try join primary