高可用性设置(解决数据库死锁)
使用此设置解决高流量下可能出现的数据库死锁问题
什么导致了该问题?
LiteLLM 向数据库写入 UPDATE
和 UPSERT
查询。当使用 10 个或更多 LiteLLM 实例时,这些查询可能导致死锁,因为每个实例可能同时尝试更新相同的 user_id
、team_id
、key
等。
高可用性设置如何解决问题
- 所有实例将写入 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_size | Redis 中每日消费更新队列中的项目数量。这些是每个用户的聚合消费日志。 | Redis |
litellm_in_memory_spend_update_queue_size | 内存中针对 key、用户、团队、团队成员等的聚合消费值。 | 内存中 |
litellm_redis_spend_update_queue_size | Redis 中针对 key、用户、团队等的聚合消费值。 | Redis |