Workstation Logo
Продукты
AI LabsАгенты OpenAIАгенты ClaudeGrok BotWorkstation CRM (WSL CRM)МаркетингВсе продукты
Решения ИИ
Рабочие станции ИИAI SME PackagesЧастный ИИКластеры GPUПограничный ИИЛаборатория корпоративного ИИИИ по отраслям
Услуги
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous OperationsИИ-консалтингАвтоматизация DevOpsКибербезопасностьРазработка ПОСоздание агентовНастройка MLOps
О нас
ПартнёрыИстории клиентов
Статьи
Документация
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
Блог
Связаться с намиLogin
Workstation

AI-рабочие станции, мультиагентное AI-ПО, GPU-инфраструктура и решения на базе интеллектуальных агентов для современного бизнеса.

Связаться с нами

AI-решения

Рабочие станции ИИAI SME PackagesЧастный ИИКластеры GPUПограничный ИИЛаборатория корпоративного ИИИИ по отраслям

Продукты

Все продуктыWSL CRM и ERPМаркетингАгенты OpenAIWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

Компания

О насПочему WorkstationПартнёрыИстории клиентовЦеныКонтакты

Ресурсы

СтатьиДокументацияБлогПоискКарта сайта
Офис в Великобритании
77-79 Marlowes, Hemel Hempstead HP1 1LFКак добраться: съезд 20 с трассы M25, Внешний ЛондонРег. номер компании: 11641870Пн - Пт: 9:00 - 18:00 GMT
+44 7515 356 146
Офис в Бельгии
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683Пн - Пт: 9:00 - 18:00 CET
+32 492 45 67 46
Офис в Индии
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI. Все права защищены.

КонфиденциальностьФайлы cookieУсловия использованияКарта сайта

Loading blog...

Home / Blog
DatabaseKubernetesDevOpsBackend

Высокая доступность Couchbase в производстве: XDCR, оператор Kubernetes и развертывание в нескольких регионах

Корпоративный Couchbase HA с XDCR, автономным оператором и развертыванием в нескольких облаках

Balinder Walia12 апреля 2026 г.34 min read
Введение

: почему Couchbase для рабочих нагрузок высокой доступности

Сервер Couchbase — это распределенная многомодельная база данных NoSQL, разработанная для интерактивных приложений, которым требуется стабильная производительность с низкой задержкой в любом масштабе. В отличие от баз данных, в которых распределенные функции используются в последнюю очередь, Couchbase с самого начала создавался вокруг одноранговой топологии без общего доступа, в которой все узлы равны, а данные автоматически сегментируются по кластеру с использованием детерминированного механизма хеширования, называемогоvBuckets. Такой архитектурный выбор исключает отдельные точки отказа на уровне данных и обеспечивает горизонтальное масштабирование без изменений приложений.

Что отличает Couchbase в сфере высокой доступности, так это егоCross Data Center Replication (XDCR)— встроенный механизм асинхронной репликации, который непрерывно передает изменения между географически распределенными кластерами. В сочетании с автоматическим переключением при сбое, контролем стойки/зоны и богатым набором интегрированных сервисов (данные, индексы, запросы, поиск, аналитика и обработка событий) Couchbase обеспечивает единую платформу, которая может служить как операционной базой данных, так и аналитическим механизмом для современных приложений.

В этом подробном руководстве мы рассмотрим каждый аспект работы сервера Couchbase в производственных средах с высокой доступностью: внутреннюю архитектуру, которая делает возможной высокую доступность, конфигурацию XDCR для развертываний в нескольких регионах, автономный оператор Couchbase для Kubernetes, шаблоны облачного развертывания для AWS EKS, Azure AKS и GCP GKE, развертывание k3s на «голом компьютере» с Rancher и Longhorn, стратегии резервного копирования и восстановления. Настройка запросов N1QL, усиление безопасности, мониторинг и Couchbase Mobile со шлюзом Sync для периферийных развертываний. К концу вы получите практические знания по развертыванию и эксплуатации кластеров Couchbase промышленного уровня в любой инфраструктуре.

Серверная архитектура Couchbase: службы, виртуальные сегменты и автоматическое сегментирование

