架构
分布式架构的理论
- 从0开始学架构
- 软件的复杂度:高性能(榨干单机、集群)、高可用、可扩展性(设计模式的思想),此外还有低成本、安全、规模。
- 架构设计三原则:合适原则、简单原则、演化原则。合适优于先进,演化优于一步到位,简单优于复杂。
- 高性能:读写分离、分库分表(或业务分库)、NoSql(文档数据库、列式数据库、全文搜索)、使用缓存。
- 缓存雪崩:缓存大量瞬时失效,导致数据库压力过大崩溃,继而导致整个系统崩溃,方案1是用更新锁防止并发更新缓存,方案2是后台异步更新缓存。
- 单机高性能:多进程多线程。多线程开销少、线程通信简单,但是线程之间容易死锁、某个线程异常可能导致整个进程退出。
- 负载均衡:region级别用DNS,同机房集群用硬件F5,机器级别用nginx或lvs。
- 异地多活:异地就是多个地理位置,多活就是多个地理位置都能提供服务。
- 故障应对:降级(保住主业务)、熔断(熔断故障点以免拖慢系统)、限流和排队(牺牲了一定的用户体验)
单机高性能
- 从0开始学架构
- bio:阻塞io,PPC和TPC属于这种(一个连接一个进程/线程)。假如我们去饭店点餐,饭店人很多,如果我们付了钱后站在收银台等着饭端上来我们才离开,这就成了同步阻塞了。
- nio:多路复用io,Reactor就是基于这种技术。如果我们付了钱后给你一个号就可以离开,饭好了老板会叫号,你过来取。这就是Reactor模型。
- aio:异步io,Proactor就是基于这种技术。如果我们付了钱后给我一个号就可以坐到坐位上该干啥干啥,饭好了老板会把饭端上来送给你。这就是Proactor模型了。
- 单Reactor单进程的是Redis;多Reactor多进程的是Nginx;多Reactor多线程的是Memcache和Netty。
亿级 pv 网站架构
- PHP进阶之路
- 分离:动静分离、读写分离、业务分离,微服务化
- 分层:业务分层,多级缓存
- 分布:分布式数据库,分布式缓存,分布式存储,分布式计算
- 服务发现:服务者-注册中心-消费者-监控中心
- 客户端发现模式:带负载调度规则的客户端SDK,这种比较常用
- 服务端发现模式:在消费者和服务者中间加一个负载均衡器,由负载均衡器去调度。
- 服务治理:增删节点,权重规则,路由配置,调的服务尽量落在统一机房
常见概念
- 左耳听风-分布式架构入门
- Elasticsearch 架构原理和网易云 NES 最佳实践
- CAP:现实中 P 很少遇到,而 C 和 A 放宽约束后可以兼顾一致性和可用性,两者不是非此即彼。
- BASE:最终一致性。为了可用性牺牲部分一致性可以显著地提升系统的可伸缩性。
- Basically Available(基本可用):出现故障时响应时间变长、部分用户功能不正常
- Soft State(软状态):相对于原子性而言,所有数据副本都是一致的,这是硬状态。软状态则有数据副本不一致的时候。
- Consistent(最终一致性):软状态在某个时间期限后,所有数据副本都是一致的。
- 分布式一致性算法(选主算法、共识算法):
- Paxos(号称是最难理解的算法)
- Raft(把Paxos简化为三个子问题:选主、日志复制、安全性),etcd、Redis-Cluster
- ZAB(基于Paxos算法),ZooKeeper
- Gossip(又称流言算法、疫情传播算法。只有大多数节点都认定某个节点失联了,集群才认为是失联了),Redis-Cluster、Redis-Sentinel、Consul、Elasticsearch
- Bully(所以节点遵循同样的规则,可用节点要大于指定数量),Elasticsearch