Ubuntu 20.04/22.04 Valkey 9.0.3 源码安装极简版(单机 + 集群)

Ubuntu 20.04/22.04 Valkey 9.0.3 源码安装极简版(单机+集群)

一、环境依赖

sudo apt update && sudo apt install -y build-essential tcl libssl-dev libsystemd-dev libjemalloc-dev

二、下载编译安装

wget https://github.com/valkey-io/valkey/archive/refs/tags/9.0.3.tar.gz
tar -zxf 9.0.3.tar.gz && cd valkey-9.0.3

make BUILD_TLS=yes USE_SYSTEMD=yes MALLOC=jemalloc -j$(nproc)

sudo make PREFIX=/usr/local/valkey install

echo 'export PATH=$PATH:/usr/local/valkey/bin' >> /etc/profile
source /etc/profile

三、单机模式(生产)

3.1 目录与用户

sudo useradd -r -m -U -d /data/valkey -s /sbin/nologin valkey
sudo mkdir -p /usr/local/valkey/etc /data/valkey /data/valkey/log
sudo chown -R valkey:valkey /usr/local/valkey /data/valkey /data/valkey/log

3.2 配置文件 /usr/local/valkey/etc/valkey.conf

bind 0.0.0.0
port 6379
daemonize no
pidfile /var/run/valkey.pid
logfile /data/valkey/log/valkey.log
dir /data/valkey/
appendonly yes
maxmemory 2gb
maxmemory-policy allkeys-lru
requirepass 123456
protected-mode yes

3.3 systemd 服务 /etc/systemd/system/valkey.service

[Unit]
Description=Valkey
After=network.target

[Service]
User=valkey
Group=valkey
ExecStart=/usr/local/valkey/bin/valkey-server /usr/local/valkey/etc/valkey.conf

Restart=alwayscd 
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

3.4 启动

sudo chown -R valkey:valkey /usr/local/valkey /data/valkey /data/valkey/log

sudo systemctl daemon-reload
sudo systemctl enable --now valkey
valkey-cli -a 123456 ping

# 其它命令
sudo systemctl daemon-reload
sudo systemctl start valkey
sudo systemctl status valkey


四、集群模式(3主3从 7000~7005)

4.1 创建节点目录

cd /usr/local/valkey/etc/cluster

vim cluster.sh

for port in {7000..7005}; do
  mkdir -p /usr/local/valkey/etc/cluster/$port /usr/local/valkey/lib/cluster/$port /data/valkey/cluster/$port
done
chown -R valkey:valkey /usr/local/valkey/etc/cluster /usr/local/valkey/lib/cluster /data/valkey/cluster/

bash cluster.sh

4.2 节点配置模板

vim /usr/local/valkey/etc/cluster/valkey-cluster-template.conf

bind 0.0.0.0
port PORT
cluster-enabled yes
cluster-config-file nodes-PORT.conf
cluster-node-timeout 5000
appendonly yes
dir /data/valkey/cluster/PORT
requirepass cluster123
masterauth cluster123
protected-mode no

vim valkey-cluster.conf.sh

for port in {7000..7005}; do
  sed "s/PORT/$port/g" /usr/local/valkey/etc/cluster/valkey-cluster-template.conf \
  > /usr/local/valkey/etc/cluster/$port/valkey.conf
done

4.3 集群 systemd 模板

vim /etc/systemd/system/valkey-cluster@.service

# /etc/systemd/system/valkey-cluster@.service
[Unit]
Description=Valkey Cluster %I
After=network.target

[Service]
User=valkey
Group=valkey
ExecStart=/usr/local/valkey/bin/valkey-server /usr/local/valkey/etc/cluster/%I/valkey.conf
Restart=always

[Install]
WantedBy=multi-user.target

4.4 启动所有节点

vim start-cluster.sh

for port in {7000..7005}; do
  systemctl enable --now valkey-cluster@$port
done

chown -R valkey:valkey /usr/local/valkey/etc/cluster /usr/local/valkey/lib/cluster /data/valkey

bash start-cluster.sh

# 其它命令
systemctl status valkey-cluster@7000.service
systemctl status valkey-cluster@7001.service
systemctl status valkey-cluster@7002.service
systemctl status valkey-cluster@7003.service
systemctl status valkey-cluster@7004.service
systemctl status valkey-cluster@7005.service

4.5 创建集群

vim cluser-create.sh

valkey-cli --cluster create \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1 -a cluster123

4.6 验证

