首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Memcached 集群,客户端自动Hash到不同服务器的兑现

2012-10-28 
Memcached 集群,客户端自动Hash到不同服务器的实现.....首先分析一下Java client 启动时的部分代码Memcach

Memcached 集群,客户端自动Hash到不同服务器的实现
.....
首先分析一下Java client 启动时的部分代码

Memcached 支持直接设置多个servers属性 来实现多个memcahced均衡,对应还有一个属性是weights,字面意思就是权重,分析了一下代码,和我想的是一样的

启动memcached的代码通常是这样的


看到这里就是开辟一些连接池的空间,然后调用了根据我们选择的hash 算法 执行populateBuckets();或者populateConsistentBuckets();

hash算法共有4种


假如我们设置的servers是 192.168.0.1:44444和192.168.0.2:22222
然后我们设置了weights是  5和3 那么
buckets list的值最终会是
[
192.168.0.1:44444,
192.168.0.1:44444,
192.168.0.1:44444,
192.168.0.1:44444,
192.168.0.1:44444,
192.168.0.2:22222,
192.168.0.2:22222.
192.168.0.2:22222.
]
然后就开始根据initCon初始连接数按servers分别创建socket
那么究竟这个buckets做什么用呢?

在我们使用set存放对象时会调用

private long getBucket( String key, Integer hashCode ) {long hc = getHash( key, hashCode );if ( this.hashingAlg == CONSISTENT_HASH ) {return findPointFor( hc );}else {     long bucket = hc % buckets.size();if ( bucket < 0 ) bucket *= -1;return bucket;}}


先不管key和hashCode,我们看到首先算出一个hc值后会直接做hc%buckets.size()实际上就是根据buckets的数量散列,最终值一定是buckets.size()范围里的一个值
然后最终server值就根据buckets.get( (int)bucket )得到,那么假如我们得到bucket是3,则参照上面buckets 里的值,得到 list.get(3)=192.168.0.1:44444 所以会根据weight设置的值的不同得到不同的server ,如果 weights设置10:1 那buckets里就是10个相同的server和另一个不同的,将来散列得到的server很大可能性是servers里设置的第一个server。






热点排行