常见的分布式系统(常见的分布式系统有哪些)
打造一个高可用系统的初衷是为了无论在何种未知意外发生的情况下,系统的核心功能仍然能正常运作。当然这个“未知意外”不能太过分,比如,如果地球都没了,系统自然也就没办法了,除非咱们有个“异星球多活”的方案。
强化系统高可用特效的手段有很多,比如服务高可用、数据高可靠、故障隔离、故障恢复、流量控制、服务降级、熔断等。
服务高可用
实现服务高可用的主要手段有主备切换和负载均衡。
主备切换说的是当主节点发生故障后,从备选节点中选出一个作为新的主节点,以继续提供服务。这种方案主要应用在“有状态”的服务,“有状态”说的是服务会自身持久化系统运行所依赖的数据,比如包含了分片映射、worker健康状态等信息的集群元数据。对此,在主备方案中,同一时刻只有主节点对外提供服务,而备份节点不会提供服务,并且在数据写入时,需要同时写入主节点和备份节点,以免主备切换后导致数据丢失。
而无状态服务则说的是集群运行所依赖的元数据保存在了额外引进的组件上,比如现在很多分布式系统如pulsar、kafka、ds除了会将元数据保留一份在自己的服务内存中之外,还会在zk上保留一份。这样做的目的是在系统开发时完全可以不用考虑数据的副本设计、分片设计、以及一致性的问题,直接引一个已经具备了解决这些问题的组件就行了,然后专注于系统的核心业务开发。对于,无状态的服务,则适合负载均衡的方案,也就是同一类服务会存在多个,然后通过负载均衡算法将请求均匀分散地打在某一个服务上面。
数据高可靠
实现数据高可靠的目的是为了避免因为“意外”,比如磁盘损坏而导致的数据丢失问题。
一旦数据丢失后,就会导致系统核心功能不能正常运作。比如,对于一个分布式数据库,如果数据库的元数据(比如某个库拥有哪些分片、分片在机器上的存储位置等)丢了一个分片,导致某个数据库在系统里面“消失了”,后续往库里写的操作及读的操作都会失败。
实现数据高可靠的手段一般是“冗余备份”,也就是给数据的每个分片设计多个副本,当往主副本里面写数据的时候,同时也需要往其他副本里面写,或者其他副本异步地从主副本把数据同步过来。
故障隔离
故障隔离的目的是,对故障组件进行隔离,以避免其影响系统中的其他组件,尽可能保证分布式系统的可用性。实现故障隔离可以从两个维度来看:
- 功能模块:从功能模块的方向出发,可以将一个大模块拆分成多个小模块,然后将这些小模块分散在不同的机器上,这样相互之间就不影响了。当下大行其道的微服务设计亦是如此。
- 资源隔离:通过资源隔离,系统中各个模块拥有自己独立的资源,不会发生资源争抢,从而避免了因为某个模块抢占了整个机器资源而导致的其他模块因资源不足无法对外正常提供服务的问题。云原生的容器技术,就是利用了linux的cgroup和namespace技术来实现的对某个进程的资源制和隔离。
故障恢复
故障恢复说的是某个模块、服务或者整个系统发生了故障之后,采用某种恢复手段来保证系统服务仍然可用。
上面说的服务主备切换、数据冗余副本都是属于故障恢复的范畴。这两者都是从某个进程或者某个节点出发的,还可以从更大的粒度出发,也就是可以从整个集群的粒度出发来实现故障恢复,这就是平时常说的“异地多活”。
顾名思义,异地多活架构的关键点就是异地、多活,其中异地就是指地理位置上不同的地方(比如,北京和上海),多活就是指不同地理位置上的系统都能够提供业务服务异地多活架构。当其中一个地理位置上的集群发生故障后,可以立即将故障集群上面的流量切换到其他位置上的集群。异地多活又可以分为同城异区、跨城异地、跨国异地。
异地多活架构的故障恢复能力无可厚非地很硬核!但是也存在两个问题:
- 一个问题是成本,多出了一个集群的运维成本和机器成本
- 另一个则是消息延迟的问题。两个集群离的位置越远,故障恢复能力越强,但是数据传输的延迟就越大,这样会导致两个集群之间的数据永远存在一个时差,如果集群发生了故障,然后因故障恢复切换到另外一个集群之后,还未来得及同步的那部分数据就丢失了。
卷不动了,流量控制、服务降级、熔断放下篇吧~