Docker部署Redis哨兵集群,保姆级部署方案

         上篇讲了如何在物理机上部署Redis哨兵集群方案,刚好最近业务要求,需要在Docker中部署一套Redis哨兵集群,在这里将部署的过程给大家展示一下,以供有需要的朋友参考。

Docker相对物理机部署Redis的有几个显著好处:

  1. 环境一致性:Docker容器化确保了Redis在不同环境(如开发、测试、生产)下的一致性。因为Docker镜像包含了运行Redis所需的所有依赖和配置,避免了“在我机器上能跑”的问题。

  2. 快速部署和扩容:Docker使得部署Redis变得极为快速和简便。只需一条命令即可启动容器,大大缩短了部署时间。同时,根据需要轻松增加或减少容器数量,实现快速扩容或缩容。

  3. 隔离性:Docker容器为Redis提供了独立的运行环境,与主机系统和其他容器隔离。这意味着Redis的运行不会受到外部环境变化的影响,提高了系统的稳定性和安全性。

  4. 资源利用率:Docker容器共享主机操作系统,相比传统虚拟机,可以更高效地利用系统资源。这对于资源密集型的应用如Redis尤为重要,可以在有限的硬件资源上运行更多实例。

  5. 便于管理:Docker提供了丰富的命令行工具和API,使得Redis容器的创建、启动、停止、删除等操作变得简单易行。结合Docker Compose或Kubernetes等编排工具,可以进一步自动化部署和管理复杂的服务栈。

  6. 持续集成和交付(CI/CD):Docker与现代CI/CD流程无缝集成,能够自动化构建、测试和部署Redis服务,加速软件交付周期。

  7. 微服务架构友好:在微服务架构中,Docker容器化的Redis可以作为独立的服务运行,与其他微服务一起构成灵活、可扩展的系统。

  8. 版本控制和回滚:Docker镜像支持版本管理,可以方便地保存和恢复不同版本的Redis配置,便于进行版本升级或回滚操作。

相对来说,Docker部署Redis能够提高部署效率、增强环境一致性、简化管理和运维工作,非常适合现代云原生应用和微服务架构的需求。

废话不多说,直接上部署方案

1. 部署要求

       本文档要求集群部署,采用一主两从三哨兵模式部署,所以至少需要3台服务器,每台服务器部署一个redis及哨兵服务,redis之间通过主从复制方式同步数据。哨兵服务监控master节点,发现异常可以自动完成故障转移等操作。

2. 安装docker-compose

如果已安装docker-compose,可以跳过

2.1 下载docker-compose

下载地址:https://github.com/docker/compose/releases

2.2 部署docker-compose

进入/usr/local/bin目录,上传docker-compose-linux-x86_64

cd /usr/local/bin/

修改docker-compose-linux-x86_64文件名为docker-compose

mv docker-compose-linux-x86_64 docker-compose

2.3安装完成,查看版本

docker-compose version

3 redis哨兵集群搭建(一主两从三哨兵)

.3.1 创建数据卷目录

mkdir /usr/redis (三个服务器都需要创建)

3.2 创建数据存储目录

mkdir /usr/redis/data(三个服务器都需要创建)

3.3 创建日志存储目录

mkdir /usr/redis/logs(三个服务器都需要创建)

3.4 配置redis.conf

cd /usr/redis/

vim redis.conf

master配置(主机服务器)

salve配置(两个从机服务器)

3.5 配置sentinel.conf

cd /usr/redis/

vim sentinel.conf         

sentinel哨兵配置(三个服务器配置一样)

附案例:

# 服务器的端口号
port 26379
daemonize no
# 可访问的 IP 地址
bind 0.0.0.0    
dir /tmp
# 日志文件
logfile /logs/sentinel.log
#设置sentinel服务广播到其他sentinel节点和客户端的端口号
sentinel announce-port 26379
#设置sentinel服务广播到其他sentinel节点和客户端的IP地址
sentinel announce-ip 192.168.1.133
# 监控的主机(格式为 sentinel monitor 主机名 主机ip 主机端口 多少个哨兵节点都认为主节点不可达时才会进行故障转移的数量)
sentinel monitor redis133 192.168.1.133 6379 2
# 监控的主机密码(格式为 sentinel auth-pass 主机名 主机连接密码)
sentinel auth-pass redis133 密码
# 指定在多少毫秒内,哨兵节点没有收到主节点的响应时,就会将主节点判定为下线状态(格式为 sentinel down-after-milliseconds 主机名 超时毫秒数)
sentinel down-after-milliseconds redis133 3000
# 指定进行故障转移的超时时间,即在多少毫秒内完成故障转移操作(格式为 sentinel failover-timeout 主机名 主机连接密码)
sentinel failover-timeout redis133 10000
# 这个配置项用于指定在进行故障转移时可以同时同步的从节点数量(格式为 sentinel parallel-syncs 主机名 主机连接密码)
sentinel parallel-syncs redis133 1
sentinel deny-scripts-reconfig yes

