写点什么

如何不停机将数百个 ZooKeeper 实例迁移到 Kubernetes

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

    阅读完需:约 8 分钟

如何不停机将数百个ZooKeeper实例迁移到Kubernetes

最近,我们在不停机的情况下将数百个 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 服务。


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

英文原文

ZooKeeper to Kubernetes Migration


2020-05-06 13:498376
用户头像
小智 让所有人认同的文字称不上表达

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

关注

评论

发布
暂无评论
发现更多内容

Python批量分割Excel后逐行做差、合并文件的方法

不在线第一只蜗牛

Python Excel 开发语言

手把手教你利用算法工具链训练、量化、编译、可视化 征程 6 参考算法 BEVFormer征程 6E/M 快速上手实战 Sample-IPC

地平线开发者

自动驾驶 算法 ipc

天工开物 | 征程6 启航新章:量化流程 PTQ 篇

地平线开发者

自动驾驶 算法

Go 语言 nil 和接口

FunTester

十六年所思所感,聊聊这些年我所经历的 DevOps 系统

阿里云云效

阿里云 云原生 云效

非凸科技复旦大学校企合作

非凸科技

人才培养 校企合作 D-Lab

AI 网关基于 IP 地理位置,增强 Prompt 修饰能力

阿里巴巴云原生

阿里云 云原生

技术同学,一定要去大厂吗?

老张

职场成长 认知 职场晋升

作为中级前端工程师,每天都做些什么?

伤感汤姆布利柏

体验通义灵码 @workspace:轻松分析项目结构,结合代码仓库理解工程、查询问答等

阿里巴巴云原生

阿里云 云原生 通义灵码

体验通义灵码 @workspace:轻松分析项目结构,结合代码仓库理解工程、查询问答等

阿里云云效

阿里云 云原生 通义灵码

面经复盘:从高并发到数据存储的深度解析

王中阳Go

Go 面试 复盘 面经

解读基于华为云 DWS 的湖仓一体方案构建

华为云开发者联盟

华为云入选中国云平台领导者,云安全服务斩获国内唯一满分

华为云开发者联盟

值传递OR引用传递?大部人都答错了!

王磊

美国、香港、新加坡加密资产托管要求与合规解析:从Galois Capital事件看全球合规框架

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。 在筛选过程中,每轮选择一个孩子时,所有尚未选

福大大架构师每日一题

福大大架构师每日一题

KaiwuDB 魏可伟:用“多模”实现对行业的“One size best fits”

KaiwuDB

KaiwuDB 分布式多模数据库 KWDB 开源

思维导图软件:Xmind 2024 (Win&Mac) 特别版

你的猪会飞吗

XMind 2024中文 XMind 2024破解版 XMind for mac XMind 破解版

【Tomcat源码分析】Pipeline 与 Valve 的秘密花园

派大星

tomcat源码解读

十六年所思所感,聊聊这些年我所经历的 DevOps 系统

阿里巴巴云原生

阿里云 云原生 云效

JNPF——快速搭建应用好助手

伤感汤姆布利柏

抢先看:2024云栖大会体验攻略

阿里云CloudImagine

云计算 音视频 视频云 云栖大会

大语言模型应用框架介绍

霍格沃兹测试开发学社

魔乐社区体验:探索Llama 3.1模型微调之旅

天翼云开发者社区

人工智能 大模型 Llama3

如何不停机将数百个ZooKeeper实例迁移到Kubernetes_容器_Paul Furtado_InfoQ精选文章