介 绍node
Redis(REmote DIctionary Server的意思)是一个开源的内存数据存储,一般用做数据库、缓存以及消息代理。它能够存储和操做高级的数据结构类型,好比lists、maps、sets以及排序sets。Redis接受多种格式的键,所以能够在服务器上执行操做,减小客户端的工做负载。它将数据库彻底地保存在内存中,只使用磁盘进行持久化存储。Redis是一种流行的数据存储解决方案,受到了Github、Pinterest、Snapchat、Twitter、StackOverflow、Flickr等科技巨头的青睐。python
为何要用Redis?redis
Redis的应用案例数据库
什么是Redis集群?编程
Redis集群是一个多Redis实例的集合,用于经过对数据库分区来扩展数据库,使其更具备弹性。集群中的每一个成员,不管是主副本仍是次级副本,都管理哈希槽的一个子集。若是一个主服务器出现不能访问的故障,那么它的从属服务器会提高为主服务器。在由三个主节点组成的最小的Redis集群中,每一个主节点都有一个从属节点(为了至少能保证最低程度的故障转移),每一个主节点分配一个范围在0至16383之间的哈希槽。节点A包含哈希槽范围为从0到5000,节点B为5001到10000,节点C从10001到18383。集群内部的通讯则经过内部总线进行,使用gossip协议来传播关于集群的信息或者发现新节点。json
在Kubernetes上部署Redis集群后端
在Kubernetes中部署Redis集群颇有挑战,由于每一个Redis实例都依赖于一个配置文件,该文件跟踪其余集群实例及其角色。为此,咱们须要结合使用Kubernetes状态集(StatefulSets)和持久卷(PersistentVolumes)。浏览器
前期准备缓存
要完成这次的demo,咱们须要有下列准备:服务器
启动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...)。