3.6 配置docker-compose.yml

cd /usr/redis/

vim docker-compose.yml   

1.主机配置

附案例

#version: '3.3'
services:
  redis-master: #自定义服务名
    image: redis:latest
    restart: always
    container_name: redis-master
    command: redis-server --port 6379 --requirepass 密码 --protected-mode no --daemonize no #容器启动后,运行的命令
    ports:
      - 6379:6379  #宿主机的16380映射容器内部的16380端口

  sentinel-master:
    image: redis:latest
    restart: always
    container_name: redis-sentinel-master
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - /usr/redis/data:/data
      - /usr/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf
      - /usr/redis/logs:/logs

2.从机配置1配置

附案例:

#version: '3.3'
services:
  redis-salve-1: #自定义服务名
    image: redis:latest
    restart: always
    container_name: redis-salve-1
    command: redis-server --slaveof 192.168.1.*5 6379 --port 6379 --requirepass 密码 --masterauth root --protected-mode no --daemonize no #容器启动后,运行的命令
    ports:
      - 6379:6379  #宿主机的16380映射容器内部的16380端口

  sentinel-salve-1:
    image: redis:latest
    restart: always
    container_name: redis-sentinel-salve-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - /usr /redis/data:/data
      - /usr/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf
      - /usr/redis/logs:/logs

3.从机配置2配置

附案例:

#version: '3.3'
services:
  redis-salve-2: #自定义服务名
    image: redis:latest
    restart: always
    container_name: redis-salve-2
    command: redis-server --slaveof 192.168.1.*5 6379 --port 6379 --requirepass 密码 --masterauth root --protected-mode no --daemonize no #容器启动后,运行的命令
    ports:
      - 6379:6379  #宿主机的16380映射容器内部的16380端口

  sentinel-salve-2:
    image: redis:latest
    restart: always
    container_name: redis-sentinel-salve-2
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - /usr/redis/data:/data
      - /usr/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf
      - /usr/redis/logs:/logs

3.7 启动并测试

1.给对应文件赋权(三个服务器都需赋权)

cd /usr/redis

chmod 777 ./*

ll

2 启动redis及哨兵服务(三个服务器)

cd /usr/redis

docker-compose up -d

3 登录redis,查看配置信息

docker-compose ps

docker exec -it 主机名 redis-cli -a 主机密码

info replication

  主机信息

通过概要信息可以看到,该redis服务为主机(master),它存在两个从机(slave)分别为192.168.1.*6,192.168.1.*7

  从机信息

  通过概要信息可以看到,该redis服务为从机(slave),它关联了一个主机(master)为192.168.1.*5

4.测试主从复制

主机

从机1

从机2

5 登录哨兵服务,查看配置

docker-compose ps

docker exec -it redis-sentinel*5 redis-cli -p 26379 -a root

info sentinel

主机信息

通过概要信息可以看,哨兵服务现在监听的是主节点(192.168.1.*5)

从机信息

从机哨兵监听的也是主节点(192.168.1.*5)

6 灾备测试

现在模拟一下主机redis宕机,看哨兵服务是否能检测到主机redis异常,并切换主机节点,自动进行故障转移

  1. 主机redis关闭

docker-compose stop redis*5

查看从机哨兵信息,主机已经从192.168.1.*5切换成192.168.1.*7

查看192.168.1.*7服务的redis概要信息

       *7的redis已经切换成了master节点,因为*5节点redis服务还在关闭状态,所有他只有*6一个从机。

启动*5服务器redis服务,重新查看*7概要信息,*5变更为*7的从机。

4 横向扩展方案

大规模的应用可能会产生大量的读请求,这些读请求如果都落到一个服务器上,可能会导致性能瓶颈,进而影响用户体验。使用 Redis 的主从复制,可以将读请求负载均衡到多个从节点上,而主节点主要负责处理写请求。这种方式可以有效地分散请求,减轻主节点的负担,确保系统的流畅运行。

本次部署采用一个主节点两个从节点方式,如果后期存在业务数据读请求量增大,现有模式无法支撑,可以在现有基础上扩张从节点,即将一主两从模式变为一主三或更多,只需在现有基础上,多部署几个从服务器,并与主服务器关联即可,详细操作步骤可参考 步骤3

注意:增加从机可以有效缓解大量读操作带来的系统压力,确保系统性能稳定并提高可用性。但是无法缓解主节点的写入压力,且增加从节点增加主从复制的压力,从节点的数据状态可能落后于主节点,导致读操作可能读取到过时的数据,所以从机的数量不是越多越好,要根据具体的业务,部署合适数量的从机,以提高系统稳定性及高可用性。

5 系统集成

       登录系统nacos管理平台  访问ip:8848/nacos

修改application-dev.yml中对于redis配置

配置完成后发布即可

如果配置文件修改后未生效,就需要将对应的服务重启一下,重启之后即可生效;

如果还是不生效,需要根据具体的错误提示进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值