[Redis] 使用 redis-py 連線 Redis Sentinel 時,出現 No master found for ‘mymaster’ 錯誤訊息?
今天在幫忙同事看一個 redis-py 連線 Redis Sentinel,
可是卻出現 No master found for ‘mymaster’ 錯誤訊息的問題…
下面是建立 Sentinel
物件,以及用它來跑 discover_master()
的主體程式:
ssl = True ssl_cert_reqs = "required" redis_sentinel = redis.sentinel.Sentinel( [('127.0.0.1', 26379)], sentinel_kwargs={ "ssl": ssl, "ssl_cert_reqs": ssl_cert_reqs, }, ssl=ssl, connection_class=redis.sentinel.SentinelManagedSSLConnection, ssl_cert_reqs=ssl_cert_reqs, ) redis_master = redis_sentinel.discover_master("mymaster")
因為我們的 Redis Sentinel 和 Redis server 都有開 TLS,
所以 ssl 是設定成 True 的,光看程式似乎沒有問題,
那就用 pdb 來跑跑看吧~
跑到 redis-py 底層的 get_connection()
時,
看到它傳出一個 [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: self signed certificate in certificate chain 的 exception:
(Pdb) n > /usr/local/lib/python3.10/site-packages/redis/client.py(1255)execute_command() -> conn = self.connection or pool.get_connection(command_name, **options) (Pdb) n redis.exceptions.ConnectionError: Error 1 connecting to 127.0.0.1:26379. [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:997). > /usr/local/lib/python3.10/site-packages/redis/client.py(1255)execute_command() -> conn = self.connection or pool.get_connection(command_name, **options)
看起來是因為我們建的 Redis Sentinel 本身是用 self-signed certificate,
而我們又沒有在 redis-py 裡指定相關的 CA,
因此 TLS 驗證失敗造成的…
比較懶 (不安全) 的改法是關閉 certificate 的驗證:
ssl_cert_reqs = "none"
這時就可以成功跑完 discover_master()
的部分,
拿到 Redis master node 的資訊了:
(Pdb) redis_master ('10.0.233.199', 6379)
不過正式的改法,應該還是將 ssl_cert_reqs 設成 “required”,
然後要正確的設定 ssl_keyfile, ssl_certfile, ssl_ca_certs 這些參數囉~
(本頁面已被瀏覽過 251 次)