您好,登錄后才能下訂單哦!
介 紹
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集群中,其中的數據分布在數百個實例中。
什么是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
啟動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 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/cluster-tutorial)或者文檔(https://redis.io/topics/cluster-spec)。
有關Rancher的更多信息,請訪問我們的主頁(https://www.cnrancher.com)或者部署文檔(https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。