基于Docker的Redis高可用集群搭建(redis-sentinel)

简介: 前言  之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该redis主从集群并非是高可用的。

前言

  之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该redis主从集群并非是高可用的。
  目前来说,高可用(主从复制、主从切换)redis集群有两种方案,一种是redis-sentinel,只有一个master,各实例数据保持一致;一种是redis-cluster,也叫分布式redis集群,可以有多个master,数据分片分布在这些master上。
  本文介绍基于docker和redis-sentinel的高可用redis集群搭建,大多数情况下,redis-sentinel也需要做高可用,这里先对redis搭建一主二从环境,另外需要3个redis-sentinel监控redis master。

  很显然,只使用单个redis-sentinel进程来监控redis集群是不可靠的,由于redis-sentinel本身也有single-point-of-failure-problem(单点问题),当出现问题时整个redis集群系统将无法按照预期的方式切换主从。官方推荐:一个健康的集群部署,至少需要3个Sentinel实例。另外,redis-sentinel只需要配置监控redis master,而集群之间可以通过master相互通信。

img_e64f47a8684956ef1de9f7c4a9ff4f07.png
实战拓扑图

redis-sentinel

  redis-sentinel作为独立的服务,用于管理多个redis实例,该系统主要执行以下三个任务:

  • 监控 (Monitor): 检查redis主、从实例是否正常运作
  • 通知 (Notification): 监控的redis服务出现问题时,可通过API发送通知告警
  • 自动故障迁移 (Automatic Failover): 当检测到redis主库不能正常工作时,redis-sentinel会开始做自动故障判断、迁移等操作,先是移除失效redis主服务,然后将其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器。当客户端试图连接失效的主服务器时,集群也会向客户端返回最新主服务器的地址,使得集群可以使用新的主服务器来代替失效服务器

环境说明

  • Docker
  • Ubuntu/CentOS
  • Redis v4.0.10

sentinel.conf

  sentinel.conf是启动redis-sentinel的核心配置文件,可以从官网下载:

    wget http://download.redis.io/redis-stable/sentinel.conf

一主二从

  先搭建好Redis一主二从环境,这里仅给出操作过程,可以参考之前写的《Docker + Redis (4.0.10) 主从环境搭建》,在master上使用info Replication查看集群状态(注意,为了让redis-sentinel可以发现slave,这里要确保redis服务端口和容器映射端口一致):

    # 主库
    docker run -it --name redis-master -d -p 6300:6300 redis redis-server --requirepass redispassword --port 6300
    docker exec -it redis-master bash
    redis-cli -a redispassword -p 6300
    config set masterauth redispassword

    # 从库1
    docker run -it --name redis-slave -d -p 6301:6301 redis redis-server --requirepass redispassword --port 6301
    docker exec -it redis-slave bash
    redis-cli -a redispassword -p 6301
    slaveof <master-ip> <master-port>
    config set masterauth redispassword
    
    # 从库2
    docker run -it --name redis-slave2 -d -p 6302:6302 redis redis-server --requirepass redispassword --port 6302
    docker exec -it redis-slave2 bash
    redis-cli -a redispassword -p 6302
    slaveof <master-ip> <master-port>
    config set masterauth redispassword
img_0ce5ea7585d4f7bb53a6e7112f2b2dd8.png
一主二从

配置

  根据上面下载好的sentinel.conf,找到并修改如下配置:

    # mymaster:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的<master-name> <master-redis-ip>:主库ip <master-redis-port>:主库port <quorum>:最小投票数,由于有三台redis-sentinel实例,所以可以设置成2
    sentinel monitor mymaster <master-redis-ip> <master-redis-port> <quorum>
    
    # 注:redis主从库搭建的时候,要么都不配置密码(这样下面这句也不需要配置),不然都需要设置成一样的密码
    sentinel auth-pass mymaster redispassword
    
    # 添加后台运行
    daemonize yes

  将上面的sentinel.conf复制三份,分别为sentinel1.conf,sentinel2.confsentinel3.conf,再次编辑修改port26000,2600126002

启动

  redis-sentinel启动有以下两种方式:

  • redis-sentinel /path/to/sentinel.conf
  • redis-server /path/to/sentinel.conf --sentinel

  大多数版本的redis都支持以上两种方式启动。实战中,为了让redis-sentinel作为独立的服务运行,这里用docker搭建环境:

    # redis-sentinel实例1
    docker run -it --name redis-sentinel1 -v /root/redis/sentinel1.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash
    
    # redis-sentinel实例2
    docker run -it --name redis-sentinel2 -v /root/redis/sentinel2.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash
    
    # redis-sentinel实例3
    docker run -it --name redis-sentinel3 -v /root/redis/sentinel3.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash

  分别进入以上三个容器启动redis-sentinel:

    docker exec -it redis-sentinel(x) bash
    # 或redis-server /usr/local/etc/redis/sentinel.conf --sentinel
    redis-sentinel /usr/local/etc/redis/sentinel.conf

  连接并使用redis-sentinel API查看监控状况:

    redis-cli -p 26000 (26001 | 26002)
    sentinel master mymaster 或 sentinel slaves mymaster
img_1eb271b858602e2d132b3b9a6fe6c098.png
sentinel master mymaster

测试

  进入redis-master容器,休眠60秒redis服务:

    docker exec -it redis-master bash
    redis-cli -a redispassword -p 6300 DEBUG sleep 60

  进入redis-slave或redis-slave2容器,查看info Replication,可以看到master已经完成了切换。

img_86c92fe9e0e26a54ded7ac2b9ec53cea.png
原从库切换成主库
img_14e90bb18b35d398fc26d802f84838d9.png
redis-sentinel输出主库切换信息

  60秒后原redis主库恢复服务,但降级后当前redis服务已无法恢复原主库身份。

img_9c53deef7629b5ced6b92bf2db5d060c.png
60秒后原主库服务

参考

Docker化高可用redis集群
Redis Sentinel Documentation
Redis Sentinel 机制与用法(4.0.0版本)
Redis practise(二)使用Docker部署Redis高可用,分布式集群

目录
相关文章
|
6月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
3月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
974 7
|
3月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
558 5
|
8月前
|
Prometheus 监控 Cloud Native
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
640 79
|
6月前
|
NoSQL Redis 数据安全/隐私保护
挂载配置文件以Docker启动Redis服务
以上步骤提供了一个高效且实用的方式来使用Docker启动并运行带有自定义配置的Redis服务。这些操作可以适用于开发、测试和生产环境,是一种灵活且可扩展的部署方案。通过挂载配置文件和数据卷,您可以轻松地管理和迁移您的Redis实例。
693 9
|
11月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
1518 91
|
10月前
|
NoSQL Redis Docker
Docker——阿里云服务器利用docker搭建redis集群
本文详细记录了使用Docker搭建Redis集群的过程,包括检查Docker和Docker Compose的安装、创建Redis配置文件、编写`docker-compose.yml`文件、启动Redis节点、创建Redis集群的具体步骤,以及最终的验证方法。文章还提供了在多服务器环境下搭建Redis集群的注意事项,帮助读者全面了解 Redis 集群的部署流程。
1272 68
|
11月前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
672 161
|
9月前
|
NoSQL Redis 数据库
Docker平台上的Redis镜像运行
这就是如何在Docker平台上运行Redis镜像的全部过程。走进Docker和Redis的世界,探索更多可能!
556 10