|   登录   |   注册   |   设为首页   |   加入收藏   

用户登录

close

用户名:

密码:

新用户注册

close

用户名:

密码:

密码确认:

电子邮箱:

关注内容:

个人主页:

帮助

close

龙宇网成立于2008年3月,网站进入整体运作于2010年10月1日。

在这里,我们把它做成了一个真正意义上的网站,完全以个人的信息为内容,以网友的需要为主导,全力搜罗各种信息,建立完善的网站功能,使网友在这里可以第一时间找到所需要的信息。

现在,经过三年的努力,网站的资料已经相当丰富,而网站得到了大家的喜爱和认可。

但,我们还是会继续努力下去,让网间的这份快乐继续持续下去,让这份闲暇时的日子,与快乐一并同行。

寻觅快乐,网住快乐,关注网络,是龙宇网的宣言与承诺。

高可用系统基础组件

标签: 分布式锁
分类: 流式计算 发布时间: 2018-02-26 17:26:55 浏览次数: 502
内容提要: 高可用系统的基础组件分布式锁是核心功能, 在这篇文章来说说如果通过分布式锁打造一款高可用系统的基础组件。

高可用系统的基础组件分布式锁是核心功能, 在这篇文章来说说如果通过分布式锁打造一款高可用系统的基础组件。

我们的日常系统来个大概分类,定时任务和常驻内存服务,我们服务无非就这两种。而定期任务我们又可以细分为两小类:有依赖定期服务和无依赖定期服务。常驻内存的服务又分为有状态的常驻内存服务和无状态的常驻内存服务。上述四类服务是否包含了我们日常的服务系统了呢,在此四类的基础上构建一套高可用基础组件,他可以满足我们的大部分的需求,我们在开发业务系统的时候,只需要做业务逻辑就够了,高可用完全交给它去做。

下面所有的实现都是在zookeeper的基础上实现,几年前在zookeeper刚刚出来的时候还没有认识到它的伟大,现在看来,zookeeper对的起动物管理员这个角色了。

每个业务逻辑服务在zookeeper创建一个node节点。

1、无依赖的定时任务

node节点内容:定时任务执行时间(exctime)、预估执行时间(timeout)、任务状态(taskfalg)

系统基础组件监控任务节点,发现到执行时间将任务启动,然后开始倒计时,如果在预估执行时间任务为结束,就认为执行失败,汇报任务执行状态,后续处理,可以让任务再次执行,可以发报警邮件通知RD和OP介入。

2、有依赖定时任务

node节点内容:定时任务执行时间(exctime)、预估执行时间(timeout)、任务状态(taskfalg)、上级任务节点(pre-node)

在无依赖定时任务基础上增加依赖节点的ID, 在任务执行的时候检测上级节点是否执行成功,如果未执行成功,但是时间已经到了执行时间,我们需要报警人工处理或者采取其他策略。只需增加这么一点,我们就轻轻松松处了有依赖服务。在这个简单的设计里边,我们牺牲了部分效率。但是我们换来的系统的够简单,够稳定。写一行的hello word都不会出错,写一对带逻辑的hello word就说不好了。在依赖任务里边,我们始终保证下游对上游任务的状态查看即可,其他什么事情都不需要做,而作为上游任务只管执行自己的任务就行,其他都不管。

3、无状态的常驻内存的服务

这个太简单了,无状态以为这可以随便执行, 方正只要保证有任务在跑就行,一个或者多个跑没有影响。只需在zookeeper的node节点中记录一个run的最后心跳时间戳就可以了。

4、有状态的常驻内存的服务

这个相对无状态就要复杂很多,一字只差,问题难度却是相差万里。k8s做了N个版本才开始支持有状态,但是这个有状态还是各种坑。在这里介绍一种极简的通用方案,我们不讲效率只讲稳定,可靠。

在任务的node节点中保存一个状态数据,根据自己的业务情况,可能是个int,也可能是一个string, 同时要保存业务汇报心跳时间戳,这个不管有状态还是无状态都需要的时间戳, 常驻内存我们就要靠这个时间戳来反应任务的健康度了。大家都知道zookeeper是一个集群,集群中的点,也会故障,在单个点故障的情况下,我们需要切换,但是这个时候,我们的业务任务怎么办呢,按着刚才提到的设计原则,我们要保证稳定,为了避免出现脑裂,我们需要将业务服务停止,如果是由于网络闪断导致暂时中断,我们再次将服务启动就可以了。

另外一个点就是,我们既然目标是一个基础服务, 我们就要支持各种语言。C++、JAVA等, 那我们可以通过脚本来进行服务解耦,将业务服务的起停放置到脚本中,而高可用基础服务只管调用起停脚本即可,其他都不需要关心。这样起停脚本就可以起停任何语言的业务服务了。当然,这里还有好多细节要处理,好多异常要处理,总体的结构就这样了。

有了一个这样的高可用基础服务,我们再写业务服务的时候是不是很轻松了呢。

PS:目前只是实现了有状态的常驻内存的基础组件,最复杂的一种情况。其他都未支持。

 

16
28

分类: 流式计算   |   评论: 0   |   引用: 0   |   浏览次数: 502