Понимание внутренней архитектуры Couchbase имеет решающее значение перед развертыванием системы высокой доступности. Couchbase использует архитектурумногомерного масштабирования (MDS), позволяющую независимо развертывать и масштабировать различные сервисы на узлах кластера. Это дает операторам детальный контроль над распределением ресурсов и изоляцией производительности.

Шесть основных сервисов

Сервер Couchbase предоставляет шесть интегрированных сервисов, каждый из которых обрабатывает отдельный тип рабочей нагрузки:

  • Служба данных (KV)— основной механизм обработки ключей и значений, построенный на архитектуре с приоритетом памяти. Он обрабатывает операции CRUD, управляет распределением vBucket и служит уровнем персистентности. Данные хранятся в памяти (управляемый кеш) и асинхронно сохраняются на диске. Эта служба должна работать хотя бы на одном узле в каждом кластере.
  • Служба индексов (GSI)— поддерживает глобальные вторичные индексы, поддерживающие запросы N1QL. Индексы хранятся отдельно от данных, что обеспечивает независимое масштабирование. Поддерживает стандартные и оптимизированные для памяти режимы хранения индексов.
  • Служба запросов (N1QL)— выполняет запросы N1QL (SQL++ для JSON) к кластеру. Без сохранения состояния по своей конструкции, что позволяет легко масштабировать по горизонтали. Координирует свои действия со службами данных и индексирования для планирования и выполнения запросов.
  • Служба поиска (FTS)— обеспечивает возможности полнотекстового поиска на основе поисковой системы Bleve. Поддерживает нечеткое сопоставление, геопространственные запросы, фасетный поиск и пользовательские анализаторы. Индексы секционируются и реплицируются по узлам поиска.
  • Analytics Service (CBAS)— выполняет сложные аналитические запросы с использованием механизма параллельной обработки на базе Apache Asterix. Работает с собственной копией данных, гарантируя, что аналитические рабочие нагрузки никогда не повлияют на задержку в работе.
  • Служба обработки событий— выполняет функции JavaScript на стороне сервера в ответ на изменения данных. Обеспечивает обогащение данных, преобразование, каскадное удаление и триггеры интеграции в режиме реального времени без внешней инфраструктуры.
Couchbase Архитектура кластера и усилитель; Распространение услугКластер Couchbase (включено автоматическое аварийное переключение, обнаружение за 3 секунды)Узел 1 (10.0.1.10)Служба передачи данных (КВ)vBuckets 0-341 | Кэш 256 МБСлужба индексирования(GSI)Служба запросов(N1QL)Карта vBucket(активная)0-341 активен | 342-682 репликаАвтоматическое сохранение на диске (асинхронное)Узел 2 (10.0.1.11)Служба передачи данных (КВ)vBuckets 342-682 | Кэш 256 МБСлужба поиска (FTS)Аналитическая служба(CBAS)Карта vBucket(активная)342-682 активен | 683-1023 репликаПоток DCP в AnalyticsУзел 3 (10.0.1.12)Служба передачи данных (КВ)vBuckets 683-1023 | Кэш 256 МБСлужба организации мероприятийСлужба запросов(N1QL)Карта vBucket(активная)683-1023 активен | Реплика 0-341Потребитель DCP для организации событийМенеджер автоматического аварийного переключенияМониторинг сердцебиения | 3s обнаружение | vBucket продвижение | Макс. 3 последовательных аварийных переключенияДанные (КВ)Индекс/запросПоиск/аналитика/обработка событийВнутрикластерная репликацияСердцебиение

Распределение vBucket и автоматическое сегментирование

Couchbase распределяет данные по кластеру с помощью1024 виртуальных сегментов(виртуальных сегментов). Каждый документ сопоставляется с vBucket с использованием хэша CRC32 ключа документа по модулю 1024. Карта кластера, поддерживаемая каждым узлом и кэшируемая каждым клиентом SDK, сопоставляет каждый vBucket с конкретным узлом. Такое детерминированное сопоставление означает, что клиенты всегда точно знают, на каком узле хранится тот или иной документ, что позволяет осуществлять чтение и запись за один переход с задержкой менее миллисекунды.

При добавлении или удалении узлов Couchbase автоматически перераспределяет виртуальные бакеты с помощью процесса, называемогоrebalance. Во время ребалансировки кластер перемещает vBuckets между узлами, оставаясь при этом полностью работоспособным. Ребалансировка тщательно организована для постоянного поддержания настроенного количества реплик, а клиенты плавно перенаправляются в новые местоположения vBucket посредством обновлений карты кластера.

