全面替代Redis?Valkey哨兵模式高可用部署实战:哨兵模式部署

一、Valkey 是什么?为何取代 Redis?

Valkey 是由原 Redis 核心开发者社区在 Redis 改为闭源后(2024 年)发起的一个 完全开源、社区主导 的 Redis 分支,目标是保持 Redis 原有的开源理念、兼容性及稳定性。

Valkey 替代 Redis 的原因:

  • Redis 改为双许可证(RSAL+SSPL),不再完全开源。

  • 社区版和商业版功能出现分裂,开源生态受限。

  • Valkey 由 Redis 重要贡献者维护,100% 兼容 Redis 命令与数据格式。

  • 活跃社区支持,未来将持续演进和开放治理。

  • 技术延续性与创新

    • 兼容性​:基于 Redis 7.2.4 分支,完全兼容 Redis 协议与 API,用户可无缝迁移。
    • 性能优化​:
      • 改进多线程 I/O 模型,吞吐量提升 3 倍;
      • 实验性支持 RDMA(远程直接内存访问)​,降低集群节点间延迟;
      • 优化内存管理与集群故障转移机制。
  • 生态与社区支持

    • 获 AWS、谷歌、阿里云等头部云厂商背书,集成至 AWS ElastiCache、阿里云 Tair 等服务。
    • GitHub 活跃度超 2 万 Star,社区贡献者覆盖全球企业开发者。
  • 治理透明性

    • Linux 基金会托管确保项目中立性,避免单一方控制与许可证突变风险

国产替代选型对比:

国产方案主要分为两类:​兼容 Redis 协议的独立产品基于 Redis 二次开发的优化版本
在这里插入图片描述

二、部署架构说明

本方案使用 3 台物理/虚拟服务器,部署如下组件:

  • 1 个主节点(Master)
  • 2 个从节点(Replica)
  • 3 个 Sentinel 实例,构成哨兵集群,实现主从自动切换。

2.1 部署架构图

在这里插入图片描述

2.2 架构说明

🔗Valkey 节点之间的关系

  • 主从架构:valkey 从节点向主节点同步数据

    • 主节点(Master):
    • 负责处理 写操作读操作(如果未启用只读副本)
    • 持有数据的“源头”
    • 可被一个或多个从节点复制(replica)
  • 从节点(Replica / Slave)

    • 通过 replicaof(或 slaveof)命令同步主节点的数据
    • 支持只读访问,可用于分担读取压力
    • 在主节点宕机后,有可能被 Sentinel 选为新主节点(failover)

⛓ 主从关系可以一层或多层复制,但一般推荐只用一层。

🔗 Sentinel 节点之间的关系

  • 对等架构(Peer-to-Peer):每个 Sentinel 节点独立运行,相互通信、共享主从信息,不存在主从角色。
  • 共同监控:每个 Sentinel 节点都会独立监控 Valkey 的主节点(master)和从节点(replica)。
  • Sentinel 节点不存储数据,只监控 valkey 节点变化。
  • 故障判断 & 选主投票:当主节点宕机时,多个 Sentinel 通过投票机制决定是否主观认为“主挂了”,若超过设定的阈值则进入主观下线(Subjective Down,简称 sdown)→ 客观下线(Objective Down,简称 odown)→ 选举新的主节点。

👁 Sentinel 如何监控 Valkey 节点

每个 Sentinel 会:

  1. PING:定期 ping Valkey 主从节点以及其他 Sentinel 节点,检查是否存活。

  2. INFO replication:定期读取主节点的复制信息,识别哪些是从节点。

  3. SUBSCRIBE:订阅 Valkey 实例的 sentinel:hello 通道,感知其他 Sentinel 的存在。

  4. 故障转移(Failover)

    • 一旦主节点失败(PING 无响应超过 down-after-milliseconds 时间),Sentinel 发起故障检测。
    • 多个 Sentinel 一致认为该主节点宕机后,会选出一个 Sentinel 发起“故障转移”(failover)。
    • 将某个从节点提升为新的主节点,并通知其他从节点重新复制。
    • 通知客户端连接新主节点(通过发布订阅机制或服务发现)

