CentOS上部署Redis及其哨兵(Sentinel)模式

架构:说明我这里是伪集群的,redis 在同一台机器,Sentinel 只有一个,也存在单点故障问题

只能当作开发环境使用,要满足生产至少是下面这种架构 

+-------------------+      +-------------------+      +-------------------+
|  Sentinel 1       |      |  Sentinel 2       |      |  Sentinel 3       |
|  (Monitoring)     |<---->|  (Monitoring)     |<---->|  (Monitoring)     |
+-------------------+      +-------------------+      +-------------------+|                          |                          |v                          v                          v
+-------------------+      +-------------------+      +-------------------+
|  Redis Master     |<---->|  Redis Slave 1    |<---->|  Redis Slave 2    |
|  (Port: 6379)     |      |  (Port: 6380)     |      |  (Port: 6381)     |
+-------------------+      +-------------------+      +-------------------+

安装Shell 脚本:

记得赋予可执行权限:chmod +x redis_sentinel_manager.sh

 

#!/bin/bash# =============================================================================
# Script Name: redis_sentinel_manager.sh
# Version: v1.4 (Enhanced stop function using ps/kill)
# Description: A script to install and manage Redis Sentinel mode on CentOS 7/8
# Author: ldj
# Creation Date: 2025-07-31
# =============================================================================# 全局变量
REDIS_VERSION="7.0.14"
REDIS_PORT1=6379
REDIS_PORT2=6380
REDIS_PORT3=6381
SENTINEL_PORT=26379
REDIS_DIR="/usr/local/redis"
DATA_DIR="/var/lib/redis"
LOG_DIR="/var/log/redis"
REDIS_PASSWORD="redis123456"  # 建议设置强密码# 检查权限
if [ "$(id -u)" -ne 0 ]; thenecho "请使用root权限运行此脚本"exit 1
fi# 显示使用说明
usage() {echo "使用方法:"echo "$0 <install|uninstall|start|stop>"echo ""echo "功能说明:"echo "  install   - 安装Redis哨兵模式"echo "  uninstall - 卸载Redis及相关文件"echo "  start     - 启动Redis服务"echo "  stop      - 停止Redis服务"
}# 检查Redis实例和Sentinel是否正在运行
check_running() {if pgrep -f "redis-server" > /dev/null; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 发现Redis实例正在运行,请先停止所有Redis实例和服务后再进行安装。"exit 1fiif pgrep -f "redis-sentinel" > /dev/null; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 发现Sentinel正在运行,请先停止Sentinel服务后再进行安装。"exit 1fi
}# 安装函数
install() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始安装Redis哨兵模式..."# 检查是否有正在运行的Redis实例或Sentinelcheck_running# 创建目录mkdir -p $REDIS_DIR $DATA_DIR $LOG_DIRmkdir -p $DATA_DIR/$REDIS_PORT1mkdir -p $DATA_DIR/$REDIS_PORT2mkdir -p $DATA_DIR/$REDIS_PORT3mkdir -p $DATA_DIR/sentinel# 安装依赖echo "[$(date +'%Y-%m-%d %H:%M:%S')] 安装编译依赖..."yum install -y wget gcc make tcl || { echo "安装依赖失败"; exit 1; }# 下载编译Rediscd $REDIS_DIR || { echo "无法进入目录 $REDIS_DIR"; exit 1; }echo "[$(date +'%Y-%m-%d %H:%M:%S')] 下载Redis $REDIS_VERSION..."wget https://download.redis.io/releases/redis-$REDIS_VERSION.tar.gz || { echo "下载Redis失败"; exit 1; }tar xzf redis-$REDIS_VERSION.tar.gz || { echo "解压Redis失败"; exit 1; }cd redis-$REDIS_VERSION || { echo "无法进入Redis源码目录"; exit 1; }# 编译 (在源码根目录)echo "[$(date +'%Y-%m-%d %H:%M:%S')] 编译Redis..."make || { echo "编译Redis失败"; exit 1; }# ========== 关键修复:正确安装所有二进制文件 ==========# 直接在 src 目录执行 make install,这是标准做法echo "[$(date +'%Y-%m-%d %H:%M:%S')] 安装Redis二进制文件 (server, cli, sentinel)..."cd src || { echo "无法进入 src 目录"; exit 1; }make install || { echo "安装二进制文件失败"; exit 1; }# 验证 redis-sentinel 是否安装成功if ! command -v redis-sentinel &> /dev/null; thenecho "致命错误: redis-sentinel 安装失败,未找到可执行文件。"exit 1fiecho "[$(date +'%Y-%m-%d %H:%M:%S')] redis-sentinel 安装验证通过。"# ============================================================# 可选:运行测试 (在源码根目录)echo "[$(date +'%Y-%m-%d %H:%M:%S')] 运行测试验证安装..."cd .. # 回到源码根目录make test || echo "[$(date +'%Y-%m-%d %H:%M:%S')] 测试运行完成 (可能存在非致命错误,但核心功能应正常)。"# ==================== 关键修改:配置并启动 Redis 实例 (注意顺序!) ====================echo "[$(date +'%Y-%m-%d %H:%M:%S')] 配置并启动 Redis 实例..."# --- 步骤 1: 配置并启动 主节点 (REDIS_PORT1) ---echo "[$(date +'%Y-%m-%d %H:%M:%S')] 配置主节点 (端口: $REDIS_PORT1)..."cat <<EOF > $REDIS_DIR/redis-$REDIS_PORT1.conf
port $REDIS_PORT1
bind 0.0.0.0
dir $DATA_DIR/$REDIS_PORT1
pidfile /var/run/redis-$REDIS_PORT1.pid
logfile "$LOG_DIR/redis-$REDIS_PORT1.log"
daemonize yes
appendonly yes
requirepass $REDIS_PASSWORD
masterauth $REDIS_PASSWORD
EOF# 启动主节点redis-server $REDIS_DIR/redis-$REDIS_PORT1.conf || { echo "启动主节点 $REDIS_PORT1 失败"; exit 1; }echo "[$(date +'%Y-%m-%d %H:%M:%S')] 主节点 (端口: $REDIS_PORT1) 已启动。"# --- 步骤 2: 配置并启动 从节点 (REDIS_PORT2 和 REDIS_PORT3) ---for PORT in $REDIS_PORT2 $REDIS_PORT3; doecho "[$(date +'%Y-%m-%d %H:%M:%S')] 配置从节点 (端口: $PORT)..."cat <<EOF > $REDIS_DIR/redis-$PORT.conf
port $PORT
bind 127.0.0.1
dir $DATA_DIR/$PORT
pidfile /var/run/redis-$PORT.pid
logfile "$LOG_DIR/redis-$PORT.log"
daemonize yes
appendonly yes
requirepass $REDIS_PASSWORD
masterauth $REDIS_PASSWORD
replicaof 127.0.0.1 $REDIS_PORT1
EOFdone# 启动从节点sleep 2 # 给主节点一点时间完全启动for PORT in $REDIS_PORT2 $REDIS_PORT3; doredis-server $REDIS_DIR/redis-$PORT.conf || { echo "启动从节点 $PORT 失败"; exit 1; }echo "[$(date +'%Y-%m-%d %H:%M:%S')] 从节点 (端口: $PORT) 已启动。"done# --- 步骤 3: 配置并启动 Sentinel ---echo "[$(date +'%Y-%m-%d %H:%M:%S')] 配置Sentinel..."cat <<EOF > $REDIS_DIR/sentinel.conf
port $SENTINEL_PORT
daemonize yes
pidfile /var/run/redis-sentinel.pid
logfile "$LOG_DIR/sentinel.log"
dir $DATA_DIR/sentinelsentinel monitor mymaster 127.0.0.1 $REDIS_PORT1 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster $REDIS_PASSWORD
EOF# 启动Sentinelecho "[$(date +'%Y-%m-%d %H:%M:%S')] 启动Sentinel..."redis-sentinel $REDIS_DIR/sentinel.conf || { echo "启动Sentinel失败"; exit 1; }echo "[$(date +'%Y-%m-%d %H:%M:%S')] Sentinel 已启动。"# 防火墙配置 (略,保持不变)echo "[$(date +'%Y-%m-%d %H:%M:%S')] 配置防火墙规则..."if systemctl is-active --quiet firewalld; thenfirewall-cmd --permanent --add-port=$REDIS_PORT1/tcpfirewall-cmd --permanent --add-port=$REDIS_PORT2/tcpfirewall-cmd --permanent --add-port=$REDIS_PORT3/tcpfirewall-cmd --permanent --add-port=$SENTINEL_PORT/tcpfirewall-cmd --reload && echo "[$(date +'%Y-%m-%d %H:%M:%S')] 防火墙规则已配置。"elseecho "[$(date +'%Y-%m-%d %H:%M:%S')] 防火墙服务(firewalld)未运行,跳过防火墙配置。"fiecho "[$(date +'%Y-%m-%d %H:%M:%S')] 安装完成!"echo "请使用 'redis-cli -p $SENTINEL_PORT' 连接 Sentinel 并检查状态。"echo "例如: redis-cli -p $SENTINEL_PORT -a $REDIS_PASSWORD"echo "在 Sentinel CLI 中执行: SENTINEL masters"
}# 卸载函数
uninstall() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] 卸载Redis及相关文件..."# 停止服务stop# 删除文件rm -rf $REDIS_DIR $DATA_DIR $LOG_DIRecho "[$(date +'%Y-%m-%d %H:%M:%S')] 卸载完成!"
}# 启动函数
start() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动Redis服务..."for PORT in $REDIS_PORT1 $REDIS_PORT2 $REDIS_PORT3; doredis-server $REDIS_DIR/redis-$PORT.conf || { echo "启动Redis实例 $PORT 失败"; exit 1; }doneredis-sentinel $REDIS_DIR/sentinel.conf || { echo "启动Sentinel失败"; exit 1; }echo "[$(date +'%Y-%m-%d %H:%M:%S')] Redis服务已启动。"
}# 停止函数
stop() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] 停止Redis服务..."# 逐个杀死 Redis 实例for PORT in $REDIS_PORT1 $REDIS_PORT2 $REDIS_PORT3; do# 查找进程pids=$(ps aux | grep -E "redis-server.*127.0.0.1:$PORT|redis-server.*:$PORT" | grep -v grep | awk '{print $2}')if [ ! -z "$pids" ]; thenecho "正在强制停止端口 $PORT 的 Redis 实例 (PID: $pids)..."# 直接发送 SIGKILL (-9),强制终止kill -9 $pidselseecho "端口 $PORT 的 Redis 实例未找到。"fidone# 停止 Sentinelsentinel_pids=$(ps aux | grep "redis-sentinel" | grep -v grep | awk '{print $2}')if [ ! -z "$sentinel_pids" ]; thenecho "正在强制停止 Sentinel (PID: $sentinel_pids)..."# 直接发送 SIGKILL (-9),强制终止kill -9 $sentinel_pidselseecho "Sentinel 实例未找到。"fiecho "[$(date +'%Y-%m-%d %H:%M:%S')] Redis服务已停止。"
}# 根据参数执行操作
case $1 ininstall)install;;uninstall)uninstall;;start)start;;stop)stop;;*)usageexit 1;;
esac

 

 重新运行: ./redis_sentinel_manager.sh install

