天天看點

使用Docker Compose部署基于Sentinel的高可用Redis叢集

使用Docker Compose部署基于Sentinel的高可用Redis叢集

大家一定非常熟悉如何利用docker啟動單個redis容器用于開發環境,本文将介紹如何利用docker compose模闆在本機和雲端部署基于sentinel的高可用redis 3叢集。

redis叢集可以在一組redis節點之間實作高可用性和sharding。今天我們重點圍繞master-slave的高可用模式來進行讨論,在叢集中會有1個master和多個slave節點。當master節點失效時,應選舉出一個slave節點作為新的master。然而redis本身(包括它的很多用戶端)沒有實作自動故障發現并進行主備切換的能力,需要外部的監控方案來實作自動故障恢複。

redis sentinel是官方推薦的高可用性解決方案。它是redis叢集的監控管理工具,可以提供節點監控、通知、自動故障恢複和用戶端配置發現服務。

使用Docker Compose部署基于Sentinel的高可用Redis叢集

下面的測試需要本地環境已經安裝docker engine和docker compose,推薦使用docker for mac/windows。想在雲端部署的同學可以直接跳到下一節

下載下傳代碼

目錄下面的<code>docker-compose.yml</code>模闆定義redis叢集的服務組成

在模闆中定義了下面一系列服務

master: redis master

slave: redis slave

sentinel: redis sentinel

其中sentinel服務的docker鏡像是由 "./sentinel" 目錄中的dockerfile建構完成,隻是在官方redis鏡像上添加了<code>sentinel.conf</code>配置檔案,并以sentinel模式啟動容器。其配置檔案如下,其中包含了sentinel對名為"mymaster"的叢集的監控配置:

細節請參見<code>sentinel.conf</code>配置自身。

注意:

slave和sentinel容器初始化配置的redis master節點主機名為"redis-master",這裡我們利用了docker容器連接配接的别名機制來連接配接master和sentinel/slave容器執行個體

由于我們會部署3個sentinel,我們把sentinel的"quorum"設定為2,隻有兩個sentinel同意故障切換,才會真正切換相應的redis master節點。

下面我們先建構 sentinel 服務所需 docker image

一鍵部署并啟動redis叢集

這時我們可以檢查叢集狀态,應該是包含3個容器,1個master, 1個slave,和1個sentinel

顯示結果如下

我們可以伸縮sentinel的執行個體數量到3個

伸縮slave的執行個體數量到2個,這樣我們就有3個redis執行個體了(包含一個master)

檢查叢集狀态,結果如下

我們可以利用下面的測試腳本來模拟master節點失效,并驗證redis叢集的自動主從切換。

這個測試腳本實際上利用 <code>docker pause</code> 指令将 redis master容器暫停,sentinel會發現這個故障并将master切換到其他一個備用的slave上面。

執行結果如下

我們可以利用docker compose友善地在本地驗證redis叢集的部署和故障恢複,但是這還不是一個分布式的高可用部署。我們下面會利用阿裡雲容器服務來進行驗證

首先您需要建立一個包含至少三個節點的叢集(否則您需要注釋掉相應的"affinity:service"部署限制)

然後我們利用下面的 docker compose模闆部署高可用redis叢集

這裡使用了預編譯的sentinel鏡像"registry.aliyuncs.com/acs-sample/redis-sentinel:3"

更重要是,引入了一些阿裡雲擴充使得對分布式應用更好地控制容器在主控端節點的部署

<code>aliyun.scale</code> 标簽:描述了服務的執行個體數量

<code>affinity:service</code> 環境變量描述了服務的部署限制:比如對于redis slave而言,我們不希望在一個主控端節點上同時部署master和slave,或多個slave,我們可以友善用示例中的方法描述這些限制。

一鍵部署之後,我們就已經有一個真正高可用的redis叢集了

在這裡master和2個slave部署到不同的主控端節點中

3個sentinel部署到不同的主控端節點中

這樣任何一個主控端節點失效,都不會導緻redis叢集失敗

使用Docker Compose部署基于Sentinel的高可用Redis叢集

文章介紹了如何在本地部署一個redis叢集,并利用redis sentinel實作自動化的主從切換。并在此基礎上利用阿裡雲容器服務擴充,一鍵部署一個真正的高可用分布式redis叢集。

對于redis而言,阿裡雲提供了雲資料庫 redis 版,對于大部分對sla有要求的客戶我們建議在生産環境使用redis雲服務。但是如果大家對版本、配置有特殊要求的時候,使用docker部署redis也是非常友善的。

出于性能考慮,在docker容器中運作redis不建議采用bridge網絡對外提供通路,如需對外部vm或應用提供服務建議采用host網絡模式,并注意安全保護;如果隻是對叢集中容器提供redis通路,則容器服務預設提供的跨主控端容器網絡會提供優化而安全的網絡配置。同時建議在docker容器設定中,給redis容器配置合适的記憶體設定。

本文也給大家提供了一個示例,如何采用docker的方式開發分布式應用并在雲端部署生産級别環境。阿裡雲容器服務不但支援docker-compose模闆提供的容器功能,使得本地開發的docker鏡像和編排模闆可以輕松上雲;更提供了靈活的部署限制描述,使得對分布式應用的部署和控制變得非常友善。

繼續閱讀