#集群服务高可用

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

# 心跳机制

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
-----------------------------------------------------------------------------------------
Self Host ID|Cluster Master ID|YasFS Master ID|YasDB Master ID|Active Host Count
-----------------------------------------------------------------------------------------
1       1            1                 1               1               2         
-----------------------------------------------------------------------------------------
Host ID   |Target    |State     |YasFS     |YasDB
-----------------------------------------------------------------------------------------
1          online     online     online     online     
2          online     online     online     online                     

2.当一个YCS服务器发生故障时,会进入故障处理流程。例如Host1磁盘心跳故障,Host2检测到Host1故障后,进入故障处理流程,不同服务器的故障处理不同:

  • 非主服务器:故障处理时发现发生故障的不是主服务器,则放弃投票,直接将故障服务器Host1驱逐。
  • 主服务器:如果是主服务器发生故障,备服务器检测到后,将会进入投票仲裁流程,选择出新的主服务器后,将旧的主服务器驱逐,拓扑信息如下:
$ ycsctl status
-----------------------------------------------------------------------------------------
Self Host ID|Cluster Master ID|YasFS Master ID|YasDB Master ID|Active Host Count
-----------------------------------------------------------------------------------------
2       2            2                 2               2                1         
-----------------------------------------------------------------------------------------
Host ID   |Target    |State     |YasFS     |YasDB
-----------------------------------------------------------------------------------------
1          online     offline    offline    offline     
2          online     online     online     online                     

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

abnormal found, trigger a new vote cycle

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

ycs run as primary successfully

对于非主服务器,日志打印如下信息:

try join primary

# YCSM监控

YCSM监控进程是独立运行的进程,在YCS进程启动时最先启动,YCS进程退出后退出,用于持续监控YCS进程的状态。YCSM进程具备以下能力:

  • 监控YCS进程状态并处理

    YCSM进程与YCS进程间存在本地心跳,一旦本地心跳超时,YCSM进程将强制停止并重新启动YCS进程及其所管理的数据库实例,本地心跳的超时时间与磁盘心跳的超时时间一致。

  • YCS进程掉线拉起

    当YCS进程不存在且为非正常停止状态时,YCSM进程会主动拉起YCS进程。