Cap理论初学

Posted by BY Blog on February 27, 2019

CAP 理论解释

CAP 理论:一个系统最多能同时满足一致性(Consistency),可用性(Availability),和分区容错性(Partition tolerance)这三项中的两项.

  • 一致性(Consistency)指的是强一致性,每次访问都能获得最新数据但可能会收到错误响应 .
  • 可用性(Availability) 每次访问都能收到非错响应,但不保证获取到最新数据。指的是工作中的系统,任何一个工作中的节点,每次访问都能返回一个非错的结果。
  • 分区容错性 (Partition tolerance)在任意分区网络故障的情况下系统仍能继续运行 s

CAP 可用性

假设如图示,两个数据节点。中间发生了网络分区。一部分用户访问第一个节点,另一部分用户访问第二个节点。某一个时刻网络  发生了问题,此时显然有两个选择

  • 继续允许访问写数据库,但是就造成了数据不一致的情况。
  • 为了保持数据一致性,此时就停止接受读写操作,直到网络恢复。这样违反了可用性原则,数据库运行中的节点,无法接受请求。
实际的系统中 就算违反了CAP的可用性,但是还是成功的处理着请求。所以当一个系统选择了一致性,这并不一定意味着网络发生问题的时候一定服务当级。还可以把用户流量转到主数据库,用户就毫无感知。

实际应用中的可用性和CAP的可用性并不相同。应用中的可用性是通过SLA来衡量。(比如99.9%的正确的请求一定要在一秒钟之内返回成功),但是一个系统无论是否满足CAP可用性其实都可以满足这样的SLA。

啥都不是的系统

一个 master,slave 的系统。用户不访问主库就不能写入数据。所以就不符合 CAP 中的可用性。 如果从 slave 里那里读到的数据,有一定延迟,所以也不符合一致性要求。所以这个系统 CA 都不满足。

Availability Patterns

Fail-over 冷备,热备,主从切换

Replication _ Master-Slave 主从 _ Tree replication _ Master-Master _ Buddy Replication

scalability trade off

  • performance vs scalability 性能问题,系统在有一个用户访问的时候就很慢。 扩展性问题,系统在一个用户访问的时候很快,很多人访问的时候就变慢了。

  • Latency vs Throughput 目标是在一个可以接受的延时下,最大化吞吐量,

  • Availability vs Consistency

scale up vs scale out

scale up 扩展单机的性能,纵向扩展 scale out 添加更多的机器。横向扩展

zookeeper

zookeeper 通常被认为是一个 CP 系统。采用了 consensus 算法。但是默认页不提供一致性操作。需要调用 sync[https://blog.the-pans.com/cap/]。

Load Balancer

DNS 轮训 A 地址可以添加 IP。输入域名 IP 切换。缺点是 DNS 的缓存时间太久

L3 负载均衡 有 IP 地址和 PORT 或者 三层负载均衡可以根据 IP 和 port 转发 L4 负载均衡 会话层负载均衡 可以识别 TCP 协议。

L7 负载均衡 7 层是应用层。所以会解析 HTTP 协议。业务上可以根据 cookies,或者 HTTP 报文的内容来进行负载

负载均衡的算法:

  • round robin 一个接一个
  • weighted round robin 根据配置的权重来轮训 1:5
  • Random 随机
  • Least busy 最少负载
  • cookie/session 保持
  • 根据参数

Cache

  • 直写模式
1. 用户的写入请求 先写入缓存
2 存入DB,
3 返回给用户成功

缺点: 1 写入的数据可能永远不会被读到。TTL 可能会缓解这个问题。 2 速度很慢,因为要写入 DB

  • 回写模式
 1 写入缓存
 2 在队列中添加一个事件
 3 返回给用户
 4 异步队列里处理之前加入的数据,并且写入DB

缺点: 异步的,可能 DB 还没存储,缓存丢了此类数据。

  • 刷新 提前将 DB 的数据灌入缓存,然后访问的时候访问缓存。

缺点:需要预测未来将要使用的数据。

  • 过期策略 TTL FIFO LIFO LRU 显示标记过期时间

数据库

ACID BASE 反模式 Sharding

MYSQL

MYSQL 集群

sharding

NOSQL