👁 App Client 与 Sentinel Valkey 之间的关系

  1. 客户端首先连接到多个 Sentinel 节点(建议配置至少两个)。
  2. 客户端向 Sentinel 查询某个主节点的当前地址,并连接主节点。
  3. 如果主节点发生故障,Sentinel 完成主从切换后,客户端会再次从 Sentinel 查询新的主节点地址,实现“自动发现与切换”。

2.3 环境准备

  • 操作系统:Linux(推荐:CentOS 7+/AlmaLinux/Ubuntu 20.04+)

  • 内核版本:≥ 3.10(推荐 4.18+)

  • SELinux: 建议关闭或设置为 permissive

  • 防火墙:关闭或开放 6379、26379 端口

  • 硬件要求:

    • 生产环境主从架构 ≥ CPU 4 核(推荐 8 核)
    • 高可用/持久化开启 ≥ 8 GB,推荐 16 GB+
    • 纯内存模式,不持久化 = 无特别要求, 高可用哨兵模式-开启 RDB = SSD/NVMe 推荐 ≥ 50GB(系统 + 日志)
    • 带宽 ≥ 1 Gbps
  • 每个节点部署 valkey 和 sentinel 服务

推荐 IP 和 PORT 规划:

Node1: 192.168.1.1  valkeyPort:6379 sentinelPort:26379
Node2: 192.168.1.2  valkeyPort:6379 sentinelPort:26379
Node3: 192.168.1.3  valkeyPort:6379 sentinelPort:26379
  • 依赖包:

Ubuntu/Debian

apt update && apt install -y build-essential tcl

CentOS/RHEL

yum groupinstall "Development Tools" -y
yum install gcc make tcl -y

三、部署步骤

3.1 安装 Valkey

# 安装编译工具,若直接使用编译后的二进制文件,无需安装编译工具
yum install -y gcc make tcl
# 下载并编译 Valkey
wget https://github.com/valkey-io/valkey/archive/refs/tags/7.2.5.tar.gz
tar -zxvf 7.2.5.tar.gz
cd valkey-7.2.5
make -j

复制可执行文件至 /opt/valkey/bin:

mkdir -p /opt/valkey/bin
cp src/valkey-server src/valkey-cli /opt/valkey/bin
chmod +x /opt/valkey/bin/valkey-server /opt/valkey/bin/valkey-cli

3.2 创建普通用户(也可以用 root 用户)

创建 valkey 用户

sudo useradd --system --no-create-home --shell /sbin/nologin valkey

说明:

  • --system:创建系统用户,一般没有登录权限,不用于登录。
  • --no-create-home:不创建家目录,减少无用空间。
  • --shell /sbin/nologin:禁止该用户登录系统,安全性更高。

确保配置和数据目录归属这个用户:

# 可以做完所有配置后,执行一次该命令
chown -R valkey:valkey /opt/valkey

确保服务文件中的路径和权限正确,这样服务才能顺利启动,并且安全地运行在 valkey 用户下。

3.3 配置主从节点

创建配置相关目录

cd /opt/valkey
mkdir -p config data logs run

每台机器都需创建配置文件 valkey.conf,放置 config 目录下,主要区别是主节点与从节点的角色配置。

说明:这个配置文件是原始配置文件,只是将英文注释改为了中文,可以直接复制使用。

主节点配置(Node1)

################################## NETWORK #####################################
# 绑定所有网卡地址,允许任意主机连接
bind 0.0.0.0
# 启用保护模式(未设置密码时只允许本地访问)
protected-mode yes
# 服务监听端口
port 6379
# TCP连接队列大小
tcp-backlog 2048
# 客户端闲置超时时间,0表示无限制
timeout 0
# TCP连接保活时间(秒)
tcp-keepalive 300

################################# GENERAL #####################################
# 是否以守护进程方式运行,需 systemd 启动时设为 no
daemonize no
# PID 文件路径
pidfile /opt/valkey/run/valkey6379.pid
# 日志级别:debug、verbose、notice、warning
loglevel notice
# 日志输出路径
logfile "/opt/valkey/logs/valkey.log"
# 支持的逻辑数据库数量(默认16)
databases 16
# 启动是否始终显示 LOGO
always-show-logo no
# 设置进程标题
set-proc-title yes
# 进程标题模板
proc-title-template "{title} {listen-addr} {server-mode}"
# 设置本地化排序方式(留空表示默认)
locale-collate ""

