Haute disponibilité Couchbase en production : XDCR, opérateur Kubernetes et déploiement multirégional
Enterprise Couchbase HA avec XDCR, opérateur autonome et déploiement multi-cloud
: Pourquoi Couchbase pour les charges de travail de production à haute disponibilité
Couchbase Server est une base de données NoSQL distribuée et multimodèle conçue pour les applications interactives qui exigent des performances constantes à faible latence à n'importe quelle échelle. Contrairement aux bases de données qui s'appuient sur des fonctionnalités distribuées après coup, Couchbase a été architecturé depuis sa création autour d'une topologie peer-to-peer sans partage où chaque nœud est égal et les données sont automatiquement partagées sur le cluster à l'aide d'un mécanisme de hachage déterministe appelévBuckets. Ce choix architectural élimine les points de défaillance uniques au niveau de la couche de données et permet une mise à l'échelle horizontale sans modification des applications.
Ce qui distingue Couchbase dans le paysage de la haute disponibilité est sonCross Data Center Replication (XDCR)— un moteur de réplication asynchrone intégré qui diffuse en continu les mutations entre des clusters géographiquement distribués. Associé au basculement automatique, à la connaissance rack/zone et à un riche ensemble de services intégrés (données, index, requêtes, recherche, analyses et événements), Couchbase fournit une plate-forme unifiée qui peut servir à la fois de base de données opérationnelle et de moteur analytique pour les applications modernes.
Dans ce guide complet, nous explorerons tous les aspects de l'exécution du serveur Couchbase dans des environnements de production à haute disponibilité : l'architecture interne qui rend la haute disponibilité possible, la configuration XDCR pour les déploiements multirégionaux, l'opérateur autonome Couchbase pour Kubernetes, les modèles de déploiement spécifiques au cloud pour AWS EKS, Azure AKS et GCP GKE, les déploiements k3s sans système d'exploitation avec Rancher et Longhorn, les stratégies de sauvegarde et de restauration, la requête N1QL. réglage, renforcement de la sécurité, surveillance et Couchbase Mobile avec Sync Gateway pour les déploiements périphériques. À la fin, vous disposerez de connaissances pratiques pour déployer et exploiter des clusters Couchbase de production sur n'importe quelle infrastructure.
Architecture du serveur Couchbase : services, vBuckets et partage automatique
Comprendre l'architecture interne de Couchbase est essentiel avant de procéder à un déploiement pour une haute disponibilité. Couchbase utilise une architectureà mise à l'échelle multidimensionnelle (MDS)dans laquelle différents services peuvent être déployés et mis à l'échelle indépendamment sur les nœuds du cluster. Cela donne aux opérateurs un contrôle précis sur l’allocation des ressources et l’isolation des performances.
Les six services de base
Couchbase Server fournit six services intégrés, chacun gérant un type de charge de travail distinct :
- Data Service (KV)— Le moteur clé-valeur de base construit sur une architecture axée sur la mémoire. Il gère les opérations CRUD, gère la distribution de vBucket et sert de couche de persistance. Les données sont stockées en mémoire (cache géré) et conservées de manière asynchrone sur le disque. Ce service doit s'exécuter sur au moins un nœud dans chaque cluster.
- Index Service (GSI)— Gère les index secondaires globaux qui prennent en charge les requêtes N1QL. Les index sont stockés séparément des données, permettant une mise à l'échelle indépendante. Prend en charge les modes de stockage d'index standard et optimisés en mémoire.
- Query Service (N1QL)— Exécute les requêtes N1QL (SQL++ pour JSON) sur le cluster. De par sa conception, il est apatride, ce qui facilite son évolution horizontale. Coordonne avec les services de données et d'index pour planifier et exécuter les requêtes.
- Search Service (FTS)— Fournit des fonctionnalités de recherche en texte intégral optimisées par le moteur de recherche Bleve. Prend en charge la correspondance floue, les requêtes géospatiales, la recherche à facettes et les analyseurs personnalisés. Les index sont partitionnés et répliqués sur les nœuds de recherche.
- Analytics Service (CBAS)— Exécute des requêtes analytiques complexes à l'aide d'un moteur de traitement parallèle basé sur Apache Asterix. Fonctionne sur sa propre copie des données, garantissant que les charges de travail analytiques n’ont jamais d’impact sur la latence opérationnelle.
- Eventing Service— Exécute les fonctions JavaScript côté serveur en réponse aux mutations de données. Permet l'enrichissement des données en temps réel, les transformations, les suppressions en cascade et les déclencheurs d'intégration sans infrastructure externe.
Distribution vBucket et partage automatique
Couchbase distribue les données sur le cluster à l'aide de1024 vBuckets(seaux virtuels). Chaque document est mappé à un vBucket à l'aide d'un hachage CRC32 de la clé du document modulo 1024. La carte de cluster — maintenue par chaque nœud et mise en cache par chaque client SDK — mappe chaque vBucket à un nœud spécifique. Ce mappage déterministe signifie que les clients savent toujours exactement quel nœud contient un document donné, permettant des lectures et des écritures en un seul saut avec une latence inférieure à la milliseconde.
Lorsque des nœuds sont ajoutés ou supprimés, Couchbase redistribue automatiquement les vBuckets via un processus appelérééquilibrer. Lors du rééquilibrage, le cluster déplace les vBuckets entre les nœuds tout en restant pleinement opérationnel. Le rééquilibrage est soigneusement orchestré pour maintenir le nombre configuré de réplicas à tout moment, et les clients sont redirigés de manière transparente vers les nouveaux emplacements vBucket via des mises à jour de la carte du cluster.
Réplication intra-cluster et basculement automatique
Chaque vBucket possède une copieactiveet jusqu'à trois copiesde répliqueréparties sur différents nœuds. Lorsqu'un client écrit un document, l'écriture est transférée vers le vBucket actif sur le nœud responsable. Le service de données réplique ensuite la mutation en répliques de vBuckets sur d'autres nœuds via le flux interneDCP (Database Change Protocol). Par défaut, Couchbase configure une réplique, mais pour les déploiements de production HA, deux répliques sont recommandées :
# Configure bucket with 2 replicas via CLI
/opt/couchbase/bin/couchbase-cli bucket-create \
--cluster localhost:8091 \
--username Administrator \
--password password \
--bucket production-data \
--bucket-type couchbase \
--bucket-ramsize 4096 \
--bucket-replica 2 \
--bucket-priority high \
--bucket-eviction-policy valueOnly \
--enable-flush 0 \
--compression-mode active \
--max-ttl 0 \
--durability-min-level majorityAndPersistActiveBasculement automatiqueest le mécanisme de Couchbase permettant de détecter et de récupérer automatiquement les pannes de nœuds. Lorsqu'un nœud ne répond plus, l'orchestrateur de cluster attend un délai d'expiration configurable (minimum 5 secondes, recommandé 30 secondes pour la production), puis promeut les vBuckets de réplique sur les nœuds survivants à l'état actif. Cela se produit sans aucune intervention côté application : les clients SDK reçoivent une carte de cluster mise à jour et acheminent immédiatement les requêtes vers les nouveaux vBuckets actifs.
# Configure auto-failover settings
/opt/couchbase/bin/couchbase-cli setting-autofailover \
--cluster localhost:8091 \
--username Administrator \
--password password \
--enable-auto-failover 1 \
--auto-failover-timeout 30 \
--max-failovers 3 \
--enable-failover-of-server-groups 1 \
--failover-on-data-disk-issues 1 \
--failover-data-disk-period 120 \
--can-abort-rebalance 1Paramètres clés de basculement automatique :
- Délai d'expiration du basculement automatique— Quelques secondes à attendre avant de déclencher le basculement. Des valeurs inférieures réduisent les temps d'arrêt mais augmentent le risque de faux positifs. 30 secondes est le réglage de production recommandé.
- max-failovers— Nombre maximum de basculements automatiques séquentiels avant de nécessiter une intervention manuelle. Définissez sur 3 pour un cluster à 5 nœuds (pour maintenir le quorum).
- activer le basculement des groupes de serveurs— Permet le basculement d'un groupe de serveurs entier (rack/zone), essentiel pour les déploiements sensibles aux zones.
- problèmes de basculement sur disque de données— Déclenche le basculement lorsque le service de données détecte des erreurs d'E/S de disque persistantes.
XDCR : réplication entre centres de données
XDCR est la technologie phare de réplication multirégion de Couchbase. Contrairement à la réplication au niveau de la base de données trouvée dans les systèmes SGBDR traditionnels, XDCR fonctionne au niveau du compartimentet diffuse les mutations de documents individuels entre des clusters Couchbase indépendants. Chaque cluster reste entièrement autonome : il peut accepter les lectures et les écritures indépendamment, ce qui rend XDCR idéal pour les déploiements multirégions actifs-actifs où les utilisateurs ont besoin d'un accès à faible latence depuis n'importe quelle zone géographique.
XDCR unidirectionnel ou bidirectionnel
XDCR unidirectionnelréplique les mutations d'un cluster source vers un cluster cible dans une direction. Cela convient aux scénarios de reprise après sinistre, aux réplicas en lecture dans des régions distantes ou à l'alimentation des données d'un cluster opérationnel vers un cluster d'analyse.
XDCR bidirectionnelcrée des liens de réplication dans les deux sens entre deux clusters, permettant des déploiements actif-actif où les deux clusters acceptent les écritures. Il s'agit de la configuration la plus puissante, mais elle nécessite une planification minutieuse de la résolution des conflits.
Configuration de la réplication XDCR
La configuration de XDCR implique la création d'une référence de cluster distant, puis la définition de liens de réplication au niveau du compartiment. Vous trouverez ci-dessous les commandes CLI et les appels REST API pour une configuration bidirectionnelle complète :
# Step 1: Create remote cluster reference on the US-EAST cluster
/opt/couchbase/bin/couchbase-cli xdcr-setup \
--cluster cb-us-east.example.com:8091 \
--username Administrator \
--password password \
--create \
--xdcr-cluster-name eu-west-cluster \
--xdcr-hostname cb-eu-west.example.com:8091 \
--xdcr-username Administrator \
--xdcr-password password \
--xdcr-demand-encryption 1 \
--xdcr-encryption-type full \
--xdcr-certificate /path/to/eu-west-ca.pem
# Step 2: Create replication from US-EAST to EU-WEST for the 'app' bucket
/opt/couchbase/bin/couchbase-cli xdcr-replicate \
--cluster cb-us-east.example.com:8091 \
--username Administrator \
--password password \
--create \
--xdcr-cluster-name eu-west-cluster \
--xdcr-from-bucket app \
--xdcr-to-bucket app \
--xdcr-replication-mode xmem \
--enable-compression 1 \
--filter-expression "" \
--priority high \
--network-usage-limit 0
# Step 3: Create the reverse replication on EU-WEST cluster (bidirectional)
/opt/couchbase/bin/couchbase-cli xdcr-setup \
--cluster cb-eu-west.example.com:8091 \
--username Administrator \
--password password \
--create \
--xdcr-cluster-name us-east-cluster \
--xdcr-hostname cb-us-east.example.com:8091 \
--xdcr-username Administrator \
--xdcr-password password \
--xdcr-demand-encryption 1 \
--xdcr-encryption-type full \
--xdcr-certificate /path/to/us-east-ca.pem
/opt/couchbase/bin/couchbase-cli xdcr-replicate \
--cluster cb-eu-west.example.com:8091 \
--username Administrator \
--password password \
--create \
--xdcr-cluster-name us-east-cluster \
--xdcr-from-bucket app \
--xdcr-to-bucket app \
--xdcr-replication-mode xmem \
--enable-compression 1Stratégies de résolution de conflits
En XDCR bidirectionnel, le même document peut être modifié simultanément sur différents clusters, créant des conflits. Couchbase propose plusieurs stratégies de résolution de conflits :
- Basé sur l'horodatage (LWW — Dernière écriture gagnante)— La mutation avec l'horodatage le plus récent l'emporte. Il s'agit de la valeur par défaut et fonctionne bien pour la plupart des cas d'utilisation. Nécessite une synchronisation NTP sur tous les clusters (dans un délai de 5 secondes). Défini au moment de la création du compartiment et ne peut pas être modifié ultérieurement.
- basé sur le numéro de séquence — Utilise le numéro de séquence interne (ID de révision) pour déterminer le gagnant. La mutation avec le nombre de révisions le plus élevé l’emporte. Utile lorsque la synchronisation de l'horodatage n'est pas fiable.
- Résolution personnalisée des conflits (Entreprise)— Couchbase Enterprise Edition prend en charge les fonctions de fusion personnalisées qui exécutent JavaScript côté serveur pour résoudre les conflits avec la logique spécifique à l'application. Cela permet des scénarios tels que la fusion d'articles de panier de différentes régions ou l'application de règles de résolution de conflits spécifiques au domaine.
# Create a bucket with timestamp-based conflict resolution
curl -X POST http://localhost:8091/pools/default/buckets \
-u Administrator:password \
-d name=app \
-d ramQuota=4096 \
-d replicaNumber=2 \
-d bucketType=couchbase \
-d conflictResolutionType=lww \
-d compressionMode=active \
-d durabilityMinLevel=majorityAndPersistActive
# XDCR advanced settings via REST API
curl -X POST http://localhost:8091/settings/replications/<replication-id> \
-u Administrator:password \
-d optimisticReplicationThreshold=256 \
-d sourceNozzlePerNode=4 \
-d targetNozzlePerNode=4 \
-d checkpointInterval=600 \
-d batchCount=500 \
-d batchSize=2048 \
-d failureRestartInterval=10 \
-d docBatchSizeKb=2048 \
-d networkUsageLimit=0 \
-d priority=HighFiltrage XDCR
XDCR prend en charge le filtrage afin que vous puissiez répliquer uniquement un sous-ensemble de documents. Les filtres utilisent des expressions régulières sur les clés de document et peuvent également filtrer en fonction de l'expiration ou de la suppression du document :
# Replicate only documents with keys starting with 'user::'
/opt/couchbase/bin/couchbase-cli xdcr-replicate \
--cluster localhost:8091 \
--username Administrator \
--password password \
--create \
--xdcr-cluster-name remote-cluster \
--xdcr-from-bucket app \
--xdcr-to-bucket app-users \
--filter-expression "^user::" \
--filter-skip-restream 0
# Replicate documents matching a complex pattern
# (orders from 2026 with specific type)
--filter-expression "REGEXP_CONTAINS(META().id, '^order::2026') AND type='premium'"Opérateur autonome Couchbase pour Kubernetes
L'opérateur autonome Couchbase (CAO)est un opérateur Kubernetes de niveau entreprise qui automatise le déploiement, la gestion, la mise à l'échelle et la récupération des clusters de serveurs Couchbase. Contrairement aux simples déploiements StatefulSet, l'opérateur autonome comprend la topologie interne de Couchbase : il gère les opérations de rééquilibrage, coordonne les mises à niveau progressives, gère la sensibilisation aux groupes de serveurs et s'intègre aux primitives de planification Kubernetes pour garantir un placement optimal des pods Couchbase.
CouchbaseCluster CRD Spécification
Le CouchbaseCluster CRD est la configuration centrale qui déclare l'état souhaité de votre déploiement Couchbase. L’opérateur autonome rapproche cela en ressources StatefulSets, Services, PVC, Secrets et RBAC. Vous trouverez ci-dessous un CRD prêt pour la production :
apiVersion: couchbase.com/v2
kind: CouchbaseCluster
metadata:
name: cb-production
namespace: couchbase
spec:
image: couchbase/server:7.6.1-enterprise
antiAffinity: true
platform: aws
cluster:
autoFailoverTimeout: 30s
autoFailoverMaxCount: 3
autoFailoverOnDataDiskIssues: true
autoFailoverOnDataDiskIssuesTimePeriod: 120s
autoFailoverServerGroup: true
clusterName: cb-production
dataServiceMemoryQuota: 8Gi
indexServiceMemoryQuota: 4Gi
searchServiceMemoryQuota: 2Gi
analyticsServiceMemoryQuota: 4Gi
eventingServiceMemoryQuota: 2Gi
indexStorageSetting: memory_optimized
autoCompaction:
databaseFragmentationThreshold:
percent: 30
size: 1Gi
viewFragmentationThreshold:
percent: 30
size: 1Gi
parallelCompaction: false
timeWindow:
start: "02:00"
end: "06:00"
abortCompactionOutsideWindow: true
security:
adminSecret: cb-admin-credentials
rbac:
managed: true
selector:
matchLabels:
cluster: cb-production
ldap:
hosts:
- ldap.example.com
port: 636
encryption: TLS
networking:
tls:
static:
serverSecret: couchbase-server-tls
operatorSecret: couchbase-operator-tls
exposeAdminConsole: true
adminConsoleServices:
- data
adminConsoleServiceType: NodePort
exposedFeatures:
- client
- xdcr
exposedFeatureServiceType: NodePort
buckets:
managed: true
selector:
matchLabels:
cluster: cb-production
servers:
- name: data-zone-a
size: 2
services:
- data
- index
serverGroups:
- zone-a
pod:
metadata:
labels:
couchbase-service: data-index
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9091"
spec:
nodeSelector:
topology.kubernetes.io/zone: us-east-1a
tolerations:
- key: couchbase
operator: Equal
value: "true"
effect: NoSchedule
resources:
requests:
cpu: "4"
memory: 16Gi
limits:
cpu: "8"
memory: 20Gi
volumeMounts:
default: couchbase-data
data: couchbase-data
index: couchbase-index
- name: data-zone-b
size: 2
services:
- data
- index
serverGroups:
- zone-b
pod:
spec:
nodeSelector:
topology.kubernetes.io/zone: us-east-1b
tolerations:
- key: couchbase
operator: Equal
value: "true"
effect: NoSchedule
resources:
requests:
cpu: "4"
memory: 16Gi
limits:
cpu: "8"
memory: 20Gi
volumeMounts:
default: couchbase-data
data: couchbase-data
index: couchbase-index
- name: query-search
size: 2
services:
- query
- search
serverGroups:
- zone-a
- zone-b
pod:
spec:
resources:
requests:
cpu: "4"
memory: 8Gi
limits:
cpu: "8"
memory: 12Gi
volumeMounts:
default: couchbase-default
- name: analytics-eventing
size: 2
services:
- analytics
- eventing
serverGroups:
- zone-c
pod:
spec:
nodeSelector:
topology.kubernetes.io/zone: us-east-1c
resources:
requests:
cpu: "8"
memory: 32Gi
limits:
cpu: "16"
memory: 40Gi
volumeMounts:
default: couchbase-analytics
analytics:
- couchbase-analytics
serverGroups:
- zone-a
- zone-b
- zone-c
volumeClaimTemplates:
- metadata:
name: couchbase-data
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 100Gi
- metadata:
name: couchbase-index
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 50Gi
- metadata:
name: couchbase-default
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 20Gi
- metadata:
name: couchbase-analytics
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 200GiInstallation de l'opérateurvia Helm
# Add Couchbase Helm repository
helm repo add couchbase https://couchbase-partners.github.io/helm-charts/
helm repo update
# Install the Couchbase Autonomous Operator
helm install couchbase-operator couchbase/couchbase-operator \
--namespace couchbase \
--create-namespace \
--set operator.image.repository=couchbase/operator \
--set operator.image.tag=2.7.1 \
--set admissionController.enabled=true
# Create the admin credentials secret
kubectl create secret generic cb-admin-credentials \
--namespace couchbase \
--from-literal=username=Administrator \
--from-literal=password=$(openssl rand -base64 24)
# Deploy the CouchbaseCluster CRD
kubectl apply -f couchbase-cluster.yaml
# Verify deployment
kubectl get couchbaseclusters -n couchbase
kubectl get pods -n couchbase -l app=couchbase
kubectl get svc -n couchbaseGroupes de serveurset détection des racks/zones
Les groupes de serveursconstituent le mécanisme de Couchbase permettant de garantir que les vBuckets actifs et leurs répliques sont placés dans différents domaines de défaillance (zones de disponibilité, racks ou centres de données). Lorsque des groupes de serveurs sont configurés, Couchbase garantit qu'aucune paire active et réplica pour le même vBucket ne réside dans le même groupe de serveurs. Cela signifie qu'une défaillance complète d'une zone n'entraînera pas de perte de données.
L'opérateur autonome mappe les groupes de serveurs aux étiquettes de topologie des nœuds Kubernetes, planifiant automatiquement les pods dans les zones appropriées. Combiné aux règles d'anti-affinité des pods, cela garantit que les pods Couchbase sont répartis sur l'infrastructure physique pour une résilience maximale.
AWS Déploiement EKS
Amazon EKS nécessite une configuration spécifique pour des performances Couchbase optimales. Les principales considérations sont le stockage (EBS gp3 pour le débit), les types d'instances (r6i/r7i optimisés en mémoire pour les nœuds de données) et la mise en réseau (VPC CNI pour la mise en réseau au niveau des pods).
# EBS gp3 StorageClass optimized for Couchbase
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-gp3-couchbase
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "6000"
throughput: "500"
encrypted: "true"
kmsKeyId: "arn:aws:kms:us-east-1:123456789:key/mrk-abcdef"
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# Recommended EKS node groups for Couchbase
# Data nodes: r6i.2xlarge (8 vCPU, 64 GiB) or r7i.2xlarge
# Index/Query: m6i.2xlarge (8 vCPU, 32 GiB)
# Analytics: r6i.4xlarge (16 vCPU, 128 GiB)
# Eventing: m6i.xlarge (4 vCPU, 16 GiB)
# EKS managed node group with taints for Couchbase
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: couchbase-eks
region: us-east-1
managedNodeGroups:
- name: cb-data
instanceType: r6i.2xlarge
desiredCapacity: 4
minSize: 4
maxSize: 8
volumeSize: 200
volumeType: gp3
volumeIOPS: 6000
volumeThroughput: 500
availabilityZones: ["us-east-1a", "us-east-1b"]
labels:
workload: couchbase-data
taints:
- key: couchbase
value: "true"
effect: NoSchedule
iam:
attachPolicyARNs:
- arn:aws:iam::policy/AmazonEBSCSIDriverPolicy
- name: cb-query
instanceType: m6i.2xlarge
desiredCapacity: 2
minSize: 2
maxSize: 4
availabilityZones: ["us-east-1a", "us-east-1b"]
labels:
workload: couchbase-queryAzure Déploiement AKS
Azure AKS utilise Premium SSD v2 ou Ultra Disk pour les demandes d'E/S du Couchbase et Azure Private Link pour une connectivité XDCR sécurisée entre les régions.
# Azure Premium SSD v2 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-premium-couchbase
provisioner: disk.csi.azure.com
parameters:
skuName: PremiumV2_LRS
DiskIOPSReadWrite: "6000"
DiskMBpsReadWrite: "500"
cachingMode: None
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# Ultra Disk StorageClass for high-performance workloads
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-ultra-couchbase
provisioner: disk.csi.azure.com
parameters:
skuName: UltraSSD_LRS
DiskIOPSReadWrite: "10000"
DiskMBpsReadWrite: "1000"
cachingMode: None
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# AKS recommended VM sizes:
# Data nodes: Standard_E8s_v5 (8 vCPU, 64 GiB)
# Index/Query: Standard_D8s_v5 (8 vCPU, 32 GiB)
# Analytics: Standard_E16s_v5 (16 vCPU, 128 GiB)Déploiement GCP GKE
Google Kubernetes Engine utilise des disques SSD persistants et Workload Identity pour un accès sécurisé à Google Cloud Storage pour les sauvegardes.
# GKE SSD Persistent Disk StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ssd-couchbase
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-ssd
provisioned-iops-on-create: "6000"
provisioned-throughput-on-create: "500"
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# GKE Hyperdisk Balanced for cost-effective performance
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: hyperdisk-couchbase
provisioner: pd.csi.storage.gke.io
parameters:
type: hyperdisk-balanced
provisioned-iops-on-create: "6000"
provisioned-throughput-on-create: "500"
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# GKE recommended machine types:
# Data nodes: n2-highmem-8 (8 vCPU, 64 GB)
# Index/Query: n2-standard-8 (8 vCPU, 32 GB)
# Analytics: n2-highmem-16 (16 vCPU, 128 GB)k3s/Rancher en métal nu avec Longhorn
Pour les organisations qui ont besoin d'un contrôle total de l'infrastructure sans dépendance envers un fournisseur de cloud, le k3s nu avec gestion Rancher et stockage distribué Longhorn constitue une excellente base pour Couchbase HA. Cette architecture est populaire dans les secteurs réglementés, les scénarios d'informatique de pointe et les environnements sensibles aux coûts.
# k3s bare metal setup for Couchbase
# Install k3s on master nodes (HA with embedded etcd)
curl -sfL https://get.k3s.io | sh -s - server \
--cluster-init \
--disable traefik \
--disable servicelb \
--write-kubeconfig-mode 644 \
--node-taint couchbase=true:NoSchedule \
--node-label topology.kubernetes.io/zone=rack-1
# Join additional server nodes
curl -sfL https://get.k3s.io | sh -s - server \
--server https://master-1:6443 \
--token $(cat /var/lib/rancher/k3s/server/node-token) \
--node-taint couchbase=true:NoSchedule \
--node-label topology.kubernetes.io/zone=rack-2
# Join agent nodes
curl -sfL https://get.k3s.io | sh -s - agent \
--server https://master-1:6443 \
--token $(cat /var/lib/rancher/k3s/server/node-token) \
--node-taint couchbase=true:NoSchedule \
--node-label topology.kubernetes.io/zone=rack-3
# Install Longhorn for distributed storage
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--set defaultSettings.defaultReplicaCount=3 \
--set defaultSettings.defaultDataPath=/mnt/longhorn \
--set defaultSettings.guaranteedInstanceManagerCPU=12
# Create Longhorn StorageClass for Couchbase
kubectl apply -f - <Sauvegarde et restaurationavec cbbackupmgr
Couchbase fournitcbbackupmgr, un outil de sauvegarde d'entreprise qui prend en charge les sauvegardes complètes, incrémentielles et différentielles avec compression et chiffrement en option. Pour les déploiements de production HA, une stratégie de sauvegarde robuste combine des sauvegardes de niveau Couchbase avec des capacités d'instantanés cloud.
Configuration de sauvegarde
# Initialize a backup repository
/opt/couchbase/bin/cbbackupmgr config \
--archive /backup/couchbase \
--repo production-backup \
--include-data production-data \
--include-data user-profiles \
--exclude-data _system
# Run a full backup
/opt/couchbase/bin/cbbackupmgr backup \
--archive /backup/couchbase \
--repo production-backup \
--cluster couchbase://localhost \
--username Administrator \
--password "$CB_PASSWORD" \
--threads 4 \
--no-progress-bar
# Run an incremental backup (only mutations since last backup)
/opt/couchbase/bin/cbbackupmgr backup \
--archive /backup/couchbase \
--repo production-backup \
--cluster couchbase://localhost \
--username Administrator \
--password "$CB_PASSWORD" \
--threads 4
# List available backups
/opt/couchbase/bin/cbbackupmgr list \
--archive /backup/couchbase \
--repo production-backup
# Restore from a specific backup
/opt/couchbase/bin/cbbackupmgr restore \
--archive /backup/couchbase \
--repo production-backup \
--cluster couchbase://target-cluster:8091 \
--username Administrator \
--password "$CB_PASSWORD" \
--start 2026-04-12T00_00_00 \
--end 2026-04-12T14_30_00 \
--threads 4Script de sauvegarde automatisée pour Kubernetes
#!/bin/bash
# couchbase-backup.sh — Automated backup to S3-compatible storage
set -euo pipefail
CLUSTER_HOST="cb-production-srv.couchbase.svc.cluster.local"
BACKUP_DIR="/backup/couchbase"
REPO_NAME="prod-$(date +%Y%m%d)"
S3_BUCKET="s3://couchbase-backups/production"
RETENTION_DAYS=14
log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*"; }
log "Starting Couchbase backup for cluster: $CLUSTER_HOST"
if [ ! -d "$BACKUP_DIR/$REPO_NAME" ]; then
log "Configuring new backup repository: $REPO_NAME"
cbbackupmgr config \
--archive "$BACKUP_DIR" \
--repo "$REPO_NAME" \
--include-data production-data \
--include-data user-profiles
fi
log "Running incremental backup..."
cbbackupmgr backup \
--archive "$BACKUP_DIR" \
--repo "$REPO_NAME" \
--cluster "couchbase://$CLUSTER_HOST" \
--username "$CB_USERNAME" \
--password "$CB_PASSWORD" \
--threads 4 \
--no-progress-bar
BACKUP_SIZE=$(du -sh "$BACKUP_DIR/$REPO_NAME" | cut -f1)
log "Backup complete. Size: $BACKUP_SIZE"
log "Syncing to S3: $S3_BUCKET/$REPO_NAME"
aws s3 sync "$BACKUP_DIR/$REPO_NAME" "$S3_BUCKET/$REPO_NAME" \
--storage-class STANDARD_IA \
--sse aws:kms
log "Cleaning up backups older than $RETENTION_DAYS days..."
find "$BACKUP_DIR" -maxdepth 1 -name "prod-*" -mtime +"$RETENTION_DAYS" -exec rm -rf {} \;
log "Backup pipeline complete."CouchbaseBackup CRD (géré par l'opérateur)
L'opérateur autonome fournit des CRD pour la gestion automatisée des sauvegardes :
apiVersion: couchbase.com/v2
kind: CouchbaseBackup
metadata:
name: cb-daily-backup
namespace: couchbase
spec:
strategy: full_incremental
full:
schedule: "0 2 * * 0" # Full backup every Sunday at 2 AM
incremental:
schedule: "0 2 * * 1-6" # Incremental Mon-Sat at 2 AM
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 3
backOffLimit: 3
logRetention: 168h
size: 100Gi
s3bucket: s3://couchbase-backups/production
---
apiVersion: couchbase.com/v2
kind: CouchbaseBackupRestore
metadata:
name: cb-restore-pitr
namespace: couchbase
spec:
backup: cb-daily-backup
repo: "20260412"
start:
int: 1
end:
int: 5
backOffLimit: 3Optimisation des performances des requêtes N1QL
N1QL (SQL++ pour JSON) est le langage de requête de Couchbase. L'optimisation des performances N1QL nécessite de comprendre le planificateur de requêtes, la conception de l'index et les optimisations côté serveur.
Stratégies indicielles: GSI et FTS
-- Global Secondary Index (GSI) for common query patterns
-- Composite index for user lookups
CREATE INDEX idx_users_email_status
ON `user-profiles`(email, status)
WHERE type = 'user'
WITH {"num_replica": 1, "defer_build": false};
-- Covering index (includes all queried fields to avoid fetch)
CREATE INDEX idx_orders_covering
ON `production-data`(customer_id, order_date, total_amount, status)
WHERE type = 'order'
WITH {"num_replica": 1};
-- Array index for nested documents
CREATE INDEX idx_order_items
ON `production-data`(DISTINCT ARRAY item.product_id FOR item IN items END)
WHERE type = 'order'
WITH {"num_replica": 1};
-- Partial index for active records only
CREATE INDEX idx_active_sessions
ON `production-data`(user_id, created_at)
WHERE type = 'session' AND status = 'active'
WITH {"num_replica": 1};
-- Adaptive index for dynamic query patterns
CREATE INDEX idx_adaptive_products
ON `production-data`(DISTINCT PAIRS(self))
WHERE type = 'product'
WITH {"num_replica": 1};
-- Check index status
SELECT name, state, num_docs_indexed, num_docs_pending
FROM system:indexes
WHERE keyspace_id = 'production-data';
-- Analyze query execution plan
EXPLAIN SELECT u.name, u.email, COUNT(o.id) AS order_count
FROM `user-profiles` u
JOIN `production-data` o ON o.customer_id = u.id
WHERE u.status = 'active' AND o.type = 'order'
GROUP BY u.name, u.email
ORDER BY order_count DESC
LIMIT 100;
-- Use ADVISE to get index recommendations
ADVISE SELECT * FROM `production-data`
WHERE type = 'order'
AND customer_id = 'cust-12345'
AND order_date BETWEEN '2026-01-01' AND '2026-04-12'
ORDER BY order_date DESC;Conseils d'optimisation des requêtes-- Use PREPARE for frequently executed queries (cached plan)
PREPARE get_user_orders AS
SELECT o.id, o.order_date, o.total_amount, o.status
FROM `production-data` o
WHERE o.type = 'order'
AND o.customer_id = $customer_id
ORDER BY o.order_date DESC
LIMIT $page_size OFFSET $page_offset;
-- Execute prepared statement
EXECUTE get_user_orders
USING {"customer_id": "cust-12345", "page_size": 20, "page_offset": 0};
-- Use META().id for direct key-value lookups (fastest path)
SELECT META().id, *
FROM `production-data`
USE KEYS ["order::2026-001", "order::2026-002", "order::2026-003"];
-- Correlated subquery with USE KEYS for joins
SELECT u.name,
(SELECT o.id, o.total_amount
FROM `production-data` o
USE KEYS u.order_ids
WHERE o.status = 'completed') AS completed_orders
FROM `user-profiles` u
WHERE META(u).id = 'user::12345';
-- Use INFER to understand document schema
INFER `production-data` WITH {"sample_size": 10000, "similarity_metric": 0.6};Gestion de la mémoire et configuration du bucket
L'architecture axée sur la mémoire duCouchbase signifie que l'allocation de RAM a un impact direct sur les performances. Chaque service possède son propre quota de mémoire et les compartiments partagent le quota du service de données. Un dimensionnement approprié empêche les expulsions de cache qui dégradent la latence.
# Configure cluster-level memory quotas
/opt/couchbase/bin/couchbase-cli setting-cluster \
--cluster localhost:8091 \
--username Administrator \
--password password \
--cluster-ramsize 8192 \
--cluster-index-ramsize 4096 \
--cluster-fts-ramsize 2048 \
--cluster-eventing-ramsize 2048 \
--cluster-analytics-ramsize 4096
# Memory allocation guidelines:
# Data Service: 60% of available node RAM
# Index Service: 20% of available node RAM
# Search Service: 10% of available node RAM
# OS/overhead: 10% reserved
# Bucket memory sizing formula:
# Required RAM = (avg_doc_size * num_docs * 2.5) / num_data_nodes
# The 2.5 multiplier accounts for:
# - Metadata overhead (~56 bytes per document)
# - Internal fragmentation
# - Replica copies in memory
# Create an optimized production bucket
curl -X POST http://localhost:8091/pools/default/buckets \
-u Administrator:password \
-d name=production-data \
-d ramQuota=4096 \
-d bucketType=couchbase \
-d replicaNumber=2 \
-d threadsNumber=8 \
-d evictionPolicy=valueOnly \
-d compressionMode=active \
-d maxTTL=0 \
-d conflictResolutionType=lww \
-d flushEnabled=0 \
-d durabilityMinLevel=majorityAndPersistActive
# Eviction policies:
# valueOnly - Evicts document values but keeps metadata in RAM
# Best for workloads where key access patterns are predictable
# fullEviction - Evicts both values and metadata
# Best for very large datasets that exceed available RAM
# noEviction - (Ephemeral buckets only) Rejects writes when RAM is full
# Best for caching use casesCryptage TLS et RBAC
La sécurisation de Couchbase en production nécessite le chiffrement des données en transit (TLS), un contrôle d'accès précis basé sur les rôles (RBAC) et une journalisation d'audit.
# Enable TLS for all Couchbase services
/opt/couchbase/bin/couchbase-cli ssl-manage \
--cluster localhost:8091 \
--username Administrator \
--password password \
--set-node-certificate
# Enforce minimum TLS version
/opt/couchbase/bin/couchbase-cli setting-security \
--cluster localhost:8091 \
--username Administrator \
--password password \
--set \
--tls-min-version tlsv1.2 \
--tls-honor-cipher-order 1 \
--hsts-max-age 31536000 \
--hsts-preload-enabled 1
# Create application-specific RBAC users
/opt/couchbase/bin/couchbase-cli user-manage \
--cluster localhost:8091 \
--username Administrator \
--password password \
--set \
--rbac-username app-service \
--rbac-password "$(openssl rand -base64 32)" \
--rbac-name "Application Service Account" \
--roles 'data_reader[production-data],data_writer[production-data],query_select[production-data],query_insert[production-data],query_update[production-data],query_delete[production-data]' \
--auth-domain local
# Create a read-only analytics user
/opt/couchbase/bin/couchbase-cli user-manage \
--cluster localhost:8091 \
--username Administrator \
--password password \
--set \
--rbac-username analytics-reader \
--rbac-password "$(openssl rand -base64 32)" \
--roles 'data_reader[production-data],query_select[production-data],analytics_reader[production-data]' \
--auth-domain local
# Enable audit logging
/opt/couchbase/bin/couchbase-cli setting-audit \
--cluster localhost:8091 \
--username Administrator \
--password password \
--set \
--audit-enabled 1 \
--audit-log-path /opt/couchbase/var/lib/couchbase/logs \
--audit-log-rotate-interval 86400 \
--audit-log-rotate-size 20971520Kubernetes TLS avec gestionnaire de certificats
# Certificate for Couchbase server TLS
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: couchbase-server-tls
namespace: couchbase
spec:
secretName: couchbase-server-tls
duration: 8760h # 1 year
renewBefore: 720h # 30 days before expiry
privateKey:
algorithm: RSA
size: 4096
usages:
- server auth
- client auth
dnsNames:
- "*.cb-production.couchbase.svc.cluster.local"
- "*.cb-production.couchbase.svc"
- "cb-production-srv.couchbase.svc.cluster.local"
- "localhost"
issuerRef:
name: couchbase-ca-issuer
kind: ClusterIssuerSurveillanceavec l'exportateur Prometheus
Couchbase expose des métriques riches via son REST API. Lecouchbase-exporterles traduit au format Prometheus pour une surveillance complète.
# Deploy Couchbase Prometheus Exporter
apiVersion: apps/v1
kind: Deployment
metadata:
name: couchbase-exporter
namespace: couchbase
spec:
replicas: 1
selector:
matchLabels:
app: couchbase-exporter
template:
metadata:
labels:
app: couchbase-exporter
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9091"
spec:
containers:
- name: exporter
image: couchbase/exporter:1.0.9
args:
- --couchbase-address=cb-production-srv.couchbase.svc.cluster.local
- --couchbase-port=8091
- --couchbase-username=$(CB_USERNAME)
- --couchbase-password=$(CB_PASSWORD)
- --server-address=0.0.0.0:9091
- --per-node-refresh=5
env:
- name: CB_USERNAME
valueFrom:
secretKeyRef:
name: cb-admin-credentials
key: username
- name: CB_PASSWORD
valueFrom:
secretKeyRef:
name: cb-admin-credentials
key: password
ports:
- containerPort: 9091
name: metrics
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: couchbase-monitor
namespace: couchbase
spec:
selector:
matchLabels:
app: couchbase-exporter
endpoints:
- port: metrics
interval: 15s
path: /metricsMétriques Couchbase clés pour surveiller le
- cb_bucket_ops_per_sec— Nombre total d'opérations par seconde et par compartiment. Basez votre débit normal et alertez en cas d’anomalies.
- cb_bucket_mem_used_bytes— Utilisation de la mémoire du compartiment. Alerte à l'approche du quota de RAM pour éviter les expulsions.
- cb_bucket_cache_miss_ratio— Taux de requêtes qui manquent le cache et nécessitent une récupération de disque. Doit rester inférieur à 2 % pour des performances optimales.
- cb_bucket_disk_queue_items— Profondeur de la file d'attente d'écriture sur disque. Une file d'attente croissante indique que les E/S disque ne peuvent pas suivre le débit d'écriture.
- cb_xdcr_changes_left— Nombre de mutations en attente de réplication XDCR. Indique le décalage de réplication entre régions.
- cb_xdcr_docs_write— Documents répliqués par seconde via XDCR.
- cb_node_cpu_utilization_percent— Utilisation CPU par nœud. Couchbase utilise intensivement CPU pour le compactage et l'indexation.
- cb_bucket_vbucket_active_num— Nombre de vBuckets actifs par nœud. Doit être à peu près égal entre les nœuds de données.
- cb_index_num_docs_ending— Documents en attente de mise à jour de l'index. Indique le retard de création de l’index.
- cb_n1ql_requests_per_sec— Débit des requêtes N1QL. Combiné à la latence moyenne, identifie les problèmes de performances des requêtes.
Prometheus Règles d'alerte
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: couchbase-alerts
namespace: couchbase
spec:
groups:
- name: couchbase.rules
rules:
- alert: CouchbaseNodeDown
expr: cb_node_healthy == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Couchbase node {{ $labels.node }} is unhealthy"
- alert: CouchbaseHighCacheMissRate
expr: cb_bucket_cache_miss_ratio > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "Cache miss rate {{ $value | humanizePercentage }} on bucket {{ $labels.bucket }}"
- alert: CouchbaseXDCRLag
expr: cb_xdcr_changes_left > 10000
for: 10m
labels:
severity: warning
annotations:
summary: "XDCR replication lag: {{ $value }} pending mutations"
- alert: CouchbaseDiskQueueGrowing
expr: rate(cb_bucket_disk_queue_items[5m]) > 100
for: 10m
labels:
severity: warning
annotations:
summary: "Disk queue growing on bucket {{ $labels.bucket }}"
- alert: CouchbaseMemoryPressure
expr: cb_bucket_mem_used_bytes / cb_bucket_mem_quota_bytes > 0.9
for: 5m
labels:
severity: critical
annotations:
summary: "Memory usage at {{ $value | humanizePercentage }} for bucket {{ $labels.bucket }}"Configuration de la chaîne de connexion du SDKpour HA
Les SDKCouchbase sont sensibles à la topologie : ils maintiennent une carte de cluster interne et acheminent les opérations directement vers le nœud approprié. Une configuration appropriée du SDK est essentielle pour la haute disponibilité, garantissant une détection rapide du basculement et une nouvelle tentative automatique en cas d'erreurs transitoires.
// Node.js SDK configuration for HA
const couchbase = require('couchbase');
const clusterConnStr = 'couchbases://cb-node1.example.com,cb-node2.example.com,cb-node3.example.com';
const cluster = await couchbase.connect(clusterConnStr, {
username: process.env.CB_USERNAME,
password: process.env.CB_PASSWORD,
timeouts: {
kvTimeout: 2500, // Key-value operation timeout (ms)
kvDurableTimeout: 10000, // Durable write timeout
queryTimeout: 75000, // N1QL query timeout
searchTimeout: 75000, // FTS search timeout
analyticsTimeout: 75000, // Analytics query timeout
connectTimeout: 10000, // Initial connection timeout
managementTimeout: 75000 // Management API timeout
},
security: {
trustStorePath: '/etc/couchbase/ca.pem'
},
transactions: {
durabilityLevel: couchbase.DurabilityLevel.MajorityAndPersistToActive,
timeout: 15000
}
});
const bucket = cluster.bucket('production-data');
const collection = bucket.defaultCollection();
// Durable write with observe-based durability
await collection.upsert('order::2026-001', orderDocument, {
durabilityLevel: couchbase.DurabilityLevel.MajorityAndPersistToActive,
timeout: 10000
});
// Read with replica fallback for HA
try {
const result = await collection.get('user::12345');
} catch (err) {
if (err instanceof couchbase.errors.TimeoutError) {
const replicaResult = await collection.getAnyReplica('user::12345');
}
}# Java SDK configuration for HA
import com.couchbase.client.java.*;
import com.couchbase.client.java.env.*;
import java.time.Duration;
ClusterEnvironment env = ClusterEnvironment.builder()
.timeoutConfig(TimeoutConfig.builder()
.kvTimeout(Duration.ofMillis(2500))
.kvDurableTimeout(Duration.ofSeconds(10))
.queryTimeout(Duration.ofSeconds(75))
.connectTimeout(Duration.ofSeconds(10))
.build())
.ioConfig(IoConfig.builder()
.numKvConnections(4)
.enableMutationTokens(true)
.enableDnsSrv(true)
.build())
.securityConfig(SecurityConfig.builder()
.enableTls(true)
.trustCertificate(Paths.get("/etc/couchbase/ca.pem"))
.build())
.build();
Cluster cluster = Cluster.connect(
"couchbases://cb-node1.example.com,cb-node2.example.com",
ClusterOptions.clusterOptions("username", "password")
.environment(env)
);Kubernetes Service DNS pour connexion SDK
# When using the Autonomous Operator, connect via the headless service:
# couchbase://cb-production-srv.couchbase.svc.cluster.local
#
# The operator creates these services:
# cb-production-srv - Headless service for SDK auto-discovery
# cb-production-ui - Web Console (port 8091/18091)
# cb-production-cloud - External connectivity (NodePort/LoadBalancer)
#
# For external SDK access (outside Kubernetes), use:
# - NodePort with explicit node addresses
# - LoadBalancer with MetalLB (bare metal)
# - Ingress with TCP passthrough for port 11210 (SDK) and 11207 (SDK TLS)Passerelle mobile et de synchronisation Couchbase pour les déploiements Edge
Couchbase Mobile étend l'écosystème Couchbase aux appareils de périphérie et aux applications mobiles.Couchbase Litefonctionne de manière intégrée sur les appareils iOS, Android et IoT, tandis queSync Gatewayagit comme middleware de synchronisation entre Couchbase Lite et Couchbase Server.
// Sync Gateway configuration for production
{
"interface": ":4984",
"adminInterface": "127.0.0.1:4985",
"logging": {
"console": {
"log_level": "info",
"log_keys": ["HTTP", "Sync", "Auth", "Changes"]
}
},
"databases": {
"mobile-app": {
"server": "couchbases://cb-production-srv.couchbase.svc.cluster.local",
"bucket": "production-data",
"username": "sync-gateway",
"password": "${SG_PASSWORD}",
"enable_shared_bucket_access": true,
"import_docs": true,
"num_index_replicas": 1,
"delta_sync": {
"enabled": true,
"rev_max_age_seconds": 86400
},
"cache": {
"channel_cache": {
"max_number": 50000,
"compact_high_watermark_pct": 80,
"compact_low_watermark_pct": 60
},
"rev_cache": {
"size": 5000,
"shard_count": 16
}
},
"users": {
"GUEST": {"disabled": true}
},
"sync": "function(doc, oldDoc) { if (doc.type === 'user-data') { channel(doc.channels); requireAccess(doc.channels); } else { channel('public'); } }"
}
}
}
# Deploy Sync Gateway on Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: sync-gateway
namespace: couchbase
spec:
replicas: 3
selector:
matchLabels:
app: sync-gateway
template:
metadata:
labels:
app: sync-gateway
spec:
containers:
- name: sync-gateway
image: couchbase/sync-gateway:3.1.4-enterprise
args: ["/etc/sync-gateway/config.json"]
ports:
- containerPort: 4984
name: public
- containerPort: 4985
name: admin
resources:
requests:
cpu: "2"
memory: 4Gi
limits:
cpu: "4"
memory: 8Gi
volumeMounts:
- name: config
mountPath: /etc/sync-gateway
volumes:
- name: config
configMap:
name: sync-gateway-configPlanification et dimensionnement des capacités
Une bonne planification de la capacité est essentielle pour les performances du Couchbase et l'optimisation des coûts. Le tableau suivant fournit des directives de dimensionnement basées sur le niveau de charge de travail :
| Niveau de charge de travail | Nœuds de donnéesIndex/Requête | RAM par nœud | Stockage | Débit du||
|---|---|---|---|---|---|
| Développement | 1 (tous les services) | Colocalisé | 4 Go | SSD 20 Go | <1 000 opérations/s |
| Petite production | 3 Données | 2 Requête+Index | 16 Go | Disque SSD 100 Go | 10 000 opérations/s |
| Production moyenne | 5 Données | 3 Requête+Index | 32 Go | Disque SSD 500 Go | 50 000 opérations/s |
| Grande production | 7-10 Données | 4+ Requête+Index | 64 Go | 1 To NVMe | + de 200 000 opérations/s |
| Entreprise/Global | 10+ Données (multirégion) | 6+ Requête+Index | 128 Go | 2 To NVMe | + de 500 000 opérations/s |
Formule de dimensionnement
# Data Service RAM sizing
# Required RAM per node = (num_documents * (doc_metadata_size + avg_value_size)) / num_data_nodes * (1 + num_replicas)
# doc_metadata_size = 56 bytes (fixed overhead per document)
# Include 25% headroom for fragmentation and growth
# Example: 100M documents, 1KB avg size, 3 data nodes, 1 replica
# RAM = (100,000,000 * (56 + 1024)) / 3 * 2 = ~72 GB per node
# With 25% headroom: ~90 GB per node
# Index Service RAM sizing (memory-optimized)
# RAM = total_index_size * 3 (for build/merge overhead)
# Use system:indexes to check current index sizes
# Disk sizing
# Disk = (num_documents * avg_doc_size * (1 + num_replicas)) * 3 (compaction headroom)
# Use SSD/NVMe with provisioned IOPS for predictable performanceProcédures de reprise après sinistre et de basculement
Un plan complet de reprise après sinistre garantit la continuité des activités lorsque les pannes de l'infrastructure dépassent la portée du basculement automatique.
Panne d'un seul nœud (automatique)
# Auto-failover handles single node failures automatically.
# Verify failover occurred:
/opt/couchbase/bin/couchbase-cli server-list \
--cluster localhost:8091 \
--username Administrator \
--password password
# After replacing the failed node, add and rebalance:
/opt/couchbase/bin/couchbase-cli server-add \
--cluster localhost:8091 \
--username Administrator \
--password password \
--server-add new-node.example.com:8091 \
--server-add-username Administrator \
--server-add-password password \
--services data,index
/opt/couchbase/bin/couchbase-cli rebalance \
--cluster localhost:8091 \
--username Administrator \
--password passwordPanne complète du cluster (manuel)
# Scenario: Primary region (US-EAST) completely lost
# Step 1: Verify XDCR target cluster (EU-WEST) has latest data
# Check XDCR replication status before failure
curl -s http://eu-west-node:8091/pools/default/remoteClusters \
-u Administrator:password | jq .
# Step 2: Pause XDCR replications pointing to the failed cluster
/opt/couchbase/bin/couchbase-cli xdcr-replicate \
--cluster cb-eu-west.example.com:8091 \
--username Administrator \
--password password \
--pause \
--xdcr-replicator <replication-id>
# Step 3: Update application connection strings to EU-WEST cluster
# (via DNS update, service mesh, or environment variable change)
# Step 4: Scale up EU-WEST cluster if needed to handle full production load
# In Kubernetes, update the CouchbaseCluster CRD:
kubectl patch couchbasecluster cb-eu-west -n couchbase --type merge \
-p '{"spec":{"servers":[{"name":"data-zone-a","size":4}]}}'
# Step 5: After US-EAST cluster is restored, re-establish XDCR
# and perform a full resync from EU-WEST back to US-EASTBasculement et récupération gracieux
# Graceful failover (for maintenance, drains data before removal)
/opt/couchbase/bin/couchbase-cli failover \
--cluster localhost:8091 \
--username Administrator \
--password password \
--server-failover node-to-remove.example.com:8091
# Recovery (re-add the node after maintenance)
/opt/couchbase/bin/couchbase-cli recovery \
--cluster localhost:8091 \
--username Administrator \
--password password \
--server-recovery node-to-recover.example.com:8091 \
--recovery-type delta
# Delta recovery re-synchronizes only the changed data,
# which is much faster than full recovery.
# Full recovery rebuilds the node from scratch.
# Rebalance to complete the recovery
/opt/couchbase/bin/couchbase-cli rebalance \
--cluster localhost:8091 \
--username Administrator \
--password passwordValeurs Helm pour un déploiement de production complet
Vous trouverez ci-dessous un fichier complet de valeurs Helm pour le déploiement de Couchbase avec l'opérateur autonome dans un environnement de production :
# helm-values-production.yaml
couchbase-operator:
operator:
image:
repository: couchbase/operator
tag: 2.7.1
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
admissionController:
enabled: true
resources:
requests:
cpu: 100m
memory: 128Mi
cluster:
image: couchbase/server:7.6.1-enterprise
antiAffinity: true
autoFailoverTimeout: 30s
autoFailoverMaxCount: 3
autoFailoverOnDataDiskIssues: true
autoFailoverServerGroup: true
security:
adminSecret: cb-admin-credentials
networking:
tls:
static:
serverSecret: couchbase-server-tls
operatorSecret: couchbase-operator-tls
exposeAdminConsole: true
adminConsoleServiceType: NodePort
buckets:
managed: true
servers:
data:
size: 4
services:
- data
- index
serverGroups:
- zone-a
- zone-b
resources:
requests:
cpu: "4"
memory: 16Gi
limits:
cpu: "8"
memory: 20Gi
volumeMounts:
default: couchbase-data
data: couchbase-data
index: couchbase-index
query:
size: 2
services:
- query
- search
resources:
requests:
cpu: "4"
memory: 8Gi
limits:
cpu: "8"
memory: 12Gi
volumeMounts:
default: couchbase-default
analytics:
size: 2
services:
- analytics
- eventing
serverGroups:
- zone-c
resources:
requests:
cpu: "8"
memory: 32Gi
limits:
cpu: "16"
memory: 40Gi
volumeMounts:
default: couchbase-analytics
analytics:
- couchbase-analytics
serverGroups:
- zone-a
- zone-b
- zone-c
volumeClaimTemplates:
- metadata:
name: couchbase-data
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 100Gi
- metadata:
name: couchbase-index
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 50Gi
- metadata:
name: couchbase-default
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 20Gi
- metadata:
name: couchbase-analytics
spec:
storageClassName: ebs-gp3-couchbase
resources:
requests:
storage: 200GiConclusion
L'architecture du serveurCouchbase, construite autour du partitionnement basé sur vBucket, de l'accès aux données en priorité mémoire et des services multimodèles intégrés, fournit une base puissante et unique pour les déploiements de production à haute disponibilité. La combinaison de la réplication intra-cluster avec le basculement automatique garantit que les pannes d'un seul nœud sont gérées de manière transparente, tandis que XDCR étend cette résilience à toutes les régions géographiques pour les applications mondiales.
L'opérateur autonome Couchbase pour Kubernetes transforme ce qui serait des opérations manuelles complexes en déploiements déclaratifs et auto-réparateurs. Les groupes de serveurs assurent la connaissance du rack/zone, l'opérateur gère les opérations de rééquilibrage lors des événements de mise à l'échelle et les CRD de sauvegarde intégrés automatisent la préparation de la reprise après sinistre.
Points clés à retenir de ce guide :
- Tirer parti de la mise à l'échelle multidimensionnelle— Séparez les services de données, d'index, de requêtes, de recherche, d'analyse et d'événements sur des pools de nœuds dédiés pour une mise à l'échelle indépendante et une isolation des ressources.
- Configurez XDCR pour une résilience multirégionale— XDCR bidirectionnel avec résolution des conflits basée sur l'horodatage permet des déploiements actifs-actifs sur AWS, Azure et GCP. Assurez toujours la synchronisation NTP.
- Utiliser des groupes de serveurs pour la connaissance des zones— Mappez les groupes de serveurs sur des zones de disponibilité ou des racks pour garantir que les vBuckets actifs et de réplique se trouvent dans des domaines de défaillance différents.
- Dimensionnez soigneusement la mémoire— Les performances du Couchbase sont directement liées à la quantité de mémoire disponible dans la RAM. Utilisez les formules de dimensionnement et surveillez les taux d’échec du cache.
- Mettre en œuvre une surveillance complète— Déployez l'exportateur Prometheus dès le premier jour. Le délai de réplication XDCR, le taux d'échec du cache, la profondeur de la file d'attente du disque et l'état des nœuds sont vos signaux critiques.
- Automatisez les sauvegardes avec cbbackupmgr— Combinez des sauvegardes complètes et incrémentielles avec des instantanés cloud. Testez régulièrement les procédures de restauration.
- Sécurisé avec TLS et RBAC— Activez le chiffrement TLS de nœud à nœud et de client à nœud. Utilisez des rôles RBAC précis pour chaque compte de service d'application.
- Configurer les SDK pour HA— Utilisez plusieurs nœuds d'amorçage, configurez les délais d'attente appropriés, implémentez les lectures de réplica comme solution de secours et exploitez les écritures durables pour les données critiques.
- Plan de reprise après sinistre— Documentez et répétez les procédures de basculement pour les scénarios de panne de cluster à un seul nœud, à plusieurs nœuds et complets. Les clusters de secours XDCR doivent être prêts pour la promotion à tout moment.
Grâce à cette base complète, vous êtes équipé pour déployer et exploiter le serveur Couchbase dans des environnements de production à haute disponibilité sur n'importe quelle infrastructure : du Kubernetes géré sur AWS, Azure et GCP aux clusters k3s sans système d'exploitation gérés par Rancher. La combinaison de l'architecture distribuée native de Couchbase avec l'orchestration Kubernetes offre une plate-forme de base de données qui répond aux exigences des applications modernes distribuées à l'échelle mondiale.