理财平台C++定时结算任务的容灾问题的解决方案

理财平台C++定时结算任务的容灾问题的解决方案


预备知识:zookeeper

Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
简单的说:zookeeper=文件系统+通知机制。
主要功能:1、 命名服务 2、 配置管理 3、 集群管理 4、分布式锁 5、队列管理

这里主要用到集群管理功能。故其他功能不做主要介绍。

所谓集群管理无在乎两点:是否有机器退出和加入、选举master。

  • 1. 所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。新机器加入 也是类似,所有机器收到通知:新兄弟目录加入。

  • 2. 是针对zookeeper服务器集群,zookeeper的启动过程中会进行leader选举,当有写操作和slave下线时,会统一汇报给leader进行决策。

一、 问题描述

C++定时结算任务为主从模式,包含了一组常驻进程和一组定时进程,当遇到主服务器时,Crontab将发送主服务器的故障通知到运维,接着再由运维小哥手动启动备用机的定时脚本,此过程存在两个问题:

  • 无法做到实时切换,可能错过触发周期。

  • 缺乏高可用和可拓展性,手动切换费时费力。

由于后台的计息匹配算法用的是C++,并且不涉及到用户数据,为了统一语言故决定通过zookeeper集群来解决应用级的容灾问题。


二、 要解决的问题

主从服务器平滑切换定时任务的问题:当主服务器宕机时,可以开启备用机来继续定时服务,当主服务器恢复运行时,定时任务自动从备用机迁移到主服务器


三、 具体的实现思路

用zookeeper集群 + crontab 实现定时服务器的单点故障切换,利用zookeeper来控制哪个主机定时进程的停止和运行,由于c++的多数结算进程是间断运行,所以这里将重新起一个守护进程来作为zookeeper的客户端(这个守护进程代表这个服务器在线和离线的状态),负责和zookeeper交互并管理定时器的运行,通过对定时器的修改来控制结算任务的运行。这样处理的好处是:将原来的C++结算进程和定时器分离,避免修改其源代码。


框架图:

这里写图片描述

此图实现的是 : Master和Slave服务器的互相监控,协同工作,以Master为主服务器,当主服务器出现故障则切换到Slave服务器,监听到主服务器恢复则自动停止Slave服务并开始Master任务。


主要流程:

  • 1) 主从服务器的守护进程分别在zookeeper上注册临时结点 /root/master和 /root/slave。

  • 2) 从服务器监听主服务器的状态,主服务器监听从服务器状态,删除和新注册会立马通知对方。

  • 3) 当主服务器宕机时,从服务器收到消息立即启动定时器任务。

  • 4) 当主服务器恢复时,从服务器感知到主服务器上线,立刻退出定时器任务并等待当前任务运行完毕之后删除结点,这时主服务器发现从服务器退出,立即继续执行自己的定时器任务。

流程图 :

这里写图片描述

这里处理的定时服务分两类:

  • 第一种是间歇运行,这类进程控制只需要对crontab脚本进行配置即可。

  • 第二种为常驻一直运行,这类进程会在内部产生一个或多个子多进程 进行fork + execl 使其任务运行于master或slave的


四、 具体的实现过程

由于C++的大多数结算进程计算完毕后就退出,故不能和zookeeper服务器建立心跳连接,不能作为zookeeper客户端注册,所以这里新启动一个守护进程作为zookeeper的客户端,处理watch监听和控制crontab定时器,进而定时器控制C++结算进程的运行周期。好处:不干预结算进程源码的情况下控制其运行周期。

原理图:

这里写图片描述

注:这里是将定时启动任务和c++结算任务进行分离,把定时任务的调度放入一个master/slave的守护进程中,此进程一直在后台运行监听从服务器的状态并执行定时器任务。

对应函数的详细设计:
RegisterMasterToZookeeper() :主要将主从服务器的守护进程注册到zookeeper服务器中。在zookeeper的 /root根节点下创建临时子节点。

  • WatchSlave() : 监听备用机,当备用机下线时,自动接管其定时任务。
    回调WatchSlave_cb() : 调用AddMasterTimer() 添加定时器,调用RunProcess创建子进程并替换为常驻结算进程。

  • WatchMaster() : 监听主机,当主机宕机时,自动切换到备用机。
    主机重启恢复时,自动切换到主机。
    回调WatchMaster_cb() :
    a) 主机宕机则调用AddSlaveTimer() 添加定时器,调用RunProcess创建子进程并替换为常驻结算进程。
    b) 主机恢复则调用DeleteSlaveTimer() 删除定时器,并等待本次结算任务结束,最后删除注册结点。

删除和添加定时器AddSlaveTimer()、DeleteSlaveTimer():主要是对/var/spool/cron 或者 /etc/crontab 内容的添加和删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值