Внутрикластерная репликация и автоматическое переключение при сбое

Каждый виртуальный баккет имеет одну активную копиюи до трех копий реплики, распределенных по разным узлам. Когда клиент записывает документ, запись поступает в активный vBucket на ответственном узле. Затем служба данных реплицирует мутацию для реплик виртуальных бакетов на других узлах через внутренний потокDCP (протокол изменения базы данных). По умолчанию Couchbase настраивает одну реплику, но для производственных развертываний высокой доступности рекомендуется использовать две реплики:

.
# 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 majorityAndPersistActive

Автоматическое переключение при сбое— это механизм Couchbase для автоматического обнаружения и восстановления после сбоев узла. Когда узел перестает отвечать на запросы, оркестратор кластера ожидает настраиваемого тайм-аута (минимум 5 секунд, рекомендуется 30 секунд для рабочей среды), а затем переводит реплики vBuckets на выживших узлах в активное состояние. Это происходит без какого-либо вмешательства со стороны приложения — клиенты SDK получают обновленную карту кластера и немедленно направляют запросы в новые активные vBuckets.

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

Ключевые параметры автоматического переключения при отказе:

  • — тайм-аут автоматического переключения при сбое.— время ожидания в секундах перед запуском переключения при сбое. Более низкие значения сокращают время простоя, но увеличивают риск ложноположительных результатов. 30 секунд — рекомендуемая производственная настройка.
  • максимальное количество аварийных переключений— максимальное количество последовательных автоматических аварийных переключений, прежде чем потребуется ручное вмешательство. Установите значение 3 для кластера из 5 узлов (для поддержания кворума).
  • включить аварийное переключение групп серверов— обеспечивает аварийное переключение всей группы серверов (стойки/зоны), что критически важно для развертываний с учетом зон.
  • Проблемы с переключением на диске с данными— запускает переключение при сбое, когда служба данных обнаруживает постоянные ошибки ввода-вывода на диске.

XDCR: репликация между центрами обработки данных

XDCR — это флагманская технология многорегиональной репликации Couchbase. В отличие от репликации на уровне базы данных, существующей в традиционных системах РСУБД, XDCR работает на уровне корзиныи передает мутации отдельных документов между независимыми кластерами Couchbase. Каждый кластер остается полностью автономным — он может независимо принимать операции чтения и записи, что делает XDCR идеальным для развертываний в нескольких регионах, где пользователям необходим доступ с низкой задержкой из любой географической точки.

Однонаправленный и двунаправленный XDCR

Однонаправленный XDCRреплицирует мутации из исходного кластера в целевой кластер в одном направлении. Это подходит для сценариев аварийного восстановления, реплик чтения в удаленных регионах или передачи данных из операционного кластера в аналитический кластер.

Двунаправленный XDCRсоздает каналы репликации в обоих направлениях между двумя кластерами, обеспечивая развертывание в режиме «активный-активный», при котором оба кластера принимают запись. Это самая мощная конфигурация, но она требует тщательного планирования разрешения конфликтов.

XDCR Многорегиональная двунаправленная репликацияСША-ВОСТОК (AWS EKS)Кластер: cb-us-east5 узлов | Данные+Индекс+ЗапросBucket: приложениеГруппа: пользователиРазрешение конфликтов: LWW (метка времени)XDCR: сжатие включено | TLS 1.3Запись: ~15 тыс. операций в секундуЕС-ЗАПАД (Azure AKS)Кластер: cb-eu-west5 узлов | Данные+Индекс+ЗапросВедро: приложениеГруппа: пользователиРазрешение конфликтов: LWW (метка времени)XDCR: сжатие включено | TLS 1.3Запись: ~12 тыс. операций в секундуТочка доступа-ЮГ (GCP GKE)Кластер: cb-ap-south3 узла | Данные+Индекс+ЗапросBucket: приложениеГруппа: пользователиРазрешение конфликтов: LWW (метка времени)XDCR: сжатие включено | TLS 1.3Запись: ~8 тыс. операций в секундуXDCRXDCRXDCR (двунаправленный)Стратегии разрешения конфликтовLWW (последняя запись выигрывает по временной метке) | Порядковый номер | Пользовательское разрешение конфликтов с помощью функций слияния (предприятие)XDCR ФорвардXDCR РеверсМежрегиональная связьAWSAzureGCP

