Sharding 策略
数据 Sharding 的策略与分区表的方式有很多类似的地方有基于表ID 范围数据产生的时间或是SOA理念下的基于服务等众多方式可选择而与传统的表分区方式不同的是Sharding 策略和业务结合的更为紧密成功的 Sharding 必须对自己的业务足够熟悉进行众多可行性分析的基础上进行业务逻辑驱动
Sharding 实现案例分析Digg 网站
作为风头正劲的 Web 网站之一的 Diggcom虽然用户群庞大但网站数据库数据并非海量去年同期主数据大约只有 GB 的样子现在应该更大一些但应该不会出现数量级上增长数据库软件采用 MySQL xDiggcom的 IO 压力非常大而且是读集中的应用(%的 IO 是读请求)因为提供的是新闻类服务这类数据有其自身特点最近时间段的数据往往是读压力最大的部分
根据业务特点Diggcom 根据时间范围对主要的业务数据做 Sharding把不到 % 的热数据有效隔离开来同时对这部分数据用以更好的硬件提供更好的用户体验而另外 % 的数据因用户很少访问所以尽管访问速度稍慢一点对用户来说影响也很小通过 ShardingDigg 达到了预期效果
现有的Sharding 软件简介
现在 Sharding 相关的软件实现其实不少基于数据库层DAO 层不同语言下也都不乏案例限于篇幅作一下简要的介绍
MySQL Proxy + HSCALE
一套比较有潜力的方案其中 MySQL Proxy (http://forgemysqlcom/wiki/MySQL_Proxy) 是用 Lua 脚本实现的介于客户端与服务器端之间扮演 Proxy 的角色提供查询分析失败接管查询过滤调整等功能目前的 版本还做不到读写分离HSCALE 则是针对 MySQL Proxy 插件也是用 Lua 实现的对 Sharding 过程简化了许多需要指出的是MySQL Proxy 与 HSCALE 各自会带来一定的开销但这个开销与集中式数据处理方式单条查询的开销还是要小的
Hibernate Shards
这是 Google 技术团队贡献的项目(http://wwwhibernateorg/html)该项目是在对 Google 财务系统数据 Sharding 过程中诞生的因为是在框架层实现的所以有其独特的特性标准的 Hibernate 编程模型会用 Hibernate 就能搞定技术成本较低相对弹性的 Sharding 策略以及支持虚拟 Shard 等
Spock Proxy
这也是在实际需求中产生的一个开源项目Spock(http://wwwspockcom/)是一个人员查找的 Web 网站通过对自己的单一 DB 进行有效 Sharding化 而产生了Spock Proxy(http://spockproxysourceforgenet/ ) 项目Spock Proxy 算得上 MySQL Proxy 的一个分支提供基于范围的 Sharding 机制Spock 是基于 Rails 的所以Spock Proxy 也是基于 Rails 构建关注 RoR 的朋友不应错过这个项目
HiveDB
上面介绍了 RoR 的实现HiveDB (http://wwwhivedborg/)则是基于Java 的实现另外稍有不同的是这个项目背后有商业公司支持
PL/Proxy
前面几个都是针对 MySQL 的 Sharding 方案PL/Proxy 则是针对 PostgreSQL 的设计思想类似 Teradata 的 Hash 机制数据存储对客户端是透明的客户请求发送到 PL/Proxy 后由这里分布式存储过程调用统一分发 PL/Proxy 的设计初衷就是在这一层充当数据总线的职责所以当数据吞吐量支撑不住的时候只需要增加更多的 PL/Proxy 服务器即可大名鼎鼎的 Skype 用的就是 PL/Proxy 的解决方案
[] []