hazelcast的目标是千亿级的缓存系统,在这样的系统里,sharding和cluster是必不可少的话题.
hazelcast的sharding使用的是传统的hash+分片的技术.hazelcast服务器将缓存默认分为271个partitions,对于要存入hazelcast缓存的内容,首先需要进行如下几步处理:
a.针对key序列化
b.求hash值
c.用271对hash进行mode,得出key应该存放在哪个partition里面.
cluster的一些基本技术有:节点发现,数据迁移,数据安全等.在hazelcast里,节点发现采用的是自动发现的理念,尽量不使用配置;hazelcast对数据迁移的处理核心是partition表的维护;对于数据容错,一方面,cluster的中心采用的是年龄为大机制,谁先启动谁是中心节点,另一方面,每个partition的数据不只是存在一台服务器上,还在另外一台机器上有一个备份,如果其中一台宕掉了,另外一台里面备份数据能够用来为整个cluster做repartitioning,而不至于数据丢失.
hazelcast目前的版本支持三种类型的发现机制:
当发现机制配置为multicast 时,hazelcast会定时对局域网内可达到的机器进行广播,通知其他机器自己的存在,并期望网内的其他hazelcast服务器返回一个回应,从而确定自己不是hazelcast cluster中最老的那位(即选择cluster的leader)。
<network>
<join>
<multicast enabled="true">
<multicast-group>224.2.2.3multicast-group>
<multicast-port>54327multicast-port>
<multicast-time-to-live>32multicast-time-to-live>
<multicast-timeout-seconds>2multicast-timeout-seconds>
<trusted-interfaces>
<interface>192.168.1.102interface>
trusted-interfaces>
multicast>
<tcp-ip enabled="false">
tcp-ip>
<aws enabled="false">
aws>
join>
<network>
使用multicast配置简单,但一个,当hazelcast cluster规模比较大时,广播占用的带宽可能会比较受影响,另一个,广播的范围有限,cluster的服务器可能会分布在广播难以达到的地方。这时TCP/IP是一个较好的选择。
<hazelcast>
...
<network>
...
<join>
<multicast enabled="false">
multicast>
<tcp-ip enabled="true">
<member>machine1member>
<member>machine2member>
<member>machine3:5799member>
<member>192.168.1.0-7member>
<member>192.168.1.21member>
tcp-ip>
...
join>
...
network>
...
hazelcast>
这是基于亚马逊云服务的一种发现机制,有点类似于zookeeper的意思。在分布式cluster中,EC2 cloud作为一个中介,所有cluster都与之进行通信,寻找cluster中其他的hazelcast成员。
<join>
<multicast enabled="false">
multicast>
<tcp-ip enabled="false">
tcp-ip>
<aws enabled="true">
<access-key>my-access-keyaccess-key>
<secret-key>my-secret-keysecret-key>
<iam-role>s3accessiam-role>
<region>us-west-1region>
<host-header>ec2.amazonaws.comhost-header>
<security-group-name>hazelcast-sgsecurity-group-name>
<tag-key>typetag-key>
<tag-value>hz-nodestag-value>
aws>
join>
当cluster的hazelcast服务器个数只有一个时,所有271个partitions全部放在这个服务器上:
n=1
当cluster的hazelcast服务器个数大于一个时,271个partitions会基本平均分配到这n个服务器上去,并且,每个partition在另外的机器上会有一个拷贝的副本:
n=2
n=4
这样,当一台机器宕机后,并不会影响到整个集群数据的运行,如果两台机器宕机了,而这两台机器的partition(自己的partition+备份的partition)没有交集,也不会影响到整个cluster的运行。
cluster中每个节点都维护着一份自己的partition表。当新增或移除一个节点时,cluster中的leader负责调整整个cluster的partition的分配情况