高性能mysql-第十一章-笔记-可扩展

可扩展

  1. 数据量;
  2. 用户量: 并发量。
  3. 负载。

可扩展性的描述

  • 线性扩展: 加1倍资源=>加1倍性能。(理想最优情况,一般达不到)

  • Amdahl定律:

  1. 存在无法并发的工作;
  2. 存在需要交互的工作;
    因此吞吐量达不到线性增长,会趋于平缓。
  • USL扩展:(通用可扩展定律)
  1. 存在无法并发的工作;
  2. 存在需要交互的工作;
  3. 存在内部系统通信开销。

从3种扩展性的描述看,我们的目标是趋近于线性扩展,因此应该尽量削减USL扩展中的三个方面: 减少串行、减少交互、减少内部通信。

垂直扩展(纵向扩展、向上扩展)

升级硬件。价格更高,性能比低。
mysql利用极限:
CPU: 24
内存: 128
更多的时候提升趋于平缓。

向内扩展

优化查询、索引,压缩数据。

水平扩展(横向扩展,向外扩展)

  1. 复制
  2. 拆分
  3. 分片(sharding)

拆分: 按功能拆分(微服务),划分的表之间不会进行关联操作

数据分片(sharding)

用userid分片。
id+hash。

星形/雪花模型: 容易分片。
网状模型: 难以分片。

因此早期设计应该避免网状模型。

分片方式:

  1. 固定分配,硬编码; 缺点: 无法处理热点。优点: 简单。
  2. 动态分配:缺点:实现复杂。

热点解决方案:随机数+哈希;
扩展性: 预分配32个分片,用DNS单点,把4个库放在一个实例(IP)上。

小猿(CP): 库名_32.表名; DNS作为单点。
网易(CP): 类似codis,引入中间件单点。

全局唯一ID

  1. autoinc: 利用自增幅度和初始偏移;
  2. 创建一个全局表,进行autoinc id分配;
  3. 使用memcached/redis,生成全局自增id;(没有持久性)

其中2,3可以批量生成一批,减少调用次数。

冷热数据分表

归档、冷数据分离到另一张表、或者将冷数据分离到较差的节点。

负载均衡的目的

  1. 可扩展性;(读写分离)
  2. 高效性;
  3. 可用性;
  4. 透明性;
  5. 一致性。

负载均衡算法

  1. 随机
  2. 轮询
  3. 最少连接数: 有缺点,新加入的机器还没有预热缓存,却立即分配了最多的连接;
  4. 最快响应;
  5. 哈希:通过源IP进行哈希(会话局部性);
  6. 权重:结合上述算法,根据底层机器的性能差异进行权重。

具体采用哪个算法,取决于工作负载类型。

推荐文章