最近把redis-cluster集羣遷移到了k8s上後發生了一個問題,當一個pod重啓後,java程序報錯,連不上redis服務器。我們查看集羣狀態後發現,當pod重啓後,pod的ip發生了改變(我們並沒有固定redis-cluster的pod的ip),去非重啓pod使用cluster nodes查看集羣信息,一切正常,但在重啓pod節點查看集羣信息,發現集羣信息中使用的還是重啓前的pod的ip。也就是說,當pod重啓後,該pod中的redis實例通知了集羣中其他成員更新了Cluster topology,但自身卻沒有更新,截圖如下:
這是redis集羣信息,大家注意redis-0的ip地址,我們重啓redis-0後,redis-0的ip地址如下:
pod啓動了47s,其他都是25m,證明重啓了,重啓後ip地址爲172.255.211.7,我們進去redis-0查看集羣信息:
發現還是使用重啓前的pod的ip,並沒更新,再去其他redis節點查看集羣信息:
發現集羣信息正常,那怎麼讓他通知自己也更新Cluster topology呢?
參考:https://github.com/antirez/redis/issues/4289這個issue,在啓動參數中加入選項
--cluster-announce-ip
最後yaml文件中啓動參數如下:
- "/etc/redis.conf"
- "--protected-mode"
- "no"
- "--cluster-announce-ip"
- "$(POD_IP)"
再重啓pod節點,問題解決。