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 节点地址来源有三种情况:
- 启动 Redis 时,redis.config绑定的是 localhost
例如:
bind 127.0.0.1
或者:
bind 127.0.0.1 ::1
Redis 就会认为自己的地址是:
127.0.0.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
- 没配置 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
本文来自博客园,作者:技术摘抄,转载请注明原文链接:https://www.cnblogs.com/running-future/p/19903619

浙公网安备 33010602011771号