Thank you for reading this post, don't forget to subscribe!
На официальном сайте приводятся примеры установки Cassandra разными способами:
- Запуск как приложение docker.
- Загрузка и запуск бинарника.
- Использование репозитория.
Проще всего использовать последний метод. Мы же рассмотрим все варианты. Также, в рамках данной инструкции, посмотрим на некоторые настройки СУБД.
Установка с помощью репозитория
Данный вариант удобен, если есть поддержка используемой операционной системы со стороны разработчика Cassandra, и мы можем подключить репозиторий. Рассмотрим установку для различных дистрибутивов Linux.
Установка OpenJDK
Независимо от типа Linux, в системе должна быть установлена платформа для обработки Java. Самый удобный способ это сделать — установить пакет OpenJDK.
Debian / Ubuntu
Нам необходимо правильно подключить репозиторий. Для этого нужно перейти на страницу загрузки Cassandra и внимательно посмотреть на предлагаемые версии программного продукта. На момент написания инструкции, стабильной версией была 4.0.х. В репозитории Cassandra названия релизов строятся исходя из номеров версий без точки, то есть версия 4.0.х будет релизом 40x.
Создаем файл:
vi /etc/apt/sources.list.d/cassandra.list
1 2 3 |
deb https://debian.cassandra.apache.org 40x main |
* где 40x соответствует версии 4.0.х. Есть и более свежая версия, но мы сознательно выбрали стабильный релиз.
** если мы работаем не с Debian, нас не должно смущать debian в названии пути. Пакеты рассчитаны для установки на любом DEB-дистрибутиве.
Добавим ключ репозитория:
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -
Обновим кэш репозиториев:
apt update
Можно устанавливать Cassandra:
apt install cassandra
Готово. Проверить состояние можно командой:
nodetool status
Rocky Linux
Содержимое конфигурационного файла для репозитория зависит от версии релиза, которую мы будем устанавливать. Переходим на страницу загрузки Cassandra и внимательно смотрим на предлагаемые версии программы. Допустим, нам нужна стабильная версия — на момент написания данной инструкции она была 4.0.х. В репозитории Cassandra названия релизов строятся исходя из номеров версий без точки, то есть версия 4.0.х будет релизом 40x.
Создаем файл:
vi /etc/yum.repos.d/cassandra.repo
1 2 3 4 5 6 |
[cassandra] name=Apache Cassandra baseurl=https://redhat.cassandra.apache.org/40x/ gpgcheck=1 repo_gpgcheck=1 gpgkey=https://downloads.apache.org/cassandra/KEYS |
* в нашем примере планируется установить cassandra версии 4.0.x.
Импортируем GPG-ключи репозитория:
rpm --import https://downloads.apache.org/cassandra/KEYS
Устанавливаем СУБД:
yum install cassandra
Разрешим автостарт и запустим сервис:
systemctl enable cassandra
systemctl start cassandra
Готово. Проверить состояние можно командой:
nodetool status
Установка бинарника
Это универсальный способ установки, который подойдет для большинства систем. Однако, он требует дополнительных действий.
Для удобства, разобьем процесс на этапы.
Установка OpenJDK
В системе должна быть установлена платформа для обработки Java. Самый удобный способ это сделать в Linux — установить пакет OpenJDK.
Загрузка и распаковка бинарных файлов
На странице загрузки Cassandra находим нужную версию СУБД и переходим по ссылке.
На странице копируем ссылку для ее загрузки:
* в нашем примере скопирована ссылка на архив последней стабильной версии.
Используя ссылку, скачиваем архив на сервере:
wget https://dlcdn.apache.org/cassandra/4.0.7/apache-cassandra-4.0.7-bin.tar.gz
Распаковываем архив:
tar xzvf apache-cassandra-*-bin.tar.gz
Переносим содержимое в каталог /opt:
mv apache-cassandra-*/ /opt/cassandra
Настройка запуска
Для автозапуска будем использовать сервис, созданный как юнит в systemd.
Создаем пользователя, из-под которого будет запускаться сервис:
useradd -r -c 'Cassandra database' cassandra
В качестве владельца каталога /opt/cassandra задаем созданного пользователя:
chown -R cassandra:cassandra /opt/cassandra
Создадим файл:
vi /etc/systemd/system/cassandra.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[Unit] Description=Cassandra Service After=network.target [Service] RuntimeDirectory=cassandra PIDFile=/var/run/cassandra/cassandra.pid Environment=CASSANDRA_HOME=/opt/cassandra Environment=CASSANDRA_CONF=/opt/cassandra/conf Environment=CASSANDRA_INCLUDE=/opt/cassandra/tools/bin/cassandra.in.sh Environment=CASSANDRA_OWNR=cassandra User=cassandra Group=cassandra Type=forking ExecStart=/usr/sbin/cassandra -p /var/run/cassandra/cassandra.pid StandardOutput=journal StandardError=journal LimitNOFILE=100000 LimitMEMLOCK=infinity LimitNPROC=32768 LimitAS=infinity Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target |
Разрешаем сервис и стартуем его:
systemctl enable cassandra
systemctl start cassandra
Проверим состояние командой:
systemctl status cassandra
Настройка системных переменных и проверка работы СУБД
Так как бинарники для запуска утилит, с помощью которых можно работать с cassandra находятся в нестандартном каталоге (/opt), нам нужно прописывать до них полный путь. Это не очень удобно.
Создадим файл:
vi /etc/profile.d/cassandra.sh
1 2 3 |
export PATH="${PATH}:/opt/cassandra/bin:/opt/cassandra/tools/bin" |
* в нашем примере мы добавили 2 каталога — /opt/cassandra/bin и /opt/cassandra/tools/bin. При вводе короткой команды, система будет также учитывать данные каталоги для поиска введенной команды.
Теперь выходим из текущего сеанса (комбинация Ctrl + D) и снова входим в систему. Если необходимо войти под суперпользователем, используем минус:
sudo su -
Пробуем ввести команду:
nodetool status
Запуск в качестве приложения Docker
Данный способ удобнее с точки зрения установки — нам не нужно ничего делать, так как приложение уже упаковано в контейнер. Однако, нам необходимо уметь работать с самим Docker.
Рассмотрим процесс подготовки сценария docker-compose для запуска cassandra.
Установка Docker Engine
Также нам нужно установить docker-compose. Данный процесс также описан в инструкции.
Создание сценария и запуск контейнера
Создадим каталог, в котором будет сценарий запуска cassandra:
mkdir /opt/cassandra
Перейдем в него:
cd /opt/cassandra
Создадим сценарий:
vi docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
services: cassandra: image: cassandra:latest container_name: cassandra hostname: cassandra restart: unless-stopped environment: TZ: "Europe/Moscow" volumes: - ./data:/var/lib/cassandra ports: - 9042:9042 |
* обратите внимание, что мы пробрасываем содержимое каталога /var/lib/cassandra в контейнере в текущую директорию (/opt/cassandra), папку data.
Запускаем контейнер:
docker-compose up -d
Проверить статус работы кассандры в docker можно командой:
docker exec -it cassandra nodetool status
Настройка подключения по сети
По умолчанию, сервис слушает на локальном адресе. При использовании docker это не важно, но при установке СУБД из пакетов или бинарников мы не сможем подключиться к базе по сети.
Для начала, убедимся, что брандмауэр разрешить сетевые запросы на порту 9042 (на нем по умолчанию работает cassandra). В зависимости от утилиты управления netfilter, наши действия будут отличаться.
а) Для iptables (как правило, на DEB):
iptables -I INPUT -p tcp --dport 9042 -j ACCEPT
Сохраняем правило:
apt install iptables-persistent
netfilter-persistent save
б) Для firewalld (как правило, на RPM):
firewall-cmd --permanent --add-port=9042/tcp
firewall-cmd --reload
Настройка брандмауэра завершена.
Теперь открываем конфигурационный файл cassandra. В зависимости от типа установки, путь до него будет отличаться.
а) При установке из пакетов:
vi /etc/cassandra/cassandra.yaml
б) Бинарники:
vi /opt/cassandra/conf/cassandra.yaml
Приводим опцию rpc_address к виду:
rpc_address: 192.168.0.15
* где 192.168.0.15 — IP-адрес, на котором слушает наш сервер cassandra.
Если у нас несколько сетевых адресов и нужно, чтобы cassandra слушала на каждом из них, то править нужно две опции:
rpc_address: 0.0.0.0
…
broadcast_rpc_address: 192.168.0.15
* rpc_address мы выставляем на любой адрес, а в качестве значения broadcast_rpc_address выставляем адрес одного из интерфейсов, на котором будет работать broadcast для взаимодействия с другими нодами (при работе в режиме кластера).
Перезапускаем сервер баз данных:
systemctl restart cassandra
Ждем около 15 секунд. Проверяем, что сервер стал слушать на сетевом адресе:
ss -tunlp | grep 9042
Мы должны увидеть что-то на подобие:
tcp LISTEN 0 4096 192.168.0.15:9042
Для проверки подключения можно установить cqlsh на любой другой компьютер в сети.
Это можно выполнить разными способами, например, с помощью пакетного менеджера pip. Сначала его установим.
а) Для систем DEB:
apt install python3-pip
б) Для систем RPM:
yum install python3-pip
После установки pip можно перейти к установке cqlsh.
Выполняем команду:
pip3 install cqlsh
Можно подключаться к СУБД по сети:
cqlsh 192.168.0.15
* напомним, что 192.168.0.15 — адрес сервера cassandra.
Использование аутентификации
Открываем конфигурационный файл cassandra. В зависимости от типа установки, путь до него будет отличаться.
а) При установке из пакетов:
vi /etc/cassandra/cassandra.yaml
б) Бинарники:
vi /opt/cassandra/conf/cassandra.yaml
Находим опцию:
authenticator: AllowAllAuthenticator
И меняем ее на:
authenticator: PasswordAuthenticator
Перезапускаем cassandra:
systemctl restart cassandra
Информацию о логинах и паролях хранится в системной таблице. По умолчанию, создан пользователь cassandra с паролем cassandra.
Подключиться можно командой:
cqlsh -u cassandra 192.168.0.15
* где cassandra — логин; 192.168.0.15 — адрес сервера.
Система запросит пароль — вводим cassandra. В итоге, мы должны увидеть строку ввода команд:
cassandra@cqlsh>
Рекомендуется сразу создать новую учетную запись суперпользователя и отключить встроенную:
1 |
> CREATE ROLE test WITH SUPERUSER = true AND LOGIN = true AND PASSWORD = 'test111'; |
* где test — логин; test111 — пароль.
Выходим из командной оболочки cqlsh:
> quit
Заходим под созданной учетной записью:
cqlsh -u test 192.168.0.15
Для отключения учетной записи по умолчанию вводим:
> ALTER ROLE cassandra WITH SUPERUSER = false AND LOGIN = false;
SSL/TLS шифрование
Процесс настройки шифрованного обмена трафика состоит из следующих шагов:
- Генерируем сертификаты для сервера и клиента(ов).
- Настраиваем сервер для работы с использованием созданного сертификата.
- Настраиваем клиента.
Рассмотрим эти шаги подробнее.
Создание сертификатов
Будем работать на сервере. Создадим каталог для хранения сертификатов:
mkdir /etc/ssl/cassandra
Перейдем в него:
cd /etc/ssl/cassandra
Воспользуемся утилитой keytool для создания хранилища ключей java (keystore):
1 |
keytool -genkeypair -noprompt -keyalg RSA -keysize 2048 -validity 36500 -alias server1 -keystore keystore.jks -storepass cassandra -keypass cassandra -dname "CN=cassandra, O=Global Security, L=SPb, ST=SPb, C=RU" |
* в данном примере будет создан файл keystore.jks для хранения пар сертификатов. Данные в ключе dname можно задать свои. Обратите внимание, что в качестве пароля для keystore и ключа мы задали cassandra.
Создадим сертификаты для клиента:
1 |
openssl req -x509 -days 1461 -newkey rsa:2048 -nodes -sha256 -keyout client1.key -out client1.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=cassandra.test.local/CN=test" |
* в данном примере мы создадим открытый ключ client1.pem и закрытый client1.key. Действие данного сертификата будет распространяться на 1461 день (4 года). В ключе subj передаются данные сертификата — желательно, чтобы они соответствовали вашей организации.
Экспортируем сертификат сервера из созданного ранее keystore.jks:
1 |
keytool -exportcert -rfc -noprompt -alias server1 -keystore keystore.jks -storepass cassandra -file cassandra_server.pem |
* в результате мы получим файл cassandra_server.pem, содержащий последовательность для шифрования данных. Данный файл будем использовать на клиентах.
Импортируем клиентский сертификат в кейстор сервера:
1 |
keytool -import -file client1.pem -alias client1 -keystore truststore.jks -storepass cassandra |
* данная команда создаст новый кейстор-файл truststore.jks и импортирует в него последовательность для ключа client1.
Подтверждаем импорт:
1 |
Trust this certificate? [no]: yes |
Сертификаты готовы.
Настройка сервера
Открываем файл конфигурации. Напомним, что в зависимости от типа установки, путь до него будет отличаться.
а) При установке из пакетов:
vi /etc/cassandra/cassandra.yaml
б) Бинарники:
vi /opt/cassandra/conf/cassandra.yaml
В открывшемся файле находим директиву client_encryption_options.
Приводим ее к виду:
1 2 3 4 5 6 7 8 9 10 11 |
client_encryption_options: ... enabled: true ... keystore: /etc/ssl/cassandra/keystore.jks keystore_password: cassandra ... require_client_auth: true ... truststore: /etc/ssl/cassandra/truststore.jks truststore_password: cassandra |
* где:
- enabled — разрешает использование шифрования между сервером и клиентом.
- keystore — путь до кейстор-файла.
- keystore_password — пароль для keystore. В нашем примере cassandra.
- require_client_auth — требует проверки клиентских сертификатов.
- truststore — путь до кейстора с доверенными клиентскими сертификатами.
- truststore_password — пароль для контейнера с доверенными сертификатами. В нашем примере cassandra.
Для применения настроек, перезапустим сервис cassandra:
systemctl restart cassandra
Настройка сервера выполнена. Можно переходить к клиенту.
Настройка клиента и подключение к серверу
Копируем файлы с сервера на клиентский компьютер:
- cassandra_server.pem
- client1.key
- client1.pem
Разместим скопированные файлы в любом каталоге. Для удобства, будем использовать такой же путь, что и на сервере:
mkdir /etc/ssl/cassandra
Создадим конфигурационный файл для клиента cqlsh:
vi ~/.cassandra/cqlshrc
* стандартный путь до конфигурационного файла cqlshrc находится в домашней директории пользователя + .cassandra/cqlshrc.
Пропишем следующее:
1 2 3 4 5 |
[ssl] certfile = /etc/ssl/cassandra/cassandra_server.pem validate = true userkey = /etc/ssl/cassandra/client1.key usercert = /etc/ssl/cassandra/client1.pem |
* в данном примере мы указываем пути до последовательностей, которые должны использоваться при шифровании данных.
Пробуем подключиться к серверу:
cqlsh --ssl -u test 192.168.0.15
* для шифрованного подключения мы добавляем опцию --ssl.
** так как в нашем примере мы настроили аутентификацию, то в строке подключения необходимо указать опцию -u и пользователя (test).