写点什么

如何不停机将数百个zookeeper实例迁移到kubernetes-金马国际

  • 2020-05-06
  • 本文字数:2347 字

    阅读完需:约 8 分钟

最近,我们在不停机的情况下将数百个 zookeeper 实例迁移到了 kubernetes。我们利用了强大的 kubernetes 特性(例如端点)简化了迁移过程,那些想要跟我们一样进行 zookeeper 迁移的人可以在这篇文章里找到答案。文章的末尾列出了进行迁移所需的网络条件。

传统的 zookeeper 迁移方法

zookeeper 是很多分布式系统的基础,它为这些系统提供了一个强大的平台,让它们可以聚在一起形成集群。它提供了一种比较基础的方法来形成集群:每个服务器实例都有一个配置文件,文件里列出了集群成员的主机名和数字 id,所有的服务器都有相同的集群成员列表,如下所示:


server.1=host1:2888:3888server.2=host2:2888:3888server.3=host3:2888:3888
复制代码


每台服务器都有一个叫作 myid 的文件,用来指明它在列表中对应的是哪个数字 id。


集群可以随意添加和移除服务器,只要没有违反这个关键规则:每台服务器必须能够与配置文件中列出的仲裁服务器通信。传统的 zookeeper 服务器迁移步骤主要包括:


  1. 启动一台新主机,在服务器列表配置中加入“server.4=host:4…”;

  2. 更新已有主机上的配置文件,添加新的服务器条目,或删除已退役的主机;

  3. 滚动重启旧主机(3.4x 版本分支不提供动态服务器配置功能);

  4. 更新客户端的连接串。


这种方法的缺点是需要修改大量的配置文件并进行滚动重启,这种方式可能无法进行可靠的自动化。在将 zookeeper 迁移到 kubernetes 之前,我们也考虑过这种方法,但后来找到了一种更简单的方法。这种方法更为安全,因为根据我们的经验,每一次新的首领选举都存在一个小风险,就是有可能会让依赖它们的系统崩溃。

新的迁移方法

我们将已有的 zookeeper 服务器包装成 kubernetes 服务,然后使用相同的 zookeeper id 进行从服务器到 pod 的一对一替换。这只需要一次滚动重启就可以重新配置现有的 zookeeper 实例,然后逐一关闭服务器。不过,我们不打算深入讨论如何为 zookeeper 配置 kubernetes 拓扑,也不打算深入讨论底层的状态就绪检查机制,因为有很多方法可以实现这些操作。


我们将分五个步骤进行迁移:


  1. 确保为 zookeeper 集群的迁移做好准备;

  2. 在 kubernetes 中创建 clusterip 服务,将 zookeeper 包装成服务;

  3. 修改 zookeeper 客户端,让它们连接到 clusterip 服务;

  4. 配置 zookeeper 服务器实例,让它们可以基于 clusterip 服务地址执行点对点事务;

  5. 通过 kubernetes pod 运行 zookeeper 实例。


对于下面的每一个步骤,我们都将提供一个基础设施拓扑关系图。为了便于理解,这些图只包含两个 zookeeper 实例(在现实当中一般不会创建少于三个节点的集群)。

准备好先决条件

我们从一个可运行的 zookeeper 集群开始,确保主机上的服务能够与 kubernetes 集群通信。文末介绍了几种方法。



图 1:初始状态,一个包含两个实例的 zookeeper 集群和一些客户端

创建 clusterip 服务

为每个 zookeeper 服务器创建一个具有匹配端点的 clusterip 服务,可以让客户端端口(2181)和集群内部端口(2888、3888)通过。完成之后,就可以通过这些服务主机名连接到 zookeeper 集群。kubernetes clusterip 服务在这个时候很有用,因为它们提供了可以作为后端 pod 负载均衡器的静态 ip 地址。我们用它们进行从服务到 pod 的一对一映射,相当于为每个 pod 提供了一个静态的 ip 地址。



图 2:可以通过 clusterip 服务访问我们的集群(zookeeper 仍然运行在物理硬件上)

重新配置客户端

在可以通过 kubernetes clusterip 服务连接到 zookeeper 集群之后,接下来就可以重新配置客户端了。如果你在 zookeeper 连接串中使用了 cname 记录,那么请修改 dns 记录。如果客户端在连接失败时不会重新解析 dns 条目,那么就重新启动客户端。如果没有使用 cname 记录,那么就需要使用新的连接串,并重新启动客户端。在这个时候,新旧连接串都可以使用。



图 3:客户端现在通过 clusterip 服务实例与 zookeeper 集群通信

重新配置 zookeeper 实例

接下来,我们将让 zookeeper 服务器通过 clusterip 服务进行点对点通信。为此,我们将结合 clusterip 服务的地址来修改配置文件。这里还需要配置 zk_quorum_listen_all_ips 标志,如果没有这个,zookeeper 实例将无法成功绑定到主机接口上不存在的 ip 地址,因为它是一个 kube 服务 ip。


