跳到主要内容

高可用性设置(解决数据库死锁)

使用此设置解决高流量下可能出现的数据库死锁问题

什么导致了该问题?

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_size内存中针对 key、用户、团队、团队成员等的聚合消费值。内存中
litellm_redis_spend_update_queue_sizeRedis 中针对 key、用户、团队等的聚合消费值。Redis