Работа с внешней базой данных Cassandra
Встроенная служба Cassandra, используемая сервером SberMobile, достаточна для широкого спектра случаев использования, но исключительно большие или специализированные системы могут потребовать уникальных конфигураций баз данных. В SberMobile предусмотрена возможность соединения с внешним экземпляром Cassandra, что дает администраторам детальный контроль над инфраструктурой базы данных.
Развертывание высокопроизводительного внешнего экземпляра Cassandra
По умолчанию сервер SberMobile настраивает встроенную службу Cassandra, применяя параметры databaseCassandra*
из собственной конфигурации(server.xml
по умолчанию) и некоторые жестко закодированные значения.
Чтобы настроить высокопроизводительный экземпляр Cassandra, используйте внешний YAML-файл
конфигурации cassandra.yaml
. Текущий файл является стандартным способом конфигурирования автономной установки БД Cassandra. Все поддерживаемые параметры описаны в официальной документации по Cassandra.
Чтобы использовать эту функцию:
Установлено Java 8 или JDK 8.
Установите (распакуйте) последнюю версию Cassandra.
Редактировать
config/cassandra.yaml
Изменение каталога данных и каталога commitlog (желательно на разных физических дисках).
Укажите IP-адрес сервера Cassandra в семенах, listen_address и rpc_address.
Измените start_rpc на true.
Установите переменную окружения
JAVA_HOME
в корневую папку JRE/JDK.Установите переменную окружения
CASSANDRA_HOME
в папку установки Cassandra.Отредактируйте
bin/cassandra
Измените настройки Xms и Xmx на более высокое значение, оставив не менее 2-4 Гб оперативной памяти для операционной системы.
Запустите
bin/cassandra
и убедитесь в том, что Cassandra начала прослушивание входящих соединений.Включите опцию "Использовать внешний YAML-файл конфигурации" на вкладке База данных страницы Конфигурация сервера и перезагрузите сервер.
После перезапуска сервер будет использовать внешний файл cassandra.yaml
и игнорировать все параметры databaseCassandra*
в собственной конфигурации(server.xml
по умолчанию). Обратите внимание, что такое переключение может вызвать проблемы с существующей базой данных. Например, если cassandra.yaml
содержит другое значение параметра cluster_name
, сервер вообще не запустится.
Обычно не следует менять имя кластера. Однако если это неизбежно, вы можете добавить следующие опции JVM в файл |
Также обратите внимание, что имя и расположение файла cassandra.yaml
не настраиваются. Файл должен находиться в домашней (установочной) директории сервера. Файл предоставляется в составе установочного пакета сервера и, в отличие от server.xml
, никак не изменяется сервером (т. е. используется только в режиме чтения).
Файл cassandra.yaml
в SberMobile представляет собой модифицированную копию файла конфигурации автономной Cassandra по умолчанию. Все модификации дополнены большим заголовком комментария и описанием, как здесь:
########################################################################################################################
# NOTE
########################################################################################################################
# This parameter was changed from default 'true' to 'false' according to internal config
########################################################################################################################
Поскольку изменения в этом файле могут привести к тому, что Cassandra не будет работать или будет работать плохо, дистрибутив SberMobile также содержит резервную копию рабочего файла cassandra.yaml
с именем cassandra.default.yaml
, в котором сохранены все начальные значения. Этот файл не используется SberMobile и предназначен для использования в качестве точки отката для рабочего файла в случае сбоя.
Оптимизация производительности Cassandra при работе с большими объемами записи
Нагрузка, связанная с записью, подразумевает большое количество операций вставки. Чем быстрее вы вставляете данные, тем быстрее вам нужно их уплотнять, чтобы поддерживать стабильный счетчик. Таким образом, вам нужно отредактировать следующие параметры в cassandra.yaml
:
Увеличить количество concurrent_compactors.
Увеличьте значение compaction_throughput_mb_per_sec или отключите дросселирование, установив этот параметр на ноль.
Также может потребоваться изменить стратегию уплотнения определенных таблиц. Возможно, потребуется изменить следующие параметры:
уплотнение - предпочтительной стратегией является TimeWindowCompactionStrategy. Она была специально визуализирована для временных рядов и рабочих нагрузок с истекающим TTL. Для ее настройки вам потребуется изменить только compaction_window_unit и compaction_window_size. Также необходимо установить значение
true
для параметра unchecked_tombstone_compaction, чтобы Cassandra отбрасывала истекшие sstables в режиме реального времени.gc_grace_seconds - должно быть уменьшено или установлено на ноль (только если вы используете одноузловой кластер).
Для изменения параметров уплотнения необходимо выполнить запрос с помощью интерактивного терминала CQL. Запустите bin/cqlsh
для подключения к текущему узлу Cassandra:
USE aggregate;
ALTER TABLE <table_name>
WITH compaction = {'class' : 'TimeWindowCompactionStrategy', 'compaction_window_unit' : 'HOURS', 'compaction_window_size' : '1', 'unchecked_tombstone_compaction' : 'true'}
AND gc_grace_seconds = 0;
Перед настройкой базы данных с использованием перечисленных параметров ознакомьтесь с документацией по Apache Cassandra. В вашем конкретном случае настройка базы данных может отличаться. |
Настройки сетевого таймаута
Рассмотрите возможность изменения настроек таймаута, если вы планируете выполнять операции, требующие много времени. В противном случае вы можете получить TimedOutException при работе с базой данных.
Параметр | Описание |
---|---|
range_request_timeout_in_ms | Сколько времени координатор должен ждать завершения сканирования seq или index. |
read_request_timeout_in_ms | Сколько времени координатор должен ждать завершения операций чтения. |
write_request_timeout_in_ms | Сколько времени координатор должен ждать завершения операций записи. |
таймаут_запроса_в_мс | Время ожидания выполнения операций по умолчанию для других, различных операций. |
Будьте внимательны при увеличении таймаута и учитывайте использование памяти и ЦП для выполняемых операций. Таймауты защищают клиентов от слишком долгого ожидания операций, которые никогда не завершаются из-за ошибки или нехватки ресурсов. |
Устранение неполадок с помощью Nodetool
nodetool
- это встроенный инструмент Cassandra для получения различных сведений об узлах Cassandra. Он может быть чрезвычайно полезен для поиска проблем с производительностью.
Чтобы использовать nodetool
со встроенной службой Cassandra SberMobile:
Скачайте установку Cassandra 3.11 и распакуйте ее в любую папку.
Убедитесь, что сервер SberMobile работает со встроенной службой Cassandra.
Убедитесь, что в переменной окружения
JAVA_HOME
установлена как минимум Java 8 или соответствующий исполняемый файлjava
находится в переменнойPATH
. Проверить последнее можно, выполнив командуjava -version
.Переходит к извлеченной директории
bin/
и выполняет следующую команду:
$ ./nodetool --port 11111 status
Опция --port
указывает на встроенный JMX-порт Cassandra. Если вы запускаете nodetool
с другой машины, вам также необходимо указать опцию --host
с SberMobile IP-адресом или именем хоста.
Вывод команды должен выглядеть следующим образом:
Datacenter: datacenter1
========================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 127.0.0.1 1.35 MiB 256 100,0% 38512adb-b868-4ea1-9593-bf3b9950e687 rack1
Основными информационными командами nodetool
являются status
, version
и info
. Существует множество других полезных команд, описанных в документации и в самом инструменте (просто запустите его без опций или с помощью команды help
).
Непосредственный запрос с помощью CQLSH
cqlsh
- это интерактивный инструмент для выполнения различных запросов к узлу базы данных Cassandra (название расшифровывается как "CQL Командная оболочка"). С ее помощью можно интерактивно выбрать/обновить данные внутри экземпляра базы данных.
Как и nodetool
, оболочка также поставляется в составе автономной установки Cassandra.
Чтобы использовать ее с SberMobile встроенной Cassandra:
Скачайте установку Cassandra 3.11 и распакуйте ее в любую папку.
Убедитесь, что на сервере SberMobile запущена встроенная служба Cassandra.
Убедитесь, что Python 2.7 доступен в переменной окружения
PATH
. Вы можете проверить это, выполнив командуpython --version
в консоли. Заметим, что Python 3+ не совместим.Переходит к извлеченной директории
bin/
и выполняет следующую команду:
$ ./cqlsh
Текущая команда попытается подключиться к Cassandra, развёрнутой по адресу localhost:9042
. При необходимости хост и порт можно указать либо переменными окружения $CQLSH_HOST
и $CQLSH_PORT
, либо добавив их в саму команду, например, $ ./cqlsh localhost 9042
(обратите внимание, что пара отделяется пробелом, а не двоеточием).
Обратите внимание, что предыдущая команда предполагает имя пользователя и пароль по умолчанию, но если вам нужно их указать, добавьте следующие параметры:
$ ./cqlsh -u cassandra -p cassandra
В любом случае вывод должен выглядеть следующим образом:
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.10-SNAPSHOT | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
WARNING: pyreadline dependency missing. Install to enable tab completion.
cqlsh>
Чтобы протестировать какой-нибудь запрос, попробуйте сделать следующее:
cqlsh> select count(*) from aggregate.ag_events;
Более подробную информацию о cqlsh
можно найти на текущей странице документации. Синтаксис языка CQL описан здесь.