这是我参与「第五届青训营 」伴学笔记创作活动的第 23 天
在分布式存储中,需要学习的知识点也有四个:
1)如何判断数据存储规则?
2)如何数据分片?
3)如何复制数据?
4)如何做分布式事务?
-
分布式系统的分布式计算中,第一个问题是
*服务如何找到另一个服务呢*
?
这块主要是结合微服务的思想在进行落地。通过将服务划分为生产者producer(提供相应的服务)、消费者consumer(发起请求的服务),再通过服务注册、服务发现,生产者节点将自己所能提供的服务、自己的IP地址端口等给到注册中心,消费者节点到注册中心根据自己的诉求获取需要的服务。
-
第二个问题是
*在服务找到之后,消费者节点应该将用户的请求发往部署着生产者节点的哪一个服务呢*
?
如果是有状态的服务(即同一个服务下不同机器的数据不一样),通过路由来确认当前要访问的请求数据是在哪一个实例上,再进行请求的分发即可;如果是无状态的服务(即同一个服务不同机器的数据一样),通过hash、权重分配、轮询等规则将请求进行分发即可。
-
第三个问题是
*如何避免服务的雪崩*
(即部署某个服务的某台机器出了问题,大量的请求发过来,导致其他的机器承受不住,最后该服务的所有机器都挂了)?
在分布式系统内有两个办法,1、快速减少系统负载来避免雪崩的方式,即熔断服务、降级服务、限流服务;2、通过快速增加机器节点,承受更多的服务请求,即弹性扩容。
-
最后一个问题是
*如何对分布式系统进行监控告警*
?
在分布式系统内部,由于服务众多、机器众多,如果不了解系统整体的情况、服务与服务之间如何关联,当出现问题时排查问题就会变得非常艰难。通过在部署服务的每台机器上安装探针,采集数据,进行分布式的trace追踪,再结合一定的告警机器,可保障服务的高可用,在出现问题时快速排查、解决问题。
-
分布式系统的分布式存储中,第一个问题是
*用什么样的规则决定如何存储数据*
?
业内流行的有三个理论,即ACID(即atomicity原子性、consistency一致性、isolation隔离性、durability持久性)、BASE(即BasicallyAvailable基本可用、SoftState软状态、EventuallyConsistent最终一致性)、CAP(即Consistency一致性、Availability可用性、Partition分区容错性)。这取决于不同的业务场景,在交易场景中,大部分企业会采取ACID原则,即交易操作不能接受任何错误,每个操作的步骤必须是原子的、操作与操作的数据是隔离的、操作完成后的数据是持久化的;在大部分场景中,企业一般采用BASE原则,即每个业务系统最开始的时候由于大业务量等情况,数据不要求强一致性,但可以通过采取一定的方式使得数据最后是一致的。
-
第二个问题是
*如何做数据分片*
?
我们知道互联网系统会产生大量的数据,而单机是不可能存储所有的数据,因此需要解决数据如何存储在不同的机器上。在分布式系统中常用的规则就是Hash、一致性hash、按范围分片规则来将数据存储在不同的机器上。
-
第三个问题是
*如何做数据复制*
?
为了保障服务的高可用,除了机器的设备准备之外,还需要对数据做处理,保障业务请求访问到任何一个节点的数据都是一致的、准确的。常用的解决方案有主从复制、一致性协议Raft等。
-
第四个问题是
*如何做分布式事务*
?
在单机系统中,通过时间戳加序号的方式就可以实现事务功能,然而在分布式系统中,因为系统拆分成了微服务、微服务又分为多个节点进行部署,系统中的时间不能完全同步,这个时候可以采用整体系统选一台机器按单机的模式生产事务ID,同城多中心和异地多中心去该台机器获取事务ID,实现分布式事务一致性。