heike1 发表于 2015-7-20 08:45:31

redis 一致性hash

  
  使用zookeeper 实现一致性hash。
  redis服务启动时,将自己的路由信息通过临时节点方式写入zk,客户端通过zk client读取可用的路由信息。

  

服务端

  使用python 脚本写的守护进程:https://github.com/LittlePeng/redis-manager
  脚本部署在redis-server本机,定时ping redis-server
  节点失效的情况:
  1.服务器与ZK服务器失去连接 Session Expired ,环境网络波动造成,需要根据网络情况设置适当zookeeper的Timeout时间,避免此情况发生
  2. 服务器宕机,Zookeeper server 发现zkclient ping超时,就会通知节点下线
  3. redis-server 挂了,redis-manager ping 超时主动断开与zookeeper server的连接
  


客户端


  需要zkclient监控 节点变化,及时更新路由策略
  下面是C# 版本一致性hash算法:



   1:class KetamaNodeLocator
   2:      {
   3:          private Dictionary ketamaNodes;
   4:          private HashAlgorithm hashAlg;
   5:          private int numReps = 160;
   6:          private long[] keys;
   7:   
   8:          public KetamaNodeLocator(List nodes)
   9:          {
10:            ketamaNodes = new Dictionary();
11:   
12:            //对所有节点,生成nCopies个虚拟结点
13:            for (int j = 0; j < nodes.Count; j++) {
14:                  RedisCluster node = nodes;
15:                  int numReps = node.Weight;
16:   
17:                  //每四个虚拟结点为一组
18:                  for (int i = 0; i < numReps / 4; i++) {
19:                      byte[] digest = ComputeMd5(
20:                        String.Format("{0}_{1}_{2}", node.RoleName, node.RouteValue, i));
21:   
22:                      /** Md5是一个16字节长度的数组,将16字节的数组每四个字节一组,
23:                     * 分别对应一个虚拟结点,这就是为什么上面把虚拟结点四个划分一组的原因*/
24:                      for (int h = 0; h < 4; h++) {
25:   
26:                        long rv = ((long)(digest & 0xFF)
页: [1]
查看完整版本: redis 一致性hash