可扩展性设计 性能设计 一致性设计
可扩展性设计
横向扩展
横向扩展(scale out)也叫水平扩展,指用更多的节点支撑更大量的请求。例如如果1台机器支撑10 000TPS,那么两台机器是否能支撑20 000TPS?
纵向扩展(scale up)也叫垂直扩展,扩展一个点的能力支撑更大的请求,它通常通过提升硬件实现,例如把磁盘升级为SSD。
如何扩展数据库
主从复制集群
分库、垂直分表
分片(sharding)
区间法(Range-Based)
轮流法(Round-Robin)
一致性哈希法(Consistent Hash)
如何扩展数据中心
两地三中心
同城多活
异地多活
性能设计
比较常见的性能问题如下
内存泄漏——导致内存耗尽。
过载——突发流量,大量超时重试。
网络瓶颈——需要加载的内容太多
阻塞——无尽的等待。
锁——通过限制。
IO繁忙——大量的读写、分布式
CPU繁忙——计算型常见问题。
长请求拥塞——连接耗尽。
性能指标
响应时间(Latency),就是发送请求和返回结果的耗时。
吞吐量(Throughput),就是单位时间内的响应次数。
树立目标
寻找平衡点
- 我们可以通过一组压力测试数据找到拐点。
定位瓶颈点
压力测试
日志分析
监控工具
服务通信优化
同步转异步
阻塞转非阻塞
序列化优化
通过消息中间件提升写性能
通过缓存提升读性能
缓存的常用模式
Read Through模式
Write Through模式
Write Behind Caching模式
Cache-Aside模式
Cache-As-SoR模式
为缓存数据设置合理的过期时间
为缓存设置回收策略
先预热数据
数据库优化
通过执行计划分析瓶颈点
为搜索字段创建索引
通过慢查询日志分析瓶颈点
通过提升硬件能力优化数据库
目前各大互联网公司的数据库均使用SSD硬盘或者PCIE-FLASH,据说2012年的时候微博使用PCIE-FLASH支撑了Feed系统在春晚时的3.5万QPS。
简化设计
转移复杂度
从业务角度优化
一致性设计
事务
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
未提交读(Read uncommitted)
提交读(Read committed)
可重复读(Repeatable reads)
可序列化(Serializable)
隔离级别
持久性(Durability)
CAP定理
一致性(Consistence)
可用性(Availability)
分区容错性(Partition tolerance)
分布式系统的一致性分类
以数据为中心的一致性模型
1.严格一致性(Strict Consistency
2.顺序一致性(Sequential Consistency)
3.因果一致性(Causal Consistency)
4.FIFO一致性(FIFO Consistency)
以用户为中心的一致性模型
1.单调读一致性(Monotonic-read Consistency)
2.单调写一致性(Monotonic-write Consistency)
3.写后读一致性(Read-your-writes Consistency)
4.读后写一致性(Writes-follow-reads Consistency)
业界常用的一致性模型
弱一致性
最终一致性(Eventual Consistency)
强一致性(Strong Consistency)
如何实现强一致性
两阶段提交
三阶段提交(3PC)
如何实现最终一致性
重试机制
本地记录日志
可靠事件模式
Saga事务模型
TCC事务模型
分布式锁
基于数据库实现悲观锁和乐观锁
基于ZooKeeper的分布式锁
基于Redis实现分布式锁
如何保证幂等性
幂等令牌(Idempotency Key)
在数据库中实现幂等性

关注公众号 获取更多精彩内容
