Redis 部署、主从复制与哨兵模式配置
一.Redis简介Redis 是一个基于内存的键值数据库核心优势是性能极高和数据结构丰富。主要用途是缓存用来存放热点数据减轻数据库压力提升应用响应速度。此外也常用于会话存储、分布式锁、排行榜和简单消息队列。它和 MySQL 这类关系型数据库是互补关系Redis 负责高性能读写和缓存处理内存中的临时数据MySQL 负责持久化存储和复杂查询存储核心业务数据。两者结合是现代高并发系统的常见架构。二.Redis部署与安装1. 安装依赖安装编译Redis所需的工具如编译器和系统管理脚本工具[rootredis-node1 ~]# dnf install make gcc initscripts -y2. 源码编译redis从官方源下载Redis源码包[rootredis-node1 ~]# wget https://download.redis.io/releases/redis-7.4.8.tar.gz # 解压下载的源码包 [rootredis-node1 ~]# tar zxf redis-7.4.8.tar.gz # 进入解压后的源码目录 [rootredis-node1 ~]# cd redis-7.4.8/ [rootredis-node1 redis-7.4.8]# # 执行编译和安装命令 [rootredis-node1 redis-7.4.8]# make make install # 进入Redis的实用工具目录 [rootredis-node1 redis-7.4.8]# cd utils/ # 编辑安装脚本注释掉检查systemd的代码块使其能在使用systemd的系统上继续执行 [rootredis-node1 utils]# vim install_server.sh #bail if this system is managed by systemd #_pid_1_exe$(readlink -f /proc/1/exe) #if [ ${_pid_1_exe##*/} systemd ] #then # echo This systems seems to use systemd. # echo Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry! # exit 1 #fi Ctrl v # 进入块选择模式 选择要注释的行 Shift i # 进入插入模式 输入注释符如 // 或 # Esc # 应用到所有行 # 运行Redis服务安装脚本 [rootredis-node1 utils]# ./install_server.sh Welcome to the redis service installer This script will help you easily set up a running redis server # 交互式配置过程设置端口、配置文件、日志文件、数据目录和可执行文件路径 Please select the redis port for this instance: [6379] Selecting default: 6379 #修改配置文件 Please select the redis config file name [/etc/redis/6379.conf] Please select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379 Please select the redis executable path [/usr/local/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/bin/redis-server Cli Executable : /usr/local/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful! # 重新加载systemd守护进程使新的服务单元文件生效 [rootredis-node1 utils]# systemctl daemon-reload # 检查服务状态 [rootredis-node1 utils]# systemctl status redis_6379.service ● redis_6379.service - LSB: start and stop redis_6379 Loaded: loaded (/etc/rc.d/init.d/redis_6379; generated) Active: active (exited) since Sun 2026-03-08 15:24:18 CST; 8s ago Docs: man:systemd-sysv-generator(8) Process: 35637 ExecStart/etc/rc.d/init.d/redis_6379 start (codeexited, status0/SUCCESS) CPU: 1ms # 使用netstat命令检查Redis服务是否在指定端口(6379)成功监听 [rootredis-node1 utils]# netstat -antlpe | grep redis tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 0 76854 35530/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 0 76855 35530/redis-server三.Redis主从复制1.Redis主节点配置本部分配置主节点通常只需开放访问确保从节点可连接# 登录到Redis主节点服务器 [rootredis-node1 ~]# vim /etc/redis/6379.conf # 注释掉默认的本地绑定允许任何IP连接 #bind 127.0.0.1 -::1 # 绑定到所有网络接口IPv4和IPv6允许远程访问 bind * -::* # 关闭保护模式允许非本机连接 protected-mode no # 修改配置后重启Redis服务使配置生效 [rootredis-node1 ~]# systemctl restart redis_6379.service2.配置Redis从节点在之前配置好的主节点上克隆两台主机修改相关配置作为从节点在两个从节点上进行相同配置核心是指定主节点的地址# 在第一个从节点redis-node2上进行配置 [rootredis-node2 ~]# vim /etc/redis/6379.conf #bind 127.0.0.1 -::1 # 同样绑定到所有网络接口 bind * -::* # 关闭保护模式 protected-mode no # 指定主节点的IP和端口这是从节点配置的核心指令 replicaof 172.25.254.101 6379 # 重启服务 [rootredis-node2 ~]# systemctl restart redis_6379.service # 在第二个从节点redis-node3上进行相同配置 [rootredis-node3 ~]# vim /etc/redis/6379.conf #bind 127.0.0.1 -::1 bind * -::* protected-mode no # 指向同一个主节点 replicaof 172.25.254.101 6379 # 重启服务 [rootredis-node3 ~]# systemctl restart redis_6379.service3. 查看状态并测试本部分用于验证主从复制是否配置成功3.1.状态查看通过在master和slave节点上执行info replication命令来查看复制状态# 登录主节点查看复制信息 [rootredis-node1 ~]# redis-cli 127.0.0.1:6379 info replication # Replication role:master # 当前角色主节点 connected_slaves:2 # 已连接的从节点数量2个 slave0:ip172.25.254.102,port6379,stateonline,offset391,lag0 # 从节点0的详细信息 slave1:ip172.25.254.103,port6379,stateonline,offset391,lag1 # 从节点1的详细信息 # ... 以下为复制相关的ID、偏移量等信息 master_failover_state:no-failover master_replid:e5f5cddc017ab0d5223213592d0482b832d3af77 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:391 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:391 # 登录一个从节点redis-node2查看复制信息 [rootredis-node2 ~]# redis-cli 127.0.0.1:6379 info replication # Replication role:slave # 当前角色从节点 master_host:172.25.254.101 # 主节点主机地址 master_port:6379 # 主节点端口 master_link_status:up # 主从连接状态正常 master_last_io_seconds_ago:5 # 距离上次与主节点IO交互的秒数 master_sync_in_progress:0 # 是否正在进行全量同步0表示否 # ... 以下为复制偏移量、从节点优先级等信息 slave_read_repl_offset:433 slave_repl_offset:433 slave_priority:100 slave_read_only:1 # 从节点为只读模式 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:e5f5cddc017ab0d5223213592d0482b832d3af77 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:433 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:4333.2.测试数据同步性本部分验证数据从主节点到从节点的同步以及从节点的只读属性# 在主节点上写入一个键值对 [rootredis-node1 ~]# redis-cli 127.0.0.1:6379 set name test OK 127.0.0.1:6379 get name test # 在从节点redis-node2上读取该键验证数据已同步 [rootredis-node2 ~]# redis-cli 127.0.0.1:6379 get name test # 在从节点redis-node3上进行相同验证并尝试写入数据以触发“只读副本”错误 [rootredis-node3 ~]# redis-cli 127.0.0.1:6379 get name test # 尝试在从节点写入数据会收到错误因为从节点默认是只读的 127.0.0.1:6379 set test 123 (error) READONLY You cant write against a read only replica.好的我已经根据您提供的文档内容对配置和测试过程进行了格式整理并添加了相应的注释使其逻辑更加清晰。四.配置Redis哨兵模式1. 主节点配置首先在主节点redis-node1, IP: 172.25.254.101上修改哨兵配置文件/etc/redis/sentinel.conf[rootredis-node1 redis-7.4.8]# vim /etc/redis/sentinel.conf配置文件关键项注释已添加protected-mode no # 关闭保护模式允许外部网络访问哨兵 port 26379 # Sentinel 哨兵进程的监听端口 daemonize no # 设置为“no”表示前台运行哨兵进程方便观察日志 pidfile /var/run/redis-sentinel.pid # Sentinel 进程的 PID 文件路径 loglevel notice # 日志级别 # 核心监控项监控名为“mymaster”的主节点主节点IP:172.25.254.100端口6379。故障裁决的法定票数(quorum)为2 sentinel monitor mymaster 172.25.254.101 6379 2 # 判断主节点“主观下线”的时间阈值10秒内无有效响应则认为主节点异常 sentinel down-after-milliseconds mymaster 10000 # 故障转移后同时向新主节点发起数据同步的从节点数量。设为1可避免新主节点瞬时负载过大 sentinel parallel-syncs mymaster 1 # 故障转移全过程的超时时间设置为3分钟 sentinel failover-timeout mymaster 1800002. 从节点配置在两个从节点上修改Redis配置文件关闭保护模式然后重启Redis服务。# 在从节点 redis-node2 上操作 [rootredis-node2 ~]# vim /etc/redis/6379.conf protected-mode no [rootredis-node2 ~]# systemctl restart redis_6379.service # 在从节点 redis-node3 上操作 [rootredis-node3 ~]# vim /etc/redis/6379.conf protected-mode no [rootredis-node3 ~]# systemctl restart redis_6379.service3. 分发哨兵配置从主节点将配置好的sentinel.conf文件复制到两个从节点。[rootredis-node1 ~]# scp /etc/redis/sentinel.conf root172.25.254.102:/etc/redis/ [rootredis-node1 ~]# scp /etc/redis/sentinel.conf root172.25.254.103:/etc/redis/4. 启动哨兵集群在所有三台服务器上使用相同的命令启动哨兵进程。# 在 redis-node1, node2, node3 上分别执行 [rootredis-node1~3 ~]# redis-sentinel /etc/redis/sentinel.conf启动后日志显示哨兵进程已成功启动并开始监控主节点同时发现了两个从节点172.25.254.102和172.25.254.103。稍后各个哨兵实例之间也完成了相互发现。2. 测试故障切换1. 模拟主节点故障在主节点redis-node1上创建新的终端窗口通过Redis客户端将其关闭。[rootredis-node1 6379]# redis-cli 127.0.0.1:6379 SHUTDOWN not connected quit2. 观察哨兵故障转移过程主节点下线后哨兵集群触发了故障转移流程。从哨兵的日志中我们可以看到完整的切换步骤以某个哨兵的日志为例检测与裁决sdown master ...: 哨兵主观认为主节点已下线。odown master ...: 获得足够哨兵本例中quorum为2投票后主节点被判定为客观下线。选举与切换try-failover: 开始尝试故障转移。vote-for-leader和elected-leader: 哨兵之间进行选举选出领导者哨兵来执行故障转移。selected-slave slave 172.25.254.20:6379 ...: 领导者哨兵选择从节点172.25.254.102作为新的主节点。promoted-slave: 将从节点172.25.254.102提升为新的主节点。failover-state-reconf-slaves: 开始重新配置其他从节点让它们复制新的主节点。slave-reconf-done slave 172.25.254.103:6379 ...: 从节点172.25.254.103已完成向新主节点的重新配置。switch-master mymaster 172.25.254.101 6379 172.25.254.102 6379:最关键的一步宣布主节点已从172.25.254.10:6379切换至172.25.254.20:6379。3. 验证切换结果在新的从节点redis-node3上查看可以看到它的主节点master_host已经变成了172.25.254.20。[rootredis-node3 ~]# redis-cli 127.0.0.1:6379 info replication # Replication role:slave master_host:172.25.254.102 master_port:6379 master_link_status:up ...4. 恢复旧主节点将之前宕机的原主节点redis-node1重新启动。[rootredis-node1 6379]# /etc/init.d/redis_6379 start5. 验证最终状态在新的主节点redis-node2上查看可以看到它现在作为主节点拥有两个从节点172.25.254.103和172.25.254.101。这说明原主节点恢复后会自动以从节点的身份加入新主节点形成了新的“一主二从”结构。[rootredis-node2 ~]# redis-cli 127.0.0.1:6379 info replication # Replication role:master connected_slaves:2 slave0:ip172.25.254.103,port6379,stateonline... slave1:ip172.25.254.101,port6379,stateonline... # 原主节点恢复后成为从节点 ...以上步骤和日志清晰地展示了Redis哨兵Sentinel模式的核心功能监控主节点状态、在主节点故障时自动选举新的主节点、并自动完成从节点的主从关系重新配置从而实现高可用。