Couchbase性能优化 #

一、性能优化概述 #

1.1 性能指标 #

指标 说明 目标值
延迟 操作响应时间 < 10ms
吞吐量 每秒操作数 根据业务需求
内存使用 内存利用率 < 85%
CPU使用 CPU利用率 < 70%
磁盘IO 磁盘读写 < 80%

1.2 优化方向 #

text
优化层次:
├── 应用层
│   ├── 查询优化
│   ├── 连接池管理
│   └── 批量操作
├── 数据层
│   ├── 索引设计
│   ├── 文档设计
│   └── 数据分布
├── 配置层
│   ├── 内存配置
│   ├── 线程配置
│   └── 超时配置
└── 架构层
    ├── 集群规划
    ├── 分片策略
    └── 缓存策略

二、查询优化 #

2.1 使用EXPLAIN分析 #

sql
EXPLAIN SELECT * FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user' AND city = '北京';

关键指标:

指标 说明
#operator 操作类型
index 使用的索引
spans 扫描范围
#items 处理文档数
#time 执行时间

2.2 避免全表扫描 #

sql
SELECT * FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user';

SELECT * FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user' AND city = '北京'
LIMIT 100;

2.3 使用覆盖索引 #

sql
CREATE INDEX idx_users_city_name_email 
ON `my-bucket`.`_default`.`_default`(city, name, email)
WHERE type = 'user';

SELECT city, name, email
FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user' AND city = '北京';

2.4 优化JOIN查询 #

sql
SELECT u.name, o.order_id
FROM `my-bucket`.`_default`.`_default` u
JOIN `my-bucket`.`_default`.`_default` o 
    ON META(u).id = o.user_id
WHERE u.type = 'user' AND o.type = 'order'
    AND u.city = '北京';

CREATE INDEX idx_orders_user_id 
ON `my-bucket`.`_default`.`_default`(user_id)
WHERE type = 'order';

2.5 分页优化 #

sql
SELECT * FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user'
ORDER BY name
LIMIT 10 OFFSET 10000;

SELECT * FROM `my-bucket`.`_default`.`_default`
WHERE type = 'user' AND name > 'last_name'
ORDER BY name
LIMIT 10;

2.6 使用参数化查询 #

python
from couchbase.options import QueryOptions

result = cluster.query('''
    SELECT * FROM `my-bucket`.`_default`.`_default`
    WHERE type = 'user' AND city = $city
''', QueryOptions(named_parameters={'city': '北京'}))

三、索引优化 #

3.1 选择合适的索引类型 #

sql
CREATE INDEX idx_users_city 
ON `my-bucket`.`_default`.`_default`(city)
WHERE type = 'user';

CREATE INDEX idx_users_city_age 
ON `my-bucket`.`_default`.`_default`(city, age)
WHERE type = 'user';

CREATE INDEX idx_users_city_age_name 
ON `my-bucket`.`_default`.`_default`(city, age, name)
WHERE type = 'user';

3.2 最左前缀原则 #

sql
CREATE INDEX idx_composite 
ON `my-bucket`.`_default`.`_default`(a, b, c);

SELECT * FROM t WHERE a = 1;
SELECT * FROM t WHERE a = 1 AND b = 2;
SELECT * FROM t WHERE a = 1 AND b = 2 AND c = 3;
SELECT * FROM t WHERE b = 2;

3.3 部分索引 #

sql
CREATE INDEX idx_active_users 
ON `my-bucket`.`_default`.`_default`(name)
WHERE type = 'user' AND status = 'active';

3.4 索引监控 #

sql
SELECT 
    name,
    num_docs,
    num_requests,
    avg_scan_time,
    cache_hits,
    cache_misses
FROM system:indexes
WHERE keyspace_id = 'my-bucket';

3.5 索引维护 #

sql
ALTER INDEX idx_users_city 
ON `my-bucket`.`_default`.`_default`
WITH {"action": "cleanup"};

四、内存优化 #

4.1 内存配额规划 #

text
内存分配原则:
总内存 = 系统预留 + Data服务 + Index服务 + Query服务 + 其他服务

示例(16GB服务器):
系统预留:4GB
Data服务:8GB
Index服务:2GB
Query服务:1GB
其他服务:1GB

4.2 Bucket内存配置 #

bash
/opt/couchbase/bin/couchbase-cli bucket-edit \
    --cluster localhost:8091 \
    --username Administrator \
    --password your-password \
    --bucket my-bucket \
    --bucket-ramsize 2048

4.3 淘汰策略 #

bash
/opt/couchbase/bin/couchbase-cli bucket-edit \
    --cluster localhost:8091 \
    --username Administrator \
    --password your-password \
    --bucket my-bucket \
    --bucket-eviction-policy valueOnly

淘汰策略对比:

策略 说明 适用场景
valueOnly 只淘汰值 默认策略
fullEviction 淘汰整个文档 内存紧张
noEviction 不淘汰 数据不能丢失
nruEviction 最近未使用淘汰 缓存场景

4.4 工作集优化 #

text
工作集 = 活跃数据大小

建议:
工作集大小 < 内存配额 × 70%

