如何利用容器實現生產級別的 Redis sharding 集群的一鍵交付

作者介紹:

張春源

希云cSphere 合伙人,國內早期的容器布道者,對企業應用容器化有豐富的實踐經驗,擅長利用容器踐行 Devops 文化。國內第一套容器系列實戰視頻課程講師,視頻播放量累計10萬+。

開篇:

Redis 在 3.0 之后開始支持 sharding 集群。 Redis 集群可以讓數據自動在多個節點上分布。如何使用容器實現 Redis 集群的一鍵部署交付,是一個有趣的并且有價值的話題。

本文將給大家介紹基于進程的容器技術實現 Redis sharding 集群的一鍵部署,充分展現了容器的強大威力。

什么是Redis sharding集群

Redis(http://redis.io) 作為最流行的 KV 數據庫,很長一段時間都是單機運行,關于如何實現 Redis 的數據在多個節點上的分布,在 Redis3.0 出來之前,有很多第三方的方案。建議大家參考這個鏈接:

Partitioning: how to split data among multiple Redis instances.

Client hash

這是最簡單的實現,通過在客戶端利用一致性 hash 算法,將數據分布到不同節點。這種方法的缺點非常明顯,缺少故障自動 failover 能力,并且在擴容時數據分布的搬遷,也比較費勁。

代理模式

一個是 Redis 官方推薦的 Twemproxy,是由 twitter 公司開發;

另一個是國內豌豆莢開源的 codis;

代理模式最大的好處是仍然使用 redis 單機的 sdk 進行開發,維護簡單。

Redis Cluster

redis 3.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. ... ib.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 ]; thenif [ -f /usr/local/etc/redis-trib.conf ] ; then. /usr/local/etc/redis-trib.confQUIET_MODE=1 redis-trib.rb create --replicas $REPLICAS $NODESfifi

上面兩個文件用來構建 redis-trib 鏡像, Dockerfile 中的邏輯比較簡單,將 github 中的 redis-trib.rb 文件添加到鏡像中,并讓腳本執行支持非交互模式 ( QUIET_MODE ) 。

鏡像啟動時,將執行集群初始化命令。

準備redis集群配置文件

port 6379 cluster-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 = 1NODES 的意思是集群的每個節點,包括 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 !

Q & A

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: redis 3.0 目前自己出的這個 Q5 集群方案穩定嗎?有沒有經過大量的數據測試!效率如何?因為我不是專業做運維的,我是做開發的對運維的知識比較感興趣但是不專業,希望能得到一個經過數據支撐的答案。

A7: redis 當前的集群穩定性是比較好的,國內外有大量互聯網企業大規模的使用,據我所知,唯品會的 redis 集群規模在 500 臺以上。

Q8: 你們的pass平臺在部署容器時還能指讓用戶自主定制部署策略?這樣做的目的是什么?

A8:不同類型的應用有不同的資源偏好,比如 CPU 密集型的,磁盤 IO 密集型的,通過調度策略的選擇,用戶可以更深度的控制容器在主機集群上的分布,使應用獲得更好的運行效果。

Q9: redis 用 docker 做集群,在內存方面有什么需要額外注意的地方嗎?

A9:內存方面注意設置內核 vm 相關參數,另外配置文件里可以加入內存最大大小的設置等,如果要自動化,可以自動獲取容器的內存配額或主機節點的內存 size 自動計算。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容