跳至主要內容

高可用性設定(解決 DB 死鎖)

生產環境必備

此設定對於每秒處理 1000+ 請求的生產部署是必需的。若未設定 Redis,您可能會遇到 PostgreSQL 連線耗盡(FATAL: sorry, too many clients already)。

請使用此設定來解決高流量下可能遇到的任何資料庫死鎖

問題的原因是什麼?

LiteLLM 會將 UPDATEUPSERT 查詢寫入資料庫。當使用 10+ 個 LiteLLM 執行個體時,這些查詢可能會造成死鎖,因為每個執行個體都可能同時嘗試更新相同的 user_idteam_idkey 等。

高可用性設定如何解決問題

  • 所有執行個體都會寫入 Redis 佇列,而不是資料庫。
  • 單一執行個體會取得資料庫鎖定,並將 Redis 佇列清空到資料庫。

運作方式

階段 1. 每個執行個體將更新寫入 redis

每個執行個體都會彙總某個 key、使用者、團隊等的支出更新,並將更新寫入 Redis 佇列。

每個執行個體都會將更新寫入 redis

階段 2. 單一執行個體將 Redis 佇列清空到資料庫

單一執行個體會取得資料庫鎖定,並將 Redis 佇列中的所有元素清空到資料庫。

  • 1 個執行個體會嘗試取得資料庫更新工作的鎖定
  • 鎖定狀態會儲存在 Redis 中
  • 如果執行個體取得了寫入資料庫的鎖定
    • 它會從 Redis 讀取所有更新
    • 將所有更新彙整成 1 個交易
    • 將更新寫入資料庫
    • 釋放鎖定
  • 注意:同一時間只有 1 個執行個體可以取得鎖定,這會限制同時能寫入資料庫的執行個體數量

單一執行個體將 Redis 佇列清空到資料庫

使用方式

必要元件

  • Redis
  • Postgres

在 LiteLLM 設定中進行設定

您可以在您的 proxy_config.yaml 檔案的 general_settings 區段中設定 use_redis_transaction_buffer: true 來啟用 Redis 緩衝區。

注意:此設定需要 litellm 連線到一個 redis 執行個體。

litellm proxy_config.yaml
general_settings:
use_redis_transaction_buffer: true

litellm_settings:
cache: True
cache_params:
type: redis
supported_call_types: [] # Optional: Set cache for proxy, but not on the actual llm api call

監控

LiteLLM 會發出以下 prometheus 指標,用於監控記憶體內緩衝區與 Redis 緩衝區的健康狀態。

指標名稱說明儲存類型
litellm_pod_lock_manager_size表示哪個 pod 持有寫入資料庫更新的鎖定。Redis
litellm_in_memory_daily_spend_update_queue_size記憶體內每日支出更新佇列中的項目數量。這些是每個使用者的彙總支出記錄。記憶體內
litellm_redis_daily_spend_update_queue_sizeRedis 每日支出更新佇列中的項目數量。這些是每個使用者的彙總支出記錄。Redis
litellm_in_memory_spend_update_queue_sizekey、使用者、團隊、團隊成員等的記憶體內彙總支出值。記憶體內
litellm_redis_spend_update_queue_sizekey、使用者、團隊等的 Redis 彙總支出值。Redis

疑難排解:Redis 連線錯誤

您可能會看到如下錯誤:

LiteLLM Redis Caching: async async_increment() - Got exception from REDIS No connection available., Writing value=21
LiteLLM Redis Caching: async set_cache_pipeline() - Got exception from REDIS No connection available., Writing value=None

這表示所有可用的 Redis 連線都已在使用中,而 LiteLLM 無法從連線池取得新的連線。這可能會在高負載或大量並發代理程式請求時發生。

解決方案:

  • proxy_config.yaml 中的 Redis 設定區段提高 max_connections 參數,以允許更多同時連線。例如:
litellm_settings:
cache: True
cache_params:
type: redis
max_connections: 100 # Increase as needed for your traffic

請依據您預期的並發量與 Redis 伺服器容量調整此值。