redis 集群部署 两台服务器1主1从 三个哨兵
·
服务器规划:
服务器A (192.168.130.192):
├── Redis 主节点 (端口: 6379)
└── 哨兵1 (端口: 26379)
服务器B (192.168.130.195):
├── Redis 从节点 (端口: 6379)
├── 哨兵2 (端口: 26379)
└── 哨兵3 (端口: 26380)
准备工作目录:
# 在两台服务器上创建统一目录结构
mkdir -p /opt/redis/{bin,conf,data,logs,sentinel}
mkdir -p /opt/redis/backup/{daily,weekly}
1.下载Redis tar包
# 下载地址(建议国内镜像)
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
# 或者从国内镜像下载
wget https://mirrors.huaweicloud.com/redis/redis-7.2.4.tar.gz
# 校验文件
sha256sum redis-7.2.4.tar.gz
# 正确输出:e25b7f7c749f6c7c23057c4d2eb3c0f5e872d5d1b7b93d9fcd3c843b2e7d64a7
2.安装Redis
# 解压(两台服务器同样的操作)
tar -xzf redis-7.2.4.tar.gz
cd redis-7.2.4
# 编译安装
make && make install PREFIX=/opt/redis
# 创建软链接
ln -sf /opt/redis/bin/redis-server /usr/local/bin/redis-server
ln -sf /opt/redis/bin/redis-cli /usr/local/bin/redis-cli
ln -sf /opt/redis/bin/redis-sentinel /usr/local/bin/redis-sentinel
# 验证安装
redis-server --version
# 应输出:Redis server v=7.2.4
三、配置文件准备
- Redis节点配置(服务器A)我并没有在conf文件中配置主从关系,因为后期发送故障转移的时候会有问题,所有主从的关系叫给哨兵去做。
# 创建配置文件
cat > /opt/redis/conf/redis-master.conf << 'EOF'
# 基础配置
# 基础配置
port 6379
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-server.pid"
logfile "/opt/redis/logs/redis-server.log"
dir "/opt/redis/data"
# 认证配置(必须)
requirepass "Redis@2024Master"
masterauth "Redis@2024Master"
# 持久化
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename "dump.rdb"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru
# 主从复制(通用)
repl-backlog-size 128mb
min-replicas-to-write 1
min-replicas-max-lag 10
# 性能优化
tcp-keepalive 60
timeout 0
tcp-backlog
EOF
- Redis从节点配置(服务器B)
# 创建配置文件
cat > /opt/redis/conf/redis-slave.conf << 'EOF'
# 基础配置
port 6379
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-server.pid"
logfile "/opt/redis/logs/redis-server.log"
dir "/opt/redis/data"
# 认证配置(必须)
requirepass "Redis@2024Master"
masterauth "Redis@2024Master"
# 持久化
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename "dump.rdb"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru
# 主从复制(通用)
repl-backlog-size 128mb
min-replicas-to-write 1
min-replicas-max-lag 10
# 性能优化
tcp-keepalive 60
timeout 0
tcp-backlog 511
EOF
- 哨兵配置
哨兵1配置(服务器A)
cat > /opt/redis/sentinel/sentinel-26379.conf << 'EOF'
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "/opt/redis/logs/sentinel-26379.log"
dir "/tmp"
sentinel monitor mymaster 192.168.130.195 6379 2
sentinel auth-pass mymaster Redis@2024Master
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 15000
protected-mode no
EOF
哨兵2配置(服务器B - 端口26379)
cat > /opt/redis/sentinel/sentinel-26379.conf << 'EOF'
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "/opt/redis/logs/sentinel-26379.log"
dir "/tmp"
sentinel monitor mymaster 192.168.130.195 6379 2
sentinel auth-pass mymaster Redis@2024Master
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 15000
protected-mode no
EOF
哨兵3配置(服务器B - 端口26380)
port 26380
daemonize yes
pidfile "/var/run/redis-sentinel-26380.pid"
logfile "/opt/redis/logs/sentinel-26380.log"
dir "/tmp"
sentinel monitor mymaster 192.168.130.195 6379 2
sentinel auth-pass mymaster Redis@2024Master
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 15000
protected-mode no
四、部署脚本
部署主节点(服务器A执行)
#!/bin/bash
# deploy-master.sh
echo "=== 部署Redis主节点 ==="
# 1. 创建目录
mkdir -p /opt/redis/{data/master,logs,backup}
# 2. 复制配置文件
# cp redis-master.conf /opt/redis/conf/
# 3. 启动Redis主节点
/opt/redis/bin/redis-server /opt/redis/conf/redis-master.conf
# 4. 验证启动
sleep 2
if redis-cli -a "Redis@2024Master" ping | grep -q PONG; then
echo "✅ Redis主节点启动成功"
else
echo "❌ Redis主节点启动失败"
exit 1
fi
echo "=== 主节点部署完成 ==="
部署从节点(服务器B执行)
#!/bin/bash
# deploy-slave.sh
echo "=== 部署Redis从节点 ==="
# 1. 创建目录
mkdir -p /opt/redis/{data/slave,logs,backup}
# 2. 复制配置文件
# cp redis-slave.conf /opt/redis/conf/
# 3. 启动Redis从节点
/opt/redis/bin/redis-server /opt/redis/conf/redis-slave.conf
# 4. 验证启动和复制
sleep 3
if redis-cli -a "Redis@2024Master" ping | grep -q PONG; then
echo "✅ Redis从节点启动成功"
# 检查复制状态
REPL_INFO=$(redis-cli -a "Redis@2024Master" info replication)
if echo "$REPL_INFO" | grep -q "master_link_status:up"; then
echo "✅ 主从复制正常"
else
echo "❌ 主从复制异常"
fi
else
echo "❌ Redis从节点启动失败"
exit 1
fi
echo "=== 从节点部署完成 ==="
部署哨兵(两台服务器分别执行)
主节点(创建deploy-sentinel.sh文件):
# 启动哨兵
redis-sentinel /opt/redis/sentinel/sentinel-26379.conf &
# 立即检查是否成功
sleep 2
if redis-cli -p 26379 ping > /dev/null 2>&1; then
echo "✅ 哨兵启动成功!端口:26379"
else
echo "❌ 哨兵启动失败!"
fi
从节点:(创建deploy-sentinel.sh文件):
#!/bin/bash
# start-sentinels.sh - 服务器B专用
echo "=== 启动Redis哨兵 ==="
# 0. 检查是否已经启动
if ps aux | grep -q "[r]edis-sentinel.*26379"; then
echo "⚠️ 哨兵26379已经在运行"
else
echo "启动哨兵26379..."
redis-sentinel /opt/redis/sentinel/sentinel-26379.conf &
echo "✅ 哨兵26379启动成功"
fi
if ps aux | grep -q "[r]edis-sentinel.*26380"; then
echo "⚠️ 哨兵26380已经在运行"
else
echo "启动哨兵26380..."
redis-sentinel /opt/redis/sentinel/sentinel-26380.conf &
echo "✅ 哨兵26380启动成功"
fi
# 等待哨兵启动
sleep 3
# 验证启动
echo "验证启动状态..."
if redis-cli -p 26379 ping 2>/dev/null | grep -q PONG; then
echo "✅ 哨兵26379运行正常"
else
echo "❌ 哨兵26379启动失败"
fi
if redis-cli -p 26380 ping 2>/dev/null | grep -q PONG; then
echo "✅ 哨兵26380运行正常"
else
echo "❌ 哨兵26380启动失败"
fi
echo "=== 启动完成 ==="
echo "查看哨兵状态: redis-cli -p 26379 sentinel master mymaster"
等两台服务器的redis和哨兵都启动后需要设置主从关系:
# 手动设置主从关系(确保192是主节点)
redis-cli -h 192.168.130.192 -a "Redis@2024Master" SLAVEOF NO ONE
redis-cli -h 192.168.130.195 -a "Redis@2024Master" SLAVEOF 192.168.130.192 6379
# 验证
echo "195状态:"
redis-cli -h 192.168.130.195 -a "Redis@2024Master" info replication | grep -E "(role|connected_slaves)"
echo "192状态:"
redis-cli -h 192.168.130.192 -a "Redis@2024Master" info replication | grep -E "(role|master_host|master_link)"
结尾:
关键监控命令
# 查看集群状态
redis-cli -p 26379 sentinel master mymaster
# 查看哨兵信息
redis-cli -p 26379 sentinel sentinels mymaster
# 查看主从信息
redis-cli -h 192.168.1.10 -a "Redis@2024Master" info replication
# 查看内存使用
redis-cli -h 192.168.1.10 -a "Redis@2024Master" info memory
# 查看客户端连接
redis-cli -h 192.168.1.10 -a "Redis@2024Master" info clients
最终验证命令
# 在服务器A(主节点)执行:
redis-cli -a "Redis@2024Master" info replication
# 输出应该包含:
# role:master
# connected_slaves:1
# slave0:ip=192.168.130.195,port=6379,state=online,offset=...
# 在服务器B(从节点)执行:
redis-cli -a "Redis@2024Master" info replication
# 输出应该包含:
# role:slave
# master_host:192.168.130.192
# master_link_status:up
# 查看哨兵集群状态
redis-cli -p 26379 sentinel master mymaster | grep -E "num-other-sentinels|num-slaves"
# 现在应该看到:
# num-slaves:1
# num-other-sentinels:2 # 能看到服务器B的两个哨兵
如果想测试在主节点set数据能不能复制到从节点可以用下面的命令测试:
1. 在主节点写入数据
bash
# 在服务器A(主节点)执行
redis-cli -h 192.168.130.192 -a "Redis@2024Master"
# 进入Redis命令行后:
127.0.0.1:6379> set test_key "hello_from_master"
127.0.0.1:6379> set school_portal_user "zhangsan"
127.0.0.1:6379> set login_session "abc123"
127.0.0.1:6379> exit
2. 在从节点读取数据
bash
# 在服务器B(从节点)执行
redis-cli -h 192.168.130.195 -a "Redis@2024Master"
# 进入Redis命令行后:
127.0.0.1:6379> get test_key
# 应该输出:"hello_from_master"
127.0.0.1:6379> get school_portal_user
# 应该输出:"zhangsan"
127.0.0.1:6379> keys *
# 应该看到刚才在主节点设置的所有key
如果能读取到说明成功了 密码我设置的主从是一样的(避免发生不知名错误,本人技术小白 !!!)
如果想测试故障转移
# 测试方法:停止主节点看故障转移是否成功
redis-cli -h 192.168.130.192 -a "Redis@2024Master" shutdown
# 监控日志
tail -f /opt/redis/logs/sentinel-26379.log
如果输出以下内容大概就是成功了:
85920:X 23 Jan 2026 14:36:13.443 # +odown master mymaster 192.168.130.192 6379 #quorum 3/2
85920:X 23 Jan 2026 14:36:13.444 * Next failover delay: I will not start a failover before Fri Jan 23 14:36:43 2026
85920:X 23 Jan 2026 14:36:14.481 # +config-update-from sentinel f21639903f265c71767c217b123ceeca6b33bd7e 192.168.130.195 26379 @ mymaster 192.168.130.192 6379
85920:X 23 Jan 2026 14:36:14.481 # +switch-master mymaster 192.168.130.192 6379 192.168.130.195 6379
85920:X 23 Jan 2026 14:36:14.481 * +slave slave 192.168.130.192:6379 192.168.130.192 6379 @ mymaster 192.168.130.195 6379
85920:X 23 Jan 2026 14:36:14.484 * Sentinel new configuration saved on disk
85920:X 23 Jan 2026 14:36:17.564 # +sdown slave 192.168.130.192:6379 192.168.130.192 6379 @ mymaster 192.168.130.195 6379
85920:X 23 Jan 2026 14:46:26.537 # -sdown slave 192.168.130.192:6379 192.168.130.192 6379 @ mymaster 192.168.130.195 6379
85920:X 23 Jan 2026 14:46:36.507 * +convert-to-slave slave 192.168.130.192:6379 192.168.130.192 6379 @ mymaster 192.168.130.195 6379
更多推荐




所有评论(0)