为什么要写一些基本概念?
发现自己有时候学了一些技术,经常使用用,但是在学习和设计各种架构的时候,对一些技术概念理解不清晰,导致用错了。所以写本篇博客,想要记录下不同的概念,便于学习架构和理解一些技术的特性。打算经常去更新。
为什么使用分布式?
提升系统整体性能和吞吐量,尽量保证分布式系统的容错性。
分布式系统设计思路(中心化vs去中心化)
中心化:按角色分工,领导和干活的(主从节点)。
发现有人偷懒或者病危,那么就给这个节点踢出去,然后将任务分配给其他人。
中心化设计的缺陷:会出现领导安危问题。
解决领导安危问题思路:采用主备两个领导的设计方案,热备或者冷备。也可以自动切换或者手动切换。而且越来越多心系统具备自动选举切换领导的能力,提升系统可用性。
应用场景:Kubernetes 技术
去中心化:去中心化的思路不是没有领导,而是自由选择领导,由节点自由选择中心。
去中心化设计的缺陷:脑裂问题(出现了两个主机)
解决脑裂问题思路:
两个集群,出现通信不畅问题,两个集群各自单独工作,造成两个主机。解决方式就是让其自杀或者拒绝服务。
应用场景:zookeeper、nacos、eureka
分布式vs集群
分布式,是将业务拆分成多个子业务,部署在不同的机器上。
集群,是将一个业务部署在不同机器上,提高系统性能。
分布式系统的性能标准
性能、资源、可用性和可扩展性
CAP定理
- 一致性(Consistence) :所有节点访问同一份最新的数据副本 。
- 可用性(Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。
- 分区容错性(Partition tolerance) : 分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
由于我们将系统部署到多台机器上,产生了多个节点(网络分区),所以一定要保证分区容错性。所以这就决定了CAP定理中,先要满足P。
为了保证网络分区或者节点发生故障的时候,仍能保证对外提供服务。意思就是必须得保证分区容错性(P),那么我们只能在强一致性和可用性之间选择一个。那么这时候就出现了CA和CP两种架构。
CP架构保证数据一致性
举例:当前我们有两台服务器a和b,此时服务器a和服务器b的数据值value都为1。当前网络分区,随便一个客户端将服务器a的值value改为了2。现在为了保证数据一致性,将服务器b也需要改为2。但是现在有大量请求到服务器b,服务器b对于同步服务器a的请求没有处理成功,那么服务器b的value值仍为1。如果此时客户端,想要向服务器b获取value值。但是为了数据一致性,服务器b拒绝了客户端的请求,所以这意味着服务器b就不可用了,那么服务器b也就放弃了高可用。
- a = b = 1
- a = 2
- 同步失败,b =1
- 为了保证数据一致性,b拒绝提供服务。
CP架构中高可用方面的思考:
- 利用redis,将存取都放在同一个地方,并不依赖于网络数据间通信同步,所有人从同一个地方拿东西,那么就保证高可用问题。
- 利用服务限流技术,限定访问流量在服务器可接受范围内,保证我们当前需要同步的服务器接口,不会被大流量冲到崩溃,那么就保证高可用问题。
- 利用服务降级技术,如果当前我们需要同步的服务器接口,已经不可用了,那么我们提供一种备胎接口来处理同步问题,那么也保证了系统高可用问题。
- 我将服务器集群b看做一个节点,主服务器出现问题,备胎服务器可以顶上来,主从结构来解决问题。
- 我将服务器集群b看做一个节点,主服务器出现问题,我从多个备胎服务器里面选举出一台主服务器来解决问题。
AP架构保证系统高可用
举例:当前我们有两台服务器a和b,此时服务器a和服务器b的数据值value都为1。当前网络分区,随便一个客户端将服务器a的值value改为2。但是现在有大量请求到服务器b,服务器b对于同步服务器a的请求没有处理成功,那么服务器b的value值仍为1。如果此时客户端,想要向服务器b获取value值,但是为了保证系统的高可用。服务器b给客户端返回了旧的值value为1,所以这意味着服务器b牺牲了数据一致性。
- a = b =1
- a = 2
- 同步失败 b =1
- 为了保证系统高可用,b返回旧值 1
上面的一致性,指的是强一致性,而AP很难保证强一致性,所以就有人设计了弱一致性,提出了Base理论。弱一致性:不保证任意时刻所有节点数据一样,有很多不同实现。
Base理论核心思想是:既是无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
最终一致性:在一段时间后,节点间的数据会最终达到一致状态(就是不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化)。
服务限流vs服务降级vs服务熔断
服务限流:服务限流的意识就是发现某个提供的接口,流量大,会造成其他服务接口崩溃,那么就限制该接口,同一时间内的访问接口的消费者数量。
服务降级:服务降级的意思就是从一种方式降低到另一种方式。譬如原本调用方法a,发现不通,就调用备用方法b。
服务熔断:服务熔断的意思就是多次降级,最后备用方案也不好使,只好放弃该服务。
什么是脑裂?
脑裂是指在主备切换时,由于切换不彻底或其他原因,导致客户端和Slave误以为出现两个active master,最终使得整个集群处于混乱状态。
高并发三板斧
缓存、异步、分流
参考
《大型网站技术架构》
https://www.cnblogs.com/liujiarui/p/14725113.html
网友评论