NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

如何不停机将数百个 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:498174
用户头像
小智 让所有人认同的文字称不上表达

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

关注

评论

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

IOS上架流程详解,包含审核避坑指南!

雪奈椰子

ChatGPT介绍与使用场景

楚少AI

openai ChatGPT ChatGPT4

ChatGPT App苹果版下载

楚少AI

ChatGPT ChatGPT4 chatgpt app

ChatGpt账号注册

楚少AI

ChatGPT chatgpt注册

Web3 游戏团队如何在项目发布前奠定成功基础 ——以真实用户支持为核心的运营策略

Footprint Analytics

区块链游戏 NFT Web3 游戏

九大亮点+六大好处,瑞云科技虚拟仿真实训平台引领教育信息化新潮流

3DCAT实时渲染

虚拟仿真 云仿真 3D实时云渲染

2023-06-02:给定一个二进制数组 nums 和一个整数 k, k位翻转 就是从 nums 中选择一个长度为 k 的 子数组, 同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1

福大大架构师每日一题

golang 算法 rust 福大大

总结vue3 的一些知识点:Vue.js 安装

雪奈椰子

Django笔记四十一之Django中使用es

Hunter熊

Python django elasticsearch

推进开源法律知识普及|2023开放原子全球开源峰会开源法律与合规分论坛即将启幕

开放原子开源基金会

开源 法律与合规

Nautilus Chain:我们将支持EIP6969

股市老人

多层网关已成过去,网关多合一成潮流,网关改造正当时丨Higress 正式发布 1.0 版本

阿里巴巴云原生

阿里云 云原生 网关 Higress

人脸面部表情识别的原理及其应用

来自四九城儿

总结vue3 的一些知识点:​Vue.js 条件语句​

雪奈椰子

存储接口测试简介与测试方法

天翼云开发者社区

测试 存储

为什么说 Go 语言字符串是不可变的?

AlwaysBeta

Go 源码 面试 字符串

文心一言 VS 讯飞星火 VS chatgpt (29)-- 算法导论5.2 1题

福大大架构师每日一题

ChatGPT 文心一言

ChatGPT 背后的英雄——AI芯片

天翼云开发者社区

人工智能 AI芯片

Linea奥德赛没有测试币ETH怎么办?3种渠道领取

加密先生

测试币 Linea

以技术实践赋能开源安全|2023开放原子全球开源峰会开源安全技术与实践分论坛即将启幕

开放原子开源基金会

开源 开源软件供应链 开源安全技术

Generative AI 新世界 | 大型语言模型(LLMs)概述

亚马逊云科技 (Amazon Web Services)

机器学习 tensorflow 开源 PyTorch Amazon SageMaker

技术分享 | 如何编写同时兼容 Vue2 和 Vue3 的代码?

LigaAI

JavaScript vue.js Vue 前端 企业号 6 月 PK 榜

C语言编程-共用体

智趣匠

6 月 优质更文活动

MobTech MobPush|统一推送联盟烂尾,统一推送还能实现吗

MobTech袤博科技

火山引擎边缘云,助力泛娱乐产业数字化转型升级

火山引擎边缘云

Qcon 云产品 火山引擎边缘云

QR防伪溯源系统追溯原理是什么?

天翼云开发者社区

防伪溯源 防伪技术 QR技术

重磅升级|ONES Resource 资源管理解决方案

万事ONES

JavaScript深度剖析之变量、函数提升:从表面到本质

控心つcrazy

Nautilus Chain:我们将支持EIP6969

大瞿科技

Nautilus Chain:我们将支持EIP6969

BlockChain先知

Spring Boot 启动注解分析

江南一点雨

Java spring springboot

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