验证:

 第一步:确认进程都在跑

ps -ef | grep redis
  • 3 个 Redis 实例(1 主 2 从)起来了。
  • 1 个 Sentinel 也起来了。 ✅ 服务启动成功!

第二步:连上 Sentinel,问它“主节点是谁?”

redis-cli -p 26379
SENTINEL get-master-addr-by-name mymaster

这说明:

  • Sentinel 正在监控一个叫 mymaster 的主节点。
  • 当前主节点是 127.0.0.1:6379。 ✅ 哨兵在正常工作!

 

第三步:写个数据,看能不能读到(功能测试)

1.连主节点写数据:

redis-cli -p 6379> AUTH redis123456
> SET name ldj
> exit

2.连从节点读数据: 

redis-cli -p 6380
> AUTH redis123456
> GET name

如果返回 "ldj",说明主从数据同步正常

 

补充:

部署方式(生产推荐)

方法工具说明
1. 容器化部署(推荐)Docker + Docker Compose / Kubernetes用容器封装 Redis 和 Sentinel,配置集中管理,启动快,环境一致
2. 配置管理工具Ansible / SaltStack / Puppet编写 Playbook,一键在多台机器部署,保证配置一致性
3. 云服务商托管阿里云 Redis / AWS ElastiCache / Azure Cache完全托管,自动故障转移、备份、监控,最省心

 

