Налаштування кластера Cassandra (multi-datacenter)

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

Налаштування кластера Cassandra (multi-datacenter)

При переході на гео-розподілену архітектуру багато хто стикається з тим, що 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 нових нод та відновлення після split-brain.

Чому варто обрати 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