apache helix是一个通用的集群管理框架,既能做分布式task,也能做分布式存储,还可以做服务发现,分布式锁等,大大简化了你系统的设计,分布式系统开发过程中,一些通用的部分,它全部给你抽象实现,基于zookeeper。
那么既然是通用,那么必须要高度抽象,只有理解了抽象出来的几个概念,我们才能更好地读懂它的实现和设计原理,ok废话不多说了,撸一把。
假如我们要设计分布式task系统,那么对于一个task,有两个基本的属性,一个是位置,一个是状态。同样对于分布式存储,一个partition或者region也有位置和状态,同时,这种有位置和状态属性的东西,可以统一抽象成资源,资源分布式化,因此需要有一种平衡的理想状态。
Ideal State
"TASK_NAME" : { "LOCATION" : "STATE" }
如果你希望在N1上启动myTask,那么理想状态也可以描述成这样:
{ "id" : "MyTask", "mapFields" : { "myTask" : { "N1" : "ONLINE", } } }
Partition
分区,分区概念一般在消息系统上比较常见,比如kafka,每个topic有多个partition;对于分布式task来讲,如果一个task单机单进程搞不定,那么可以映射成子任务,这种子任务,你可以理解成storm作业的spout,bolt task,那么这种东西,统一抽象成partition,代表最小的资源颗粒。
"myTask_0", "myTask_1", "myTask_2" 运行在N1, N2 和 N3 上,那么理想状态描述成下面这样,其实这里helix的理想状态就相当于storm里的每个topology的assignment,即任务分配细节。