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