分布式系统
一、分布式技术概念
1.负载均衡:
Nginx:高性能、高并发的web服务器;功能包括负载均衡、反向代理、静态内容缓存、访问控制;工作在应用层
LVS: Linux virtual server,基于集群技术和Linux操作系统实现一个高性能、高可用的服务器;工作在网络层
2.webserver:
Java:Tomcat,Apache,Jboss
Python:gunicorn、uwsgi、twisted、webpy、tornado
3.service:
SOA、微服务、spring boot,django
4.容器:
docker, K8S(Kubernetes): 是一个全新的基于容器技术的分布式架构解决方案
5.cache:
memcache、redis等
6.协调中心:
zookeeper、etcd等
zookeeper使用了Paxos协议Paxos是强一致性,高可用的去中心化分布式。zookeeper的使用场景非常广泛,之后细讲。
7.rpc框架:
grpc、dubbo、brpc
dubbo是阿里开源的Java语言开发的高性能RPC框架,在阿里系的诸多架构中,都使用了dubbo + spring boot
8.消息队列:
kafka、rabbitMQ、rocketMQ、ActiveMQ
消息队列的应用场景:异步处理、应用解耦、流量削锋和消息通讯
9.实时数据平台:
storm、akka
10.离线数据平台:
hadoop、spark
PS: apark、akka、kafka都是scala语言写的,看到这个语言还是很牛逼的
11.dbproxy:
cobar也是阿里开源的,在阿里系中使用也非常广泛,是关系型数据库的sharding + replica 代理
12.db:
mysql、oracle、MongoDB、HBase
13.搜索:
elasticsearch、solr
14.日志:
rsyslog、elk、flume
15.分布式与集群的区别
分布式:一个业务分拆多个子业务,部署在不同的服务器上。
集群:同一个业务,部署在多个服务器上。
二、分布式常见问题
1.分布式事务
1.1 分布式事务基础
事务的 特性:ACID:原子性、一致性、隔离性、持久性。
1)CAP定理:ZooKeeper保证的是CP
C:一致性
A:可用性
P:分区容错性,容忍网络中断。
2)BASE理论 解决了CAP中没有网络延迟,用软状态和最终一致性,保证了延迟后的一致性。
BA:基本可用
S:软状态
E:最终一致性
1.2.分布式事务解决方案
DTP事务模型(XA规范)
DTP角色:
AP:节点
RM:资源管理器。数据库
TM:事务管理器(协调者)
事务流程:1)begin transaction
2) 业务逻辑
3)commit/rollback
1. 2PC方案:基于XA协议的两阶段提交方案 类似彩排
1)准备阶段
2)提交阶段
存在问题:- 执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
- 协调者发生故障。参与者会一直阻塞下去,需要额外的备机进行容错。
问题一:2阶段出错导致数据不一致。解决方案:补偿机制(人工介入执行sql脚本)。
2. 3PC:通过超时机制解决阻塞的问题。
1)询问阶段
2)准备阶段
3)提交阶段
存在问题:3PC的出现就是通过增加复杂度(性能也因此降低)来解决或优化2PC中的一部分问题。
3. TCC方案 Try:尝试执行业务,Confirm:确认执行业务,Cancel:取消执行业务。事务补偿(反向操作)
第一阶段:主业务服务分别调用所有从业务服务的 try 操作,并在活动管理器中记录所有从业务服务。当所有从业务服务 try 成功或者某个从业务服务 try 失败时,进入第二阶段。
第二阶段:活动管理器根据第一阶段从业务服务的 try 结果来执行 confirm 或 cancel 操作。如果第一阶段所有从业务服务都 try 成功,则协作者调用所有从业务服务的 confirm操作,否则调用所有从业务服务的 cancel 操作。
在第二阶段中,confirm 和 cancel 同样存在失败情况,所以需要对这两种情况做 异常处理 以保证数据一致性。
Confirm 失败:则回滚所有 confirm 操作并执行 cancel 操作。
Cancel 失败:从业务服务需要提供自动 cancel 机制,以保证 cancel 成功。
优点:TCC是对二阶段的一个改进,try阶段通过预留资源的方式避免了同步阻塞资源的情况。
缺点: 缺点还是比较明显的,业务侵入性太强,需要大量开发工作进行业务改造,给业务升级、运维都带来困难;在一些场景中,一些业务流程可能用TCC不太好定义及处理。
4. 基于消息的最终一致性方案
2.分布式锁
1)数据库:实现排他锁
2)redis分布式锁,redisson
3)zk分布式锁,curator
性能:redis > zk > 数据库
可靠性: zk > redis > 数据库。
3.分布式session
3.1
1)tomcat + redis
2)spring session + redis
3.2解决session一致性方案
1)session粘滞:配置简单,单点故障问题。
基于nginx的ip_hash策略来做负载均衡。原理:根据ip做hash计算,同一个ip的请求始终会定位到同一台tomcat。
2)session复制:不会丢失session,内存消耗大。
服务器session复制。原理:tomcat服务器创建session后,会通过组播方式把session发送到组播地址中的其他服务器上。
3)session共享(redis):不会丢失session,适合大集群,系列化和反系列化消耗CPU性能。
4.分布式系统唯一ID几种生成方案
1)数据库自增ID:
2)UUID生成:
3)redis生成:
4)snowflake雪花算法:使用一个 64位的 long 型的数字作为全局唯一 ID。
优点: 高性能、低延迟、去中心化、按时间有序;
缺点: 要求机器时钟同步(到秒级即可),即时间回拨 会导致id重复。
5.分布式缓存之一致性hash算法(hash环)
一致性hash算法会建立一个有2^32个槽点(0 - 2^32-1)的hash环。
解决:hash算法在增加或减少节点时导致缓存失效而引发雪崩的情况。
问题:hash倾斜,解决方案:引入虚拟节点。
虚拟节点读写大概流程为: 数据读写 -> 虚拟节点 -> 真实节点 -> 读写
6.接口幂等性
1)对于每个请求必须有一个唯一的标识。
2)每次处理完请求之后,必须有一个记录标识这个请求处理过了。
3)每次接收请求需要进行判断之前是否处理过的逻辑处理。
例:用redis用orderId作为唯一键。
7.分布式雪崩
1)熔断
2)隔离
3)限流
8.接口重试机制
防止网络波动等导致的接口调用失败。