日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/4/16 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Docker Compose部署基于Sentinel的高可用Redis集群 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家一定非常熟悉如何利用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集群了

  • 在這里master和2個(gè)slave部署到不同的宿主機(jī)節(jié)點(diǎn)中
  • 3個(gè)sentinel部署到不同的宿主機(jī)節(jié)點(diǎn)中
    這樣任何一個(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)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。