第十一章 可扩展的MySQL
11.1 什么是可扩展性
可扩展性。 即通过增加资源提升整个系统吞吐量的能力
一般会有如下的角度影响负载:
- 数据量
- 用户量 更多的用户,意味着更多的数据,更复杂的查询,更多的事务
- 用户活跃度 容易造成热点
- 相关数据集的大小 即关联数据,比如好友
可扩展性的数学表现:
- 最简单的是线性的,资源翻倍,吞吐量翻倍
- 但是由于有些工作是线性的,无法通过并发来提升,这样曲线就会趋于平缓
- 再引入扩展带来的内部节点或者是线程间的通信,会造成曲线的不降反升
- 考虑到有一些I/O密集型的应用,扩展只会可能变成全都读取内存,还有可能造成曲线上扬
11.2 扩展MySQL
通常系统初建时要考虑一点可扩展性。在扩展之前,要先压榨单机性能,比如算法调优等等。
11.2.1 向上扩展
向上扩展就是换CPU,磁盘等等。对部分应用来说这是唯一需要做的。
优点:
- 单台服务器比多台服务器更加容易开发和维护,能显著节省开销
- 在单台服务器上备份和恢复应用同样简单;
- 无需关心一致性;
为了能够更好的在大型服务器上运行MySQL,一定要尽量使用最新的版本。
如果应用变得非常庞大,向上扩展可能就没有办法。
11.2.2 向外扩展
向外扩展有时也称为横向扩展或者水平扩展,策略划分为三个部分:复制、拆分,以及数据分片(sharding)。
最简单的扩展方法是通过复制将数据分发到多个服务器上,然后将备库用于读查询,即读写分离。
另外一个比较常见的向外扩展方法是将工作负载分布到多个“节点”。许多大型的MySQL应用不能自动分布负载,就算有也没有做到完全的自动化。
一个节点可能就是一台服务器,如果设计冗余,那么一个节点通常是下面的某一种:主主复制,一主多备复制,一主多备DRBD复制,共享存储。大多数情况下,一个节点内的所有服务器应该拥有相同的数据。我们倾向于把主主复制架构作为两台服务器的主动被动节点。
安功能拆分
按功能拆分,或者说按业务拆分,意味着不同的节点执行不同的任务。将独立的服务节节点分配给不同的应用,这样每个节点只包含特定应用的数据,即按库划分。
另一个可能的按功能划分方法是对单个服务器的数据进行划分,确保划分的表集合之间不会执行关联操作,即按表划分。
但是功能划分不能无限地进行扩展,因为如果一个功能区哉被捆绑到单个MySQL节点,就只能进行垂直扩展。如果进行了太多的功能划分,以后就很难采用更具扩展性的设计了。
数据分片
在目前用于扩展大型MySQL应用的方案中,数据分片是最通用且最成功的方法。它把数据分割成一小片,或者说一块&#x