上篇讲了如何在物理机上部署Redis哨兵集群方案,刚好最近业务要求,需要在Docker中部署一套Redis哨兵集群,在这里将部署的过程给大家展示一下,以供有需要的朋友参考。
Docker相对物理机部署Redis的有几个显著好处:
-
环境一致性:Docker容器化确保了Redis在不同环境(如开发、测试、生产)下的一致性。因为Docker镜像包含了运行Redis所需的所有依赖和配置,避免了“在我机器上能跑”的问题。
-
快速部署和扩容:Docker使得部署Redis变得极为快速和简便。只需一条命令即可启动容器,大大缩短了部署时间。同时,根据需要轻松增加或减少容器数量,实现快速扩容或缩容。
-
隔离性:Docker容器为Redis提供了独立的运行环境,与主机系统和其他容器隔离。这意味着Redis的运行不会受到外部环境变化的影响,提高了系统的稳定性和安全性。
-
资源利用率:Docker容器共享主机操作系统,相比传统虚拟机,可以更高效地利用系统资源。这对于资源密集型的应用如Redis尤为重要,可以在有限的硬件资源上运行更多实例。
-
便于管理:Docker提供了丰富的命令行工具和API,使得Redis容器的创建、启动、停止、删除等操作变得简单易行。结合Docker Compose或Kubernetes等编排工具,可以进一步自动化部署和管理复杂的服务栈。
-
持续集成和交付(CI/CD):Docker与现代CI/CD流程无缝集成,能够自动化构建、测试和部署Redis服务,加速软件交付周期。
-
微服务架构友好:在微服务架构中,Docker容器化的Redis可以作为独立的服务运行,与其他微服务一起构成灵活、可扩展的系统。
-
版本控制和回滚: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异常,并切换主机节点,自动进行故障转移
- 主机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配置
配置完成后发布即可
如果配置文件修改后未生效,就需要将对应的服务重启一下,重启之后即可生效;
如果还是不生效,需要根据具体的错误提示进行处理