CAP定理与Base理论
CAP定理:
一个分布式系统最多能同时满足一致性(Consistency)、可用性(Avaliablitity)和分区容错性(Partition tolerance)这三项中的两项。
- 一致性(Consistency):一致性指(all nodes see the same data at the same time),即更新操作成功并返回客户端后,所有的节点在同一时间的数据完全一致。
- 可用性(Avaliablitity):可用性指(Reads and writes alaways succeed),即服务一直可用,而且是正常响应时间。
- 分区容错性(Partition tolerance):分区容错性指(the system continues to operate despite arbitrary message loss or failure of part of the system),即分布式系统在遇到某节点网络或者网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
CAP的权衡:
通过CAP定理的内容,可知分区容错性是一个分布式系统最重要的属性 即P这个点无论如何是不能丢弃的,所以分布式系统分为CP和AP
CP(强一致性系统)常见于金融级系统 跟钱相关,必须要保证强一致性
AP(高可用性系统)系统BASE理论:
BASE理论是对于CAP理论的延申,核心思想就是即使无法做到强一致性(Strong Consistency CAP的一致性就是强一致性),但应用可以通过适合的方式达到最终一致性(Eventual Consistency)。
- 基本可用(Basically Available):基本可用性是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心功能可用。比如电商活动时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
- 软状态(Soft State):软状态时指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个以上的副本,允许不同节点间副本同步的延时就是软状态的体现,Mysql Replication的异步复制也是一种体现
- 最终一致性(Eventual Consistency):最终一致性指系统中所有的数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性时弱一致性的一种特殊情况。
ACID和BASE理论的区别与联系
ACID时传统数据库常用的设计理念,追求强一致性模型。BASE支持的是大型分布式系统,通过牺牲强一致性来达到数据的最终一致性。
ACID和BASE代表了两种截然相反的设计哲学,在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE又会结合起来使用。
当我们去访问一个大型的分布式系统时,CDN会根据我们的地址去连入到离我们最近的服务器,如此一来,当我们想不同的数据库中同一张表中插入数据的时候,如果使用主键自增,那么在两张表进行数据同步的时候会出现逐渐冲突,被称作(主主冲突),但是如果我们使用UUID当作主键的时候,因为主键是字符串,所以会大大降低我们检索数据的效率,因此分布式ID 应运而生,常见的是推特公司的雪花算法。
注册中心
注册中心概述
注册中心是微服务的灵魂所在,可以实现服务的注册与发现,实现服务的治理,市面上常见的注册中心软件:
eureka(AP)
Consul(CP)
Nacos(AP)
Zookeeper(CP)Zookeeper
docker下安装Zookeeper
//1.搜索 zookeeper镜像
docker search zookeeper
//2.拉取zookeeper镜像
docker pull zookeeper
//3. 查看本机所用可用的镜像
docker ps -a
//4.启动 zookeeper 容器
docker run -d -p 2181:2181 --name zk --restart always zookeeper
//5.查看启动的容器
docker ps
//6.进入容器
docker exex -it //后面跟zookeeper的container id
// 7.启动zookeeper客户端
./bin/zkCli.sh
//8.确认zookeeper是否启动 查询zookeeper的节点
ls /
将服务注册到zookeeper中
配置文件
server:
port: 8004
spring:
application:
name: cloud-provider-payment
cloud:
zookeeper:
connect-string: 175.24.232.70:2181 //zookeeper的ip端口
启动类
@SpringBootApplication
@EnableDiscoveryClient//将服务注册到zookeeper中
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class,args);
}
}
maven依赖
<!-- SpringBoot整合zookeeper客户端 防止依赖冲突,需要与服务器上的zookeeper版本保持一致 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--先排除自带的zookeeper3.5.3-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.7.0版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
</dependency>
Zookeeper的节点
临时节点
create -e /k1 v1 zookeeper退出以后,节点直接消失
当服务停止以后 zookeeper的心跳同步机制收不到回复,就会干掉服务的节点 而eureka会有自我保护机制,当服务停止以后,会继续保存服务
持久节点
Consule
Consule的简介
Conule是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consule提供了一种完整的服务网格解决方案。
Consule主要功能:
1、服务注册与发现 (提供HTTP和DNS两种发现方式)
2、健康检查(支持多种方式、HTTP、TCP、Docker、Shell脚本定制化)
3、键值对存贮(Key、Value存储)
4、多数据中心 (Consule支持多数据中心)
三个服务中心的异同
CAP
C:Consistency 强一致性
A:Availability 可用性
P:Partition tolerance 分区容错性
CAP理论关注粒度是数据,而不是整体系统设计的 而分区容错性首先是要保证的 所以只能保证CP 或者AP