5分钟理解onecache hash算法

onecahce中的hash算法有两种:

onecache自带算法

twemproxy的ketama算法——可以实现和twemproxy的直接切换。

hash函数通过配置文件中的root节点的hash属性配置。如果需要用twemproxy的ketama算法,则配置twemproxy_mode=1。

本文主要讲解onecache自带的hash算法,twemproxy的ketama运用了一致性hash算法,可以查看twemproxy源码了解。

在onecache的自带算法中, onecache有一个最大hash值,也就是配置文件中的hash_value_max字段,目前规定的最大上限为1024。由于onecache是集群方式管理后端redis节点,因此需要给每个group分配一定的hash范围,比如hash_value_max为120,有3个group分别G1,G2,G3。则可以这样配置

G1:    hash_min=0   hash_max=39

G2:    hash_min=40 hash_max=79

G3 :     hash_min=80  hash_max=119

注意不同的group的hash值不可以重叠,也不可以超过最大值,不然onecache在检测配置文件是否合法时会报错。如果集群中的主机性能差异明显,则性能好的可以多分配几个hash值,差的则少分配几个,类似权重。分配完成之后,在onecache内部会构建一个数组,一个hash值对应一个group。

如果特定的hash值需要指定到特定的group中,则可以通过配置文件的hash_mapping节点添加,例如

 

 

客户端有请求过来之后,就可以根据key计算hash值:

 hashValue = hashFun(key) % hash_value_max;

再根据hashValue值可以在数组中很快的定位到一个group。如果这个时候的group里面的所有节点都处于挂了的状态,那也没关系,在配置文件中还有如下选项可以配置:

backend_retry_interva表示后端断开后的重试连接的间隔时间

backend_retry_limit表示后端重试连接的最大次数

auto_eject_group表示是否启用group不可用时自动移除 1=YES 0=NO

group_retry_time表示group的重试时间,超过后将会自动移除

eject_after_restore表示摘除group后,如果又变为可用状态,将会进行恢复 1=YES 0=NO

也就是这个group挂了之后,如果auto_eject_group配置1,超过了group_retry_time时间group还没有恢复,则此group会被摘除,它原有的hash值就会被其他的group均分,也就是此后本来落在这个group的key会平均分散到其他的group中。如果eject_after_restore配置了1,则这个group如果又变成了active状态,那么原本的hash值又还给了它,恢复正常状态。

 

onecache源码下载地址: https://github.com/onexsoft/onecache


版权声明:本文为decoder001原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。