分布式与ZK<1>

1.这一年陆陆续续的看了看redis mq es canal 这些中间件 以及经过这个大半年996的洗礼 对分布式系统有了简单的认识
我们知道 以前我们是单体项目比如说XX电商

在这里插入图片描述

就是说所有的服务都在一个机子上 这样的优点是节约成本, 但是如果有非常大的流量的时候 你单体项目是搞不定的
所以此时就会将服务进行拆分 比如说USER服务 ORDER服务

在这里插入图片描述

这样做带来了一定的模块化, 此时如果order服务的流量过多 我们还可以做集群处理
这个就是垂直应用的优点
但是你这么切的话数据库的压力还是很大的 因为你此时order服务和user服务访问的是同一个库
如果说此时一个系统对应一个数据库 这样来说是比较合理的  你order 不能查我 user数据库 只能通过调用user服务来查库

在这里插入图片描述

此时你order不应该掉用我user数据库
此时应该order  调用user系统的接口 此时应该比较合理
这就是一个微服务的架构 
如果有 系统真的需要用户和订单2个系统的
再用 某个系统分别调用者2个服务 
这个就是微服务的架构

此时对服务进行拆分 这样 对用户来说是没有感觉的
微服务的架构更偏向于业务
1,按照子业务  用户 订单
2,按照数据库 分用户db 订单db
3.按照接口差额拆分  查用用户信息服务/增加用户信息服务/细粒度不同
你此时的细粒°越细,代表你服务的聚合性更高,更稳定, 架构更稳定
缺点就是你系统架构的复杂性就更高, 运维监控什么的就越复杂
分布式更偏向于机器上

我们把一个系统做成微服务系统, 我们会遇到什么问题
1. 分布式session,
比如用户登录的时候 session 保存在a服务器,b服务器上没有你的session
 此时用户在调用的时候, 可能的重新登录
 怎么解决 
 1.可以用nginx 负载均衡的ip Hash
 2.spring-session 底层用session存储
 3.第三个方法就是session 复制,将session同步到第二个机子上
 

在这里插入图片描述

2.分布式配置中心
	比如说接下来要说的zk
	携程的阿波罗
	
3.分布式事务 比如说有下面一种场景 查库存 下订单 [订单加1 ],库存-1
一个用户如果在订单服务出现异常了的话 要保证整条线路 都得进行回滚操作
此时就会涉及 一个分布式事务	

在这里插入图片描述

4.分布式锁
	因为此时是集群机子 你负载均衡不一定请求会落在哪里,此时
	2个用户同时下单 此时 库存表中只有一个
	 呢么此时都查到的是1  理论上应该只有一个人能下单成功
	 有一个人查到之后应该把这个库存表给锁住
	 你不锁起来 另外一个 也可能查到1 
	你不锁起来的话  最终2个人都会下单成功
	然后 库存变成-1 

	 

在这里插入图片描述

可以在mysql层面上加锁 但是性能会降低 呢么多人 下单你每次下一个单 都要把这个表锁住
这是非常影响效率的
我们此时可以这么做 在内存中间加一把锁 如果他可以拿到这个内存锁 再让他访问db 如果拿不到的话就不让访问db

在这里插入图片描述

我们分布式锁解决方案
1.mysql
2.redis
3.zk
再说下分布式这块的理论cap和base
cap理论 一致性 可用性 分区容错性
a,b  2节点集群
一致性就是说 此时a 中有一个k=1 此时 我把a的 k改成2  我再次访问集群的时候 如果b中的k=2  呢么此时才叫满足一致性,这里的一致性是强一致性,
可用性就是说a,b2节点进行集群,如果说你用户用的好好的,此时一个服务挂了 对于用户来说还是可以用的
分区容错性就是说 你a,b 2台服务器进行集群, 此时你a中将数据改成2,之后b也的改为2,此时是要求网络可以同步的,分区容错性就是说 如果集群中间的网络断开了 你此时整个集群是可以用的
 这里的分区是  第一 跟集群一样分机器
			第二 分地区 比如说上海一个机器 北京一个机器

在这里插入图片描述

		P--->跟网络有关如果网络断了的话 还可以允许用户可以用这个集群
		我们做集群 不就是当有一个挂掉了 整个服务还可以对外访问啊
		这就是做集群的目的
		P 这个特性是我们一直要保证
你此时数据的传输是受网络影响的 要想达到C 的话 就要求2台服务器之间的数据同步 ,同步的过程中 用户不可用,等所有的数据都更新完毕了之后 都同步之后   才可以用
要想达到A 就的牺牲我们的一致性

关于CAP 我们该怎么去取舍
 
比如说涉及到钱 一致性
AP 保证用户可用啊
比如说服务的降级
此时还有一个Base理论 是对Cap理论的延申
BA基本状态
S 软状态
e 最终状态
也就是会由我们的修改集群中的某个节点为 1 他最终会同步到另外一台机器上的

分布式系统中 最重要的就是解决一致性问题
如果说想得到强一致性 就得牺牲可用性
有很多算法来解决分布式系统中的一致性问题
比如说
2阶段提交
3阶段提交
paxos
zab协议

为了实现分布式系统的一致性
BASE 是舍弃一致性 采用最终一致性才能达到的理论
 	
还会有一个问题就是说分布式定时任务
比方说现在集群状态 2台机子上都有job  我如何让2台机子只有一个在跑
可以用es-job

猜你喜欢

转载自blog.csdn.net/weixin_43689953/article/details/115877657