Skip to content

Menu
  • Home
  • 文章
    • 监控
      • 自己开发的监控服务
    • MQ
      • rabbitmq
    • Database
      • Mysql
      • redis
  • 常用脚本
    • shell
      • 系统初始化
      • jdk安装
  • 资源
    • 豆包
    • ChatGPT
    • 哔哩哔哩
    • CSDN
    • 百度
    • Github
    • 阿里镜像源
    • 腾讯云
  • 联系方式
  • 关于本站
Menu

Redis的主从+sentinel

Posted on 2025年11月20日2025年11月20日 by rangrang

1.配置主从

tar zxvf redis-8.0.0.tar.gz -C /usr/local/src/
cd /usr/local/src/redis-8.0.0/src/
make PREFIX=/usr/local/redis MALLOC=libc install 
mkdir -p /usr/local/redis/{etc,logs,data}
cp ../redis.conf /usr/local/redis/etc/
#MALLOC=libc #redis对内存的优化
cat >/usr/local/redis/etc/redis.conf<<EOF
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 300
daemonize yes
supervised systemd
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
save 600 1 300 100 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir "/usr/local/redis/data"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
maxclients 10000
maxmemory 1G
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
 
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
EOF

2.使用systemd管理

cat>/etc/systemd/system/redis-server.service<<EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target
 
