Redis 外置(哨兵集群)
兼容性说明
-
ONES所有版本支持两种 Redis 部署模式,客户如提供如下两类Redis,参考Redis 外置。
-
单机模式(Standalone)
-
哨兵模式(Sentinel,主从高可用)
-
-
7.20.0 以上版本支持 Redis哨兵集群模式,客户如提供Redis哨兵集群,参考本文操作。
客户需要提供:Sentinel 地址、master 名称、Sentinel 密码和 Redis 密码。Sentinel 数量不限,请填写所有可用地址。
-
ONES 暂不支持Redis外置为 Redis Cluster(基于 Hash Slot 的分布式集群模式)。
网络要求
Kubernetes 必须能够访问:
- 所有 Sentinel 节点的 IP 和端口。
- 所有 Redis 数据节点(master 和 replica)的 IP 和端口。
Redis 故障切换后,任意 replica 都可能成为 master,因此不能只放通当前 master。
通过任意 Sentinel 查询当前 master:
redis-cli -h 10.1.1.51 -p 26379 \
-a '<Sentinel 密码>' --no-auth-warning \
SENTINEL get-master-addr-by-name mymaster
查询所有 replica 的 IP 和端口:
redis-cli -h 10.1.1.51 -p 26379 \
-a '<Sentinel 密码>' --no-auth-warning --raw \
SENTINEL replicas mymaster |
awk '$0=="ip" {getline ip} $0=="port" {getline port; print ip ":" port}'
没有 Sentinel 密码时,删除 -a '<Sentinel 密码>' --no-auth-warning。以上命令查询到的所有 Redis IP 和端口都必须能从 Kubernetes 访问。
配置
在 config/private.yaml 中添加:
internalComponentRedisEnable: false
redisSentinelHaproxyEnable: "true"
# 只填写所有 Sentinel 节点的 IP 和端口,不要填写 Redis 数据节点
redisSentinelAddresses: "10.1.1.51:26379,10.1.1.52:26379,10.1.1.53:26379"
redisSentinelMasterName: "mymaster"
redisSentinelPassword: "<Sentinel 密码,无密码则留空>"
redisHost: "ones-built-in-redis-haproxy"
redisPort: 6379
redisPassword: "<Redis 密码,无密码则留空>"
redisHost 和 redisPort 必须保持上面的固定值。
redisSentinelAddresses 只填写所有 Sentinel 节点的 IP 和端口,不用填写 Redis master/replica 数据节点。多个 Sentinel 地址使用英文逗号分隔,示例中的 3 个地址仅用于说明填写格式。
应用配置
make setup-ones-built-in-redis-haproxy
make setup-ones
检查外置 Redis
kubectl -n ones get pod -l app=ones-built-in-redis-haproxy
kubectl -n ones logs deploy/ones-built-in-redis-haproxy \
-c sentinel-watcher --tail=100
Pod 为 Running,日志中能看到下面的 master 地址变化即为正常:
Redis master changed: <empty> -> 10.1.1.61:6379
停止旧的内置 Redis
确认外置 Redis 可以正常使用后,执行:
for resource in \
deployment/redis \
deployment/deadly-eagle-redis-ha-haproxy \
deployment/stable-security-ha-redis-ha-haproxy \
statefulset/stable-redis-master \
statefulset/stable-security-redis-master \
statefulset/deadly-eagle-redis-ha-server \
statefulset/stable-security-ha-redis-ha-server
do
if kubectl -n ones get "$resource" >/dev/null 2>&1; then
kubectl -n ones scale "$resource" --replicas=0
fi
done
注意
- Sentinel master 名称必须填写正确。
- 本方案仅支持 Redis Sentinel,不支持 Redis Cluster。