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

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

做者介紹:

張春源

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

開篇:

Redis在3.0以後開始支持sharding集羣。Redis集羣可讓數據自動在多個節點上分佈。如何使用Docker實現Redis集羣的一鍵部署交付,是一個有趣的而且有價值的話題。git

本文將給你們介紹基於進程的容器技術實現Redis sharding集羣的一鍵部署,充分展示了容器的強大威力。github

什麼是Redis sharding集羣

Redis(redis.io)做爲最流行的KV數據庫,很長一段時間都是單機運行,關於如何實現Redis的數據在多個節點上的分佈,在Redis3.0出來以前,有不少第三方的方案。建議你們參考這個連接:redis

http://redis.io/topics/partitioning算法

Client hash

這是最簡單的實現,經過在客戶端利用一致性hash算法,將數據分佈到不一樣節點。這種方法的缺點很是明顯,缺乏故障自動failover能力,而且在擴容時數據分佈的搬遷,也比較費勁。docker

代理模式

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

  • 另外一個是國內豌豆莢開源的codis;編程

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

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-alpine

ADD https://raw.githubusercontent.com/antirez/redis/3.2.0/src/redis-trib.rb /usr/local/bin/redis-trib.rb

RUN 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.rb

ADD entrypoint.sh /entrypoint.sh

ENTRYPOINT [「/entrypoint.sh"]

腳本文件

cat entrypoint.sh

#!/bin/sh

if [ "$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
  fi
fi

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

鏡像啓動時,將執行集羣初始化命令。

準備redis集羣配置文件

port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly 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服務

輸入圖片說明

第三步:設置容器參數

![![容器參數-1]

輸入圖片說明

第四步:設置健康檢查策略

輸入圖片說明

第五步:設置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: 模板數據分兩種:

  1. 配置文件模板裏定義的模板變量,這類數據是在建立應用實例時用戶經過cSphere管理平臺填寫的;
  1. 集羣服務相關的元數據,如每一個容器的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自動計算

下次咱們相約在6月21日週二晚20:00,將由給Docker官方源碼全球排名前50名的魏世江(希雲CTO)給咱們來分享更深層次的容器技術,歡迎你們繼續關注!

相關文章
相關標籤/搜索