[Service]
User=root
Group=root
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
 
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable redis-server.service --now
ln -s /usr/local/redis/bin/* /usr/bin/

3.模拟数据插入

[root@server1 ~]# redis-cli
127.0.0.1:6379> info
NOAUTH Authentication required.
127.0.0.1:6379> auth Yutian_2025
OK
127.0.0.1:6379> set name wangwu
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"

4.编辑从库配置文件

在配置文件新增以下参数
#指定主库的IP+Port
slaveof 192.168.66.137 6379
#若主库有密码,需指定密码
masterauth Yutian_2025
systemctl restart redis-server.service

5.验证效果

主库redis输入info命令查看
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.66.138,port=6379,state=online,offset=86,lag=1
master_failover_state:no-failover
master_replid:40cd9c3a2a8485b841bea6f9299b15a8ee247528
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:86
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3
repl_backlog_histlen:84


从库redis输入info命令查看
# Replication
role:slave
master_host:192.168.66.137
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:184
slave_repl_offset:184
replica_full_sync_buffer_size:0
replica_full_sync_buffer_peak:0
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:40cd9c3a2a8485b841bea6f9299b15a8ee247528
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:184
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:17
repl_backlog_histlen:168
#查看测试数据是否存在
127.0.0.1:6379> keys *
1) "name"
2) "age"

6.配置哨兵模式

需要至少三台redis,创建一台新redis服务器并按照以上配置主从

cat>/usr/local/redis/etc/sentinel.conf<<EOF
protected-mode no
port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
loglevel notice
logfile "/usr/local/redis/logs/sentinel.log"
dir /tmp
sentinel monitor mymaster 192.168.66.137 6379 2
sentinel auth-pass mymaster Yutian_2025
sentinel down-after-milliseconds mymaster 10000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
SENTINEL master-reboot-down-after-period mymaster 0
EOF
#启动哨兵
redis-server /usr/local/redis/etc/sentinel.conf --sentinel

7.登录哨兵端口检查哨兵状态

redis-cli -p 26379
127.0.0.1:26379> SENTINEL master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.66.137"
 5) "port"
 6) "6379"
 7) "runid"
 8) "9c0fc370eb1b3aef726f392816697dfbc8508186"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "833"
19) "last-ping-reply"
20) "833"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "4799"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "205595"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "10000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> 

8.模拟redis主节点宕机

systemctl stop redis-server.service
tail -n 10 ../logs/sentinel.log 
3933:X 19 Nov 2025 17:06:31.274 * Sentinel new configuration saved on disk
3933:X 19 Nov 2025 17:06:31.274 # +vote-for-leader b5c23110b238c8ce63a9eede204912155bffea8e 1
3933:X 19 Nov 2025 17:06:32.206 # +odown master mymaster 192.168.66.137 6379 #quorum 3/2
3933:X 19 Nov 2025 17:06:32.206 * Next failover delay: I will not start a failover before Wed Nov 19 17:06:51 2025
3933:X 19 Nov 2025 17:06:32.543 # +config-update-from sentinel b5c23110b238c8ce63a9eede204912155bffea8e 192.168.66.139 26379 @ mymaster 192.168.66.137 6379
3933:X 19 Nov 2025 17:06:32.543 # +switch-master mymaster 192.168.66.137 6379 192.168.66.139 6379
3933:X 19 Nov 2025 17:06:32.544 * +slave slave 192.168.66.138:6379 192.168.66.138 6379 @ mymaster 192.168.66.139 6379
3933:X 19 Nov 2025 17:06:32.544 * +slave slave 192.168.66.137:6379 192.168.66.137 6379 @ mymaster 192.168.66.139 6379
3933:X 19 Nov 2025 17:06:32.547 * Sentinel new configuration saved on disk
3933:X 19 Nov 2025 17:06:42.596 # +sdown slave 192.168.66.137:6379 192.168.66.137 6379 @ mymaster 192.168.66.139 6379
查看哨兵日志发现,主节点经过投票变成了139节点
127.0.0.1:26379> SENTINEL MASTER mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.66.139"
 5) "port"
 6) "6379"
 7) "runid"
 8) "1350c0ed1cf7b27de3df09dedcdf3097effaa192"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "677"
19) "last-ping-reply"
20) "677"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "677"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "50941"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "10000"
39) "parallel-syncs"
40) "1"

9.配置vip自动切换 要实现vip功能,需要借助redis的一个脚本client-reconfig-script,该脚本接收7个参数如下:

下面是一个自动切换的脚本 :

#!/bin/sh
_DEBUG="on"
DEBUGFILE=/usr/local/redis/logs/sentinel_failover.log

VIP='192.168.1.233'
MASTERIP=${6}
MASK='24'
IFACE='ens33'
MYIP=$(ip -4 -o addr show dev ${IFACE}| grep -v secondary| awk '{split($4,a,"/");print a[1]}')


DEBUG () {
    if [ "$_DEBUG" = "on" ]; then
        $@
    fi
}


rm -rf ${DEBUGFILE}

set -e
DEBUG date >> ${DEBUGFILE}
DEBUG echo $@ >> ${DEBUGFILE}
DEBUG echo "Master: ${MASTERIP} My IP: ${MYIP}" >> ${DEBUGFILE}
if [ ${MASTERIP} = ${MYIP} ]; then
    
    if [ $(ip addr show ${IFACE} | grep ${VIP} | wc -l) -eq 0 ]; then
        ip addr add ${VIP}/${MASK} dev ${IFACE}
        DEBUG echo "ip addr add ${VIP}/${MASK} dev ${IFACE}" >> ${DEBUGFILE}
        arping -q -c 3 -A ${VIP} -I ${IFACE}
    fi
    exit 0
else
    if [ $(ip addr show ${IFACE} | grep ${VIP} | wc -l) -ne 0 ]; then
        ip addr del ${VIP}/${MASK} dev ${IFACE}
        DEBUG echo "ip addr del ${VIP}/${MASK} dev ${IFACE}" >> ${DEBUGFILE}
    fi
    exit 0
fi
exit 1
chmod +x redis_failover.sh 

进行验证

杀掉哨兵进程
kill -9 $(ps -ef|grep sentinel|awk '{print $2}'|head -n 1)
在哨兵配置文件下新增
sentinel client-reconfig-script mymaster /usr/local/redis/redis_failover.sh
第一次配置,在当前主节点手动添加VIP地址
ip addr add 192.168.66.200/24 dev ens33
[root@server3 redis]# ip a|grep 200
inet 192.168.66.200/24 scope global secondary ens33
启动哨兵模式
redis-server /usr/local/redis/etc/sentinel.conf --sentinel
模拟当前主节点估值
systemctl stop redis-server.service
之前旧主节点新增哨兵监控脚本日志
ls logs
redis.log  sentinel_failover.log  sentinel.log
查看200VIP地址,也不在旧主节点
ip a|grep 200
[root@server3 redis]# cat logs/sentinel_failover.log 
2025年 11月 19日 星期三 17:48:50 CST
mymaster leader start 192.168.66.139 6379 192.168.66.138 6379
Master: 192.168.66.138 My IP: 192.168.66.139
ip addr del 192.168.66.200/24 dev ens33
日志显示主节点变成了138,所以VIP在ens33网卡上删除

138节点查看

[root@server2 redis]# ip a|grep 200
    inet 192.168.66.200/24 scope global secondary ens33
[root@server2 redis]# cat logs/sentinel_failover.log 
2025年 11月 19日 星期三 17:48:50 CST
mymaster observer start 192.168.66.139 6379 192.168.66.138 6379
Master: 192.168.66.138 My IP: 192.168.66.138
ip addr add 192.168.66.200/24 dev ens33


已成功实现漂移

1 thought on “Redis的主从+sentinel”

  1. Pingback: redis集群配置

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

网站统计

本站已运行:5 天

文章总数:9 篇

分类:6 个 · 标签:6 个

最后更新:2025-11-22

一句话

记录每一次踩坑,帮后来人少踩一个坑。

持续学习 · 持续输出 · 持续复盘。

友情链接

  • 新华社
  • 人民网
  • 中国网
© 2025 | Powered by Superbs Personal Blog theme