使用Docker-Compose搭建高可用redis哨兵集群

头脑风暴

出于学习目的,您可以很轻松地在docker环境下运行redis的单个实例,但是如果您需要在生产环境中运行它,那么必须将Redis部署为HA(High Avaliable)模式

Redis Sentinel为Redis提供高可用性,这意味着使用Sentinel可以创建Redis HA部署,该部署可以在无需人工干预的情况下抵抗某些类型的故障。

Redis Sentinel提供的主要功能是:

  1. 当主节点发生故障时,它将自动选择一个备用节点并将其升级为主节点。

它是如何做到的,它会定期检查Redis实例的运行状况和运行状况,还会将新的主服务器通知给客户端和从服务器。使用的是带有领导者选举算法的gossip协议。

  1. Sentinel还充当客户端发现的中心授权来源,客户端连接到Sentinel以获取主节点的地址。

本文以自己的亲身经历,使用Docker-compose搭建一个Redis Sentinel模型(1:master-2:slave:3:sentinel)

Docker-compose搭建Redis Sentinel

Redis Sentinel是针对原始Master/Slave模型而衍生的高可用模型。
我们为便于灵活部署,先易后难,先搭建Redis Master/Slave模型,再搭建Redis Sentinel模型。

文件组织格式如下

redis-sentinel
├── redis
│   └── docker-compose.yml
└── sentinel├── docker-compose.yml├── sentinel1.conf├── sentinel2.conf├── sentinel3.conf└── sentinel.conf

1. Master/Slave

进入Redis文件夹,创建docker-compose.yml文件,
下面的Compose文件设置了1Master 2Slave

version: '3'
services:master:image: rediscontainer_name: redis-mastercommand: redis-server --requirepass redis_pwd  --masterauth redis_pwdports:- 6380:6379slave1:image: rediscontainer_name: redis-slave-1ports:- 6381:6379command:  redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwdslave2:image: rediscontainer_name: redis-slave-2ports:- 6382:6379command: redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd

注意,如果设置了Redis客户端访问密码requirepass, 那么也要设置相同的副本集同步密码masterauth。
另外我们后面使用哨兵模式能够完成故障转移,现有的Master可能会变成Slave,故在当前Master容器中也要携带masterauth参数。

可在容器内使用 config get [Param] 命令验证

执行docker-compose up -d会产生3个Redis容器,分别映射到宿主机6380、6381、6382端口, 默认连接在redis-default网桥。

docker ps输出如下:

fe2eb7a5cce9    redis    "docker-entrypoint.s…"   2 hours ago         Up 2 hours            0.0.0.0:6382->6379/tcp               redis-slave-2
4c280aa6dc09    redis    "docker-entrypoint.s…"   2 hours ago         Up 2 hours            0.0.0.0:6381->6379/tcp               redis-slave-1
91b83143b7c1    redis    "docker-entrypoint.s…"   2 hours ago         Up 2 hours            0.0.0.0:6380->6379/tcp               redis-master

2. Redis Sentinel

很明显我们即将搭建的Sentinel容器需要能访问到以上3个容器,故需要在形成Sentinel容器时使用外置的redis-default网桥(Redis Master/Slave docker-compose 已经创建).

2.1 进入sentinel文件夹,创建docker-compose.yml

version: '3'
services:sentinel1:image: rediscontainer_name: redis-sentinel-1ports:- 26379:26379command: redis-sentinel /usr/local/etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/usr/local/etc/redis/sentinel.confsentinel2:image: rediscontainer_name: redis-sentinel-2ports:- 26380:26379command: redis-sentinel /usr/local/etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/usr/local/etc/redis/sentinel.confsentinel3:image: rediscontainer_name: redis-sentinel-3ports:- 26381:26379command: redis-sentinel /usr/local/etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:default:external:name: redis_default

2.2 创建哨兵文件,将如下内容拷贝进去:

port 26379
dir /tmp
sentinel monitor mymaster 172.20.0.3 6379 2
sentinel auth-pass mymaster redis_pwd
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

注意,以上 172.20.0.3是之前Redis Master/slave启动之后Master节点的IP,通过docker inspect [containerIP]获取, 这里我们要配合设置Master/Slave访问密码。

2.3 将哨兵文件复制三份,Volume进Sentinel容器

sudo cp sentinel.conf sentinel1.conf
sudo cp sentinel.conf sentinel2.conf
sudo cp sentinel.conf sentinel3.conf

docker-compose up -d生成3个Sentinel容器。
此时docker ps显示如下:

