可扩展
- 数据量;
- 用户量: 并发量。
- 负载。
可扩展性的描述
线性扩展: 加1倍资源=>加1倍性能。(理想最优情况,一般达不到)
Amdahl定律:
- 存在无法并发的工作;
- 存在需要交互的工作;
因此吞吐量达不到线性增长,会趋于平缓。
- USL扩展:(通用可扩展定律)
- 存在无法并发的工作;
- 存在需要交互的工作;
- 存在内部系统通信开销。
从3种扩展性的描述看,我们的目标是趋近于线性扩展,因此应该尽量削减USL扩展中的三个方面: 减少串行、减少交互、减少内部通信。
垂直扩展(纵向扩展、向上扩展)
升级硬件。价格更高,性能比低。
mysql利用极限:
CPU: 24
内存: 128
更多的时候提升趋于平缓。
向内扩展
优化查询、索引,压缩数据。
水平扩展(横向扩展,向外扩展)
- 复制
- 拆分
- 分片(sharding)
拆分: 按功能拆分(微服务),划分的表之间不会进行关联操作
数据分片(sharding)
用userid分片。
id+hash。
星形/雪花模型: 容易分片。
网状模型: 难以分片。
因此早期设计应该避免网状模型。
分片方式:
- 固定分配,硬编码; 缺点: 无法处理热点。优点: 简单。
- 动态分配:缺点:实现复杂。
热点解决方案:随机数+哈希;
扩展性: 预分配32个分片,用DNS单点,把4个库放在一个实例(IP)上。
小猿(CP): 库名_32.表名; DNS作为单点。
网易(CP): 类似codis,引入中间件单点。
全局唯一ID
- autoinc: 利用自增幅度和初始偏移;
- 创建一个全局表,进行autoinc id分配;
- 使用memcached/redis,生成全局自增id;(没有持久性)
其中2,3可以批量生成一批,减少调用次数。
冷热数据分表
归档、冷数据分离到另一张表、或者将冷数据分离到较差的节点。
负载均衡的目的
- 可扩展性;(读写分离)
- 高效性;
- 可用性;
- 透明性;
- 一致性。
负载均衡算法
- 随机
- 轮询
- 最少连接数: 有缺点,新加入的机器还没有预热缓存,却立即分配了最多的连接;
- 最快响应;
- 哈希:通过源IP进行哈希(会话局部性);
- 权重:结合上述算法,根据底层机器的性能差异进行权重。
具体采用哪个算法,取决于工作负载类型。