资讯专栏INFORMATION COLUMN

详细教程丨如何在Kubernetes上部署Redis集群

laoLiueizo / 3134人阅读

摘要:集群中的每个成员,无论是主副本还是次级副本,都管理哈希槽的一个子集。在由三个主节点组成的最小的集群中,每个主节点都有一个从属节点为了至少能保证最低程度的故障转移,每个主节点分配一个范围在至之间的哈希槽。

介 绍

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/ranc...

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

部署Redis

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

YAML内容如下:

redis-sts.yaml



redis-svc.yaml

验证部署

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

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

$ kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

pvc-ae61ad5c-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-0 standard 7m

pvc-b74b6ef1-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-1 standard 7m

pvc-c4f9b982-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-2 standard 6m

pvc-cd7af12d-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-3 standard 6m

pvc-d5bd0ad3-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-4 standard 6m

我们可以检查任何一个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 - 5460

Master[1] -> Slots 5461 - 10922

Master[2] -> Slots 10923 - 16383

Adding replica 10.60.1.13:6379 to 10.60.2.12:6379

Adding replica 10.60.2.14:6379 to 10.60.1.12:6379

Adding replica 10.60.1.14:6379 to 10.60.2.13:6379

M: 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b 10.60.2.12:6379

slots:[0-5460] (5461 slots) master

M: 3f119dcdd4a33aab0107409524a633e0d22bac1a 10.60.1.12:6379

slots:[5461-10922] (5462 slots) master

M: 754823247cf28af9a2a82f61a8caaa63702275a0 10.60.2.13:6379

slots:[10923-16383] (5461 slots) master

S: 47efe749c97073822cbef9a212a7971a0df8aecd 10.60.1.13:6379

replicates 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b

S: e40ae789995dc6b0dbb5bb18bd243722451d2e95 10.60.2.14:6379

replicates 3f119dcdd4a33aab0107409524a633e0d22bac1a

S: 8d627e43d8a7a2142f9f16c2d66b1010fb472079 10.60.1.14:6379

replicates 754823247cf28af9a2a82f61a8caaa63702275a0

Can 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 cluster

Waiting 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 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b

M: 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 3f119dcdd4a33aab0107409524a633e0d22bac1a

S: 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/clust...)或者文档(https://redis.io/topics/clust...)。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32914.html

相关文章

  • SegmentFault 技术周刊 Vol.5 - DockerBuild, Ship, Run,

    摘要:此刻的后手指依旧飞速地敲打键盘,丝毫没有要停不下来意思。阅读本期技术周刊,你不光能弄明白什么是,使用的意义何在,还将被传授秘籍,以达的境界。周刊筛选的每篇内容,是作者的独到见解,踩坑总结和经验分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,听到后排动感十足的清脆键盘响,我就能猜到公司程序员定...

    Panda 评论0 收藏0
  • CloudBest:年度复盘盘点2020无处不的「云原生」

    摘要:华为云华为云在云原生这场游戏中,最具竞争力的玩家之一。年,金山云在云原生领域推出了三款重磅产品星曜裸金属服务器云服务器和云盘。在线上智博会上,浪潮云发布了经过全新迭代升级的浪潮云,进一步提升平台云原生服务能力。面对数字时代复杂系统的不确定性,传统的 IT 应用架构研发交付周期长、维护成本高、创新升级难,烟囱式架构,开放性差、组件复用度低,这些都成为了企业业务快速增长的瓶颈。而云原生以其敏捷、...

    Tecode 评论0 收藏0
  • GitLab Auto DevOps功能与Kubernetes集成教程

    摘要:从开始,部署管理的集群时,默认情况下会启用授权群集端点功能。我们将首先在中创建一个新项目,该项目将使用功能与我们的集群集成。完成后单击创建项目。这不仅意味着已被设为默认值,还能够触发构建。例如,负载均衡选项卡显示已部署的以及创建的主机名。 介 绍 在这篇文章中,我们将介绍如何将GitLab的Auto DevOps功能与Rancher管理的Kubernetes集群连接起来,利用Ranch...

    GraphQuery 评论0 收藏0
  • ubuntu部署Kubernetes管理docker集群示例

    摘要:部署环境及架构操作系统版本版本版本服务器信息在详细介绍部署集群前,先给大家展示下集群的逻辑架构。其他操作更新删除查看删除除此之外,你可以删除,如删除上的格式为服务名字,不必关心从哪个上删除了。 本文通过实际操作来演示Kubernetes的使用,因为环境有限,集群部署在本地3个ubuntu上,主要包括如下内容: 部署环境介绍,以及Kubernetes集群逻辑架构 安装部署Open v...

    BingqiChen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<