补充:使用docker-compose 安装

redis-docker-compose.yml

version: '3.8'services:redis-master:image: redis:6.0container_name: redis-mastercommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]volumes:- ./redis-master.conf:/usr/local/etc/redis/redis.conf- redis-data-master:/datanetworks:- redis-netports:- "6379:6379"redis-slave-1:image: redis:6.0container_name: redis-slave-1command: ["redis-server", "/usr/local/etc/redis/redis.conf"]volumes:- ./redis-slave-1.conf:/usr/local/etc/redis/redis.conf- redis-data-slave-1:/datanetworks:- redis-netports:- "6380:6379"depends_on:- redis-masterredis-slave-2:image: redis:6.0container_name: redis-slave-2command: ["redis-server", "/usr/local/etc/redis/redis.conf"]volumes:- ./redis-slave-2.conf:/usr/local/etc/redis/redis.conf- redis-data-slave-2:/datanetworks:- redis-netports:- "6381:6379"depends_on:- redis-mastersentinel-1:image: redis:6.0container_name: sentinel-1command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]volumes:- ./sentinel-1.conf:/usr/local/etc/redis/sentinel.confnetworks:- redis-netports:- "26379:26379"depends_on:- redis-mastersentinel-2:image: redis:6.0container_name: sentinel-2command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]volumes:- ./sentinel-2.conf:/usr/local/etc/redis/sentinel.confnetworks:- redis-netports:- "26380:26379"depends_on:- redis-mastersentinel-3:image: redis:6.0container_name: sentinel-3command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]volumes:- ./sentinel-3.conf:/usr/local/etc/redis/sentinel.confnetworks:- redis-netports:- "26381:26379"depends_on:- redis-mastervolumes:redis-data-master:redis-data-slave-1:redis-data-slave-2:networks:redis-net:driver: bridge

 

