Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1502162
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: 服务器与存储

2015-07-01 21:24:38

原文地址:TrafficServer一致性hash实现 作者:cbin_07

        TrafficServer的一致性hash实现与基于RBTree的一致性hash实现存在着比较大的差异。下面以Cluster模式的一致性哈希实现为例进行说明:

 1 数据结构

trafficser中实现一致性hash的结构为struct ClusterConfiguration,其定义如下:

struct ClusterConfiguration

{

int n_machines; //cluster包含的机器数目

ClusterMachine *machines[CLUSTER_MAX_MACHINES]; // 机器结构,256

ClusterMachine *machine_hash(unsigned int hash_value) // 计算hash在那台机器

{

return machines[hash_table[hash_value % CLUSTER_HASH_TABLE_SIZE]];

}

unsigned char hash_table[CLUSTER_HASH_TABLE_SIZE]; // hash空间 32707

...

};

2. hash空间建立过程

假设有三台serverip地址分别为1.1.1.12.2.2.23.3.3.3。则通过这三个ip地址能够分别计算出来三个hash值,再在该hash值的基础上加入随机因子计算出来另外的hash值(hash = 1103515145 * hash + 12345),依次递归可以得到三台server的一连串hash值。如下所示:

serverhash1->hash2->hash3.......hash n

hash(n) = 1103515145 * hash(n - 1) + 12345

再利用hash%/ CLUSTER_HASH_TABLE_SIZE分别得到hash tableslot,如果发生冲突则再用本hash链的下一个hash值,直至分配到一个hash tableslot。通过这样的方式依次利用server1server2server3 hash链中的hash值交替的填充hash table

备注:实现文件trafficserver/iocore/cluster/ClusterHash.cc,实现函数为:build_hash_table_machine()

3 机器变动处理

在增加一台server(假设为Server4)时,由于原有serverhash链不会发生改变。因此,通过原有的hash链中hash值得到的slot不会发生变化。只是由于交替插入的时候引入了Server4hash链,因此重新生成hash table时,server1-server3 hash链中插入hash tablehash值个数变少了。而这些少的slot正好由Server4 hash链中的hash值代替了。从而实现一致性hash

在删除一台serverServer3)时,由于原有serverhash链不会发生改变。因此,通过原有的hash链中hash值得到的slot不会发生变化。只是由于交替插入的时候由于删除了Server3hash链,因此重新生成hash table时,server1-server2 hash链中插入hash tablehash值个数变多了。而这些多的slot正好代替Server3 hash链中的hash值。从而实现一致性hash

4 不足

基于hash链的一致性hash实现在有节点变动的时候需要重建hash table,其时间复杂度为Ohash table size * hash冲突)。而基于RBTree实现的时间复杂度为Ologhash table size*虚拟node数)。因此,在一些情况下,时间复杂度会高于RBTree的实现。

阅读(1054) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~