80f4b776f5dd        redis    "docker-entrypoint.s…"   58 minutes ago      Up 57 minutes         6379/tcp, 0.0.0.0:26380->26379/tcp   redis-sentinel-2
3a1bcdc06253        redis    "docker-entrypoint.s…"   58 minutes ago      Up 57 minutes         6379/tcp, 0.0.0.0:26379->26379/tcp   redis-sentinel-1
3bada23b572e        redis    "docker-entrypoint.s…"   58 minutes ago      Up 57 minutes         6379/tcp, 0.0.0.0:26381->26379/tcp   redis-sentinel-3
fe2eb7a5cce9        redis    "docker-entrypoint.s…"   2 hours ago         Up 2 hours            0.0.0.0:6382->6379/tcp               redis-slave-2
4c280aa6dc09        redis    "docker-entrypoint.s…"   2 hours ago         Up 2 hours            0.0.0.0:6381->6379/tcp               redis-slave-1
91b83143b7c1        redis    "docker-entrypoint.s…"   2 hours ago         Up 2 hours            0.0.0.0:6380->6379/tcp               redis-master

验证

  1. Master/Slave副本集
    进入Master容器,确认两个Slave容器已经连接。

2.  Redis Sentinel     

进入其中一个Sentinel容器,确认Master、2个Slave、另外2个Sentinel

flags: master  表明master正常运作,异常情况会显示s-down,o-down
num-slaves:侦测到2个Slave副本集
num-other-sentinels:除此之外,还有2个哨兵

  1. Redis Sentinel高可用
    停止 master容器,等待10s,进入任意sentinel容器,使用sentinel master mymaster命令观察主节点发生变化,观察外挂的Sentinel*.conf 主节点IP发生变化

总结输出

当初做这个部署,曾经尝试采用阿里云的redis-sentinel docker-compose方式,发现其采用docker-compose scale生成多个Sentinel容器,不能映射到宿主机端口,导致外部Redis客户端无法定位sentinel。
结合网上一些资料,摸索出渐进式部署 && 共享网桥的方式部署Redis Sentinel, 本人亲测有效。

项目开源地址如下,大家可积极使用。

  • https://github.com/zaozaoniao/Redis-sentinel-with-docker-compose

推荐阅读

● 这么香的Chrome插件,你都安装了吗?

● 一文掌握Cookies前世今生

● ASP.NET Core跨平台技术内幕

● TPL Dataflow组件应对高并发,低延迟要求

● 实例解读Docker Swarm

● 基于docker-compose的Gitlab CI/CD实践&排坑指南

戳原文,更有料!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ class实现顺序队列(完整代码)

代码如下: #include <iostream> using namespace std; typedef int ElemType;class SeqQueue {public:SeqQueue(int Queuesize 100) {base new ElemType[Queuesize];front 0;rear 0;size Queuesize;};~SeqQueue() {delete[] base;};int Empty_Queue();int En_Queue…

es文件创建局域网服务器,大神来教你XBMC和ES文件浏览器局域网共享

回复可见&#xff0c;谢谢支持~首先电脑要设置&#xff0c;记住电脑的IP地址后面添加局域网用的cd4318d0f703918f9002dcbf523d269758eec45d.jpg (59.67 KB, 下载次数: 7)2014-10-11 10:26 上传ccb48d03918fa0ec39148578259759ee3c6ddb5d.jpg (45.07 KB, 下载次数: 7)2014-10-11…

【实战 Ids4】║ 认证中心之内部加权

本期配套视频&#xff1a;https://www.bilibili.com/video/BV1sJ41197af?p9&#xff08;昔我往矣&#xff0c;杨柳依依&#xff0c;今我来思&#xff0c;雨雪霏霏&#xff09;1、为什么需要在认证内部加权我们知道&#xff0c;认证中心的作用就是用来保护我们的资源服务器&…

C++ class实现链队列(完整代码)

代码如下: #include <iostream> using namespace std; typedef int ElemType;class QueueNode {friend class LinkQueue;public:QueueNode(): next(NULL) {};private:ElemType data;QueueNode *next; };class LinkQueue {public:LinkQueue(): front(NULL), rear(NULL) {…

CDN加速小水管动态应用技巧

不得不说现在大陆和HK的云主机都是小水管模式&#xff0c;由于硬件的快速发展在这种小水管的情况下很难发挥出用户硬件资源的能力&#xff0c;当然可以加水管但费用很高&#xff0c;更多时候会浪费带宽&#xff1b;这个时候我们想到CDN加速&#xff0c;这种资源的好处就是可以把…

C++ class实现二叉树(完整代码,附非递归遍历)

代码如下: #include <iostream> #include <stack> #include <queue> using namespace std; typedef char ElemType; int InOrder_count 0;class BinTreeNode {friend class BinaryTree;public:BinTreeNode(): lchild(NULL), rchild(NULL) {};private:ElemT…

服务器水冷系统仿真,水冷漫谈(三)——水冷散热器仿真方法