计算:
活跃用户数 × 平均文档大小 = 工作集大小

五、连接池优化 #

5.1 Python连接池 #

python
from couchbase.cluster import Cluster, ClusterOptions
from couchbase.auth import PasswordAuthenticator
from couchbase.options import ClusterOptions, ClusterTimeoutOptions
from datetime import timedelta

options = ClusterOptions(
    PasswordAuthenticator('Administrator', 'password'),
    timeout_options=ClusterTimeoutOptions(
        connect_timeout=timedelta(seconds=10),
        kv_timeout=timedelta(seconds=5),
        query_timeout=timedelta(seconds=30)
    )
)

cluster = Cluster('couchbase://node1,node2,node3', options)

5.2 连接复用 #

python
class CouchbaseConnection:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.cluster = Cluster(
                'couchbase://localhost',
                ClusterOptions(PasswordAuthenticator('Administrator', 'password'))
            )
        return cls._instance
    
    def get_collection(self, bucket, scope, collection):
        return self._instance.cluster.bucket(bucket).scope(scope).collection(collection)

5.3 连接池大小 #

text
建议配置:
- 最小连接数:CPU核心数 × 2
- 最大连接数:CPU核心数 × 4
- 连接超时:5-10秒
- 空闲超时:60秒

六、批量操作优化 #

6.1 批量读取 #

python
from couchbase.options import GetOptions

keys = ['user::001', 'user::002', 'user::003']
results = collection.get_multi(keys)

6.2 批量写入 #

python
from couchbase.options import UpsertOptions

docs = {
    'user::001': {'name': '张三'},
    'user::002': {'name': '李四'},
    'user::003': {'name': '王五'}
}
results = collection.upsert_multi(docs)

6.3 异步操作 #

python
import asyncio
from acouchbase.cluster import Cluster

async def batch_insert(docs):
    cluster = await Cluster.connect(
        'couchbase://localhost',
        ClusterOptions(PasswordAuthenticator('Administrator', 'password'))
    )
    
    bucket = cluster.bucket('my-bucket')
    collection = bucket.default_collection()
    
    tasks = [collection.upsert(k, v) for k, v in docs.items()]
    await asyncio.gather(*tasks)

asyncio.run(batch_insert(docs))

七、集群配置优化 #

7.1 服务分布 #

text
推荐配置(5节点):
Node 1-3: Data, Index, Query
Node 4-5: Eventing, Search, Analytics

或者:
Node 1-3: Data
Node 4-5: Index, Query

7.2 自动压缩 #

bash
/opt/couchbase/bin/couchbase-cli bucket-edit \
    --cluster localhost:8091 \
    --username Administrator \
    --password your-password \
    --bucket my-bucket \
    --compaction-db-percentage 30 \
    --compaction-view-percentage 30 \
    --enable-compaction-parallel true

7.3 线程配置 #

bash
/opt/couchbase/bin/couchbase-cli setting-cluster \
    --cluster localhost:8091 \
    --username Administrator \
    --password your-password \
    --cluster-max-parallel-indexers 4

八、监控与诊断 #

8.1 关键指标监控 #

bash
curl -X GET http://localhost:8091/pools/default/buckets/my-bucket/stats \
    -u Administrator:password | jq '.op.samples'

关键指标:

指标 说明 告警阈值
ops 每秒操作数 -
ep_queue_size 待写入队列 > 10000
ep_flusher_todo 待刷盘数 > 1000
memory_used 内存使用 > 85%
disk_write_queue 磁盘写入队列 > 10000

8.2 慢查询分析 #

sql
SELECT * FROM system:completed_requests
WHERE elapsed_time > 1000000000
ORDER BY elapsed_time DESC;

8.3 性能分析工具 #

bash
/opt/couchbase/bin/cbstats localhost:11210 all \
    -u Administrator -p password \
    -b my-bucket

九、常见性能问题 #

9.1 内存不足 #

text
症状:
- 响应延迟增加
- 频繁GC
- 操作超时

解决:
1. 增加内存配额
2. 优化淘汰策略
3. 减少工作集大小
4. 扩展集群节点

9.2 磁盘IO瓶颈 #

text
症状:
- 写入延迟高
- 队列积压
- 磁盘使用率高

解决:
1. 使用SSD
2. 调整压缩策略
3. 增加节点
4. 优化写入模式

9.3 查询慢 #

text
症状:
- 查询响应慢
- CPU使用率高

解决:
1. 创建合适的索引
2. 优化查询语句
3. 使用覆盖索引
4. 分页查询

十、总结 #

性能优化要点:

方向 方法
查询优化 使用索引、覆盖索引、参数化查询
索引优化 选择合适类型、最左前缀、部分索引
内存优化 合理配额、淘汰策略、工作集管理
连接优化 连接池、连接复用、超时配置
批量优化 批量操作、异步处理

最佳实践:

  1. 监控关键指标
  2. 定期性能测试
  3. 优化查询语句
  4. 合理设计索引
  5. 规划好集群架构

恭喜你完成Couchbase完全指南的学习!

最后更新:2026-03-27