用 Docker Compose跑redis sentinel碰到的蠢事

less than 1 minute read

最近一個python的專案要連到redis sentinel cluster,為了本地開發,所以在local用docker-compose搞了一組一個redis node和一個redis sentinel node的本地開發環境。

查了一下,VMware有發佈了一組現成的image,用他們的docker-compose.yml,在本地很快就run起一組測試環境。

嘗試用python 連線的時候,先是遇到redis.sentinel.MasterNotFoundError的問題,確認過以後,知道是sentinel連不上redis的錯誤,檢查一下發現是bitnami提供的docker-compose.yml有把redis cluster configuration寫進volume裡,但是docker-compose down & up以後,redis的ip換了,但sentinel還是用舊的configuration,所以會連不到redis,如果看sentinel container的log,也會看到 sdown的訊息。

因為data persistent也不是在意的事,所以把volume拔掉以後,sentinel contianer的sdown訊息也就沒在出現,但是而代之的是嘗試連到透過sentinel連到redis一直connection timeout,但如果直接跨過sentinel連到redis就沒這問題。

花了一小時debug,才發現sentinel會回傳redis的連線資訊給client,而因為是透過docker-compose跑起來的,sentinel container和redis container在同一個NAT,所以sentinel回給我python client的ip是NAT裡面的ip 位置,難怪在NAT外面的python client一直連不到……

後來先把redis sentinel的官方文件看完,確認我的猜測沒有錯,然後把我的python client程式也build成container跑在同一個network底下,透過sentinel去連就沒問題了,沒搞清楚sentinel跟client之間的protocol,花了很多冤枉時間啊……

Updated: