Администрирование Apache Cassandra / ScyllaDB: аудит и поддержка

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

Cassandra и ScyllaDB — базы данных для задач, где PostgreSQL и MySQL сдаются: миллионы записей в секунду, петабайты данных, нулевой tolerance к downtime. Но цену за это линейное масштабирование приходится платить — операционная сложность выше на порядок. Мы часто сталкиваемся с ситуациями, когда неправильно выбранный partition key или случайный ALLOW FILTERING в продакшене приводят к деградации кластера. За годы работы мы выработали методологию, которая предотвращает такие сценарии. Подробнее об Apache Cassandra можно прочитать в официальной документации.

Ключевые отличия ScyllaDB от Cassandra

ScyllaDB написана на C++ и реализует shard-per-core архитектуру: каждое ядро CPU обрабатывает свой собственный набор данных без shared state между потоками. Это даёт в 10 раз меньшие p99 latency при той же нагрузке по сравнению с JVM-based Cassandra. На практике: то, что требовало 6 нод Cassandra, на ScyllaDB работает на 2 нодах с лучшими показателями.

Cassandra — зрелый продукт с богатой экосистемой, лучшей совместимостью с enterprise-инструментами и более консервативным характером изменений. ScyllaDB совместима с CQL и Cassandra-драйверами, но имеет свои особенности (например, другую реализацию lightweight transactions). Наш опыт показывает, что выбор между ними зависит от требований к latency и плотности нод.

Топология и конфигурация кластера

Минимальный production-кластер: 3 ноды с RF=3. Это означает, что каждый partition реплицируется на все три ноды, и потеря одной ноды не приводит к потере данных. Рекомендуем использовать инстансы с выделенными CPU и SSD для коммитлога.

cassandra.yaml для production-ноды:

cluster_name: 'prod-cluster'
num_tokens: 256
seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: "10.0.1.10,10.0.1.11"
listen_address: 10.0.1.10
rpc_address: 0.0.0.0
broadcast_rpc_address: 10.0.1.10
endpoint_snitch: GossipingPropertyFileSnitch
auto_bootstrap: true
# Compaction
compaction_throughput_mb_per_sec: 64
# Memtable
memtable_allocation_type: offheap_objects
memtable_heap_space_in_mb: 2048
# Commitlog
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000
commitlog_segment_size_in_mb: 64
concurrent_reads: 32
concurrent_writes: 32
concurrent_counter_writes: 16

GossipingPropertyFileSnitch используется в production — он читает cassandra-rackdc.properties для определения датацентра и стойки:

dc=DC1 rack=RAC1 

Почему важно правильно выбрать partition key?

Partition key определяет, на каком узле хранятся данные. Если ключ выбран неудачно, возникает hot partition — один узел получает 80% нагрузки, а остальные простаивают. Cassandra не реляционная: нет JOIN, нет вторичных индексов в привычном смысле. Схему проектируют под запросы, а не под нормализацию.

Пример правильной таблицы для хранения событий с сортировкой по времени:

CREATE TABLE events_by_user (
    user_id UUID,
    event_time TIMEUUID,
    event_type TEXT,
    payload TEXT,
    PRIMARY KEY (user_id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC)
AND compaction = {
    'class': 'TimeWindowCompactionStrategy',
    'compaction_window_size': '1',
    'compaction_window_unit': 'DAYS'
};

user_id — partition key, данные одного пользователя хранятся вместе. event_time — clustering key, определяет порядок внутри партиции. Запрос WHERE user_id = ? AND event_time > ? выполняется эффективно без ALLOW FILTERING.

Как настроить compaction для высокой нагрузки?

Compactions перепаковывают SSTables и удаляют удалённые записи. Типичная ошибка — выбор неверной стратегии. Для временных рядов используйте TimeWindowCompactionStrategy (TWCS): она объединяет SSTables только в пределах окна, снижая нагрузку. Для случайного доступа — SizeTieredCompactionStrategy (STCS), но следите за min_threshold (по умолчанию 4) — слишком частое compacting убивает IO. Для ScyllaDB дополнительно настраивается scylla.yaml:

compaction_static_shares: 0.5 table_compaction_dynamic_shares: true 

Параметр compaction_throughput_mb_per_sec в cassandra.yaml ограничивает пропускную способность compacting. Рекомендуем выставлять 64-128 MB/s, чтобы не ущемлять read/write latency.

Обслуживание кластера: nodetool и мониторинг

nodetool repair — критически важная операция, которую часто игнорируют. Без регулярного repair anti-entropy данные между репликами расходятся. Запускать раз в gc_grace_seconds (по умолчанию 10 дней). Используйте инкрементальный repair для снижения нагрузки:

# Инкрементальный repair — менее нагружает кластер
nodetool repair -inc -pr keyspace_name table_name

# Мониторинг состояния нод
nodetool status
nodetool tpstats # thread pool statistics
nodetool compactionstats # текущие compaction задачи

ScyllaDB добавляет scyllatop — интерактивный top для мониторинга shard-уровня. Для Prometheus: cassandra-exporter или встроенный JMX exporter для Cassandra, scylla-monitoring стек для ScyllaDB (включает готовые Grafana dashboards). Настраиваем алерты на p99 latency, compaction backlog и repair status.

ScyllaDB-специфика

В ScyllaDB нет отдельного nodetool repair — вместо него scylladb-manager (отдельный сервис) управляет repair-задачами в фоне, распределяя нагрузку по времени. Это значительно удобнее. scylla.yaml имеет дополнительные параметры:

---
# Developer mode (отключить в production!)
developer_mode: false

# SMP — количество потоков (по числу ядер)
smp: 8

# Overprovisioning (для виртуалок)
overprovisioned: false
---

Что входит в нашу работу по администрированию

  • Аудит существующего кластера: анализ nodetool status, распределение данных (nodetool tablestats), топ нагруженных таблиц, выявление ALLOW FILTERING в логах, состояние compaction.
  • Развёртывание нового кластера: Ansible-роль для установки, настройка конфигов, инициализация seed-нод, создание keyspaces с оптимальным RF, load-тестирование через cassandra-stress.
  • Передача результатов: полный runbook с инструкциями по добавлению/замене нод, расписание repair, конфигурация Prometheus-алертов, обучение команды.
  • Гарантия: на протяжении 30 дней после передачи мы сопровождаем кластер, исправляем возможные проблемы. Наш опыт — 10+ лет в продакшене, более 50 успешных проектов.
Типичная ошибка при настройке consistency level Начинающие администраторы часто выставляют `LOCAL_QUORUM` на все операции, забывая, что при потере одной ноды из трёх кластер становится недоступен на запись. Оптимально: read — `LOCAL_ONE`, write — `LOCAL_QUORUM` с `hinted handoff`. Для ключевых данных — `EACH_QUORUM` в мультидатацентровой конфигурации.
Конфигурация Срок
Аудит существующего кластера 1 день
Новый кластер 3-6 нод 2-3 дня
Миграция с Cassandra на ScyllaDB 3-5 дней
Мультидатацентровый кластер 4-6 дней

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

Хотите обезопасить свой кластер? Получите консультацию инженера — мы проведём аудит и дадим рекомендации по улучшению. Закажите аудит вашего кластера прямо сейчас — свяжитесь с нами для записи.

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

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

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