Для начала необходимо создать две виртуальные машины (например, в VirtualBox) и добавить для них сетевой адаптер, выбрав тип подключения "Internal Network", после чего выполнить установку дистрибутива и первоначальную настройку, в том числе, необходимо присвоить адрес интерфейсу.
В нашем случае машина А будет иметь ip адрес 192.168.1.197, машина Б - 192.168.1.198
Также на машину A установим docker и docker-compose:
apt update
apt install docker.io docker-compose
usermod -aG docker $USER
systemctl enable docker.service
systemctl start docker.service
Далее необходимо подготовить файлы docker-compose.yml, Dockerfile, а также конфигурационные файлы для Cassandra и скрипт, который будет выполняться в контейнерах.
Для Apache Cassandra понадобится 2 конфигурационных файла: cassandra.yaml и cassandra-rackdc.properties.
cassandra.yaml:
cluster_name: 'Test'
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "cassandra1"
listen_address: cassandra1
endpoint_snitch: GossipingPropertyFileSnitch
auto_bootstrap: false
data_file_directories:
- /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000
partitioner: org.apache.cassandra.dht.Murmur3PartitionerЗдесь указаны основные параметры, необходимые для запуска. В качестве "seed" узла будем использовать один из трех наших узлов - cassandra1. Конфигурационные файлы cassandra.yaml для cassandra2 и cassandra3 будут отличаться параметром listen_address и auto_bootstrap.
cassandra-rackdc.properties:
dc=test-dc
rack=rack1
Dockefile:
FROM cassandra:latest
RUN apt update && apt install -y openssh-server gosu
RUN mkdir /var/run/sshd
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
RUN mkdir /var/lib/cassandra/data && \
mkdir /var/lib/cassandra/commitlog && \
mkdir /var/lib/cassandra/hints && \
mkdir /var/lib/cassandra/saved_caches
ARG CASSANDRA_CONFIG_FILE
ARG CASSANDRA_RACKDC_CONFIG_FILE
COPY ${CASSANDRA_CONFIG_FILE} /etc/cassandra/cassandra.yaml
COPY ${CASSANDRA_RACKDC_CONFIG_FILE} /etc/cassandra/cassandra-rackdc.properties
RUN mkdir /root/.ssh/
COPY ssh/cassandra-key.pub /root/.ssh/authorized_keys
EXPOSE 22 9042 7000 7199
COPY ./scripts/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
CMD ["cassandra", "-f"]
В каждый контейнер при сборке устанавливается openssh-server для доступа по ssh и gosu (для запуска cassandra от пользователя cassandra). Также изменяется конфигурационный файл /etc/ssh/sshd_config. После этого создаются директории, которые cassandra использует в ходе работы, а также копируются конфигурационные файлы. Далее создается директория /root/.ssh и копируется публичный ключ в файл authorized_keys (ключ необходимо создать перед запуском, это будет описано в разделе Запуск).
entrypoint.sh:
#!/bin/bash
set -e
service ssh start
exec gosu cassandra "$@"
docker-compose.yml:
networks:
cassandra:
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
services:
cassandra1:
build:
context: .
args:
- CASSANDRA_CONFIG_FILE=cassandra/cassandra1/cassandra.yaml
- CASSANDRA_RACKDC_CONFIG_FILE=cassandra/cassandra1/cassandra-rackdc.properties
container_name: cassandra1
hostname: cassandra1
networks:
cassandra:
ipv4_address: 192.168.1.200
environment:
- MAX_HEAP_SIZE=2048M
- HEAP_NEWSIZE=512M
volumes:
- cassandra1_data:/var/lib/cassandra
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "nodetool", "status"]
interval: 2m
start_period: 2m
timeout: 10s
retries: 3
cassandra2:
build:
context: .
args:
- CASSANDRA_CONFIG_FILE=cassandra/cassandra2/cassandra.yaml
- CASSANDRA_RACKDC_CONFIG_FILE=cassandra/cassandra2/cassandra-rackdc.properties
container_name: cassandra2
hostname: cassandra2
networks:
cassandra:
ipv4_address: 192.168.1.201
environment:
- MAX_HEAP_SIZE=2048M
- HEAP_NEWSIZE=512M
volumes:
- cassandra2_data:/var/lib/cassandra
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "nodetool", "status"]
interval: 2m
start_period: 2m
timeout: 10s
retries: 3
depends_on:
cassandra1:
condition: service_healthy
cassandra3:
build:
context: .
args:
- CASSANDRA_CONFIG_FILE=cassandra/cassandra3/cassandra.yaml
- CASSANDRA_RACKDC_CONFIG_FILE=cassandra/cassandra3/cassandra-rackdc.properties
container_name: cassandra3
hostname: cassandra3
networks:
cassandra:
ipv4_address: 192.168.1.202
environment:
- MAX_HEAP_SIZE=2048M
- HEAP_NEWSIZE=512M
volumes:
- cassandra3_data:/var/lib/cassandra
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "nodetool", "status"]
interval: 2m
start_period: 2m
timeout: 10s
retries: 3
depends_on:
cassandra2:
condition: service_healthy
volumes:
cassandra1_data:
cassandra2_data:
cassandra3_data:
В docker-compose.yml описывается сеть, которая создается для контейнеров, а также адреса, переменные окружения и другие параметры для контейнеров.
Для запуска необходимо сгенерировать ключи, а затем запустить кластер.
ssh-keygen -t rsa -f ssh/cassandra-key
docker-compose up -d --build
В любой момент можно проверить состояние контейнеров командой
docker ps -a
Проверить, что кластер успешно запустился, можно командой nodetool status
Подключение к 192.168.1.200 с 192.168.1.197:
Далее, для того, чтобы был доступ с машины Б к машине А, а также к любому из узлов кластера, необходимо выполнить следующее:
Добавить маршруты с машины А на машину Б и к каждому из узлов кластера:
sudo ip route add 192.168.1.200/32 dev br-3615a3cbad84
sudo ip route add 192.168.1.201/32 dev br-3615a3cbad84
sudo ip route add 192.168.1.202/32 dev br-3615a3cbad84
sudo ip route add 192.168.1.198/32 dev enp0s8
Замечание: названия интерфейсов могут отличаться
Включить форвардинг пакетов:
sudo iptables -P FORWARD ACCEPT
Включить "маскарадинг" для пакетов, которые идут на 192.168.1.200, 192.168.1.201 и 192.168.1.202 из подсети 192.168.1.0/24
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.200/32 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.201/32 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.202/32 -j MASQUERADE
Также на машине Б нужно добавить маршруты к узлам кластера:
sudo ip route add 192.168.1.200/32 via 192.168.1.197/32
sudo ip route add 192.168.1.201/32 via 192.168.1.197/32
sudo ip route add 192.168.1.202/32 via 192.168.1.197/32
Затем нужно установить cqlsh.
apt install python3-venv
python3 -m venv cassandra-env
cd cassandra-env
bin/pip install cqlsh
bin/cqlsh <address> <port>
После этого можно будет подключиться к любому узлу кластера с машины Б и добавить какие-либо данные в базу данных:



