Sharding的主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。

      MySQL5.1提供的分区(Partition)功能确实可以实现表的分区,但是这种分区是局限在单个数据库范围里的,它不能跨越服务器的限制。

    




是否真的需要分片

分片对所有环境都是不得已而为的做法。即便你使用的数据库支持开箱即用的分片功能,那也会由于引入更多组件和复杂度而带来麻烦。构建良好的分布式查询执行计划是非常复杂的任务,需要考虑网络拓扑结构和负载情况,另外还要考虑数据分布和每个独立节点的负载。 

分片的替代方案 

功能分区:把所有这些应用碎片分入不同的数据库实例

复制:许多应用都是“读操作”的压力大,而扩展读操作性能要比扩展写性能更容易一些。如果是这种情况,那么复制就是非常好的选择。MySQL有自带的复制功能非常健壮,虽然其异步特性增加了应用的复杂性。这种情况下,开发人员必须判断从哪台复制服务器上读取信息,不可以从哪里获取。因为你必须绝对保证你读取到的是最新的实际数据。这也正是针对MySQL出现的可替代的异步复制技术广受欢迎的原因(例如PerconaXtraDB)。这些工具把大部分集群环境下的功能提供给向单个数据库操作的能力。

缓存和队列:缓存是降低数据库读取量的出色技术。有许多应用使用这种技术可以降低数据库读负载高达80-95%。与之相对的是队列,它是用来优化写操作的。通过合并多次写操作,提高了对数据库操作的效率。大部分大型应用都应该重点考虑这两种技术。Memcached和Redis是MySQL领域非常流行的两种缓存技术。对于队列,最流行的技术是ActiveMQ和RabbitMQ。 外部支持技术:MySQL在很多方面都很出色,但也不是所有方面都强。如果你需要高性能全文检索,应该考虑ElasticSearch、Sphinx或者Lucene。如果你想做大规模数据分析,可以考虑基于Hadoop的基础架构或者Vertica也是不错的选择。你应该让MySQL处理它擅长的事,把其它事留给外部支持工具来做。