Zum Hauptinhalt springen

Hochverfügbarkeits-Setup (Auflösung von DB-Deadlocks)

Lösen Sie alle Datenbank-Deadlocks, die bei hohem Datenverkehr auftreten, mit diesem Setup auf.

Was verursacht das Problem?

LiteLLM schreibt UPDATE und UPSERT Abfragen in die DB. Bei Verwendung von 10+ Instanzen von LiteLLM können diese Abfragen Deadlocks verursachen, da jede Instanz gleichzeitig versuchen könnte, denselben user_id, team_id, key usw. zu aktualisieren.

Wie das Hochverfügbarkeits-Setup das Problem löst

  • Alle Instanzen schreiben in eine Redis-Warteschlange anstelle der DB.
  • Eine einzelne Instanz erwirbt einen Lock für die DB und leert die Redis-Warteschlange in die DB.

Wie es funktioniert

Stufe 1. Jede Instanz schreibt Updates nach Redis

Jede Instanz sammelt die Ausgaben-Updates für einen Schlüssel, Benutzer, Team usw. und schreibt die Updates in eine Redis-Warteschlange.

Jede Instanz schreibt Updates nach Redis

Stufe 2. Eine einzelne Instanz leert die Redis-Warteschlange in die DB

Eine einzelne Instanz erwirbt einen Lock für die DB und leert alle Elemente in der Redis-Warteschlange in die DB.

  • 1 Instanz versucht, den Lock für den DB-Update-Job zu erwerben
  • Der Status des Locks wird in Redis gespeichert
  • Wenn die Instanz den Lock zum Schreiben in die DB erwirbt
    • Es liest alle Updates aus Redis
    • Aggregiert alle Updates in 1 Transaktion
    • Schreibt Updates in die DB
    • Gibt den Lock frei
  • Hinweis: Nur 1 Instanz kann den Lock gleichzeitig erwerben, dies begrenzt die Anzahl der Instanzen, die gleichzeitig in die DB schreiben können.

Eine einzelne Instanz leert die Redis-Warteschlange in die DB

Verwendung

Erforderliche Komponenten

  • Redis
  • Postgres

Einrichtung in der LiteLLM-Konfiguration

Sie können den Redis-Puffer aktivieren, indem Sie use_redis_transaction_buffer: true im Abschnitt general_settings Ihrer proxy_config.yaml-Datei festlegen.

Hinweis: Dieses Setup erfordert, dass litellm mit einer Redis-Instanz verbunden ist.

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

Überwachung

LiteLLM gibt die folgenden Prometheus-Metriken aus, um den Zustand/Status des In-Memory-Puffers und des Redis-Puffers zu überwachen.

MetriknameBeschreibungSpeichertyp
litellm_pod_lock_manager_sizeGibt an, welcher Pod den Lock zum Schreiben von Updates in die Datenbank hat.Redis
litellm_in_memory_daily_spend_update_queue_sizeAnzahl der Elemente in der In-Memory-Warteschlange für tägliche Ausgaben-Updates. Dies sind die aggregierten Ausgabenprotokolle für jeden Benutzer.In-Memory
litellm_redis_daily_spend_update_queue_sizeAnzahl der Elemente in der Redis-Warteschlange für tägliche Ausgaben-Updates. Dies sind die aggregierten Ausgabenprotokolle für jeden Benutzer.Redis
litellm_in_memory_spend_update_queue_sizeIn-Memory aggregierte Ausgabenwerte für Schlüssel, Benutzer, Teams, Teammitglieder usw.In-Memory
litellm_redis_spend_update_queue_sizeRedis aggregierte Ausgabenwerte für Schlüssel, Benutzer, Teams usw.Redis