摘要:集群中的每個成員,無論是主副本還是次級副本,都管理哈希槽的一個子集。在由三個主節(jié)點組成的最小的集群中,每個主節(jié)點都有一個從屬節(jié)點為了至少能保證最低程度的故障轉(zhuǎn)移,每個主節(jié)點分配一個范圍在至之間的哈希槽。
介 紹
Redis(REmote DIctionary Server的意思)是一個開源的內(nèi)存數(shù)據(jù)存儲,通常用作數(shù)據(jù)庫、緩存以及消息代理。它可以存儲和操作高級的數(shù)據(jù)結(jié)構(gòu)類型,比如lists、maps、sets以及排序sets。Redis接受多種格式的鍵,因此可以在服務(wù)器上執(zhí)行操作,減少客戶端的工作負載。它將數(shù)據(jù)庫完全地保存在內(nèi)存中,只使用磁盤進行持久化存儲。Redis是一種流行的數(shù)據(jù)存儲解決方案,受到了Github、Pinterest、Snapchat、Twitter、StackOverflow、Flickr等科技巨頭的青睞。
為什么要用Redis?
它非常快,它由ANSI C編寫,可以在Linux、Mac OS X和Solaris等POSIX系統(tǒng)上運行。
Reis經(jīng)常被評為最流行的鍵值數(shù)據(jù)庫以及在容器上使用最流行的NoSQL數(shù)據(jù)庫。
它的緩存解決方案減少了對云數(shù)據(jù)庫后端的調(diào)用。
應(yīng)用程序可以通過客戶端API庫訪問它。
所有流行的編程語言都支持Redis。
它開源且非常穩(wěn)定的。
Redis的應(yīng)用案例
Facebook的一些在線游戲中,游戲分?jǐn)?shù)更新頻率非常高。當(dāng)使用Redis排序set時,即使每分鐘有數(shù)百萬用戶和數(shù)百萬個新分?jǐn)?shù),執(zhí)行這些操作都非常簡單。
Twitter在Redis集群中存儲了所有用戶的時間線。
Pinterest將用戶關(guān)注者圖存儲在Redis集群中,其中的數(shù)據(jù)分布在數(shù)百個實例中。
Github使用Redis作為隊列
什么是Redis集群?
Redis集群是一個多Redis實例的集合,用于通過對數(shù)據(jù)庫分區(qū)來擴展數(shù)據(jù)庫,使其更具有彈性。集群中的每個成員,無論是主副本還是次級副本,都管理哈希槽的一個子集。如果一個主服務(wù)器出現(xiàn)不能訪問的故障,那么它的從屬服務(wù)器會提升為主服務(wù)器。在由三個主節(jié)點組成的最小的Redis集群中,每個主節(jié)點都有一個從屬節(jié)點(為了至少能保證最低程度的故障轉(zhuǎn)移),每個主節(jié)點分配一個范圍在0至16383之間的哈希槽。節(jié)點A包含哈希槽范圍為從0到5000,節(jié)點B為5001到10000,節(jié)點C從10001到18383。集群內(nèi)部的通信則通過內(nèi)部總線進行,使用gossip協(xié)議來傳播關(guān)于集群的信息或者發(fā)現(xiàn)新節(jié)點。
在Kubernetes上部署Redis集群
在Kubernetes中部署Redis集群很有挑戰(zhàn),因為每個Redis實例都依賴于一個配置文件,該文件跟蹤其他集群實例及其角色。為此,我們需要結(jié)合使用Kubernetes狀態(tài)集(StatefulSets)和持久卷(PersistentVolumes)。
前期準(zhǔn)備
要完成此次的demo,我們需要有下列準(zhǔn)備:
Rancher
Google云平臺或者其他云提供商賬號。下面的展示中使用了GKE,不過使用任何云提供商都是可以的,且操作方法大致相同。
啟動Rancher實例
如果你沒有Rancher的實例,可以參考這里的Quick Start文檔簡單快速地啟動一個:
https://rancher.com/quick-start/
用Rancher部署GKE集群
用Rancher啟動并配置你的Kubernetes集群,具體步驟可以參考文檔:
https://rancher.com/docs/ranc...
當(dāng)集群準(zhǔn)備就緒,我們可以通過kubectl指令檢查當(dāng)前狀態(tài)
部署Redis
接著部署Redis集群,我們既可以通過kubectl來應(yīng)用YAML文件,也可以將它們導(dǎo)入到Rancher UI中。下面列出了我們所有需要的YAML文件。
YAML內(nèi)容如下:
redis-sts.yaml
redis-svc.yaml
驗證部署
檢查Redis節(jié)點是否啟動并運行:
下面的6個卷是我們創(chuàng)建的
$ 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"
同樣的數(shù)據(jù)還可以在Rancher UI上看到
部署Redis集群
下一步就是創(chuàng)建Redis集群了。為此,我們需要運行以下命令,輸入yes接受配置。前三個節(jié)點成為主節(jié)點,最后三個節(jié)點設(shè)置為從屬節(jié)點。
$ 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.
驗證集群部署
檢查集群細節(jié)以及每個成員的角色
測試Redis集群
我們希望使用集群并且模擬節(jié)點故障。對于前一個任務(wù),我們將部署一個簡單的python應(yīng)用程序,而后一個任務(wù),我們將刪除一個節(jié)點來觀察集群行為。
部署Hit Counter應(yīng)用
我們將在集群中部署一個簡單的應(yīng)用程序,并在其之前放置一個負載均衡器。該應(yīng)用程序的目的是在將計數(shù)器的值作為HTTP響應(yīng)返回值返回之前,增加計數(shù)器的值,并將值存到Redis集群上。
使用kubectl或者Rancher UI部署:
YAML內(nèi)容如下:
app-deployment-service.yaml
Rancher展示了我們創(chuàng)建的資源:一個包含python應(yīng)用的pod,以及LoadBalancer類型的服務(wù)。該服務(wù)的詳細信息內(nèi),將顯示其公共IP地址:
到了這一步,我們可以用瀏覽器訪問IP,生成hit counter的值:
模擬節(jié)點故障
我們可以通過刪除pod(使用kubectl或Rancher UI)來模擬集群成員的故障。當(dāng)我們刪除原先是master的redis-cluster-0時,我們看到Kubernetes將redis-cluster-3提升為master,而當(dāng)redis-cluster-0重新回來時,redis-cluster-3會重新恢復(fù)從屬身份。
之 前
之 后
我們可以看到redis-cluster-0的IP發(fā)生了變化,那么集群是如何恢復(fù)的呢?
在創(chuàng)建集群時,我們創(chuàng)建了ConfigMap,該ConfigMap又在/conf/update-node.sh處創(chuàng)建了一個腳本,容器在啟動時調(diào)用該腳本。該腳本使用本地節(jié)點的新IP地址更新Redis配置。有了confic中的新IP,集群就可以在新的pod中以不同的IP地址啟動并恢復(fù)。
在這個過程中,如果我們繼續(xù)加載頁面,計數(shù)器仍會繼續(xù)增加,在集群收斂之后,我們會看到?jīng)]有丟失任何數(shù)據(jù)。
結(jié) 論
Redis是一個強大的數(shù)據(jù)存儲和緩存工具。因為Redis存儲數(shù)據(jù)的方式,Redis集群更是能通過提供分片、相關(guān)性能優(yōu)勢、線性擴展和高可用性,來進一步擴展其功能。數(shù)據(jù)在多個節(jié)點之間自動分割,即使節(jié)點的子集出現(xiàn)故障或者不能和集群其他部分通信,操作仍然能夠繼續(xù)。
有關(guān)Redis集群的更多信息,請訪問教程(https://redis.io/topics/clust...)或者文檔(https://redis.io/topics/clust...)。
有關(guān)Rancher的更多信息,請訪問我們的主頁(https://www.cnrancher.com)或者部署文檔(https://www.cnrancher.com/doc...)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/32914.html
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術(shù)周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達的境界。周刊篩選的每篇內(nèi)容,是作者的獨到見解,踩坑總結(jié)和經(jīng)驗分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動感十足的清脆鍵盤響,我就能猜到公司程序員定...
摘要:華為云華為云在云原生這場游戲中,最具競爭力的玩家之一。年,金山云在云原生領(lǐng)域推出了三款重磅產(chǎn)品星曜裸金屬服務(wù)器云服務(wù)器和云盤。在線上智博會上,浪潮云發(fā)布了經(jīng)過全新迭代升級的浪潮云,進一步提升平臺云原生服務(wù)能力。面對數(shù)字時代復(fù)雜系統(tǒng)的不確定性,傳統(tǒng)的 IT 應(yīng)用架構(gòu)研發(fā)交付周期長、維護成本高、創(chuàng)新升級難,煙囪式架構(gòu),開放性差、組件復(fù)用度低,這些都成為了企業(yè)業(yè)務(wù)快速增長的瓶頸。而云原生以其敏捷、...
摘要:從開始,部署管理的集群時,默認(rèn)情況下會啟用授權(quán)群集端點功能。我們將首先在中創(chuàng)建一個新項目,該項目將使用功能與我們的集群集成。完成后單擊創(chuàng)建項目。這不僅意味著已被設(shè)為默認(rèn)值,還能夠觸發(fā)構(gòu)建。例如,負載均衡選項卡顯示已部署的以及創(chuàng)建的主機名。 介 紹 在這篇文章中,我們將介紹如何將GitLab的Auto DevOps功能與Rancher管理的Kubernetes集群連接起來,利用Ranch...
摘要:部署環(huán)境及架構(gòu)操作系統(tǒng)版本版本版本服務(wù)器信息在詳細介紹部署集群前,先給大家展示下集群的邏輯架構(gòu)。其他操作更新刪除查看刪除除此之外,你可以刪除,如刪除上的格式為服務(wù)名字,不必關(guān)心從哪個上刪除了。 本文通過實際操作來演示Kubernetes的使用,因為環(huán)境有限,集群部署在本地3個ubuntu上,主要包括如下內(nèi)容: 部署環(huán)境介紹,以及Kubernetes集群邏輯架構(gòu) 安裝部署Open v...
閱讀 2749·2021-11-24 09:39
閱讀 3400·2021-10-09 09:53
閱讀 1281·2021-09-22 16:06
閱讀 4659·2021-09-02 10:18
閱讀 960·2021-08-23 09:42
閱讀 1940·2021-08-17 10:11
閱讀 2830·2019-08-30 13:02
閱讀 2260·2019-08-30 12:49