- 一致性
- 可用性
- 分区容错性
一致性
一致性说的是客户端的每次操作,不管访问哪个节点,要么读到的都是同一份最新的数据,要么读取失败。
可以把一致性看作是分布式系统对访问本系统客户端的一种承诺:不管访问哪个节点,要么返回的都是绝对一致的数据,要么读取失败。一致性强调的不是数据完整,而是各个节点间的数据一致。
一致性这个指标,描述的是分布式系统中非常重要的一个特性,强调数据的一致性。也就是说在客户端看来,集群和单机在数据一致性上是一样的。
所以一般CP的系统,为了保证数据一致性,当有某台机器宕机的时候,整个集群都无法写入
可用性
保证集群可用,但返回的数据不一定是最新的。该指标强调可用性,但不保证数据的一致。
分区容错性
分布式系统在面对网络分区(系统中的节点之间无法相互通信或通信延迟非常高的情况)时仍然能够正常运行。
如何使用CAP理论
只要有网络交互,就一定会有延迟和数据丢失,而这种情况我们必须接受,所以节点之间的分区故障是必然发生的。也就是说分区容错是前提,是必须要保证的。
CP模型
如果因为消息丢失、延迟过高发生了网络分区,那么这个时候,集群节点收到来自客户端的写请求时,因为无法保证所有节点都是最新的,所以系统将会返回写失败错误,也就是说集群拒绝新数据写入。
AP模型
当选择了可用性时,系统将始终处理客户端的请求,返回特定的信息。如果发生了网络分区,一些节点可能无法返回最新的数据
当系统处于正常运行时(系统绝大部分时间所处的状态)C 和 A 是可以同时保证的。只有当发生了分区故障的时候,才会需要从 C 和 A 之间做出选择。
如果各个节点的数据不一致影响到了业务的运行才选择CP模型,否则选择AP模型
Redis是否可以成为分布式锁?
问题:会多个线程同时拥有锁
- 一般使用setnx方法,通过Redis实现锁和超时时间来控制锁的失效时间
- 但在极端情况下,当redis的主节点挂掉,但锁还没有同步到从节点时,根据哨兵机制,从就变成了主继续提供服务,这时另外的线程可以再来请求锁,此时就会出现两个线程同时拿到锁的情况
带入CAP理论
- Redis的设计模型是AP模型,而分布式锁则是CP场景
- 将Redis这种AP模型的架构应用于CP的场景,在底层技术选型上就是错误的