Тест на вакансию

Установка, настройка и работа с Cassandra в Docker-контейнере

24 декабря 2025 г.
134

Создадим кластер из трёх нод с полной репликацией.

Docker Compose файл

Напишем следующий docker-compose.yml:
networks:
  cassandra-net:
    driver: bridge
services:
  cassandra1:
    image: cassandra:latest
    container_name: cassandra-node1
    environment:
      - CASSANDRA_CLUSTER_NAME=MyCluster
      - CASSANDRA_SEEDS=cassandra1
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_DC=datacenter1
      - MAX_HEAP_SIZE=512M
      - HEAP_NEWSIZE=100M
    networks:
      - cassandra-net
    ports:
      - "9042:9042"
    deploy:
      resources:
        limits:
          memory: 1G
    mem_limit: 1g
  cassandra2:
    image: cassandra:latest
    container_name: cassandra-node2
    environment:
      - CASSANDRA_SEEDS=cassandra1
      - CASSANDRA_CLUSTER_NAME=MyCluster
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_DC=datacenter1
      - MAX_HEAP_SIZE=512M
      - HEAP_NEWSIZE=100M
    networks:
      - cassandra-net
    deploy:
      resources:
        limits:
          memory: 1G
    depends_on:
      - cassandra1
  cassandra3:
    image: cassandra:latest
    container_name: cassandra-node3
    environment:
      - CASSANDRA_SEEDS=cassandra1
      - CASSANDRA_CLUSTER_NAME=MyCluster
      - CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
      - CASSANDRA_DC=datacenter1
      - MAX_HEAP_SIZE=512M
      - HEAP_NEWSIZE=100M
    networks:
      - cassandra-net
    deploy:
      resources:
        limits:
          memory: 1G
    depends_on:
      - cassandra2
Запустим контейнеры:
docker-compose up -d

Создание keyspace и таблицы

Подключаемся к первой ноде:
docker exec -it cassandra-node1 cqlsh

Создаём keyspace:
CREATE KEYSPACE IF NOT EXISTS mykeyspace
WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 3
};
WITH replication — определяет параметры репликации:
  • 'class': 'SimpleStrategy' — простейшая стратегия репликации, подходит для одного дата-центра;
  • 'replication_factor': 3 — каждая запись будет храниться на 3 узлах кластера.
Далее используем созданный keyspace:
USE mykeyspace;

И создадим таблицу пользователей:
CREATE TABLE users (
  user_id UUID PRIMARY KEY,
  username TEXT,
  email TEXT,
  created_at TIMESTAMP
);

Создадим индекс для поля email:
CREATE INDEX ON users (email);

Теперь наш кластер готов к работе.

Тестирование

Вставим данные в первой ноде:
INSERT INTO users (user_id, username, email, created_at)
VALUES (uuid(), 'Eugene Starodubcev', 'eugene@starodubcev.ru', toTimestamp(now()));

Отключимся от первой ноды (команда exit) и перейдём ко второй ноде:
docker exec -it cassandra-node2 cqlsh

Проверим наличие данных:
USE mykeyspace;
SELECT * FROM users;

Отобразиться одна запись пользователя вида:
9041241d-e35f-4296-ac87-316067b9cb36 | 2025-12-24 09:03:22.414000+0000 | eugene@starodubcev.ru | Eugene Starodubcev

Внесём данные во второй ноде:
INSERT INTO users (user_id, username, email, created_at)
VALUES (uuid(), 'Ivan Fedorov', 'ivan@fedorov.ru', toTimestamp(now()));

Отлючимся от второй ноды и перейдём к третьей ноде:
docker exec -it cassandra-node3 cqlsh

Также, проверим наличие данных:
USE mykeyspace;
SELECT * FROM users;
Получим следующие данные:
e7c34354-65f4-4379-9bf2-a685c92d5d70 | 2025-12-24 09:03:51.463000+0000 | ivan@fedorov.ru | Ivan Fedorov
9041241d-e35f-4296-ac87-316067b9cb36 | 2025-12-24 09:03:22.414000+0000 | eugene@starodubcev.ru | Eugene Starodubcev

Внесём данные в третьей ноде:
INSERT INTO users (user_id, username, email, created_at)
VALUES (uuid(), 'Stepan Petrov', 'stepan@petrov.ru', toTimestamp(now()));

Отлючимся от третьей ноды и перейдём обратно к первой:
docker exec -it cassandra-node1 cqlsh
Также, проверим наличие данных:
USE mykeyspace;
SELECT * FROM users;
Получим следующие данные:
8e2a7dc4-4f56-4941-8d68-e9c6852d41d2 | 2025-12-24 09:05:10.170000+0000 | stepan@petrov.ru | Stepan Petrov
e7c34354-65f4-4379-9bf2-a685c92d5d70 | 2025-12-24 09:03:51.463000+0000 | ivan@fedorov.ru | Ivan Fedorov
9041241d-e35f-4296-ac87-316067b9cb36 | 2025-12-24 09:03:22.414000+0000 | eugene@starodubcev.ru | Eugene Starodubcev

Как видно ноды полностью реплицируют данные.

Итого

Все данные будут храниться в 3-х копиях на разных серверах, что обеспечивает отказоустойчивость — если 2 сервера упадут, данные все равно будут доступны. При этом используется простая стратегия репликации. Для продакшена обычно используют NetworkTopologyStrategy.
Поделиться: