使用Docker Compose部署基于Sentinel的高可用Redis集群
大家一定非常熟悉如何利用Docker啟動(dòng)單個(gè)Redis容器用于開發(fā)環(huán)境,本文將介紹如何利用Docker Compose模板在本機(jī)和云端部署基于Sentinel的高可用Redis 3集群。
Redis集群可以在一組redis節(jié)點(diǎn)之間實(shí)現(xiàn)高可用性和sharding。今天我們重點(diǎn)圍繞master-slave的高可用模式來(lái)進(jìn)行討論,在集群中會(huì)有1個(gè)master和多個(gè)slave節(jié)點(diǎn)。當(dāng)master節(jié)點(diǎn)失效時(shí),應(yīng)選舉出一個(gè)slave節(jié)點(diǎn)作為新的master。然而Redis本身(包括它的很多客戶端)沒(méi)有實(shí)現(xiàn)自動(dòng)故障發(fā)現(xiàn)并進(jìn)行主備切換的能力,需要外部的監(jiān)控方案來(lái)實(shí)現(xiàn)自動(dòng)故障恢復(fù)。
Redis Sentinel是官方推薦的高可用性解決方案。它是Redis集群的監(jiān)控管理工具,可以提供節(jié)點(diǎn)監(jiān)控、通知、自動(dòng)故障恢復(fù)和客戶端配置發(fā)現(xiàn)服務(wù)。
今天我們的部署模型是 Redis Sentinel 介紹的實(shí)例二,也是實(shí)戰(zhàn)中比較常見的一種部署模式:
本文所有示例代碼都可以從 https://github.com/AliyunContainerService/redis-cluster 獲得
本文采用的Redis鏡像全部基于Docker提供的Redis官方鏡像3.2.1
單機(jī)部署Redis集群
下面的測(cè)試需要本地環(huán)境已經(jīng)安裝Docker Engine和Docker Compose,推薦使用Docker for Mac/Windows。想在云端部署的同學(xué)可以直接跳到下一節(jié)
下載代碼
git clone https://github.com/AliyunContainerService/redis-cluster cd redis-cluster目錄下面的docker-compose.yml模板定義Redis集群的服務(wù)組成
master:image: redis:3 slave:image: redis:3command: redis-server --slaveof redis-master 6379links:- master:redis-master sentinel:build: sentinelenvironment:- SENTINEL_DOWN_AFTER=5000- SENTINEL_FAILOVER=5000 links:- master:redis-master- slave在模板中定義了下面一系列服務(wù)
- master: Redis master
- slave: Redis slave
- sentinel: Redis Sentinel
其中sentinel服務(wù)的Docker鏡像是由 "./sentinel" 目錄中的Dockerfile構(gòu)建完成,只是在官方Redis鏡像上添加了sentinel.conf配置文件,并以sentinel模式啟動(dòng)容器。其配置文件如下,其中包含了sentinel對(duì)名為"mymaster"的集群的監(jiān)控配置:
sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 5000細(xì)節(jié)請(qǐng)參見sentinel.conf配置自身。
注意:
- slave和sentinel容器初始化配置的Redis master節(jié)點(diǎn)主機(jī)名為"redis-master",這里我們利用了Docker容器連接的別名機(jī)制來(lái)連接master和sentinel/slave容器實(shí)例
- 由于我們會(huì)部署3個(gè)Sentinel,我們把sentinel的"quorum"設(shè)置為2,只有兩個(gè)sentinel同意故障切換,才會(huì)真正切換相應(yīng)的redis master節(jié)點(diǎn)。
下面我們先構(gòu)建 sentinel 服務(wù)所需 Docker image
docker-compose build一鍵部署并啟動(dòng)Redis集群
docker-compose up -d這時(shí)我們可以檢查集群狀態(tài),應(yīng)該是包含3個(gè)容器,1個(gè)master, 1個(gè)slave,和1個(gè)sentinel
docker-compose ps顯示結(jié)果如下
Name Command State Ports -------------------------------------------------------------------------------------- rediscluster_master_1 docker-entrypoint.sh redis ... Up 6379/tcp rediscluster_sentinel_1 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp rediscluster_slave_1 docker-entrypoint.sh redis ... Up 6379/tcp我們可以伸縮sentinel的實(shí)例數(shù)量到3個(gè)
docker-compose scale sentinel=3伸縮slave的實(shí)例數(shù)量到2個(gè),這樣我們就有3個(gè)redis實(shí)例了(包含一個(gè)master)
docker-compose scale slave=2檢查集群狀態(tài),結(jié)果如下
docker-compose psName Command State Ports -------------------------------------------------------------------------------------- rediscluster_master_1 docker-entrypoint.sh redis ... Up 6379/tcp rediscluster_sentinel_1 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp rediscluster_sentinel_2 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp rediscluster_sentinel_3 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp rediscluster_slave_1 docker-entrypoint.sh redis ... Up 6379/tcp rediscluster_slave_2 docker-entrypoint.sh redis ... Up 6379/tcp我們可以利用下面的測(cè)試腳本來(lái)模擬master節(jié)點(diǎn)失效,并驗(yàn)證Redis集群的自動(dòng)主從切換。
./test.sh這個(gè)測(cè)試腳本實(shí)際上利用 docker pause 命令將 Redis master容器暫停,sentinel會(huì)發(fā)現(xiàn)這個(gè)故障并將master切換到其他一個(gè)備用的slave上面。
執(zhí)行結(jié)果如下
Redis master: 172.17.0.2 Redis Slave: 172.17.0.3 ------------------------------------------------ Initial status of sentinel ------------------------------------------------ # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=172.17.0.2:6379,slaves=2,sentinels=3 Current master is 172.17.0.2 6379 ------------------------------------------------ Stop redis master rediscluster_master_1 Wait for 10 seconds Current infomation of sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=172.17.0.3:6379,slaves=2,sentinels=3 Current master is 172.17.0.3 6379 ------------------------------------------------ Restart Redis master rediscluster_master_1 Current infomation of sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=172.17.0.3:6379,slaves=2,sentinels=3 Current master is 172.17.0.3 6379我們可以利用Docker Compose方便地在本地驗(yàn)證Redis集群的部署和故障恢復(fù),但是這還不是一個(gè)分布式的高可用部署。我們下面會(huì)利用阿里云容器服務(wù)來(lái)進(jìn)行驗(yàn)證
云端部署高可用Redis集群
阿里云容器服務(wù) 在兼容Docker Compose編排模板的基礎(chǔ)上,做了大量的擴(kuò)展。能夠更好地幫助我們?cè)贒ocker集群中部署分布式應(yīng)用。
首先您需要?jiǎng)?chuàng)建一個(gè)包含至少三個(gè)節(jié)點(diǎn)的集群(否則您需要注釋掉相應(yīng)的"affinity:service"部署約束)
然后我們利用下面的 docker compose模板部署高可用Redis集群
master:image: redis:3environment:- affinity:service!=slaverestart: always slave:image: redis:3command: redis-server --slaveof redis-master 6379environment:- affinity:service!=master- affinity:service!=slavelabels: aliyun.scale: "2"restart: alwayslinks:- master:redis-master sentinel:image: registry.aliyuncs.com/acs-sample/redis-sentinel:3environment:- affinity:service!=sentinellabels: aliyun.scale: "3"restart: alwayslinks:- master:redis-master- slave這里使用了預(yù)編譯的sentinel鏡像"registry.aliyuncs.com/acs-sample/redis-sentinel:3"
更重要是,引入了一些阿里云擴(kuò)展使得對(duì)分布式應(yīng)用更好地控制容器在宿主機(jī)節(jié)點(diǎn)的部署
- aliyun.scale 標(biāo)簽:描述了服務(wù)的實(shí)例數(shù)量
- affinity:service 環(huán)境變量描述了服務(wù)的部署約束:比如對(duì)于Redis slave而言,我們不希望在一個(gè)宿主機(jī)節(jié)點(diǎn)上同時(shí)部署master和slave,或多個(gè)slave,我們可以方便用示例中的方法描述這些約束。
關(guān)于這些的詳盡解釋請(qǐng)參見幫助文檔
一鍵部署之后,我們就已經(jīng)有一個(gè)真正高可用的Redis集群了
這樣任何一個(gè)宿主機(jī)節(jié)點(diǎn)失效,都不會(huì)導(dǎo)致Redis集群失敗
總結(jié)
文章介紹了如何在本地部署一個(gè)Redis集群,并利用Redis Sentinel實(shí)現(xiàn)自動(dòng)化的主從切換。并在此基礎(chǔ)上利用阿里云容器服務(wù)擴(kuò)展,一鍵部署一個(gè)真正的高可用分布式Redis集群。
對(duì)于Redis而言,阿里云提供了云數(shù)據(jù)庫(kù) Redis 版,對(duì)于大部分對(duì)SLA有要求的客戶我們建議在生產(chǎn)環(huán)境使用Redis云服務(wù)。但是如果大家對(duì)版本、配置有特殊要求的時(shí)候,使用Docker部署Redis也是非常方便的。
出于性能考慮,在Docker容器中運(yùn)行Redis不建議采用bridge網(wǎng)絡(luò)對(duì)外提供訪問(wèn),如需對(duì)外部VM或應(yīng)用提供服務(wù)建議采用host網(wǎng)絡(luò)模式,并注意安全保護(hù);如果只是對(duì)集群中容器提供redis訪問(wèn),則容器服務(wù)默認(rèn)提供的跨宿主機(jī)容器網(wǎng)絡(luò)會(huì)提供優(yōu)化而安全的網(wǎng)絡(luò)配置。同時(shí)建議在Docker容器設(shè)置中,給Redis容器配置合適的內(nèi)存設(shè)置。
本文也給大家提供了一個(gè)示例,如何采用Docker的方式開發(fā)分布式應(yīng)用并在云端部署生產(chǎn)級(jí)別環(huán)境。阿里云容器服務(wù)不但支持docker-compose模板提供的容器功能,使得本地開發(fā)的Docker鏡像和編排模板可以輕松上云;更提供了靈活的部署約束描述,使得對(duì)分布式應(yīng)用的部署和控制變得非常方便。
想了解更多容器服務(wù)內(nèi)容,請(qǐng)?jiān)L問(wèn) https://www.aliyun.com/product/containerservice
總結(jié)
以上是生活随笔為你收集整理的使用Docker Compose部署基于Sentinel的高可用Redis集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS下开启mysql远程连接,远
- 下一篇: 关于IB_DESIGNABLE / IB