################################ SNAPSHOTTING  ################################
# RDB 快照规则:900秒有1次写,或300秒有10次写,或60秒有10000次写触发持久化
save 900 1 300 10 60 10000
# RDB 保存失败时停止写操作
stop-writes-on-bgsave-error yes
# 是否压缩 RDB 文件
rdbcompression yes
# 是否为 RDB 文件启用校验和
rdbchecksum yes
# RDB 文件名
dbfilename dump.rdb
# 删除临时 RDB 文件时是否使用 fsync
rdb-del-sync-files no
# 数据文件存放目录(RDB/AOF)
dir /opt/valkey/data

################################# REPLICATION #################################
# 从节点在主节点不可用时是否继续服务旧数据
replica-serve-stale-data yes
# 从节点是否只读
replica-read-only yes
# 使用无盘复制模式(直接从主节点同步,不落盘)
repl-diskless-sync yes
# 等待更多副本连接再开始同步的延迟时间(秒)
repl-diskless-sync-delay 5
# 最大等待副本数,0 表示不限
repl-diskless-sync-max-replicas 0
# 是否加载无盘复制时保存的临时 RDB 文件
repl-diskless-load disabled
# 是否禁用 TCP_NODELAY(一般保持为 no)
repl-disable-tcp-nodelay no
# 副本优先级(值越小优先晋升为主节点)
replica-priority 100

################################## SECURITY ###################################
# ACL 日志最大记录数
acllog-max-len 128
# 设置连接密码,未启用 ACL 用户管理时使用
requirepass "Day#happy01"

################################### CLIENTS ####################################
# 最大客户端连接数
maxclients 10000

############################# LAZY FREEING ####################################
# 惰性淘汰键(延后删除)
lazyfree-lazy-eviction no
# 惰性过期键
lazyfree-lazy-expire no
# 惰性删除指令处理
lazyfree-lazy-server-del no
# 副本刷新是否启用惰性删除
replica-lazy-flush no
# 删除 ACL 用户是否启用惰性模式
lazyfree-lazy-user-del no
# 清除所有用户是否使用惰性模式
lazyfree-lazy-user-flush no

############################ KERNEL OOM CONTROL ##############################
# 是否启用 OOM Score 调整(避免被 OOM Killer 杀死)
oom-score-adj no
# OOM Score 分别对主、副本、持久化进程的设置值
oom-score-adj-values 0 200 800

#################### KERNEL transparent hugepage CONTROL ######################
# 禁用透明大页(建议启用)
disable-thp yes

############################## APPEND ONLY MODE ###############################
# 是否启用 AOF 持久化
appendonly no
# AOF 文件名
appendfilename "appendonly.aof"
# AOF 存储目录
appenddirname "appendonlydir"
# 每秒 fsync 一次,权衡性能与安全
appendfsync everysec
# 在 AOF 重写时是否暂不进行 fsync
no-appendfsync-on-rewrite no
# AOF 文件增大到原始大小百分比时触发重写
auto-aof-rewrite-percentage 100
# 最小增长大小限制
auto-aof-rewrite-min-size 64mb
# 加载截断的 AOF 文件时是否继续启动
aof-load-truncated yes
# AOF 文件是否以 RDB 头部开始(优化恢复性能)
aof-use-rdb-preamble yes
# 是否为每条命令记录时间戳
aof-timestamp-enabled no

################ NON-DETERMINISTIC LONG BLOCKING COMMANDS #####################
# Lua 脚本最大执行时间(毫秒)
lua-time-limit 5000

################################## SLOW LOG ###################################
# 记录慢查询阈值(微秒)
slowlog-log-slower-than 100000
# 慢查询日志条目最大数量
slowlog-max-len 256

################################ LATENCY MONITOR ##############################
# 延迟监控阈值,0 表示关闭
latency-monitor-threshold 0

############################# EVENT NOTIFICATION ##############################
# 事件通知设置,Ex 监听键过期事件
notify-keyspace-events "Ex"

