killme2008 / carmine-sentinel

A Clojure library designed to connect redis by sentinel, make carmine to support sentinel.
Eclipse Public License 1.0
14 stars 4 forks source link

在连续进行 master 切换的时候有小概率不清理本地 resolve 的 master 地址 #13

Closed ylgrgyq closed 5 years ago

ylgrgyq commented 5 years ago

主要是在这个地方,当从 sentinel 拿到 master 地址并且跟 master 通信确认对方就是 master 后,假若此时刚巧发生了 master 切换,可能会误将失效的 master 地址存入 resolved master 地址结果中且持续保存。没有其它处理的话后续请求都会访问老 master。

目前考虑一个办法是在存 sentinel-resolved-specs 后再检查一次 master role,看目标是不是发生变化,变了就继续查找下一个 sentinel;

再一个办法是考虑给 wcar 增加 try catch,捕获 carmine 抛出的各种异常。因为 carmine 抛出的异常都是 ExceptionInfo 基本都没附带其它信息,所以考虑用个恶心一些的方法,检查异常中的 msg,如果 msg 中有类似 READONLY 即提示当前 client 连的是 slave 或者是 connection 相关的异常(每次 master 切换后,连着老 master 的连接会断开),当匹配成功时将 sentinel-resolved-specs 清理干净,下次访问 redis 会再次去 resolve master 地址。

killme2008 commented 5 years ago

也许可以考虑第一种方法,结合定时任务检查来解决?

ylgrgyq commented 5 years ago

好,我研究研究