之前参与过缓存框架的封装与测试工作,并对一致性哈希算法进行了相关的调研。通过对spymemcached与jedis等客户端源码的阅读对一致性哈希算法的Java实现进行调研:
1. 使用TreeMap实现,TreeMap本身继承NavigatableMap,因此具备节点导航的特点
2. 通过在内存中构建虚拟节点,每个物理节点存在160(默认值,可设置)个虚拟节点映射
1. 如何处理节点故障问题
源码分析:通过hash算法获取到的节点属于问题节点便进行N次的rehash操作,若执行N次的rehash操作依然没有定位到可用节点即报错。我在测试时发现,rehash经历N次后可能依然会定位到同一个故障节点,原因是我实际的物理节点数只有两台,所以每台物理节点存在50%的概率被命中。因此我建议物理节点数尽可能的多,分担哈希环区间,减少故障节点多次被命中的情况。
2. Set操作没有涉及到冗余存储
若node-1存储成功,可以在node-2, node-3上进行冗余存储并设置TTL。若遇到node-1节点故障,failover至node-2, node-3节点,尽量保证缓存命中;多节点冗余存储涉及到一致性的问题稍微复杂,因此引入TTL尽量缓解一致性的问题。
。。。未完待续。。。
时间: 2024-10-18 06:02:41