############################### ADVANCED CONFIG ###############################
# 哈希类型的最大 listpack 项数
hash-max-listpack-entries 512
# 哈希类型单个元素最大长度(字节)
hash-max-listpack-value 64
# 列表类型 listpack 最大大小(压缩)
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
# HyperLogLog 稀疏编码最大字节数
hll-sparse-max-bytes 3000
# Stream 节点最大字节数
stream-node-max-bytes 4096
# Stream 节点最大条目数
stream-node-max-entries 100
# 启用主动 rehash(优化性能)
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
# 动态调整 HZ 值以节省 CPU
dynamic-hz yes
# 启用 AOF 重写增量 fsync
aof-rewrite-incremental-fsync yes
# 启用 RDB 保存增量 fsync
rdb-save-incremental-fsync yes
# 启用 jemalloc 后台线程(提高内存分配效率)
jemalloc-bg-thread yes

从节点配置(Node2/Node3)

在 NODE1 valkey.conf 配置的基础上,增加下面一行,表示从节点从主节点同步数据。

replicaof 192.168.1.1 6379

3.4 配置 Sentinel 节点

每台机器都需创建配置文件 sentinel.conf,放置 config 目录下,每个节点配置都一样。

说明:这个配置文件是原始配置文件,只是将英文注释改为了中文,可以直接复制使用。

# 监听所有网卡的 IP 地址,允许外部机器访问 Sentinel 服务
bind 0.0.0.0
# 关闭保护模式(默认开启仅允许本地访问),必须关闭才能被其他节点或客户端访问
protected-mode no
# Sentinel 默认监听端口,建议保持不变
port 26379
# 不以守护进程运行(配合 systemd 启动需设为 no)
daemonize no
# Sentinel 运行时生成的 PID 文件路径
pidfile /opt/valkey/run/valkey-sentinel.pid
# 日志等级:debug、verbose、notice、warning,建议设为 notice 或更高
loglevel notice
# Sentinel 日志文件路径
logfile "/opt/valkey/logs/sentinel.log"
# Sentinel 工作目录(如需保存 RDB/AOF 临时文件)
dir /opt/valkey/data
# 配置被监控的主节点:
# 名称为 mymaster,主节点地址 192.168.1.1:6379,至少有 2 个 Sentinel 认为主节点宕机才进行 failover
sentinel monitor mymaster 192.168.1.1 6379 2
# 主节点启用了密码(requirepass 或 ACL 的 default 用户),Sentinel 使用该密码与主节点通信
sentinel auth-pass mymaster Day#happy01
# Sentinel 判定主节点下线的时间阈值(单位:毫秒),此处为 15 秒内无响应则视为主观下线
sentinel down-after-milliseconds mymaster 15000
# 执行故障转移时,允许同时有 1 个从节点和新的主节点进行同步(并行复制)
sentinel parallel-syncs mymaster 1
# 故障转移最大容忍时间(单位:毫秒),此处为 3 分钟
# 包括投票、同步等整个 failover 流程总时间,超时则视为失败
sentinel failover-timeout mymaster 180000

说明:

  • mymaster 是主节点别名,可自定义。
  • 2 表示至少有两个 Sentinel 认为主节点故障才触发切换。

3.5 配置节点服务启动文件

Valkey 主从节点服务:valkey.service

将下面内容保存为 /etc/systemd/system/valkey.service

[Unit]
Description=Valkey Server
After=network.target

[Service]
Type=notify
User=valkey
Group=valkey
RuntimeDirectory=valkey
RuntimeDirectoryMode=0755
# 主进程启动命令,注意配置文件路径
ExecStart=/opt/valkey/bin/valkey-server /opt/valkey/config/valkey.conf --supervised systemd
# 启动失败时自动重启
Restart=on-failure
RestartSec=5
# 文件句柄限制建议加大
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

