Couchbase复制与故障转移 #
一、复制概述 #
1.1 什么是复制 #
复制是将数据副本存储在多个节点上的机制,用于:
text
目的:
- 数据冗余:防止数据丢失
- 高可用:节点故障时继续服务
- 读写分离:提高读取性能
- 灾难恢复:跨数据中心备份
1.2 副本架构 #
text
┌─────────────────────────────────────────────────────────┐
│ Couchbase集群 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ │ │ │ │ │ │ │
│ │ 主分片A │◄───│副本分片A│ │ │ │
│ │ 副本B │────┼─────────┼───►│主分片B │ │
│ │ │ │副本C │◄───│副本A │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
1.3 副本数量 #
| 节点数 | 推荐副本数 | 说明 |
|---|---|---|
| 1 | 0 | 开发环境 |
| 2 | 1 | 最小生产配置 |
| 3+ | 1-2 | 生产环境推荐 |
二、副本配置 #
2.1 创建Bucket时配置 #
bash
/opt/couchbase/bin/couchbase-cli bucket-create \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--bucket my-bucket \
--bucket-type couchbase \
--bucket-ramsize 512 \
--bucket-replica 2
2.2 修改副本数 #
bash
/opt/couchbase/bin/couchbase-cli bucket-edit \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--bucket my-bucket \
--bucket-replica 2
2.3 Web控制台配置 #
- 登录Web控制台
- 进入Buckets页面
- 点击Bucket的Edit按钮
- 修改Replicas数量
- 保存更改
2.4 副本索引 #
bash
/opt/couchbase/bin/couchbase-cli bucket-edit \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--bucket my-bucket \
--bucket-replica 2 \
--bucket-replica-index 1
三、分片与副本分布 #
3.1 分片概念 #
text
vBucket(虚拟分片):
- 数据被分割成多个vBucket
- 每个vBucket有一个主副本和多个副本
- 自动分布在不同节点上
示例(1024个vBucket,3节点,1副本):
Node 1: vBucket 0-341 (主) + vBucket 342-683 (副本)
Node 2: vBucket 342-683 (主) + vBucket 684-1023 (副本)
Node 3: vBucket 684-1023 (主) + vBucket 0-341 (副本)
3.2 查看分片分布 #
bash
/opt/couchbase/bin/couchbase-cli bucket-get \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--bucket my-bucket \
--json | jq '.vBucketServerMap'
3.3 重新平衡 #
bash
/opt/couchbase/bin/couchbase-cli rebalance \
--cluster localhost:8091 \
--username Administrator \
--password your-password
/opt/couchbase/bin/couchbase-cli rebalance-status \
--cluster localhost:8091 \
--username Administrator \
--password your-password
四、自动故障转移 #
4.1 故障转移机制 #
text
故障转移流程:
1. 节点故障检测(心跳超时)
2. 自动提升副本为主
3. 客户端自动重路由
4. 集群继续正常服务
4.2 配置自动故障转移 #
bash
/opt/couchbase/bin/couchbase-cli setting-autofailover \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--enable-auto-failover 1 \
--auto-failover-timeout 30
4.3 故障转移参数 #
| 参数 | 说明 | 默认值 |
|---|---|---|
| enable-auto-failover | 是否启用 | true |
| auto-failover-timeout | 超时时间(秒) | 30 |
| enable-failover-of-server-groups | 是否跨组故障转移 | false |
| max-failovers | 最大故障转移次数 | 1 |
4.4 查看故障转移状态 #
bash
/opt/couchbase/bin/couchbase-cli server-list \
--cluster localhost:8091 \
--username Administrator \
--password your-password
五、手动故障转移 #
5.1 触发故障转移 #
bash
/opt/couchbase/bin/couchbase-cli failover \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--server-failover 192.168.1.101:8091
5.2 恢复故障节点 #
bash
/opt/couchbase/bin/couchbase-cli recovery \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--server-recovery 192.168.1.101:8091 \
--recovery-type delta
恢复类型:
| 类型 | 说明 |
|---|---|
| delta | 增量恢复(推荐) |
| full | 完全恢复 |
5.3 重新添加节点 #
bash
/opt/couchbase/bin/couchbase-cli server-add \
--cluster localhost:8091 \
--username Administrator \
--password your-password \
--server-add 192.168.1.101:8091 \
--server-add-username Administrator \
--server-add-password password \
--services data,index,query
/opt/couchbase/bin/couchbase-cli rebalance \
--cluster localhost:8091 \
--username Administrator \
--password your-password
六、高可用架构 #
6.1 最小高可用配置 #
text
3节点集群(推荐):
┌─────────────────────────────────────────────────────────┐
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ │ │ │ │ │ │ │
│ │ Data │ │ Data │ │ Data │ │
│ │ Index │ │ Index │ │ Index │ │
│ │ Query │ │ Query │ │ Query │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 副本数: 1 │
│ 可容忍节点故障: 1 │
└─────────────────────────────────────────────────────────┘
6.2 生产环境配置 #
text
5节点集群:
┌─────────────────────────────────────────────────────────┐
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │ Node 4 │ ... │
│ │ │ │ │ │ │ │ │ │
│ │ Data │ │ Data │ │ Data │ │ Data │ │
│ │ Index │ │ Index │ │ Index │ │ Index │ │
│ │ Query │ │ Query │ │ Query │ │ Query │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 副本数: 2 │
│ 可容忍节点故障: 2 │
└─────────────────────────────────────────────────────────┘
6.3 服务分离配置 #
text
┌─────────────────────────────────────────────────────────┐
│ │
│ 数据节点组 查询节点组 其他服务组 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Node 1 │ │ Node 4 │ │ Node 6 │ │
│ │ Data │ │ Query │ │ Eventing│ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Node 2 │ │ Node 5 │ │ Node 7 │ │
│ │ Data │ │ Query │ │ Search │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ┌─────────┐ │
│ │ Node 3 │ │
│ │ Data │ │
│ └─────────┘ │
└─────────────────────────────────────────────────────────┘
七、客户端高可用 #
7.1 连接多个节点 #
python
from couchbase.cluster import Cluster, ClusterOptions
from couchbase.auth import PasswordAuthenticator
cluster = Cluster(
'couchbase://node1,node2,node3',
ClusterOptions(PasswordAuthenticator('Administrator', 'password'))
)
7.2 自动重连 #
python
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)
)
)
cluster = Cluster('couchbase://node1,node2,node3', options)
7.3 重试策略 #
python
from couchbase.options import GetOptions, RetryStrategy
from couchbase.exceptions import TimeoutException
import time
def get_with_retry(collection, key, max_retries=3):
for attempt in range(max_retries):
try:
return collection.get(key, GetOptions(timeout=timedelta(seconds=5)))
except TimeoutException:
if attempt < max_retries - 1:
time.sleep(0.1 * (attempt + 1))
continue
raise
八、监控与告警 #
8.1 集群健康检查 #
bash
/opt/couchbase/bin/couchbase-cli server-info \
--cluster localhost:8091 \
--username Administrator \
--password your-password
8.2 关键指标 #
| 指标 | 说明 | 告警阈值 |
|---|---|---|
| cluster_ram_used | 内存使用率 | > 85% |
| hdd_used | 磁盘使用率 | > 80% |
| active_vbuckets | 活跃vBucket数 | 下降 |
| replica_vbuckets | 副本vBucket数 | 不等于预期 |
| ep_queue_size | 待写入队列 | > 10000 |
8.3 REST API监控 #
bash
curl -X GET http://localhost:8091/pools/default \
-u Administrator:password | jq '.nodes[] | {hostname, status}'
九、灾难恢复 #
9.1 备份策略 #
bash
/opt/couchbase/bin/cbbackup \
http://localhost:8091 /backup/$(date +%Y%m%d) \
-u Administrator -p password \
-b my-bucket
9.2 恢复流程 #
bash
/opt/couchbase/bin/cbrestore \
/backup/20240115 http://localhost:8091 \
-u Administrator -p password \
-b my-bucket
9.3 跨数据中心复制(XDCR) #
详见下一章节。
十、总结 #
复制与故障转移要点:
| 功能 | 说明 |
|---|---|
| 副本 | 数据冗余 |
| 分片 | 数据分布 |
| 故障转移 | 自动恢复 |
| 重新平衡 | 数据重分布 |
最佳实践:
- 生产环境至少3节点
- 配置适当的副本数
- 启用自动故障转移
- 监控集群健康状态
- 定期备份和演练恢复
下一步,让我们学习跨数据中心复制!
最后更新:2026-03-27