server.1=zk1-kube-svc-0:2888:3888server.2=zk2-kube-svc-1:2888:3888server.3=zk3-kube-svc-2:2888:3888zk_quorum_listen_all_ips: true
复制代码


滚动重新启动这些主机,后面就可以开始准备用 pod 替换主机了。



图 4:zookeeper 实例现在通过 clusterip 服务与其他实例通信

使用 pod 替代 zookeeper 主机

我们将进行以下这些步骤,每次操作一台服务器:


  1. 选择一台 zookeeper 服务器及其相应的 clusterip 服务;

  2. 关闭服务器上的 zookeeper 进程;

  3. 使用与被关闭的 zookeeper 具有相同服务器列表配置和 myid 文件的 pod;

  4. 等待,直到 pod 中的 zookeeper 启动,并与其他 zookeeper 节点的数据同步。


就这样,zookeeper 集群现在运行在 kubernetes 中,并带有之前所有的数据。



图 5:经过替换后的集群。zk1 运行在一个 pod 中,而 zk2 不需要知道发生了什么

网络先决条件

要顺利完成这些步骤,需要确保一些网络设置符合条件。你需要确保:


  1. 可以从所有需要连接到 zookeeper 的服务器重新路由 kubernetes pod 的 ip 地址;

  2. 所有连接到 zookeeper 的服务器必须能够解析 kubernetes 服务主机名;

  3. 所有需要连接到 zookeeper 的服务器必须运行 kube-proxy,让它们能够访问 clusterip 服务。


这些可以通过几种方式来实现。我们使用了一个内部网络插件,类似于 的插件,或者 ,可以直接将 aws vpc ip 地址分配给 pod,而不是使用虚拟叠加网络,所以可以从任意实例重新路由 pod 的 ip。叠加网络(如 flannel)也是可以的,只要所有的服务器都可以连接到叠加网络。

英文原文



2020-05-06 13:498193
让所有人认同的文字称不上表达

发布了 408 篇内容, 共 379.5 次阅读, 收获喜欢 1974 次。

关注

评论

发布
暂无评论
  • 这节课,我们就来看看 k8s 原生的服务发现机制:service。

    2022-12-26

  • 这是非云环境中 kubernetes 的配置和运行系列的第六篇文章,本文将详细阐释 etcd 的技术细节,及其在 kubernetes 集群中的作用。

  • 在 cyle 研究人员的一次演习中发现,90万台 kubernetes服务器暴露在网络上,其中799个实例已完全暴露给外部攻击者。

    2022-07-01

  • 消息队列作为基础组件,容灾是它的基本能力。

    2023-09-22

  • 这节课让我们把爬虫项目相关的微服务部署到 kubernetes 中。

    2023-02-11

  • 本文深入探讨了各种高级kubernetes部署策略、优缺点和用例。

  • 在本文中,我将介绍一种简单的云架构,企业可以以增量的方式将单体应用程序迁移到云端,而无需对架构进行重大修改。我们将讨论云计算可伸缩性所需的最低要求和基本组件。

  • 在微服务、云计算和无服务架构时代,理解kubernetes并且知道如何使用它是十分有用的。

  • 通常我们在使用dubbo的时候会建议使用zookeeper作为注册中心,也可以用redis,eureka作为注册中心,当然我只用过zookeeper,dubbo相当于搭载一个服务框架,zookeeper则是服务注册的中心。

  • 你是否一定需要kubernetes?

  • 这些改进增加了可定制性和灵活性。

  • 在3月份的qcon上,red hat的产品经理bilgin ibryam做了一个关于kubernetes上分布式系统演进的演讲。关于后微服务时代的应用架构会是什么样子的,ibryam有一个自己答案。读完本文,你就知道他认为的答案是什么了。

  • 这节课,让我们来看看kubernetes的基本原理。

    2023-02-09

  • 这一节课,让我们接着实现分布式master的核心功能:选主。

    2023-01-21

  • 这个演示是在一个典型的云原生环境中实现了 chronicle queue 的复制。

  • 这节课,我们先来温习一下传统应用暴露公网的方式,然后结合示例应用,进一步学习如何对外暴露 k8s 集群内的应用服务。

    2022-12-30

  • 本文主要记录了zookeeper集群迁移到新节点的详细步骤,迁移过程中极易出错的地方以及如何避免,方便有需要的读者参考。

    2021-09-21

  • 如何零宕机将 2000 个微服务从本地 kafka 集群迁移至云托管多集群平台?

    整个过程是无缝的,无需服务所有者参与,且迁移在正常通信中进行,没有任何停机。

  • 之前已经有很多文章讨论就绪(readiness)和存活(liveness)检查了,我不打算再讨论这个问题。相反,我想非常具体地介绍它们在大型微服务架构中的应用。

  • 在业界目前常见的模式是将独立的kubernetes集群部署到边缘、异构云平台、本地数据中心等,进而能够在一个统一的平台上在边缘、物联网和多云空间中运行应用和服务。

发现更多内容
金马国际
网站地图