[Redis] 使用 redis-py 連線 Redis Sentinel 時,出現 No master found for ‘mymaster’ 錯誤訊息?

[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 這些參數囉~

 

參考資料:SSL Connection Examples

 

(本頁面已被瀏覽過 251 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料