Skip to content

X1pster/uno-soft-test-task

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Развертывание кластера Apache Cassandra в Docker

Подготовка

Для начала необходимо создать две виртуальные машины (например, в 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>

После этого можно будет подключиться к любому узлу кластера с машины Б и добавить какие-либо данные в базу данных:

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors