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控制台配置 #

  1. 登录Web控制台
  2. 进入Buckets页面
  3. 点击Bucket的Edit按钮
  4. 修改Replicas数量
  5. 保存更改

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) #

详见下一章节。

十、总结 #

复制与故障转移要点:

功能 说明
副本 数据冗余
分片 数据分布
故障转移 自动恢复
重新平衡 数据重分布

最佳实践:

  1. 生产环境至少3节点
  2. 配置适当的副本数
  3. 启用自动故障转移
  4. 监控集群健康状态
  5. 定期备份和演练恢复

下一步,让我们学习跨数据中心复制!

最后更新:2026-03-27