在 OpenResty 中连接 Redis 哨兵模式,需要使用 lua-resty-redis 库并编写相应的 Lua 代码来处理哨兵发现和故障转移。以下是完整的实现步骤:
1. 依赖检查
确保 OpenResty 包含 lua-resty-redis 库(通常已内置)。
2. 连接哨兵获取主节点信息
local redis = require "resty.redis"
local sentinel = redis:new()
-- 连接哨兵节点
local ok, err = sentinel:connect("sentinel_ip", sentinel_port)
if not ok then
ngx.log(ngx.ERR, "Failed to connect to sentinel: ", err)
return
end
-- 通过哨兵获取主节点信息
local res, err = sentinel:get("master:your_redis_service_name")
if not res or res == ngx.null then
ngx.log(ngx.ERR, "Failed to get master from sentinel: ", err)
return
end
-- 解析主节点信息(格式:ip,port)
local master_ip, master_port = string.match(res, "([^,]+),([^,]+)")
sentinel:close()
3. 连接主节点操作 Redis
local red = redis:new()
red:set_timeout(1000) -- 设置超时(毫秒)
-- 连接到哨返回的主节点
local ok, err = red:connect(master_ip, master_port)
if not ok then
ngx.log(ngx.ERR, "Failed to connect to master: ", err)
return
end
-- 执行 Redis 命令
local res, err = red:get("key_name")
if not res then
ngx.log(ngx.ERR, "Redis GET failed: ", err)
else
ngx.say("Value: ", res)
end
-- 操作完成后关闭连接
red:close()
4. 完整示例代码
location /test_sentinel {
content_by_lua_block {
local redis = require "resty.redis"
-- 配置参数
local SENTINEL_HOST = "127.0.0.1"
local SENTINEL_PORT = 26379
local MASTER_NAME = "mymaster" -- Sentinel中配置的主节点名称
-- 1. 查询哨兵获取主节点地址
local sentinel = redis:new()
sentinel:set_timeout(1000)
local ok, err = sentinel:connect(SENTINEL_HOST, SENTINEL_PORT)
if not ok then
ngx.say("Sentinel connection failed: ", err)
return
end
-- 发送 SENTINEL get-master-addr-by-name 命令
local res, err = sentinel:sentinel("get-master-addr-by-name", MASTER_NAME)
if not res then
ngx.say("Sentinel query failed: ", err)
return
end
sentinel:close()
-- 2. 连接主节点Redis
local master = redis:new()
master:set_timeout(1000)
local ok, err = master:connect(res[1], res[2])
if not ok then
ngx.say("Master connection failed: ", err)
return
end
-- 3. 执行Redis操作示例
master:set("test_key", "hello_sentinel")
local value = master:get("test_key")
ngx.say("Redis value: ", value)
-- (可选)认证如果Redis需要密码
-- local auth_ok, auth_err=master:auth("your_password")
master.close()
}
}
关键说明:
1️⃣ 哨兵命令
使用 sentinel.get-master-addr-by-name (或旧版本用 sentinel masters)获取当前主节点信息。
2️⃣ 错误处理
- 哨兵网络故障时需重试或降级
- 主节点切换时自动获取新主节点地址
3️⃣ 连接池优化
实际生产环境应使用连接池并缓存主节点信息,避免每次请求都查询哨兵。
4️⃣ 多哨兵支持
为实现高可用,建议配置多个哨兵地址并实现轮询重试逻辑。
如果需要更高级的自动故障转移处理,可以考虑使用 lua-resty-sentinel等第三方库简化流程。
内容由零声教学AI助手提供,问题来源于学员提问




