AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

如何在 Kubernetes 上部署 Redis 集群

  • 2020-04-23
  • 本文字数:4160 字

    阅读完需:约 14 分钟

如何在Kubernetes上部署Redis集群

介绍

Redis(REmote DIctionary Server 的意思)是一个开源的内存数据存储,通常用作数据库、缓存以及消息代理。它可以存储和操作高级的数据结构类型,比如 lists、maps、sets 以及排序 sets。Redis 接受多种格式的键,因此可以在服务器上执行操作,减少客户端的工作负载。它将数据库完全地保存在内存中,只使用磁盘进行持久化存储。Redis 是一种流行的数据存储解决方案,受到了 Github、Pinterest、Snapchat、Twitter、StackOverflow、Flickr 等科技巨头的青睐。

为什么要用 Redis?

  • 它非常快,它由 ANSI C 编写,可以在 Linux、Mac OS X 和 Solaris 等 POSIX 系统上运行。

  • Reis 经常被评为最流行的键值数据库以及在容器上使用最流行的 NoSQL 数据库。

  • 它的缓存解决方案减少了对云数据库后端的调用。

  • 应用程序可以通过客户端 API 库访问它。

  • 所有流行的编程语言都支持 Redis。

  • 它开源且非常稳定的。

Redis 的应用案例

  • Facebook 的一些在线游戏中,游戏分数更新频率非常高。当使用 Redis 排序 set 时,即使每分钟有数百万用户和数百万个新分数,执行这些操作都非常简单。

  • Twitter 在 Redis 集群中存储了所有用户的时间线。

  • Pinterest 将用户关注者图存储在 Redis 集群中,其中的数据分布在数百个实例中。

  • Github 使用 Redis 作为队列

什么是 Redis 集群?

Redis 集群是一个多 Redis 实例的集合,用于通过对数据库分区来扩展数据库,使其更具有弹性。集群中的每个成员,无论是主副本还是次级副本,都管理哈希槽的一个子集。如果一个主服务器出现不能访问的故障,那么它的从属服务器会提升为主服务器。在由三个主节点组成的最小的 Redis 集群中,每个主节点都有一个从属节点(为了至少能保证最低程度的故障转移),每个主节点分配一个范围在 0 至 16383 之间的哈希槽。节点 A 包含哈希槽范围为从 0 到 5000,节点 B 为 5001 到 10000,节点 C 从 10001 到 18383。集群内部的通信则通过内部总线进行,使用 gossip 协议来传播关于集群的信息或者发现新节点。


在 Kubernetes 上部署 Redis 集群

在 Kubernetes 中部署 Redis 集群很有挑战,因为每个 Redis 实例都依赖于一个配置文件,该文件跟踪其他集群实例及其角色。为此,我们需要结合使用 Kubernetes 状态集(StatefulSets)和持久卷(PersistentVolumes)。

前期准备

要完成此次的 demo,我们需要有下列准备:


  • Rancher

  • Google 云平台或者其他云提供商账号。下面的展示中使用了 GKE,不过使用任何云提供商都是可以的,且操作方法大致相同。

启动 Rancher 实例

如果你没有 Rancher 的实例,可以参考这里的 Quick Start 文档简单快速地启动一个:


https://rancher.com/quick-start/

用 Rancher 部署 GKE 集群

用 Rancher 启动并配置你的 Kubernetes 集群,具体步骤可以参考文档:


https://rancher.com/docs/rancher/v2.x/en/cluster-provisioning/hosted-kubernetes-clusters/gke/


当集群准备就绪,我们可以通过 kubectl 指令检查当前状态


部署 Redis

接着部署 Redis 集群,我们既可以通过 kubectl 来应用 YAML 文件,也可以将它们导入到 Rancher UI 中。下面列出了我们所有需要的 YAML 文件。



YAML 内容如下:


redis-sts.yaml




redis-svc.yaml


验证部署

检查 Redis 节点是否启动并运行:



下面的 6 个卷是我们创建的


$ kubectl get pvNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                          STORAGECLASS   REASON   AGEpvc-ae61ad5c-f0a5-11e8-a6e0-42010aa40039   1Gi        RWO            Delete           Bound    default/data-redis-cluster-0   standard                7mpvc-b74b6ef1-f0a5-11e8-a6e0-42010aa40039   1Gi        RWO            Delete           Bound    default/data-redis-cluster-1   standard                7mpvc-c4f9b982-f0a5-11e8-a6e0-42010aa40039   1Gi        RWO            Delete           Bound    default/data-redis-cluster-2   standard                6mpvc-cd7af12d-f0a5-11e8-a6e0-42010aa40039   1Gi        RWO            Delete           Bound    default/data-redis-cluster-3   standard                6mpvc-d5bd0ad3-f0a5-11e8-a6e0-42010aa40039   1Gi        RWO            Delete           Bound    default/data-redis-cluster-4   standard                6mpvc-e3206080-f0a5-11e8-a6e0-42010aa40039   1Gi        RWO            Delete           Bound    default/data-redis-cluster-5   standard                5m
复制代码