配置文件示例

redis-master.conf

port 6379
bind 0.0.0.0
protected-mode yes
appendonly yes
requirepass yourStrongPassword!
masterauth yourStrongPassword!

redis-slave-1.conf 和 redis-slave-2.confyunx

port 6379
bind 0.0.0.0
protected-mode yes
appendonly yes
requirepass yourStrongPassword!
masterauth yourStrongPassword!
slaveof redis-master 6379

运行:

docker-compose -f redis-docker-compose.yml up -d

 

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

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

相关文章

《软件测试与质量控制》实验报告二 单元测试

目 录 一、实验学时 二、实验目的 三、实验环境 &#xff08;一&#xff09;硬件环境&#xff1a; &#xff08;二&#xff09;软件环境&#xff1a; 四、实验内容 1、实验方案&#xff1a; 2、实验步骤&#xff1a; 3、设计思路&#xff1a; 1、安装JUnit和Eclemma…

k8s模式部署PolarDB-X

当前文档适配PolarDB-X V2.4.0 版本 环境描述&#xff1a; 部署机&#xff08;ops&#xff09;1x2.2x.2x8.116&#xff0c;部署机需要可以访问互联网。使用ansible进行部署&#xff0c;自行安装ansible。需要部署两个k8s集群&#xff0c;分别在其上安装一个polardb-x集群。 部…

Flask + YARA-Python*实现文件扫描功能

以下是一个 完整的 Web API 示例&#xff0c;使用 Flask YARA-Python 实现文件扫描功能&#xff0c;支持上传文件并返回 YARA 规则匹配结果。 ✅ 功能说明 提供一个 /scan 接口&#xff0c;支持文件上传使用预加载的 YARA 规则进行扫描返回 JSON 格式的匹配结果支持多规则、可…

WinForm之NumericUpDown控件

NumericUpDown&#xff08;数字上下控件&#xff09;是 WinForm 中专门用于输入和调整数值的控件&#xff0c;它结合了文本框和上下按钮&#xff0c;用户可通过点击按钮或直接输入来设置数值&#xff0c;且能严格限制数值范围&#xff08;最小值、最大值&#xff09;和步长&…

一文读懂K8S kubectl 命令,运维小白必看!

一、Kubectl 是什么? Kubectl 是 Kubernetes(简称 K8S)集群的命令行工具,它就像是一把万能钥匙,让我们可以与 K8S 集群进行交互,轻松管理集群中的各种资源,像是 Pod、Service、Deployment 等等。通过向 K8S API 发送 REST 请求,kubectl 实现了对集群资源的增删改查等操…

髋臼方向的定义与测量-I

近期看到关于髋臼方向不同应用场景下的不同定义&#xff0c;觉得特别有意思&#xff0c;但是&#xff0c;原文是影印本&#xff0c;不太方便实用屏幕取词翻译&#xff0c;且一些专业术语也不太好理解。 因此&#xff0c;我将原文和翻译整理了一些&#xff0c;不对的地方&#x…

Python爬虫实战:研究mahotas库,构建图像获取及处理系统

一、引言 (一)研究背景 在信息爆炸的时代,图像作为一种直观、丰富的信息载体,其数量在互联网上呈现指数级增长。这些图像数据涵盖了自然景观、动植物、工业产品等多个领域,为模式识别、机器学习等研究提供了宝贵的数据源。特别是在植物学研究领域,叶片图像包含了丰富的…

【04】海康相机C#开发——VS 在编译时,提示“Files的值“+乱码情况解决办法’ ,C#项目打开编译时报错:Files 的值“IGEF‘,

