探索c#之一致性Hash详解
2018-08-28 11:30
447 查看
阅读目录:
使用场景
以Redis为例,当系统需要缓存的内容超过单机内存大小时,例如要缓存100G数据,单机内存仅有16G时。这时候就需要考虑进行缓存数据分片,也即是把100G的数据拆分成多块小于单机内存的数据。例如以10G为单位,拆分10份,存储到多台机器节点上。 但是数据怎么个分法更合理呢? 、
f(key)%n
这里配置n=10,不同的key根据数值余数映射到对应的机器。 很简单的办法就解决了多台节点key分法的问题。然而数据大小的增长和缩减是很难预知的, 如果需要增加一台缓存服务器。 配置n=11,会发现之前根据余数建立的映射关系发生混乱。映射错乱后,就会发生大量key无法命中正确的节点,需要全部重新进行映射。 如果以后再添加节点,同样会遇到这样问题。
servers = ['redis:6379', 'redis:6380', 'redis:6381'] server = servers[f(key) % servers.length]
一致性hash(consistent hashing)
为了降低添加或删除服务器节点,导致大量key无法命中的影响。就提出了一种更为合理的分法,也即是一致性hash算法。 下面看下为什么更合理些?
算法原理
空间归属
我们在脑中假想下:每台节点以CHash(ip)形式计算出一个数值,n台机器有n个数值。 把数值首尾相连,形成一个虚拟圆环的数值空间。
例如有3台机器:
servers =['redis:6379', 'redis:6380', 'redis:6381']。 CHash(server[0])==100 Chash(server[1])==200 CHash(server[2])==300
把机器计算得到的数值,在虚拟圆环中按照顺时针方向来确定空间归属,得到:
public static void AddNode(string node, int repeat) { for (int i = 0; i < repeat; i++) { string identifier = node.GetHashCode().ToString() + "-" + i; ulong hashCode = Md5Hash(identifier); _circle.Add(hashCode, node); } } public static ulong Md5Hash(string key) { using (var hash = System.Security.Cryptography.MD5.Create()) { byte[] data = hash.ComputeHash(Encoding.UTF8.GetBytes(key)); var a = BitConverter.ToUInt64(data, 0); var b = BitConverter.ToUInt64(data, 8); ulong hashCode = a ^ b; return hashCode; } } public static string GetTargetNode(string key) { ulong hash = Md5Hash(key); ulong firstNode = ModifiedBinarySearch(_circle.Keys.ToArray(), hash); return _circle[firstNode]; } /// <summary> /// 计算key的数值,得出空间归属。 /// </summary> /// <param name="sortedArray"></param> /// <param name="val"></param> /// <returns></returns> public static ulong ModifiedBinarySearch(ulong[] sortedArray, ulong val) { int min = 0; int max = sortedArray.Length - 1; if (val < sortedArray[min] || val > sortedArray[max]) return sortedArray[0]; while (max - min > 1) { int mid = (max + min) / 2; if (sortedArray[mid] >= val) { max = mid; } else { min = mid; } } return sortedArray[max]; }
相关文章推荐
- 探索c#之一致性Hash详解
- 探索c#之一致性Hash详解
- c# 一致性HASH详解
- Mycat 分片规则详解--一致性hash分片
- C#的多线程机制探索详解
- dubbo中的一致性hash(ConsistentHashLoadBalance)详解
- redis多服务器一致性hash
- C#中的委托与事件详解<个人总结>
- C#之委托详解
- c#的DateTime.Now函数详解
- Redis for Windows(C#缓存)配置文件详解
- [C#] 类型学习笔记二:详解对象之间的比较
- C# 检索不区分大小写并高亮显示实例详解
- C# Process.Start()方法详解
- C#装箱和拆箱原理详解
- C#基础语法:方法参数详解
- 详解C#编程中构造函数的使用
- c#之圆形无标题栏椭圆窗体的实现详解
- 【高并发解决方案】7、一致性hash解读
- [转]C# - JSON详解