我们可以检查任何一个 pod,看看它添加的卷:


$ kubectl describe pods redis-cluster-0 | grep pvc  Normal  SuccessfulAttachVolume  29m   attachdetach-controller                          AttachVolume.Attach succeeded for volume "pvc-ae61ad5c-f0a5-11e8-a6e0-42010aa40039"
复制代码


同样的数据还可以在 Rancher UI 上看到



部署 Redis 集群

下一步就是创建 Redis 集群了。为此,我们需要运行以下命令,输入 yes 接受配置。前三个节点成为主节点,最后三个节点设置为从属节点。


$ kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
复制代码


以下是完整的输出命令:


>>> Performing hash slots allocation on 6 nodes...Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 10.60.1.13:6379 to 10.60.2.12:6379Adding replica 10.60.2.14:6379 to 10.60.1.12:6379Adding replica 10.60.1.14:6379 to 10.60.2.13:6379M: 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b 10.60.2.12:6379   slots:[0-5460] (5461 slots) masterM: 3f119dcdd4a33aab0107409524a633e0d22bac1a 10.60.1.12:6379   slots:[5461-10922] (5462 slots) masterM: 754823247cf28af9a2a82f61a8caaa63702275a0 10.60.2.13:6379   slots:[10923-16383] (5461 slots) masterS: 47efe749c97073822cbef9a212a7971a0df8aecd 10.60.1.13:6379   replicates 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75bS: e40ae789995dc6b0dbb5bb18bd243722451d2e95 10.60.2.14:6379   replicates 3f119dcdd4a33aab0107409524a633e0d22bac1aS: 8d627e43d8a7a2142f9f16c2d66b1010fb472079 10.60.1.14:6379   replicates 754823247cf28af9a2a82f61a8caaa63702275a0Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join....>>> Performing Cluster Check (using node 10.60.2.12:6379)M: 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b 10.60.2.12:6379   slots:[0-5460] (5461 slots) master   1 additional replica(s)S: 47efe749c97073822cbef9a212a7971a0df8aecd 10.60.1.13:6379   slots: (0 slots) slave   replicates 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75bM: 754823247cf28af9a2a82f61a8caaa63702275a0 10.60.2.13:6379   slots:[10923-16383] (5461 slots) master   1 additional replica(s)M: 3f119dcdd4a33aab0107409524a633e0d22bac1a 10.60.1.12:6379   slots:[5461-10922] (5462 slots) master   1 additional replica(s)S: e40ae789995dc6b0dbb5bb18bd243722451d2e95 10.60.2.14:6379   slots: (0 slots) slave   replicates 3f119dcdd4a33aab0107409524a633e0d22bac1aS: 8d627e43d8a7a2142f9f16c2d66b1010fb472079 10.60.1.14:6379   slots: (0 slots) slave   replicates 754823247cf28af9a2a82f61a8caaa63702275a0[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.
复制代码

验证集群部署

检查集群细节以及每个成员的角色


测试 Redis 集群

我们希望使用集群并且模拟节点故障。对于前一个任务,我们将部署一个简单的 python 应用程序,而后一个任务,我们将删除一个节点来观察集群行为。

部署 Hit Counter 应用

我们将在集群中部署一个简单的应用程序,并在其之前放置一个负载均衡器。该应用程序的目的是在将计数器的值作为 HTTP 响应返回值返回之前,增加计数器的值,并将值存到 Redis 集群上。


使用 kubectl 或者 Rancher UI 部署:



YAML 内容如下:


app-deployment-service.yaml



Rancher 展示了我们创建的资源:一个包含 python 应用的 pod,以及 LoadBalancer 类型的服务。该服务的详细信息内,将显示其公共 IP 地址:




到了这一步,我们可以用浏览器访问 IP,生成 hit counter 的值:


模拟节点故障

我们可以通过删除 pod(使用 kubectl 或 Rancher UI)来模拟集群成员的故障。当我们删除原先是 master 的 redis-cluster-0 时,我们看到 Kubernetes 将 redis-cluster-3 提升为 master,而当 redis-cluster-0 重新回来时,redis-cluster-3 会重新恢复从属身份。


之前

之后


我们可以看到 redis-cluster-0 的 IP 发生了变化,那么集群是如何恢复的呢?


在创建集群时,我们创建了 ConfigMap,该 ConfigMap 又在/conf/update-node.sh 处创建了一个脚本,容器在启动时调用该脚本。该脚本使用本地节点的新 IP 地址更新 Redis 配置。有了 confic 中的新 IP,集群就可以在新的 pod 中以不同的 IP 地址启动并恢复。


在这个过程中,如果我们继续加载页面,计数器仍会继续增加,在集群收敛之后,我们会看到没有丢失任何数据。


结论

Redis 是一个强大的数据存储和缓存工具。因为 Redis 存储数据的方式,Redis 集群更是能通过提供分片、相关性能优势、线性扩展和高可用性,来进一步扩展其功能。数据在多个节点之间自动分割,即使节点的子集出现故障或者不能和集群其他部分通信,操作仍然能够继续。


有关 Redis 集群的更多信息,请访问教程(https://redis.io/topics/cluster-tutorial)或者文档(https://redis.io/topics/cluster-spec)。


有关 Rancher 的更多信息,请访问我们的主页(https://www.cnrancher.com)或者部署文档(https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/)。


2020-04-23 17:232252

评论

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

中康科技黄毅宁:AI+医疗,于我而言是圆梦

飞桨PaddlePaddle

数据库领域3月大事件

NineData

数据库 云计算

从GPT-4、文心一言再到Copilot,AIGC卷出新赛道?

引迈信息

微软 AIGC 文心一言 GPT-4

智慧公厕:未来城市的必备设施

光明源智慧厕所

物联网 智慧城市

华为昇思MindSpore开源社区三周年生日会,三大亮点不容错过!

Geek_2d6073

黄牛党“屯购”OPPO Find X6 无感验证护航官方商城安全

Geek_2d6073

两项大奖加持,浩鲸科技福利小店-WHALE SELECT

鲸品堂

福利 平台 平台搭建 企业号 3 月 PK 榜

面试造火箭?GitHub飙升“2023(Java 岗)面试真题汇总”转载40万

三十而立

Java java面试

解决90%面试问题!GitHub顶级"Java面试手册"了解下八股文天花板

三十而立

Java java面试

任务卷轴模式系统开发NFT技术

薇電13242772558

系统

质量内建落地的四要素

老张

质量保障 质量内建 交付质量

git客户端软件:Sublime Merge 激活版

真大的脸盆

Mac Mac 软件 Git客户端

关于 MyBatis 我总结了 10 种通用的写法

三十而立

Java mybatis

模型驱动软件开发 打造企业数字化未来

力软低代码开发平台

ADDS-DepthNet:基于域分离的全天图像自监督单目深度估计

飞桨PaddlePaddle

山东大学-飞桨人工智能教育创新中心正式挂牌,打造区域产教融合新范式

飞桨PaddlePaddle

百图生科AIGP平台发布:提供多种蛋白质生成能力,邀伙伴联手开发“新物种”

硬科技星球

游戏版《西部世界》来了!NPC全由AI操控,行动自如有理想和记忆,基于最新GAEA技术系统打造

Openlab_cosmoplat

AI 游戏 开源社区

MobTech|如何选择应用内广告SDK产品

MobTech袤博科技

GPT-4写代码能力提升21%!MIT新方法让LLM学会反思,网友:和人类的思考方式一样

Openlab_cosmoplat

机器学习 开源社区 智能 ChatGPT GPT-4

百度安全助力小度智能屏通过中国泰尔实验室适老化技术测试认定

百度安全

智能硬件

合约跟单项目系统开发(技术源码)丨合约量化系统开发技术(成熟案例)

I8O28578624

批量上传iOS应用程序截图的实用技巧

雪奈椰子

永洪BI、瓴羊Quick BI领衔国产BI工具

巷子

TitanIDE:云原生开发到底强在哪里?

行云创新

ide 云原生 云开发

阿里云高级技术专家林立翔:基于阿里云弹性GPU服务的神龙AI加速引擎,无缝提升AI训练性能

云布道师

阿里云 AI

软件测试/测试开发丨在Docker 上搭建持续集成平台 Jenkins

测试人

软件测试 自动化测试 测试开发

币安/欧意合约自动跟单软件开发源代码

开发v-hkkf5566

如何高效搭建资产管理平台?众安科技告诉你答案是图技术

NebulaGraph

图数据库

低代码开发:助力企业高效实现数字转型的一大利器

加入高科技仿生人

大数据 低代码 数字化 数字转型

如何在Kubernetes上部署Redis集群_文化 & 方法_Rancher_InfoQ精选文章