libmemcached选择server的几种方法

最近在本地环境上测试memcached集群怎么实现动态扩容。看了一下libmemcached中选择server的代码,做一个简单的总结。

主要涉及的代码:

// 增删服务结点时,重新计算数据分发需要的参考值
memcached_return_t run_distribution(Memcached *ptr);
enum memcached_server_distribution_t;
// 通过key哈希值得到服务结点索引值,操作数据相关的操作都会用到该函数
static uint32_t dispatch_host(const Memcached *ptr, uint32_t hash);

枚举memcached_server_distribution_t表示多种分发方式

enum memcached_server_distribution_t {
  MEMCACHED_DISTRIBUTION_MODULA,       // key_hash % server_count
  MEMCACHED_DISTRIBUTION_CONSISTENT,   // key_hash和server_hash比较
  MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA, // key_hash和server_hash比较
  MEMCACHED_DISTRIBUTION_RANDOM,       // 随机值 % server_count
  MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY, // key_hash和server_hash比较
  MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED, // key_hash和server_hash比较
  MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET,      // key_hash & (bucket_size-1)
  MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
};

主要分为四大类:

  1. 基于key_hash取模
    MEMCACHED_DISTRIBUTION_MODULA
    实现:对key取哈希值,哈希算法支持配置,支持很多种。用key_hash对服务器个数取模就可以得到服务器的索引了。
    缺点:当增删服务结点时,所有的key必须进行rehash。
  2. 基于Ketama一致性哈希算法
    MEMCACHED_DISTRIBUTION_CONSISTENT
    MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
    MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
    MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED
    实现:基于server的某些key取哈希值,并将哈希值和server索引的映射关系保存起来。对key取哈希值,用key_hash和所有server_hash进行比较,如果server1_hash < key_hash < server2_hash,则将数据server1_hash对应的结点上。
    这样实现,就可以保证增删服务结点时,只对小部分的key进行rehash。
    比如:新插入一个服务结点,得到server3_hash满足server1_hash < server3_hash < server2_hash,此时只需要将server1上key_hash大于server3_hash的key迁移到server3上即可。
  3. 基于随机数取模
    MEMCACHED_DISTRIBUTION_RANDOM
    实现:每次需要操作数据时,都获取一个随机数random,通过random % server_count得到服务结点索引。如果有大于1个以上的服务结点,数据被添加到内存后,再找到它就难了。
    测试代码:
    ret = memcached_behavior_set_distribution(memc, MEMCACHED_DISTRIBUTION_RANDOM);

    测试结果:
    这里写图片描述
    添加key1:data1后,紧接着查询,查询失败。
  4. 基于桶
    MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET
    这个还没分析代码,后续补上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值