分库分表的理想方案:
- 均匀分布数据,避免热点问题;
- 对达到上限的节点保证不再写入数据;
- 可以自由扩容;
- 不迁移数据。
部分Shading方案缺点分析:
- 基于散列的路由能均匀地分布数据,但却需要数据迁移,同时也无法避免对达到上限的节点不再写入新数据;
- 基于增量区间的路由天然不存在数据迁移和向某一节点无上限写入数据的问题,但却存在“热点”困扰;
- 结合数据库维护一个Sequence表,这样Sequence表本身可能会成为一个性能瓶颈。
我们设计方案的初衷就是希望能结合两种路由规则的优势,摒弃各自的劣势,创造出一种接近“理想”状态的扩容方式,而这种方式简单概括起来如下:
全局:按增量区间分布数据,使用增量扩容,无数据迁移;
局部:使用散列方式分散数据读写,解决“热点”问题,同时对Sharding拓扑结构进行建模,使用一致的路由算法,扩容时只需追加节点数据,不再修改散列逻辑代码。
垂直切分:把关系密切的表分到一个partition,如果同一个partition里的表数据量很大且增长迅猛,再进行水平切分。
水平切分:将一张表的数据按增量区间或散列方式分散到多个Shard上存储。
参考:http://www.jianshu.com/p/10c6fa27f889
分库分表的4个面试连环炮问题!不会就惨了