Настройка репликации XDCR

Настройка XDCR включает создание ссылки на удаленный кластер и последующее определение каналов репликации на уровне сегмента. Ниже приведены команды CLI и вызовы REST API для полной двунаправленной настройки:

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

Стратегии разрешения конфликтов

В двунаправленном XDCR один и тот же документ может быть изменен одновременно в разных кластерах, что приводит к конфликтам. Couchbase предоставляет несколько стратегий разрешения конфликтов:

  • На основе временной метки (LWW — побеждает последняя запись)— побеждает мутация с самой последней временной меткой. Это значение по умолчанию, которое хорошо работает в большинстве случаев использования. Требуется синхронизация NTP во всех кластерах (перекос в пределах 5 секунд). Устанавливается во время создания корзины и не может быть изменено позже.
  • На основе порядкового номера— для определения победителя используется внутренний порядковый номер (идентификатор версии). Мутация с большим количеством ревизий побеждает. Полезно, когда синхронизация меток времени ненадежна.
  • Пользовательское разрешение конфликтов (Enterprise)— Couchbase Enterprise Edition поддерживает пользовательские функции слияния, которые запускают JavaScript на стороне сервера для разрешения конфликтов с логикой конкретного приложения. Это позволяет использовать такие сценарии, как объединение элементов корзины покупок из разных регионов или применение правил разрешения конфликтов для конкретного домена.
# 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=High

Фильтрация XDCR

XDCR поддерживает фильтрацию, поэтому вы можете реплицировать только часть документов. Фильтры используют регулярные выражения для ключей документа, а также могут фильтровать по истечении срока действия или удалению документа:

.
# 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'"

Автономный оператор Couchbase для Kubernetes

Автономный операторCouchbase (CAO)— это оператор Kubernetes корпоративного уровня, который автоматизирует развертывание, управление, масштабирование и восстановление кластеров серверов Couchbase. В отличие от простых развертываний StatefulSet, автономный оператор понимает внутреннюю топологию Couchbase — он управляет операциями перебалансировки, координирует чередующиеся обновления, обрабатывает информацию о группах серверов и интегрируется с примитивами планирования Kubernetes для обеспечения оптимального размещения модулей Couchbase.

Автономный оператор Couchbase на KubernetesCouchbase Автономный операторЧасы CouchbaseCluster CRD | СогласовываетCouchbaseКластер CRDДекларация о желаемом состоянииСекреты TLSАвтоматическая ротация через диспетчер сертификатовГруппа серверов: зона-a (стойка-1)StatefulSet: cb-prod-data-zacb-prod-0000Данные + индекс4 CPU | 16GiPVC: 100Gi gp3cb-prod-0001Запрос + Поиск4 CPU | 8GiPVC: 50Gi gp3PVC (EBS gp3)ClusterIP SVCAnti-Affinity: только узлы зоны aГруппа серверов: зона-b (стойка-2)StatefulSet: cb-prod-data-zbcb-prod-0002Данные + индекс4 CPU | 16GiPVC: 100Gi gp3cb-prod-0003Запрос + Поиск4 CPU | 8GiPVC: 50Gi gp3PVC (EBS gp3)ClusterIP SVCAnti-Affinity: только узлы зоны bГруппа серверов: зона-c (стойка-3)StatefulSet: cb-prod-data-zccb-prod-0004Данные + аналитика8 CPU | 32GiPVC: 200Gi gp3cb-prod-0005Троеборье2 CPU | 8GiPVC: 50Gi gp3PVC (EBS gp3)ClusterIP SVCAnti-Affinity: только узлы зоны cОткрытые службыNodePort 8091 | SDK 11210 | N1QL 8093Контроллер допускапроверяет CRD | Вебхук TLSКонтроллер резервного копированияcbbackupmgr | S3/GCS/AzureОператорДанные/индекс/запросАналитика/СобытияPVC Система хранения данныхПланирование модулейБезопасность/проверка

CouchbaseCluster CRD Технические характеристики

CouchbaseCluster CRD — это центральная конфигурация, которая определяет желаемое состояние вашего развертывания Couchbase. Автономный оператор согласовывает это с ресурсами StatefulSets, Services, PVC, Secrets и RBAC. Ниже представлен готовый к производству CRD:

.
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: 200Gi
Установка оператора

через 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 couchbase
Группы серверов

и осведомленность о стойках/зонах

Группы серверов

— это механизм Couchbase, обеспечивающий размещение активных виртуальных бакетов и их реплик в разных доменах отказа (зонах доступности, стойках или центрах обработки данных). При настройке групп серверов Couchbase гарантирует, что ни одна пара активных и реплик для одного и того же виртуального бакета не находится в одной группе серверов. Это означает, что полный сбой зоны не приведет к потере данных.

Автономный оператор сопоставляет группы серверов с метками топологии узлов Kubernetes, автоматически планируя модули в правильных зонах. В сочетании с правилами ограничения сходства модулей это гарантирует, что модули Couchbase будут распределены по физической инфраструктуре для обеспечения максимальной устойчивости.

AWS Развертывание EKS

Amazon EKS требует специальной конфигурации для оптимальной производительности Couchbase. Ключевыми факторами являются хранилище (EBS gp3 для пропускной способности), типы экземпляров (оптимизированные для памяти r6i/r7i для узлов данных) и сеть (VPC CNI для сетей на уровне модулей).

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

Развертывание Azure AKS

Azure AKS использует твердотельный накопитель Premium v2 или Ultra Disk для требований ввода-вывода Couchbase и частный канал Azure для безопасного подключения XDCR между регионами.

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

Развертывание GCP GKE

Google Kubernetes Engine использует постоянные SSD-диски и идентификацию рабочей нагрузки для безопасного доступа к облачному хранилищу Google для резервного копирования.

# 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 с Longhorn

Для организаций, которым необходим полный контроль над инфраструктурой без привязки к поставщику облачных услуг, k3s без ОС с управлением Rancher и распределенным хранилищем Longhorn станет отличной основой для Couchbase HA. Эта архитектура популярна в регулируемых отраслях, сценариях периферийных вычислений и чувствительных к затратам средах.

k3s / Rancher Bare Metal Couchbase РазвертываниеКонсоль управления RancherУзел 1: сервер k3s (стойка 1)Данные Couchbase + индексcb-prod-0000 | 8 CPU, 64 ГБvBuckets 0-341 активен | Порт SDK 11210Запрос Couchbase (N1QL)cb-prod-0001 | Порт 8093MetalLB VIPPrometheusТом Longhorn/dev/sdb NVMe | 3 реплики на узлахAnti-affinity: отсутствие совместного размещения модулей CouchbaseУзел 2: сервер k3s (стойка 2)Данные Couchbase + индексcb-prod-0002 | 8 CPU, 64 ГБvBuckets 342-682 активен | Порт SDK 11210Поиск Couchbase (FTS)cb-prod-0003 | Порт 8094MetalLB VIPGrafanaТом Longhorn/dev/sdb NVMe | 3 реплики на узлахAnti-affinity: отсутствие совместного размещения модулей CouchbaseУзел 3: агент k3s (стойка-3)Данные Couchbase + аналитикаcb-prod-0004 | 16 CPU,128 ГБvBuckets 683-1023 активен | CBASCouchbase Троеборьеcb-prod-0005 | Потребитель DCPMetalLB VIPОператор CAOТом Longhorn/dev/sdb NVMe | 3 реплики на узлахAnti-affinity: отсутствие совместного размещения модулей CouchbaseБалансировщик нагрузки MetalLBVIP: 192.168.1.200-210 | SDK + веб-консоль + XDCRРезервное копирование: cbbackupmgr → MinIO S3Ежедневно полный + почасовой инкрементальный | MinIO на выделенном NVMeДанные/индексЗапрос/ПоискАналитика/События/MetalLBЛонгхорнРепликация DCPУправление ранчо
# 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 - <
Резервное копирование и восстановление

с помощью cbbackupmgr

Couchbase предоставляетcbbackupmgr— инструмент корпоративного резервного копирования, который поддерживает полное, инкрементное и дифференциальное резервное копирование с дополнительным сжатием и шифрованием. Для производственных развертываний высокой доступности надежная стратегия резервного копирования сочетает резервное копирование уровня Couchbase с возможностями облачных снимков.

Конфигурация резервного копирования

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

Сценарий автоматического резервного копирования для 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."