水冷散热器的精细化设计是需要借助仿真软件的。目前可以完成水冷仿真的商业软件有很多种&#xff0c;各有优势&#xff0c;在此不做对比。Jason用的是FloTHERM&#xff0c;但是主要的分析方法是一致的。不同于风冷的系统&#xff0c;水冷整个系统比较庞大和复杂。工程中一般不会…

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

在这篇文章中&#xff0c;我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业。这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态。接下来我将演示如何创建一个简单的 IJob&#xff0c;一个自定义的 IJobFactory和一个在应用程序运行时就开…

分享一些支持多租户的开源框架

如果你在开发sass应用程序&#xff0c;可以参考或者直接使用这些开源的框架。ASP.NET Boilerplate — Web应用程序框架ASP.NET Boilerplate是专门为新的现代Web应用程序设计的通用应用程序框架。它使用已经熟悉的工具并围绕它们实施最佳实践&#xff0c;以为您提供SOLID开发经验…

服务器操作系统用什么好,服务器操作系统一般用什么

服务器操作系统一般用什么 内容精选换一换客户的SAP系统部署在第三方云&#xff0c;服务器操作系统在华为云支持的列表内&#xff0c;数据库为任意数据库&#xff0c;同时还有如对象存储等的其他云服务。迁移到华为云后&#xff0c;数据库以及操作系统保持不变&#xff0c;系统…

一张大图了解ASP.NET Core 3.1 中的Authentication与Authorization

下面是一张ASP.NET Core 3.1 中关于Authentication与Authorization的主流程框线图&#xff0c;点击这里查看全图&#xff1a;https://johnnyqian.net/images/202004/aspnet-core-3.1-request-processing-pipeline.png重要组件一些重要的组件及其源码链接如下&#xff1a;Authen…

C++ class实现完全二叉树的顺序存储结构

代码如下: #include <iostream> using namespace std; const int maxsize 100; typedef char ElemType;class QbTree {public:void CreateBTree(int n);int vislchild(int i);int visrchild(int i);int visparent(int i);ElemType viselem(int i);void LevelOrder();p…

研发协同平台持续集成Jenkins作业设计演进

源宝导读&#xff1a;Jenkins作为一个开源的持续集成工具&#xff0c;被大家广泛使用。本文将分享&#xff0c;Jenkins在明源云研发协同平台中的运用&#xff0c;以及在其作业设计方面的演进历程。一、作业设计1.0起初&#xff0c;为了尽快推出研发协同平台v1.0&#xff0c;我们…

一切都要从华为云 CloudIDE 酷似 VS Code 说起

前不久&#xff0c;有个关于华为云 CloudIDE 的问题在知乎、朋友圈、微博等圈子引起了广泛的讨论&#xff0c;甚至上了知乎热榜。那么&#xff0c;背后的真实情况到底是如何的&#xff1f;且听韩老师娓娓道来。华为云 CloudIDE 酷似 VS Code&#xff1f;首先要明确一点&#xf…

C++ class实现双亲表示法

#include <iostream> using namespace std; typedef char ElemType; const int MAXSIZE 100;class TreeNode {friend class Tree; private:ElemType data;int parent; };class Tree { private:TreeNode elem[MAXSIZE];int n;//树中当前的节点个数 }Tree;

单元测试:如何编写可测试的代码及其重要性

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者&#xff1a;谢尔盖科洛迪&#xff08;SERGEY KOL…

C++ class实现孩子表示法

代码如下: #include <iostream> using namespace std; typedef char ElemType; const int MAXSIZE 100;class link {friend class Node; private:int child;link *next; };class Node {friend class Tree; private:ElemType data;link *first; };class Tree { private:…

IdentityServer 部署踩坑记

IdentityServer 部署踩坑记Intro周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目&#xff0c;踩了几个坑&#xff0c;在此记录分享一下。部署架构项目是基于 IdentityServerAdmin 项目修改的&#xff0c;感谢作者的开源付出&#xff0c;有需要 IdentityServer 管…

.Net Core微服务架构技术栈的那些事

一、前言大家一直都在谈论微服务架构&#xff0c;园子里面也有很多关于微服务的文章&#xff0c;前几天也有一些园子的朋友问我微服务架构的一些技术&#xff0c;我这里就整理了微服务架构的技术栈路线图&#xff0c;这里就分享出来和大家一起探讨学习&#xff0c;同时让新手对…

C++ class实现Huffman树(完整代码)

代码如下: #include <iostream> #include <string> using namespace std; const unsigned int n 8;//字符数NUM&#xff0c;这里的字符数为8 const unsigned int m 2 * n - 1;//结点总数 const float MAX 1e8;class HTNode {friend class HuffmanTree; private…