今天我们先普及分布式架构中的一些概念,只有先将这些基础的概念弄明白了,分布式架构实践的道路才能走的稳、走得远。
【一、分布式架构是什么】
由多台机器组成,数据和流量散落在不同的机器中。
解决了单机的计算能力、存储容量、吞吐量、延迟时间、并发量的问题。
分布式理论上是可以无限制扩容机器的。
【二、分布式架构中的名词】
带存储的状态节点:状态分为局部的会话状态和全局的资源状态,有数据等价于有状态。
无状态节点:服务端内部不做任何的暂存区,请求可以提交到任意副本节点,无状态的服务伸缩性很强。
宕机节点:机器宕机是最常见的异常之一,任何时候都可能发生宕机造成某些协议流程无法完成。节点不能进入正常工作的状态称为不可用状态。节点重新启动后,将失去所有内存中的信息。节点可以从读取本地存储中的信息或读取其它节点数据的方式进行内存中数据的恢复,重新进入可用状态。
网络通信:节点之间是完全独立、相互隔离的,节点之间的传递消息通过不可靠的网络进行通信。
网络分化:有的节点之间通信正常,有的节点之间无法正常通信。
异常:机器宕机、网络通信中消息丢失、网络分化、网络消息的乱序、网络消息发生比特错误、存储数据丢失或读出的数据错误。
半死不活:磁盘故障导致IO操作缓慢、网络不稳定、网络拥塞,一会好一会坏。
分布式三态:单机系统中要不成功要不失败。分布式系统中请求结果存在三种状态。分布式中有成功、失败、超时(未知)三态 超时的时候可以发起读数据操作验证是否成功,还有就是执行的时候做成是可重试的,但是要保证幂等性。
小结:设计分布式架构的时候,需要思考在执行的流程中每个步骤发生异常时系统的处理方式以及造成的影响。认为某种异常出现的概率小甚至可以忽略不计的思路是不对的,假如样本的大小很大,那出现异常风险的概率也会增大。
【三、分布式架构基于TCP通信可靠】
丢失和乱序:TCP协议在数据包丢失的时候会进行重传,会为传输的每一个字节设置顺序递增的序列号解决了网络通信中的消息丢失和乱序问题。
校验数据:TCP协议为每个TCP数据段使用32位的校验从而检查数据错误问题。
时延与吞吐:TCP协议通过设置接收和发送窗口的机制提高了传输性能,解决网络传输的时延与吞吐问题。
拥塞控制算法:TCP协议最为复杂巧妙的是不断改进的拥塞控制算法,可以动态感知底层链路的带宽加以合理使用并与其它TCP链接分享带宽 程序自身去动态调控自治是比较复杂的,比如微服务中的网关对接口的限流需要动态去调控。
小结:TCP协议保证了TCP协议栈之间的可靠传输,无法保证两个上层应用之间的可靠通信,依旧要考虑分布式中的网络异常。
【四、分布式架构中的副本】
副本(replica/copy)在分布式中为数据或服务提供冗余。
数据副本是唯一手段解决分布式系统中数据丢失的异常。
服务副本是多个节点提供某种相同的服务,这种服务一般不依赖节点的本地存储,需要的数据来自其他节点。
副本一致性是针对分布式系统而言的,不是针对某一个副本。对外部用户来说,数据始终是一致性的。依据一致性强弱的苛刻程度,分为若干变种或级别。
常见的一致性,强一致性苛刻程度最高,实现最难,任何时刻任意用户或者节点都可以读到最近一次成功更新的副本数据值。
单调一致性,苛刻程度一般,实现起来简单,任何时刻,任何用户一旦读取到某个数据某次更新的值,这个用户不会读取到比这个更旧的值。只需要关心从已方视角观察到的一致性,不需要关心其它用户的一致性情况。
会话一致性,苛刻程度一般,实现起来简单,任何时刻,任何用户在某一次会话内一旦读取到某个数据在某次更新的值,这个用户不会读取到比这个更旧的值。基于单调一致性上进一步放松约束,保证单个用户单次会话内是一致性的情况。
最终一致性,苛刻程度一般,实现起来简单,一旦某个更新成功,各个副本上的数据最终达到完全一致,达到完全一致状态所需要的时间不能保障,可以实现类似单调一致性效果,一旦用户更换副本则无法保证任何一致性。
弱一致性,苛刻程度一般,实现起来困难,一旦某个更新成功,用户无法在一个确定的时间读取到这次更新的值。一般很难在实际中使用,需要应用方做更多的工作使系统可用。
【五、如何衡量分布式架构的好坏】
性能(performance):系统的吞吐能力、系统的响应延迟、系统的并发能力。
可用性(availability):系统面对各种异常时还可以正常提供服务的能力。可以用停服务的时间和正常服务时间比例衡量、也可以用失败次数与成功次数比例衡量。
伸缩性(scalability):系统可以通过伸缩集群机器规模提高系统性能(吞吐、延迟、并发)、存储容量、计算能力的特性。
一致性:系统通过冗余提高可用性,会带来副本一致性问题,根据不同业务需求,选择合适的一致性模型。
小结:设计需求的不同,对指标的要求会不同,不同服务,关注的指标、指标数据大小也不尽相同。指标还有扩展性、安全性、可运维、弹性等。
登录后可发表评论