✅ 注意以下路径**:**

  • /opt/valkey/bin/valkey-server:Valkey 主程序路径
  • /opt/valkey/config/valkey.conf:你的 Valkey 主配置文件
  • 存在 valkey 用户和组(或改成 root

启动主从服务

在三台服务器分别执行:

chown -R valkey:valkey /opt/valkey
systemctl daemon-reload
systemctl start valkey       # 启动主/从节点
systemctl enable valkey      # 设备开机启动
systemctl status valkey      # 查看状态

确认主从同步状态:

valkey-cli -h 192.168.1.2 -p 6379 -a Day#happy01 INFO replication

配置 Sentinel 节点服务

Valkey Sentinel 节点服务:valkey-sentinel.service

保存为 /etc/systemd/system/valkey-sentinel.service

[Unit]
Description=Valkey Sentinel Service
After=network.target

[Service]
Type=notify
User=valkey
Group=valkey
RuntimeDirectory=valkey
RuntimeDirectoryMode=0755
# Sentinel 模式启动命令
ExecStart=/opt/valkey/bin/valkey-server /opt/valkey/config/sentinel.conf --sentinel --supervised systemd
# 启动失败时自动重启
Restart=on-failure
RestartSec=5
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

启动 sentinel 服务

systemctl daemon-reload
systemctl start valkey-sentinel       # 启动主/从节点
systemctl enable valkey-sentinel      # 设备开机启动
systemctl status valkey-sentinel      # 查看状态

四、检查主从同步状态

valkey-cli -p 26379 -a Day#happy01 sentinel masters  # 查看主节点状态
valkey-cli -h 192.168.1.2 -a Day#happy01  INFO replication
valkey-cli -p 26379 -a Day#happy01 info sentinel # 查看哨兵高可用状态
#预期结果:master0:name=mymaster,status=ok,address=192.168.1.1:6379,slaves=2,sentinels=3

生产环境建议​:

  • 将哨兵日志接入 ELK 或 Prometheus 监控系统
  • 每季度执行一次故障转移演练
  • 使用 min-slaves-to-write 1 防止脑裂(主节点写入时至少需 1 个从节点同步)

五、验证主从切换

  1. 停掉主节点:
kill $(cat /opt/valkey/run/valkey.pid)
  1. 查看哨兵日志,确认自动切换:
tail -f /opt/valkey/logs/sentinel.log
  1. 验证客户端连接是否自动切换到新主节点。

六、客户端连接配置(Java 示例)​

JedisSentinelPool pool = new JedisSentinelPool(
    "mymaster",
    new HashSet<>(Arrays.asList(
        "192.168.1.1:26379",
        "192.168.1.2:26379",
        "192.168.1.3:26379")),
    new JedisPoolConfig(),
    "Day#happy01"  // 密码
);
try (Jedis jedis = pool.getResource()) {
    jedis.set("test", "哨兵模式生效!");
}

七、系统参数优化

1. vm.swappiness = 10

作用:

控制内核将进程使用的内存页面换出(swap)到交换空间的倾向性。

  • 范围:0 到 100
  • 值越大,越倾向于将内存中的数据换出到 swap。
  • Redis/Valkey 是内存型服务,不建议频繁触发 swap。

推荐值: 10

  • 设置为 10 是一个折中值,允许在极端情况下使用 swap,但尽量优先使用物理内存。
  • 对于一些对延迟极其敏感的系统,也可以设置为 1 甚至 0(完全禁止 swap,但可能在内存耗尽时引发 OOM)。

2. vm.overcommit_memory = 1

作用:

控制 Linux 内核在进程申请内存时的行为。

  • 0:默认策略。内核根据一定的启发式算法判断是否允许分配内存(可能会被过度限制)。
  • 1总是允许分配请求的内存(推荐用于 Redis/Valkey)。
  • 2:只允许分配不超过物理内存 +swap 的总和,比较保守。

推荐值: 1

  • Valkey 在内部做了很多内存优化,它预分配大内存块用于数据处理。使用 1 可以避免因为内核判断不足而导致分配失败,特别是在 fork() 时(如 AOF 重写或 RDB 快照时)。

设置方法

# 临时设置(立即生效)
sysctl -w vm.swappiness=10
sysctl -w vm.overcommit_memory=1

# 永久设置
echo 'vm.swappiness = 10' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl -p

3. 附加建议参数

# 禁用透明大页(Transparent Huge Pages)
echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 文件句柄限制(避免 too many open files)
ulimit -n 65535

# Redis/Valkey 的 AOF 或 RDB 需要较大的文件缓存和写能力
# 永久生效,写入 /etc/sysctl.conf
fs.file-max = 100000

# 网络连接优化(视网络情况配置)
# 查看当前配置sysctl -n net.core.somaxconn,若大于2048,不用修改。这个值与valkey.conf的tcp-backlog配置相关。
# 临时生效
sysctl -w net.core.somaxconn=2048
# 永久生效,写入 /etc/sysctl.conf
net.core.somaxconn = 2048

ulimit 添加永久配置:

vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值