Настройка Cassandra кластера (multi-datacenter)

Когда бизнес выходит на новые регионы, Cassandra-кластер в одном датацентре перестаёт отвечать требованиям отказоустойчивости и скорости. Мы настраиваем multi-datacenter конфигурацию под ключ: проектируем гео-распределённую репликацию, подбираем оптимальные стратегии консистентности и snitch, чтобы система надёжно работала даже при потере целого датацентра. Наша команда берёт на себя весь цикл — от аудита до внедрения и последующей поддержки.
Часто задаваемые вопросы

При переходе на гео-распределённую архитектуру many сталкиваются с тем, что Cassandra кластер, работающий в одном датацентре, перестаёт справляться с нагрузкой или требованиями отказоустойчивости. Мы помогаем настроить multi-datacenter конфигурацию под ключ — она выдерживает потерю целого датацентра без потери данных и времени простоя. Наш опыт — 5+ лет, более 30 проектов с multi-datacenter Cassandra. За это время мы накопили методики, которые позволяют избежать типичных ошибок: неправильного выбора snitch, неверных seed-узлов и неоптимальных уровней консистентности. Оценим ваш проект и предложим архитектуру с учётом ваших RPO и RTO.

Multi-datacenter Cassandra — это не просто «поставить ноды в двух местах». Это отдельная дисциплина: выбор snitch, стратегия репликации, консистентность запросов, обработка network partition между датацентрами. Без понимания CAP-теоремы в контексте Cassandra мультидатацентровый кластер превращается в машину для генерации hint-очередей и stale-данных. Ниже разбираем ключевые аспекты многоцентровой настройки.

Как обеспечить гео-избыточность?

Для одиночного датацентра используют SimpleStrategy. Для мультидатацентровой конфигурации — только NetworkTopologyStrategy. Она позволяет задать разный replication factor для каждого датацентра:

CREATE KEYSPACE app_data WITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'DC1': 3, 'DC2': 3 }; 

RF=3 в каждом датацентре означает: кластер переживёт полную потерю одного датацентра без потери данных. При DC1 в Amsterdam и DC2 в Frankfurt — это реальная гео-избыточность. Сравните: при использовании SimpleStrategy потеря одного датацентра привела бы к потере всех данных в нём.

Какой snitch выбрать для production?

Cassandra должна знать, в каком датацентре и на какой стойке находится каждая нода. Это работа snitch. GossipingPropertyFileSnitch — стандартный выбор для production. Каждая нода читает /etc/cassandra/cassandra-rackdc.properties:

dc=DC1 rack=RACK1 

В cassandra.yaml на всех нодах указываем одинаковое имя кластера и seeds из обоих датацентров:

cluster_name: 'global-cluster'
endpoint_snitch: GossipingPropertyFileSnitch
seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: "10.0.1.10,10.0.1.11,10.1.1.10,10.1.1.11"

Seeds должны быть в обоих датацентрах — это важно для bootstrap новых нод и восстановления после сплит-брейна.

Почему стоит выбрать LOCAL_QUORUM?

Здесь начинаются реальные архитектурные решения. QUORUM считает кворум от всех реплик всех датацентров. При RF=3 в двух датацентрах (6 реплик итого) — нужно подтверждение от 4 реплик. Если один датацентр недоступен, запись падает. Для большинства сценариев это слишком строго.

LOCAL_QUORUM считает кворум только в локальном датацентре. Запись успешна, если большинство локальных реплик подтвердили. Это стандартный выбор для мультидатацентрового кластера — приложение пишет с LOCAL_QUORUM, читает с LOCAL_QUORUM, и при потере датацентра продолжает работать. Фактически LOCAL_QUORUM даёт прирост производительности в 2 раза по сравнению с глобальным QUORUM при отказе одного датацентра: для записи достаточно 2 из 3 реплик в локальном DC, а не 4 из 6.

