用 Docker Compose跑redis sentinel碰到的蠢事
最近一個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,花了很多冤枉時間啊......