C++分布式实时应用框架——状态中心模块

  上篇:(三):C++分布式实时应用框架——系统管理模块

  技术交流合作QQ群:436466587 欢迎讨论交流

  版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法律追究的权利!

  状态中心是分布式系统中不可或缺的部分。一个分布式系统动辄上百个节点,这些节点相互间通讯关系的建立和维护;运行时每个节点的实时状态数据采集和上报;系统管理模块下达集群管理命令时,命令如何传达到具体节点;集群节点故障时,如何检测发现并及时进行处理,从而避免对集群运行产生影响。这些都是在分布式实时系统设计时需要考虑的功能性问题。更不用说,分布式环境下的数据一致性、二阶段提交、脑裂、集群选主等复杂的分布式原生问题。状态中心就为了解决这一系列问题而诞生的,是CDRAF(Cpp Distributed Real-time Application Framework)之所以能称为“分布式”框架的核心和关键。

  

  一、状态中心模块构成

  状态中心主要由两个模块组成。一是运行于多台主机或者节点上的分布式状态中心集群(Distributed Status Center Cluster:DSCC)。DSCC上存储了应用集群所有节点的状态数据,节点间的连接关系,甚至做为管理命令的中转站。之所以需要部署在多个节点是为了解决分布式环境中的单点问题。并且由于数据存储了多份拷贝,DSCC还解决了数据一致性、二阶段提交、脑裂、集群选主等复杂的分布式原生问题。另一个模块是运行于分布式系统各个节点上的状态中心代理(SmartAgent),SmartAgent主要负责上面提到的分布式系统的功能性问题,包括:从DSCC上获取节点间通讯关系,建立分布式集群的通讯连接,并实时接受变更,动态地为集群增加或者删除节点;采集每个节点的实时状态数据并上报到DSCC;从DSCC上接收系统管理模块下达的管理命令并执行。下图浅绿色部分很好地诠释了这一架构。

  

  二、事件机制

  分布式状态中心集群(DSCC)通过事件机制与每个节点上的状态中心代理(SmartAgent)保持信息联系。当节点上SmartAgent对DSCC上的某个数据感兴趣,就会到DSCC上注册一个这个数据的通知。一旦DSCC上这个数据发生变化,相应注册了通知的SmartAgent就会立刻接受到这个数据的变更通知。正是这一机制保证了分布式系统数据接收的实时性,并且避免了轮询等其它方式产生的弊端。事件通知功能,是整个状态中心功能的基石,其贯穿了状态中心的各个功能模块。如:当某个计算节点运行状态发生变化,状态中心中对应于该节点状态数据即会发生变化,此时状态中心向关心此事件的SmartAgent进程发出一个状态改变的事件通知消息,消息中携带了状态数据变化节点的主机名以及事件类型信息,以供SmartAgent进程获取进行相关处理操作。

  SmartAgent初始化时,需要对其在DSCC上感兴趣的数据进行注册,由于业务的复杂性,这类数据会非常之多。在设计时候,考虑到分布式系统的复杂性,以及功能的多样性。将事件消息处理模块设计为职责链模式,链上的每个节点都对应于CDRAF的某一功能。采用这样的设计,极大了方便了CDRAF功能的扩展,在研发CDRAF过程中加入新的功能时,只要定义相关的消息,再写好对应此消息的处理代码即可。

  

  三、状态上报

  当集群某个节点启动时,由运行在此节点上的SmartAgent进程主动向DSCC上报本节点的属性数据,这些数据有:节点的IP、对外提供各类服务所对应的端口号、节点的业务类型、主机名(设置于环境变量)、节点的运行状态(正常、停止,启动中、故障等)、当前节点的处理能力(CPU、TPS、时延等),这一系列用来描述当前节点的数据。当SmartAgent获取到这些数据后,会周期性地将这些数据上传到DSCC中。其它节点的SmartAgent和系统管理模块便可以不断取得这些更新的数据。

  

  四、服务发现

  对于一个分布式集群而言,集群的节点数是可以动态扩缩容的。不同类型的业务节点对外开放的端口也是会发生变化的。按传统的做法,为每个服务访问者配置服务地址列表到本地已不再可行。目前docker容器部署技术的火热发展,很多企业的业务应用正在向docker部署转移,已不再是部署在物理机或是虚拟机上。而我们知道docker容器在启动前IP是未知的。基于这一系列的分布式系统特点,为CDRAF提供一个节点运行时服务注册中心与发现功能就成了一个必须的要素了。DSCC所具有的内部存储功能,可以很好的解决这一问题。当集群新增一个节点时,新节点向DSCC进行注册后,集群原有的其它节点便可以从DSCC中得到新节点地址和端口等信息,并与之建立新的通讯关系。

  五、容错机制

  CDRAF中对于每个节点的健康状态进行了管理,节点实时上报健康状态,并且节点与状态中心间有心跳机制。如果节点因业务故障主动告知状态中心故障状态,或因网络中断、停电、主机故障等被动原因,节点在一定时间间隔内没有主动上报健康状态。状态中心将把自己内部所存储的该节点状态描述设置为故障,并向集群中关心该节点的其它节点发送故障事件消息。其它节点在收到消息后即将消息中标记的该故障节点所自己的业务链中移出。防止其它节点继续向故障节点发送消息,导致消息处理失败。如果业务链中没有该故障节点的备用节点,系统管理模块将自动拉起一个新的节点以接替故障节点,注意在容器环境下,拉起一个新节点往往比重启一个节点来得迅速,从而保障系统的正常运行。

  

  六、优雅启停

  优雅启停功能主要是为了解决集群中某个节点退出(从网络中退出,或主动缩减节点)集群时,该节点消息队列里可能还有未处理的消息。如果直接将连接断开,那很有可能会丢失一定数量的未处理消息。虽然某些系统可以接受这样的丢消息故障,只要分发节点在一定时长内没收到响应消息就重新发送丢失的消息即可。但是这样的处理,会对分发节点造其它的问题。所以在CDRAF是我们设计了“优雅启停”这一节点主动退网功能。

  当节点要进行退网时,状中心会接收到相关的操作命令,状态中心DSCC将此命令转化成统一的事件,发送给相关的消息发送节点上的SmartAgent进程。SmartAgent进程收到事件消息后。通知本地的通讯平台的通讯监控程序。这时消息发送节点上的消息发送的进程将停止向将要退出网络的节点发送消息,并断开发送消息的连接。但是此时将要退出网络的计算节点仍在处理消息,并且处理结果通过和消息发送节点的接收连接发送回去。也就是说,这里的关键是在消息发送节点与处理节点间建立了双通道的网络链路。对于消息发送节点而言,一类链路用于发送消息,另一类链路用于接收消息。当业务节点处理完自己消息队列里所有消息时,业务节点主动断开返回的消息连接。这样就实现了不丢消息的退网功能。

   

  未完待续……

(四):C++分布式实时应用框架——状态中心模块的更多相关文章

  1. (四):C++分布式框架——状态中心模块

    (四):C++分布式框架--状态中心模块 上篇:(三):C++分布式实时应用框架--系统管理模块 技术交流合作QQ群:436466587 欢迎讨论交流 版权声明:本文版权及所用技术归属smartguy ...

  2. (五):C++分布式实时应用框架——微服务架构的演进

    C++分布式实时应用框架--微服务架构的演进 上一篇:(四):C++分布式实时应用框架--状态中心模块 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法律 ...

  3. (三):C++分布式实时应用框架——系统管理模块

    C++分布式实时应用框架--系统管理模块 上篇:(二): 基于ZeroMQ的实时通讯平台 一个分布式实时系统集群动辄上百台机器,集群的规模已经限定这将是一个"封闭"的系统.你不可能 ...

  4. (七):C++分布式实时应用框架 2.0

    C++分布式实时应用框架 2.0 技术交流合作QQ群:436466587 欢迎讨论交流 上一篇:(六):大型项目容器化改造 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同 ...

  5. C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework)----(一):整体介绍

    C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework) 在现今软件系统纷纷"云化"的浪潮下,各种支持" ...

  6. (一):C++分布式实时应用框架----整体介绍

    C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework) 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经 ...

  7. (五):C++分布式实时应用框架——支撑复杂的业务通讯关系

    C++分布式实时应用框架--支撑复杂的业务通讯关系 技术交流合作QQ群:436466587 欢迎讨论交流 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法 ...

  8. C++分布式实时应用框架——系统管理模块

    一个分布式实时系统集群动辄上百台机器,集群的规模已经限定这将是一个”封闭“的系统.你不可能再一台台去操作上百台机器,传统的人工运维方式早已不能满足当下需要,所有对集群或者集群中某个节点的操作都必需通过 ...

  9. [开源]CSharpFlink(NET 5.0开发)分布式实时计算框架,PC机10万数据点秒级计算测试说明

    github地址:https://github.com/wxzz/CSharpFlinkgitee地址:https://gitee.com/wxzz/CSharpFlink  1         计算 ...

随机推荐

  1. 微信小程序用setData修改数组或对象中的一个属性值

    在page中有如下数组 data: { info:[ { name:"yuki", tou:"../img/head.jpg", zGong:130, gMon ...

  2. PyCharm 如何安装python第三方库及插件

    一.如何安装python第三方库: 1.有一个专门可下载安装第三方库的网址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ Ctrl+f 搜索要下载的第三方库, ...

  3. 在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet

    最近在做一个项目的单元测试时,遇到了些问题,解决后,觉得有必要记下来,并分享给需要的人,先简单说一下项目技术框架背景: asp.net core 2.0(for .net core)框架 用Entit ...

  4. 基于Lua脚本解决实时数据处理流程中的关键问题

    摘要 在处理实时数据的过程中需要缓存的参与,由于在更新实时数据时并发处理的特点,因此在更新实时数据时经常产生新老数据相互覆盖的情况,针对这个情况调查了Redis事务和Lua脚本后,发现Redis事务并 ...

  5. [译]ASP.NET Core 2.0 部分视图

    问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...

  6. c++学习笔记---02---从一个小程序说起

    从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大 ...

  7. 【G彩娱乐网】作为一名程序员,我应该如何选购一台电脑?

    G彩娱乐网说到程序员专用电脑,那肯定是苹果电脑.优点有很多,比如白平衡特别准.酷炫的黑科技.特别方便的软件等显而易见的优势:也有能够增加提案通过率.专注工作提高工作效率这样的玄学buff. 但是!并不 ...

  8. android wear开发之:增加可穿戴设备功能到通知中 - Adding Wearable Features to Notifications

    注:本文内容来自:https://developer.android.com/training/wearables/notifications/index.html 翻译水平有限,如有疏漏,欢迎批评指 ...

  9. C++中类的多态与虚函数的使用

    C++的三大特性:封装.继承.多态.以前学的时候自己没去总结,记得在一本c++入门的书讲得还是比较清楚.今天上网找了一下多态,找到下面这篇文章写得比较清晰. http://pcedu.pconline ...

  10. [转载] Netty

    转载自http://lippeng.iteye.com/blog/1907279 Netty是什么? 本质:JBoss做的一个Jar包 目的:快速开发高性能.高可靠性的网络服务器和客户端程序 优点:提 ...