ZBLOG

openresty如何连接redis哨兵模式

在 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24410

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?