EACH_QUORUM требует кворума в каждом датацентре — используется, когда нельзя допустить расхождения данных между датацентрами даже временно. На практике: write с LOCAL_QUORUM, read с LOCAL_QUORUM. Если нужно гарантировать чтение свежих данных в другом регионе — SERIAL или LOCAL_SERIAL для lightweight transactions.

Сравнение уровней консистентности:

Уровень Кворум Производительность при потере DC
QUORUM Глобальный Запись падает
LOCAL_QUORUM Локальный Работает
EACH_QUORUM По всему DC Работает, но медленнее

Как мы это делаем: кейс из практики

Недавно мы разворачивали multi-datacenter для клиента с нодами в AWS (us-east-1) и Azure (west-europe). Требование: RPO < 1 минута, автоматическое переключение при отказе одного DC. Мы использовали GossipingPropertyFileSnitch, RF=3 в каждом датацентре, LOCAL_QUORUM для записи и чтения. Для минимизации задержек настроили cross-datacenter repair с throttling 50 MB/s. В результате при отказе AWS-региона приложение продолжило работу без потери данных и ручного вмешательства. Экономия времени на восстановление — до нескольких часов вручную.

Типичные проблемы мультидатацентрового кластера

  • Разные версии Cassandra в датацентрах. При rolling upgrade нужно обновлять ноды по одной, не допуская несовместимых версий протокола между датацентрами. Cassandra поддерживает rolling upgrade только между соседними minor-версиями.
  • Неправильные seeds. Если seeds указывают только на один датацентр, ноды второго датацентра при рестарте могут не видеть первый. Seeds должны быть в каждом DC.
  • Firewall между датацентрами. Cassandra нужен порт 7000 (межнодовое взаимодействие) и 9042 (CQL) между всеми нодами всех датацентров. Частичное закрытие приводит к split-brain.
  • Timezone при TTL. Cassandra вычисляет TTL в UTC. Если серверы в разных датацентрах имеют разные timezone и время не синхронизировано через NTP — данные с TTL удаляются несинхронно.

Команды для repair:

# Repair только локального датацентра
nodetool repair -dc DC1 -pr keyspace_name
# Full repair кластера (нагрузит межцентровой канал!)
nodetool repair keyspace_name

Межцентровой repair — тяжёлая операция. На кластерах с терабайтами данных запускать в часы минимальной нагрузки, с throttling:

nodetool setstreamthroughput 50 nodetool setcompactionthroughput 50 

Процесс развёртывания

Начинаем с одного датацентра — разворачиваем кластер, проверяем репликацию, нагружаем тестами. Только после этого добавляем второй датацентр.

При добавлении второго DC: запускаем ноды второго датацентра с теми же seeds, ждём пока gossip разойдётся (nodetool status показывает ноды обоих DC), затем запускаем nodetool rebuild -- DC1 на каждой ноде DC2 для копирования данных из первого датацентра. После rebuild обновляем keyspace для включения репликации в DC2 и запускаем repair.

Этап Срок
Аудит текущей топологии (если есть) 0.5 дня
Развёртывание первого DC 1-2 дня
Добавление второго DC + rebuild 1-2 дня
Тестирование failover + документация 1 день

Что входит в работу

  • Аудит текущей архитектуры и рекомендации по топологии.
  • Развёртывание кластера в одном или нескольких датацентрах.
  • Настройка NetworkTopologyStrategy, snitch, уровней консистентности.
  • Конфигурация мониторинга (Prometheus + Grafana) и алертов.
  • Документация по эксплуатации и runbook для failover.
  • Обучение команды заказчика (2-3 сессии).
  • Пост-релизная поддержка 2 недели.

Стоимость рассчитывается индивидуально после анализа требований к RPO/RTO и объёму данных. Свяжитесь с нами для оценки проекта — получите консультацию по вашей архитектуре.

Apache Cassandra — распределённая система управления базами данных. Википедия

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139