Работа с внешней базой данных 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 описан здесь.