標籤:
作者介紹:
張春源
希雲cSphere合伙人,國內早期的Docker佈道者,對公司專屬應用程式Docker化有豐富的實踐經驗,擅長利用Docker踐行Devops文化。國內第一套Docker系列實戰視頻課程講師,視頻播放量累計10萬+
開篇:
Redis在3.0之後開始支援sharding叢集。Redis叢集可以讓資料自動在多個節點上分布。如何使用Docker實現Redis叢集的一鍵部署交付,是一個有趣的並且有價值的話題。
本文將給大家介紹基於進程的容器技術實現Redis sharding叢集的一鍵部署,充分展現了容器的強大威力。
什麼是Redis sharding叢集
Redis(redis.io)作為最流行的KV資料庫,很長一段時間都是單機運行,關於如何?Redis的資料在多個節點上的分布,在Redis3.0出來之前,有很多第三方的方案。建議大家參考這個連結:
http://redis.io/topics/partitioning
Client hash
這是最簡單的實現,通過在用戶端利用一致性hash演算法,將資料分布到不同節點。這種方法的缺點非常明顯,缺少故障自動failover能力,並且在擴容時資料分布的搬遷,也比較費勁。
代理模式
代理模式最大的好處是仍然使用redis單機的sdk進行開發,維護簡單。
Redis Cluster
redis3.0繼2.8推出sentinel主從自動failover功能後,推出了sharding叢集,這就是Redis Cluster。本次分享主要是介紹如何將Redis叢集實現一鍵的部署。
參考文檔:
http://redis.io/topics/cluster-tutorial
首先準備redis鏡像
Redis官方已經提供了Redis 3.2和3.3的鏡像,都可以用來作為Redis叢集的鏡像,3.2是穩定版本。
目前官方推出了alpine版本的Redis鏡像,alpine鏡像的優勢是體積小。此次分享是採用官方的redis:3.2-alpine的鏡像來做叢集。
準備初始化指令碼的執行環境
redis官方提供了一個ruby的指令碼redis-trib.rb,這個指令碼可以用來初始化叢集、resharding叢集、rebalance叢集等。
我們使用官方的指令碼來初始化叢集。該指令碼的運行需要ruby環境,我們來構建一個redis-trib鏡像,以下是構建redis-trib鏡像的Dockerfile內容:
cat Dockerfile
FROM ruby:2.3.1-alpineADD https://raw.githubusercontent.com/antirez/redis/3.2.0/src/redis-trib.rb /usr/local/bin/redis-trib.rbRUN gem install redis && chmod 755 /usr/local/bin/redis-trib.rb && \ sed -i ‘/yes_or_die.msg/a return if ENV["QUIET_MODE"] == "1"‘ /usr/local/bin/redis-trib.rbADD entrypoint.sh /entrypoint.shENTRYPOINT [“/entrypoint.sh"]
指令檔
cat entrypoint.sh
#!/bin/shif [ "$CLUSTER_CMD" = create ]; then if [ -f /usr/local/etc/redis-trib.conf ] ; then . /usr/local/etc/redis-trib.conf QUIET_MODE=1 redis-trib.rb create --replicas $REPLICAS $NODES fifi
上面兩個檔案用來構建redis-trib鏡像,Dockerfile中的邏輯比較簡單,將github中的redis-trib.rb檔案添加到鏡像中,並讓指令碼執行支援非互動模式(QUIET_MODE)。
鏡像啟動時,將執行叢集初始化命令。
準備redis叢集設定檔
port 6379cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
redis叢集的設定檔我們一般放到資料目錄/data下,redis進程對/data目錄擁有可讀寫的許可權。
準備redis-trib指令碼設定檔,用於叢集初始化參數擷取
entrypoint.sh檔案中,最主要的是讀取redis-trib.conf設定檔,設定檔的格式非常簡單
REPLICAS={{.REPLICAS_NUM}}{{ $rs := service "redis" }}NODES="{{range $i,$rc := $rs.Containers}} {{$rc.IPAddr}}:6379{{end}}"
REPLICAS的意思是每個分區有幾個slave,一般配置1個slave ,即REPLICAS=1**NODES**的意思是叢集的每個節點,包括master和slave。
所以如果有10個節點,REPLICAS=1的話,那麼將有5個分區(slices)。
編排叢集
準備好上述鏡像和設定檔後,我們開始編排叢集
第一步:建立模版
第二步:選擇鏡像,添加redis服務
第三步:設定容器參數
第四步:設定健全狀態檢查策略
第五步:設定redis容器部署策略
添加redis叢集初始化服務redis-trib第一步:選擇鏡像
第二步:設定容器參數
第三步:設定redis-trib容器部署策略
redis-trib要在redis容器啟動完成後再啟動,所以啟動優先順序要比redis低。
通過以上步驟,編排好了Redis-sharding應用模版。
基於Redis-sharding應用模板,一鍵部署Redis Cluster
以下是部署後的:
查看redis-trib叢集初始化後的結果,看到叢集的初始化過程沒有問題;
驗證:登入到任意一台redis節點執行redis-cli info:
以上內容分享了基於進程的容器技術,實現了Redis sharding的一鍵交付。
你會部署了嗎?
so easy
分享後討論更是激烈:
Q1: 如果我想在一個機器上部署多個redis執行個體可以嗎?
A1: 可以
Q2: 問下你們ui編排工具是自主研發還是基於什麼開源工具?內部邏輯是什麼.?
A2: 自主研發的。
通過易用的介面對docker容器運行參數進行設定和儲存。
每個容器運行參數和優先順序以及部署策略構成一個個服務,多個服務組合成一個可以一鍵部署的應用模版。
Q3:redis叢集的docker我看ip都是同網段的。這個是單獨的docker管理工具處理的?如果只單純搭建redis叢集,而無docker叢集管理。這個多個redis node如何管理?
A3:csphere平台內部支援網路管理功能,並在背後擁有自動的可程式化的服務發現能力,使得自動化部署叢集成為可能。
如果脫離docker手工部署,按照官方文檔一步步操作即可
Q4: 請問這裡的模板資料是何時傳入進去的?
A4: 模板資料分兩種:
設定檔範本裡定義的模板變數,這類資料是在建立應用執行個體時使用者通過cSphere管理平台填寫的;
叢集服務相關的中繼資料,如每個容器的IP地址、容器所在的主機參數等,這類資料是cSphere應用編排引擎在建立應用執行個體時,自動從叢集各節點收集並註冊到配置模板解析引擎的設定檔範本經解析產生最終設定檔,然後裝載到每一個容器裡
Q5:請問redis-cluster的擴容、縮容,resharding如何處理的呢?
A5: 擴容增加節點的話,觸發trib指令碼重新resharding,減少節點的話,則需要在前面先執行,trib指令碼裡面有添加刪除節點的命令
Q6: 這是你們的商業平台?還是openstack整合docker的結果?
A6:我們的商業平台,為企業提供整體的PaaS解決方案。希雲cSphere平台底層是docker,希雲cSphere平台可以部署在OpenStack平台之上。
Q7: redis3.0目前自己出的這個Q5叢集方案穩定嗎?有沒有經過大量的資料測試!效率如何?因為我不是專業做營運的,我是做開發的對營運的知識比較感興趣但是不專業,希望能得到一個經過資料支撐的答案
A7: redis當前的叢集穩定性是比較好的,國內外有大量互連網企業大規模的使用,據我所知,唯品會的redis叢集規模在500台以上
Q8: 你們的pass平台在部署容器時還能指讓使用者自主定製部署策略?這樣做的目的是什麼?
A8:不同類型的應用有不同的資源偏好,比如CPU密集型的,磁碟IO密集型的,通過調度策略的選擇,使用者可以更深度的控制容器在主機叢集上的分布,使應用獲得更好的運行效果。
Q9: redis用docker做叢集,在記憶體方面有什麼需要額外注意的地方嗎?
A9:記憶體方面注意設定核心vm相關參數,另外設定檔裡可以加入記憶體最大大小的設定等,如果要自動化,可以自動擷取容器的記憶體配額或主機節點的記憶體size自動計算
如何利用容器實現生產層級的redis sharding叢集的一鍵交付