CouchbaseРезервное копирование CRD (управляется оператором)

Автономный оператор предоставляет CRD для автоматического управления резервным копированием:

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: 3

Настройка производительности запросов N1QL

N1QL (SQL++ для JSON) — это язык запросов Couchbase. Настройка производительности N1QL требует понимания планировщика запросов, проектирования индексов и оптимизации на стороне сервера.

Индексные стратегии

: GSI и 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;
Советы по оптимизации запросов

-- 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};

Управление памятью и конфигурация сегментов

Архитектура

Couchbase, ориентированная на память, означает, что распределение оперативной памяти напрямую влияет на производительность. Каждая служба имеет свою собственную квоту памяти, а сегменты совместно используют квоту службы данных. Правильный размер предотвращает вытеснение кэша, которое ухудшает задержку.

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

Шифрование TLS и RBAC

Для обеспечения безопасности Couchbase в производственной среде требуется шифрование передаваемых данных (TLS), детальное управление доступом на основе ролей (RBAC) и ведение журнала аудита.

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

Kubernetes TLS с диспетчером сертификатов

# 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: ClusterIssuer

Мониторинг с помощью Prometheus Exporter

Couchbase предоставляет богатые показатели с помощью REST API.couchbase-exporterпреобразует их в формат Prometheus для комплексного мониторинга.

# 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: /metrics

Ключевые показатели Couchbase для мониторинга

  • cb_bucket_ops_per_sec— Общее количество операций в секунду на сегмент. Определите базовую производительность и предупреждайте об аномалиях.
  • cb_bucket_mem_used_bytes— Использование памяти сегмента. Оповещение при приближении квоты RAM для предотвращения выселений.
  • cb_bucket_cache_miss_ratio— Доля запросов, которые не попадают в кэш и требуют выборки с диска. Для оптимальной производительности значение должно оставаться ниже 2%.
  • cb_bucket_disk_queue_items— Глубина очереди записи на диск. Растущая очередь указывает на то, что дисковый ввод-вывод не справляется с пропускной способностью записи.
  • cb_xdcr_changes_left— Число мутаций, ожидающих репликации XDCR. Указывает задержку межрегиональной репликации.
  • cb_xdcr_docs_write— Документы реплицируются в секунду через XDCR.
  • cb_node_cpu_utilization_percent— использование CPU для каждого узла. Couchbase использует CPU для сжатия и индексации.
  • cb_bucket_vbucket_active_num— Количество активных виртуальных бакетов на узел. Должно быть примерно одинаково между узлами данных.
  • cb_index_num_docs_pending— Документы, ожидающие обновления индекса. Указывает задержку построения индекса.
  • cb_n1ql_requests_per_sec— пропускная способность запросов N1QL. В сочетании со средней задержкой выявляет проблемы с производительностью запросов.

Правила оповещения Prometheus

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 }}"
Конфигурация строки подключения

SDK для HA

Пакеты SDK

Couchbase учитывают топологию — они поддерживают внутреннюю карту кластера и маршрутизируют операции непосредственно на нужный узел. Правильная настройка SDK имеет решающее значение для обеспечения высокой доступности, обеспечивая быстрое обнаружение аварийного переключения и автоматическое повторение попыток при временных ошибках.

// 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 DNS для подключения 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)

Мобильный шлюз синхронизации Couchbase для периферийных развертываний

Couchbase Mobile расширяет экосистему Couchbase для периферийных устройств и мобильных приложений.Couchbase Liteработает на устройствах iOS, Android и IoT, а шлюз синхронизациидействует как промежуточное программное обеспечение для синхронизации между Couchbase Lite и сервером Couchbase.

// 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-config

Планирование емкости и определение размеров

Правильное планирование мощности имеет важное значение для производительности Couchbase и оптимизации затрат. В следующей таблице представлены рекомендации по определению размера в зависимости от уровня рабочей нагрузки:

.Узлы данных
Уровень рабочей нагрузкиИндекс/запросОЗУ на узелСистема хранения данныхПропускная способность
Разработка1 (все службы)Совмещенный4 ГБТвердотельный накопитель емкостью 20 ГБ<1 тыс. операций в секунду
Малое производство3 Данные2 Запрос+Индекс16 ГБТвердотельный накопитель емкостью 100 ГБ10 тыс. операций в секунду
Среднее производство5 Данные3 Запрос+Индекс32 ГБТвердотельный накопитель емкостью 500 ГБ50 тыс. операций в секунду
Крупносерийное производство7-10 Данные4+ Запрос+Индекс64 ГБ1 ТБ NVMe200 тыс. операций в секунду
Корпоративный / Глобальный10+ данных (многорегиональный)6+ Запрос+Индекс128 ГБ2+ ТБ NVMe500 тыс.+ операций в секунду

Формула определения размеров

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

Процедуры аварийного восстановления и переключения при сбое

Комплексный план аварийного восстановления обеспечивает непрерывность бизнеса, когда сбои инфраструктуры выходят за рамки автоматического переключения.

Отказ одного узла (автоматический)

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

Полный отказ кластера (вручную)

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

Грациозное аварийное переключение и восстановление

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

Значения Helm для полного производственного развертывания

Ниже приведен подробный файл значений Helm для развертывания Couchbase с автономным оператором в производственной среде:

# 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: 200Gi

Заключение

Архитектура сервера

Couchbase, построенная на основе сегментирования на основе vBucket, доступа к данным с приоритетом к памяти и интегрированных многомодельных сервисов, обеспечивает уникальную мощную основу для производственных развертываний с высокой доступностью. Сочетание внутрикластерной репликации с автоматическим переключением при сбое гарантирует прозрачную обработку сбоев одного узла, а XDCR расширяет эту устойчивость на географические регионы для глобальных приложений.

Автономный оператор Couchbase для Kubernetes преобразует сложные ручные операции в декларативные, самовосстанавливающиеся развертывания. Группы серверов обеспечивают осведомленность о стойке/зоне, оператор управляет операциями балансировки во время событий масштабирования, а встроенные устройства резервного копирования CRD автоматизируют подготовку к аварийному восстановлению.

Основные выводы из этого руководства:

  • Использование многомерного масштабирования— разделение служб данных, индексов, запросов, поиска, аналитики и событий на выделенные пулы узлов для независимого масштабирования и изоляции ресурсов.
  • Настройка XDCR для обеспечения устойчивости в нескольких регионах.— двунаправленный XDCR с разрешением конфликтов на основе меток времени обеспечивает активное развертывание в AWS, Azure и GCP. Всегда обеспечивайте синхронизацию NTP.
  • Используйте группы серверов для обеспечения осведомленности о зонах.— сопоставьте группы серверов с зонами доступности или стойками, чтобы гарантировать, что активные и реплики виртуальных бакетов находятся в разных доменах сбоя.
  • Тщательно выбирайте размер памяти— производительность Couchbase напрямую зависит от того, какая часть рабочего набора помещается в ОЗУ. Используйте формулы определения размера и отслеживайте коэффициенты промахов в кэше.
  • Внедрение комплексного мониторинга— развертывание средства экспорта Prometheus с первого дня. Задержка репликации XDCR, коэффициент промахов в кэше, глубина дисковой очереди и работоспособность узла — вот ваши важные сигналы.
  • Автоматизируйте резервное копирование с помощью cbbackupmgr.— объединяйте полные и инкрементные резервные копии с облачными снимками. Регулярно тестируйте процедуры восстановления.
  • Безопасность с помощью TLS и RBAC— включение шифрования TLS между узлами и между клиентами. Используйте детализированные роли RBAC для каждой учетной записи службы приложений.
  • Настройка SDK для высокой доступности— используйте несколько узлов начальной загрузки, настройте соответствующие таймауты, реализуйте чтение реплик в качестве резервного варианта и используйте устойчивую запись для критически важных данных.
  • Планирование аварийного восстановления— задокументируйте и отрепетируйте процедуры аварийного переключения для сценариев сбоя одного узла, нескольких узлов и полного кластера. Резервные кластеры XDCR должны быть всегда готовы к повышению.

Благодаря этой комплексной основе вы сможете развернуть и использовать сервер Couchbase в производственных средах высокой доступности в любой инфраструктуре — от управляемых Kubernetes на AWS, Azure и GCP до «голых» кластеров k3s, управляемых Rancher. Сочетание собственной распределенной архитектуры Couchbase с оркестровкой Kubernetes создает платформу базы данных, отвечающую требованиям современных глобально распределенных приложений.