valkey-cli -c -p 7000 -a cluster123 cluster nodes
valkey-cli -c -p 7000

127.0.0.1:7000> AUTH cluster123
OK
127.0.0.1:7000> cluster nodes
cb9fa4f0f4a03909374a23fb050e680d55d7ee04 :7000@17000 myself,master - 0 0 0 connected
127.0.0.1:7000>

五、系统优化(必做)

echo vm.overcommit_memory=1 >> /etc/sysctl.conf
echo net.core.somaxconn=65535 >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled

场景问题

cluster nodes 为什么显示的是127.0.0.1,而不是主机ip:

x.x.x.x:7000> cluster nodes

b93a496bc616ac2cfcec32902250b33c75c3a9f2 127.0.0.1:7003@17003 slave 87bb7188107ac21c780d14b3e61155575107a52d 0 1779787501576 3 connected

87bb7188107ac21c780d14b3e61155575107a52d 127.0.0.1:7002@17002 master - 0 1779787501000 3 connected 10923-16383

1b5cda8bfd950e4ed8259c512bcf73427977732e 127.0.0.1:7001@17001 master - 0 1779787501576 2 connected 5461-10922

cb9fa4f0f4a03909374a23fb050e680d55d7ee04 127.0.0.1:7000@17000 myself,master - 0 0 1 connected 0-5460

df234a8d839936063169177f05a08c3ef18edb15 127.0.0.1:7005@17005 slave 1b5cda8bfd950e4ed8259c512bcf73427977732e 0 1779787501000 2 connected

d882b4c4ae01a7d453a6fa52cba4c66da9719e66 127.0.0.1:7004@17004 slave cb9fa4f0f4a03909374a23fb050e680d55d7ee04 0 1779787501977 1 connected

这是 Redis Cluster 的正常行为,原因是:

节点会把自己“认为的地址”写进 cluster nodes 表里。

你现在看到:

127.0.0.1:7003
127.0.0.1:7002
127.0.0.1:7001
127.0.0.1:7000

说明 Redis 在启动或创建 cluster 时 识别自己的 IP 是 127.0.0.1。

为什么会这样
Redis cluster 节点地址来源有三种情况:

  1. 启动 Redis 时,redis.config绑定的是 localhost
    例如:
bind 127.0.0.1

或者:

bind 127.0.0.1 ::1

Redis 就会认为自己的地址是:

127.0.0.1
  1. 创建 cluster 时使用的是 localhost
    如果你创建 cluster 用的是:
redis-cli --cluster create \
127.0.0.1:7000 \
127.0.0.1:7001 \
127.0.0.1:7002 \
...

Redis 就会记录:

127.0.0.1
  1. 没配置 cluster-announce-ip
    Redis cluster 默认会用:
本机检测到的地址

如果没有公网/内网地址,它就会用:

127.0.0.1

这会导致什么问题

如果 客户端和 Redis 在同一台机器

✅ 没问题

但如果:

Java程序在另一台机器

客户端会拿到:

127.0.0.1:7000

然后尝试连接:

127.0.0.1

结果就是:

连接自己

所以 cluster 会彻底不可用。

正确做法(生产环境必须做)
在每个 Redis 配置文件里加:

cluster-announce-ip 10.x.x.101
cluster-announce-port 7000
cluster-announce-bus-port 17000

不同节点改端口。

例如:

7000

cluster-announce-ip 10.x.x.101
cluster-announce-port 7000
cluster-announce-bus-port 17000

7001

cluster-announce-ip 10.x.x.101
cluster-announce-port 7001
cluster-announce-bus-port 17001

然后 重启节点并重新创建 cluster。

推荐创建 cluster 的方式
不要用 localhost。

用真实 IP:

redis-cli --cluster create \
10.x.x.101:7000 \
10.x.x.101:7001 \
10.x.x.101:7002 \
10.x.x.101:7003 \
10.x.x.101:7004 \
10.x.x.101:7005 \
--cluster-replicas 1
创建后 nodes 应该是这样

10.x.x.101:7000
10.x.x.101:7001
10.x.x.101:7002

而不是:

127.0.0.1

总结
现在出现 127.0.0.1 的原因:

**cluster 是用 localhost 创建的。**

如果你的 Java 程序也在:
10.x.x.101
其实也能正常用。

但如果要做 远程访问 / 生产环境,一定要:

✅ 使用真实 IP 创建 cluster

✅ 或配置 cluster-announce-ip
posted @ 2026-04-21 20:28  技术摘抄  阅读(19)  评论(0)    收藏  举报