文章目录C#项目打开&#xff0c;用VS 在编译时编译时报错&#xff1a;Files 的值“乱码&#xff1b; 有的编译器会显示&#xff1a;Files的值“IGEF 以上报错都为同一种错误&#xff0c;.net中的配置文件乱码导致的&#xff1a; 找到项目目录下的“..\obj\Debug\”的文件夹中…

MySQL隐式转换陷阱:从错误查询案例解析索引失效与数据类型匹配

开始之前&#xff0c;先问个问题问题&#xff1a;mysql 数据类型是date &#xff0c;怎么写查询条件索引有效&#xff1f; ——下面带着疑问看下去。 一、mysql-8.隐式转换导致索引失效或查出不符合where条件结果 今天在执行一条sql语句时候&#xff0c;where条件写错了&#x…

【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化

目录sklearn数据集玩具数据集现实世界数据集加载玩具数据集获取现实世界数据集本地csv数据创建csv文件pandas加载csv数据集划分特征工程步骤特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入门(docker桌面版)(提示wsl版本太低解决办法)

参考文章&#xff1a;Docker Desktop Engine Stopped原因分析&#xff08;docker桌面停止&#xff09;WSL没装或没更新 文章目录Docker Desktop入门指南1. Docker Desktop简介2. 安装Docker Desktop2.1 系统要求2.2 下载和安装3. 配置Docker Desktop修改默认存储路径4. 运行你的…

《n8n基础教学》第三节:模拟一个自动化场景

1、模拟场景Nathan &#x1f64b;是 ABCorp 的分析经理&#xff0c;他的工作是支持 ABCorp 团队的报告和分析。作为一个真正的多面手&#xff0c;他还负责处理一些杂项任务。Nathan 做的一些事情是重复且枯燥的。他希望自动化其中一些任务&#xff0c;以避免精疲力竭。作为一名…

CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(三)

CodeRush 是专为 Visual Studio 打造的高效开发插件&#xff0c;通过集成 AI 驱动功能&#xff08;如自然语言生成代码的 AiGen 和智能搜索逻辑的 AiFind&#xff09;、语音交互及深度重构工具&#xff0c;直接在 IDE 内无缝完成代码生成、修改与导航&#xff0c;消除窗口切换与…

如何从头开始搭建属于自己的家用nas实现内网穿透访问

最近我在家部署了群晖NAS923&#xff0c;从而实现内网穿透&#xff0c;下面写一个新手向教程&#xff1a; 一、硬件安装与初始化设置 1. 硬盘安装&#xff08;已完成可跳过&#xff09; 群晖 923 支持 4 块 3.5 英寸硬盘&#xff0c;开箱后取出硬盘架&#xff0c;将硬盘&am…

mysql 之多表

mysql之多表已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09;CREATE table dep…

【Django】-6- 登录用户身份鉴权

一、&#x1f6e1;️ Django 鉴权 & 登录控制 Django 自带的鉴权系统&#xff08;用户身份管理小管家&#xff09;鉴权系统能干啥&#xff1f;Django 自带的鉴权系统&#xff0c;就像一个 “用户身份管家” &#xff0c;帮你管好这些事儿&#xff1a;功能类比加密存储用户密…

winscp 连openwrt 返回127错误码

winscp 连openwrt 24.10返回127错误码。找了许多原因也没搞清为啥&#xff08;客户端加密方式、winscp版本过低等都试过&#xff09;&#xff0c;用SecureFx试了一下&#xff0c;发现是openwrt 24.10固件没有安装Sftp服器&#xff0c;用下列命令安装即可。opkg install openssh…

Python编程基础与实践:Python文件处理入门

Python文件处理实战 学习目标 通过本课程的学习&#xff0c;学员将掌握如何在Python中打开、读取、写入和关闭文件&#xff0c;了解文本文件和二进制文件的区别&#xff0c;以及在文件处理中的一些最佳实践。 相关知识点 Python文件处理 学习内容 1 Python文件处理 1.1 文件的基…

Corrosion2靶机

打开靶机信息收集&#xff1a;kali里使用arp-scan -l或者netdiscover发现主机使用nmap扫描端口nmap -sS -sV -T4 -n -p- 192.168.31.20开启了22、80、8080端口 8080发现开启了tomcat服务扫出了他的ip以及他开放的端口&#xff0c;我们接下来拿浏览器访问一下两个页面都没有什么…

编程与数学 03-002 计算机网络 18_物联网与网络

编程与数学 03-002 计算机网络 18_物联网与网络一、物联网的基本概念&#xff08;一&#xff09;物联网的架构与层次&#xff08;二&#xff09;物联网的关键技术二、物联网网络的构建&#xff08;一&#xff09;物联网网络的通信协议&#xff08;二&#xff09;物联网网络的拓…