程序员Java架构技术栈Java

分布式面试题,ZK集群如何实现高可用部署?

2019-05-21  本文已影响32人  若丨寒

Zookeeper 我想大家都不陌生,在很多场合都听到它的名字。它是 Apache 的一个顶级项目,为分布式应用提供一致性高性能协调服务。可以用来做:配置维护、域名服务、分布式锁等。有很多开源组件,尤其是中间件领域,使用 Zookeeper 作为配置中心或者注册中心。它是 Hadoop 和 HBase 的重要组件,是 Kafka 的管理和协调服务,是 Dubbo 等服务框架的注册中心等。

原理

在介绍高可用部署前,我们先了解下 Zookeeper 的基本知识,这对充分理解它的高可用部署非常重要。

架构

下图是 Zookeeper 的架构图,ZooKeeper 集群中包含 Leader、Follower 以及 Observer 三个角色:

Client 是 Zookeeper 的客户端,请求发起方。

高可用

Zookeeper 系统中只要集群中存在超过一半的节点(这里指的是投票节点即非 Observer 节点)能够正常工作,那么整个集群就能够正常对外服务

基于此,如果想搭建一个能够允许 N 台机器 down 掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。

因此,如果部署了 3 个 Zookeeper 节点(非 Observer),则如果至少有 2个节点可用则整个集群就可用,意味着 1 个节点故障,不影响 Zookeeper 集群对外提供服务;如果部署了 5 个节点,意味着 2 个节点同时故障,Zookeeper 集群依然能够正常对外提供服务。

Zookeeper 集群部署的节点(非 Observer)数一般为奇数个

部署的节点数一般为奇数个,这里不是说不能为偶数个。例如如果部署了 4 个节点,这意味着需要 4/2+1 = 3 个节点正常,集群才能正常对外服务,即可以容忍 1 个节点故障,但是这个部署 3 个节点,其实效果是一样的,也就是说部署偶数个,从高可用方面来说只是浪费了 1 台机器而已。

部署

既然只要 Zookeeper 集群中存在超过一半的节点能够正常工作,集群就能够正常服务,那 Zookeeper 如果想要 Zookeeper 高可用岂不是很简单,是不是多部署几个节点不就好了呢?

多部署节点就高可用了?

多部署节点,貌似确实是能够增强可用性,但是这里还需要考虑以下两个问题:

机房容灾

如果要保证在整个机房出现故障的情况下,保证 Zookeeper 集群的高可用,是要对 Zookeeper 做跨机房部署的。

单机房

我们先看下单机房部署情况下,下图是单个机房 5 个节点的部署情况。在单机房部署的情况下是不能做到机房容灾的,一旦机房出现问题,整个 Zookeeper 集群就不能对外工作。

单机房部署还需考虑所选的节点应该尽量不在同一个宿主机,不同机柜,避免多个节点同时出现问题。

同城双机房

既然单机房做不到机房容灾,那双机房呢?

如下图在“机房 1”部署 3 个节点,“机房 2”部署 2 个节点,总共 5 个节点的 Zookeeper 集群,这能做到机房容灾吗?任意一个机房故障,集群都能正常对外提供工作吗?

其实,还是不行的。假如“机房 2”故障,“机房 1”正常,这种情况下,因为“机房 1”存在 3 个节点,大于半数,因此还是能够正常工作的;但是,假如“机房 1”故障,那存活节点数只有 2 个,整个集群是不能正常工作的。

因此,Zookeeper 双机房部署,是不能够做到机房容灾的。

同城三机房

我们再来看看三机房部署,三机房部署,是能够做到机房容灾的。还是以 5 个节点的集群为例:

如下图,在“机房 1”、“机房 2”同时部署 2 个节点,而“机房 3” 部署 1 个节点。在任意一个机房故障的情况下,都能满足正常节点数大于半数及以上,所以能够保证机房容灾。

异地容灾

仅仅做到机房级别的容灾,对于一般的业务应该就够了,不过目前很多公司采用的是两地三中心模式,蚂蚁金服甚至做到了三地五中心。在这种情况下,我们的 Zookeeper 集群应该如何部署呢?

两地三中心

“两地三中心”即生产数据中心、同城灾备中心、异地灾备中心建设方案。这种模式下,两个城市的三个数据中心互联互通,如果一个数据中心发生故障或灾难,其他数据中心可以正常运行并对关键业务或全部业务实现接管。

在两地三中心的的模式下,Zookeeper 集群的部署有哪些考量呢?

如下图,一般两地三中心采用的是下面这种部署方式。在“地区 1”有两个同城数据中心,“中心 1”和“中心2”,在异地“地区 2” 有一个异地中心“中心 1”。这里你可能有两个疑问:

三中心优化

为了保护集群,在三个中心都部署上 Observer 节点,而 Client 只与 Observer 机点进行交互,用这种方式可以降低投票节点的工作负载,降低 Leader 和 Follower 的不稳定性,从而提高整个集群的稳定性和可用性。

总结

Zookeeper 的高可用在部署上也是有很多考量的,Zookeeper 集群在部署上可以做到机房容灾,但是做不到异地容灾。另外,为了提升集群的扩展性和稳定性,可以引入 Observer 节点,提升读性能,保护 Leader 与 Follower 节点。

读者福利(学习分享)

对于很多初级Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些架构技术希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时我经过多年的收藏目前也算收集到了一套完整的学习资料,希望对想成为架构师的朋友有一定的参考和帮助。

下面是部分资料截图,诚意满满:特别适合有1-5年开发经验的Java程序员们学习。

资料免费领取方式:扫码关注公众号,后台回复关键词【java】即可获取学习资料!


部分资料如下:

资料免费领取方式:扫码关注公众号,后台回复关键词【java】即可获取学习资料!

上一篇下一篇

猜你喜欢

热点阅读