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

栏目: 数据库 · 发布时间: 6年前

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

介 绍

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集群

在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/ranch ... /gke/

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

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

部署Redis

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

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

YAML内容如下:

redis-sts.yaml

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

redis-svc.yaml

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

验证部署

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

详细教程丨如何在Kubernetes上部署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上看到

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

部署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.

验证集群部署

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

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

测试Redis集群

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

部署Hit Counter应用

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

使用kubectl或者Rancher UI部署:

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

YAML内容如下:

app-deployment-service.yaml

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

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

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

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

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

模拟节点故障

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

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

之 前

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

之 后

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

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

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

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

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

结 论

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 ... view/ )。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python for Everyone

Python for Everyone

Cay S. Horstmann、Rance D. Necaise / John Wiley & Sons / 2013-4-26 / GBP 181.99

Cay Horstmann's" Python for Everyone "provides readers with step-by-step guidance, a feature that is immensely helpful for building confidence and providing an outline for the task at hand. "Problem S......一起来看看 《Python for Everyone》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具