IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

分布式系统hash策略

Hello DBA 2010-05-26 09:43:22 累计浏览 5,281 次
本机暂存

   分布式系统的hash策略,决定了数据的分布。传统的方式采用mod n的算法,非常简单,但是一旦节点发生变化,所有的数据都需要重组,代价非常大。一致性哈希(Consistent hash)很好的解决了这个问题,当节点发生变化时,只会影响到部分数据,而且永远可以找到一个提供服务的节点。

   对于数据库Sharding的架构,Consistent hash并不十分适合,我们采用了一种新的hash策略,我将其称之为“Virtual Partition Hash”策略。

   为了解决节点数量变化时,全部数据需要重组的问题,我们采用了预分区的策略,将整个系统分为很多个Virtual Partition,每个物理节点由多个Virtual Partition组成。比如整个系统分为128个VP,共有8个物理的服务器,每个服务器包含16个VP的数据,只要整个系统的物理节点小于128个,增加节点只需要移动部分VP就可以了,避免了数据重组的问题。另外,为了提高可用性,每个物理节点都有一套备机,如果节点失效则切换至备用节点。

   新增一个物理节点:

   原图已失效

   只需要移动部分VP至新节点,不需要数据重组。

   原图已失效

   Virtual partition hash策略非常简单,实现也很容易,实际上它是Consistent hash策略的一个简化版本,Oracle hash分区也是类似的做法,尽可能的减少数据重组的代价,可以参考我以前的文章《Oracle hash分区的秘密》。

   这个策略的另外一个好处是非常灵活,可以根据服务器压力的情况,通过移动VP的来达到负载均衡的目的。利用MySQL数据库复制的特性,移动VP是非常容易的,而且配合我们的分布式数据库架构,可以做到对应用透明。

   这个方案的缺点是:每个节点都准备一台备机,硬件资源比较浪费。但是如果可以和读写分离架构配合起来,备机可以承担部分读的服务,那么这个缺点就不存在了。

   “Simple but Incomplete Solutions Win!”原图已失效

同分类推荐文章

  1. Go 实验特性详解 (2026-06-21 10:05:27)
  2. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)
  3. Loop Engineering 实践:我把 RDMA 开发库移植到 Go 语言,花费 239 块钱 (2026-06-17 04:00:24)

查看更多 后端 文章 →

建议继续学习

  1. Zookeeper工作原理 (累计阅读 12,163)
  2. 关于memcache分布式一致性hash (累计阅读 11,801)
  3. 一致性哈希算法及其在分布式系统中的应用 (累计阅读 9,164)
  4. Storm:最火的流式处理框架 (累计阅读 7,435)
  5. 消息分发的同步均衡策略 (累计阅读 6,195)
  6. 各消息队列软件产品大比拼 (累计阅读 6,187)
  7. 如果用户在5分钟内重复上线,就给他发警告,问如何设计? (累计阅读 6,014)
  8. 解析Google集群资源管理系统Omega (累计阅读 5,939)
  9. 阿里巴巴国际站P4P引擎系统简介 (累计阅读 5,300)
  10. 趣图三幅:负载均衡算法需要改进 (累计阅读 5,011)