5分钟理解onecache hash算法
Posted 平民软件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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值又还给了它,恢复正常状态。
以上是关于5分钟理解onecache hash算法的主要内容,如果未能解决你的问题,请参考以下文章
Hash算法在区块链中如此重要,三分钟让小学生理解Hash算法
好文章收藏--五分钟理解一致性哈希算法(consistent hashing)
五分钟理解一致性哈希算法(consistent hashing)
每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)