写点什么

如何在 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:232272

评论

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

优化大宽表查询性能,揭秘GaussDB(DWS) 谓词列analyze

华为云开发者联盟

GaussDB #数据库 analyze

探索Flink动态CEP:杭州银行的实战案例

Apache Flink

大数据 flink 数据分析 CEP 实时处理

聚力创新|首届BIOV生命科技与再生医疗国际峰会在泰国曼谷圆满举行

TechubNews

阿里发布多模态推理模型 QVQ-72B,视觉、语言能力双提升;OpenAI 正在研发人形机器人丨 RTE 开发者日报

声网

向量检索的3种方式

DashVector

人工智能 数据库 向量检索 大模型

Python中定位元素包含文本信息的详细解析与代码示例

EquatorCoco

Python

指标管理+AI大模型深度融合,开启智能数据分析管理新时代

袋鼠云数栈

轻至986g,续航18小时、120TOPS算力!ThinkPad X1 Carbon Aura AI元启版刷新商务AI PC巅峰体验

科技范儿

聊一聊 C#线程池 的线程动态注入

快乐非自愿限量之名

C#

剖析——陪玩源码,陪玩平台搭建的各种必备功能与收益来源,游戏陪玩系统源码

DUOKE七七

php 开源 uniapp 陪玩系统源码

对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点

声网

出海电商如何解决网络问题

Ogcloud

SD-WAN 跨境电商网络 外贸网络 SD-WAN国际专线 国际网络专线

Gate.io 平台通证 GT:持续赋能与销毁、财富效应显著

股市老人

华为阅读年度榜单揭晓:汇聚精品内容,打造沉浸式阅读盛宴

最新动态

三场与AI有关的死亡

脑极体

AI

华为ensp--BGP路由黑洞

阿落ovo

2024年OpenTiny年度人气贡献者评选正式开始

OpenTiny社区

开源 前端 OpenTiny

如何找到可靠的海外云服务器租用商

Ogcloud

云服务器 香港云服务器 美国云服务器 海外云服务器 云服务器租用

阿里大佬翻遍全网Java面试文章,总结出这份1658页文档,GitHub收获25K+点赞

Summer

Java 程序员 面试 架构师 大厂

一个好的体育赛事直播平台怎么组成

熊猫比分大卫

体育赛况资讯直播app开发 体育直播 体育直播网源码

.NET 9 中的 多级缓存 HybridCache

快乐非自愿限量之名

.net

三面滴滴失败,总结了Java面试题,有几个题还是一直搞不懂

Summer

Java 程序员 面试 架构师 大厂

部署有声读物和播客的自托管媒体服务器Audiobookshelf

轶天下事

向量更新的3种方式

DashVector

人工智能 数据库 大模型

YOLOv5 的量化流程及部署方法

地平线开发者

自动驾驶 算法 地平线征程5 地平线征程6

大语言模型的上下文窗口 (Context Windows)

澳鹏Appen

文本生成 LLM 大语言模型

全新红娘交友系统定制版源码| 相亲交友小程序源码全开源可二开_

DUOKE七七

php 开源 uniapp

ByConity BSP 解锁数据仓库新未来

Swift社区

2024数据库编程大赛-八强决赛成绩揭晓

NineData

Doris NineData 第二届数据库编程大赛

Altair RapidMiner 解锁更高级别的功能,支持用户无缝构建和部署高级 AI agent

Altair RapidMiner

机器学习 #人工智能 altair #数据分析 RapidMiner

性能优化!突破性能瓶颈的尖兵CPU Cache

不在线第一只蜗牛

性能优化

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