24 декабря 2025 г.
Создадим кластер из трёх нод с полной репликацией.
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.