一、概述
MySQL 水平拓展的策略分为三个部分:
- 复制
- 拆分
- 数据分片(sharding)
二、复制
最简单也最常见的向外扩展的方法是通过复制将数据分发到多个服务器上,然后将备库用于读查询。这种技术对于以读为主的应用很有效,它也有一些缺点,例如重复缓存等等。
三、按功能拆分
按功能拆分,每个节点只包含特定应用所需要的数据,各个部分无须共享数据,可以按功能区域进行划分。如果有数据交叉的需求,也可在应用层执行联合查询。
这种方法的缺点是一个功能区还是只能进行垂直扩展 (提升单机性能),后续很难继续扩展。
四、数据分片
目前大型MySQL应用方案中,数据分片是最通用最成功的方法。它把数据分割成一小片,或者一块,然后存储到不同的结点中,分片可以大幅提高写性能。
可以先使用复制来扩展博客服务的读查询,直到它不在奏效。然后可以把服务器划分为三个部分:用户信息、文章、评论,可以在应用层执行联合查询。
采用分片的应用通常会有一个数据库访问抽象层,用来降低应用和分片数据存储之间通信的复杂度,但无法完全隐藏分片。太多抽象会导致低效率,例如查询所有的结点,可实际上需要的数据只在单一节点上。
4.1 分区键的选择
选择分区键时,尽可能选择那些能够避免跨分片查询的。分片和节点不一定是一对一的关系,应该让分片的大小比节点容量小很多,这样易于管理。
4.2 在节点上部署分片
我们倾向于使用每个分片一个数据库的方式,并把分片号写到数据库名和表名中。这会增加ALTER TABLE这类操作的复杂度,但也有如下一些优点:
多个数据库实例