redis故障转移游戏服务器获取改变后的redis服务器地址(Lua篇)

本文介绍了如何使用Lua脚本`sentinel.lua`与Predis客户端配合,实现在Redis Sentinel集群中进行故障转移后,游戏服务器动态获取新的Master服务器地址。文章详细阐述了Sentinel的配置与工作原理,并提供了Lua脚本实现的详细代码。
摘要由CSDN通过智能技术生成

最近看到关于redis故障转移的文章,然后发现自己项目的redis并没有应用故障转移的机制,项目当前的机制是如果redis所在的服务器宕机或者redis服务异常/关闭等时候游戏服务器就获取不到redis相关信息,之前也有过几次这种情况,但是当时的处理方式都是重启redis服务。

我按照这边帖子https://blog.csdn.net/guweiyu_thinker/article/details/79188281?tdsourcetag=s_pctim_aiomsg 来自己部署了下故障转移,这个帖子很详细,具体的原理就不赘述了,他是在同一台服务器上开启不同的端口来尝试的,我是在3台不同的服务器上部署的,每个服务器部署1个redis服务,1个sentinel服务,其中要提到一点 sentinel的myid不需要自己去设置 服务启动的时候会自动生成一个myid 写入到sentinel*.conf配置中,还有一些配置如

 sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10
sentinel known-slave mymaster 10.1.67.28 6379
sentinel known-slave mymaster 10.1.67.44 6399
sentinel known-sentinel mymaster 10.1.67.27 26379 0e86212b10f3e231376f84aa0315c7e1f9bcdb4f
sentinel known-sentinel mymaster 10.1.67.44 26379 c7d8950964042eb5ff3871f36929934ad46a8779
都是故障转移后自动写入到sentinel*.conf中里面的,自己不需要配置

最后故障转移成功,然后redis的master的host发生了变化,变成了某个slave的host,现在的问题是游戏服务器怎么能获取到最新的master的host,如果通过redis客户端redis-cli可以直接SENTINEL get-master-addr-by-name mymaster来获取,但是游戏服中需要连接到某个sentinel然后获取  每个项目框架不同连接的方法应该不一样,我们用的是predis,predis中有ServerSentinel.php,然后自己写了一个文件sentinel.lua用来来连接到sentinel的cli然后进行查询最新的master的host

 

sentinel.lua

-------------------------------------------

_G.Sentinel = class("ServerSentinel")

function Sentinel:__construct(host, onConnect)
    local parent = self

    local onconnect = function(net, ip, port, myip, myport)
        parent:onConnect(net)
        if onConnect then
            onConnect(net, ip, port, myip, myport)
        end
    end

    local onclose = function()
        self.__n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值