Подключение кластера RabbitMQ и Redis
Введение
Данное руководство действительно только для ONLYOFFICE Docs Enterprise Edition и Developer Edition.
Используйте это руководство, чтобы подключить ONLYOFFICE Docs к кластеру RabbitMQ и Redis Cluster. Чтобы запустить сам ONLYOFFICE Docs в виде кластера, воспользуйтесь инструкцией ONLYOFFICE Docs в Kubernetes.
ONLYOFFICE Docs Community Edition не использует Redis. Начиная с версии 9.4.0, он также не использует RabbitMQ.
Изменение конфигурации
Описанные ниже настройки задаются в файле local.json:
- Для Linux:
/etc/onlyoffice/documentserver/local.json - Для Windows:
%ProgramFiles%\ONLYOFFICE\DocumentServer\config\local.json
Добавьте параметры в существующие разделы файла, затем перезапустите службы ONLYOFFICE Docs.
Подключение кластера RabbitMQ
ONLYOFFICE Docs подключается к одному URL-адресу RabbitMQ. Параметр rabbitmq.url принимает одну строку; список URL-адресов брокеров не поддерживается. Сделайте кластер RabbitMQ доступным через одну точку подключения:
- TCP-балансировщик нагрузки, например HAProxy, с высокодоступным адресом (keepalived или VRRP);
- DNS-имя, которое разрешается в адреса работающих узлов.
Укажите эту точку подключения в local.json:
{
"rabbitmq": {
"url": "amqp://<user>:<password>@rabbitmq.example.com:5672"
}
}
Для Docker передайте тот же URL-адрес в переменной окружения AMQP_URI.
Когда узел RabbitMQ выходит из строя, ONLYOFFICE Docs автоматически переподключается. При использовании классических очередей получение сообщений возобновляется после перезапуска узла, которому принадлежит очередь.
Heartbeat
ONLYOFFICE Docs включает TCP keepalive и использует тайм-аут AMQP heartbeat, который предлагает RabbitMQ (по умолчанию 60 секунд), для обнаружения разорванных соединений. Задайте тайм-аут простоя балансировщика нагрузки RabbitMQ больше тайм-аута heartbeat. Чтобы запросить другой тайм-аут, задайте heartbeat в секундах в rabbitmq.url:
{
"rabbitmq": {
"url": "amqp://<user>:<password>@rabbitmq.example.com:5672?heartbeat=30"
}
}
Кворумные очереди
По умолчанию ONLYOFFICE Docs использует классические очереди. Можно перейти на кворумные очереди, которые RabbitMQ реплицирует между узлами кластера. Задайте для x-queue-type значение quorum для четырех очередей:
{
"rabbitmq": {
"queueconverttask": {"options": {"arguments": {"x-queue-type": "quorum"}}},
"queueconvertresponse": {"options": {"arguments": {"x-queue-type": "quorum"}}},
"queueconvertdead": {"options": {"arguments": {"x-queue-type": "quorum"}}},
"queuedelayed": {"options": {"arguments": {"x-queue-type": "quorum"}}}
}
}
Оставьте queuepubsub классической: это эксклюзивная очередь с автоудалением, а кворумные очереди этого не допускают.
Кворумные очереди поддерживают два уровня приоритета в RabbitMQ 4.0-4.2 и 32 уровня начиная с RabbitMQ 4.3. Более ранние версии не поддерживают приоритеты, поэтому задачи конвертации больше не приоритизируются.
RabbitMQ не может изменить тип существующей очереди. Перед перезапуском ONLYOFFICE Docs с новыми настройками остановите его и удалите очереди ds.converttask6, ds.convertresponse, ds.convertdead и ds.delayed или задайте новые имена в параметрах name этих очередей. Делайте это во время технического обслуживания: сообщения, оставшиеся в удаленных очередях, будут потеряны.
Подключение Redis Cluster
ONLYOFFICE Docs поддерживает Redis Cluster с обоими входящими в него клиентами Redis: node-redis (по умолчанию) и ioredis. Укажите узлы кластера в разделе services.CoAuthoring.redis файла local.json.
Для node-redis используйте optionsCluster:
{
"services": {
"CoAuthoring": {
"redis": {
"name": "redis",
"optionsCluster": {
"rootNodes": [
{"url": "redis://192.168.0.150:7000"},
{"url": "redis://192.168.0.150:7001"},
{"url": "redis://192.168.0.150:7002"}
],
"defaults": {"username": "default", "password": "<password>"}
}
}
}
}
}
Для ioredis используйте iooptionsClusterNodes и iooptionsClusterOptions:
{
"services": {
"CoAuthoring": {
"redis": {
"name": "ioredis",
"iooptionsClusterNodes": [
{"host": "192.168.0.150", "port": 7000},
{"host": "192.168.0.150", "port": 7001},
{"host": "192.168.0.150", "port": 7002}
],
"iooptionsClusterOptions": {"redisOptions": {"password": "<password>"}}
}
}
}
}
Redis Cluster поддерживает только базу данных 0.
Сопоставление адресов узлов
Узлы кластера сообщают клиенту свои собственные адреса. Если ONLYOFFICE Docs не может подключиться по этим адресам, например из-за NAT или сетей Docker, в журналах появляются ошибки вида MOVED ... или Cannot read properties of undefined (reading 'master').
Сопоставьте каждый объявленный адрес с адресом, доступным для ONLYOFFICE Docs. Для node-redis добавьте nodeAddressMap в optionsCluster:
"optionsCluster": {
"rootNodes": [{"url": "redis://redis1.example.com:7000"}],
"nodeAddressMap": {
"10.0.0.5:7000": {"host": "redis1.example.com", "port": 7000},
"10.0.0.6:7000": {"host": "redis2.example.com", "port": 7000},
"10.0.0.7:7000": {"host": "redis3.example.com", "port": 7000}
}
}
Для ioredis добавьте natMap в iooptionsClusterOptions:
"iooptionsClusterOptions": {
"natMap": {
"10.0.0.5:7000": {"host": "redis1.example.com", "port": 7000},
"10.0.0.6:7000": {"host": "redis2.example.com", "port": 7000},
"10.0.0.7:7000": {"host": "redis3.example.com", "port": 7000}
}
}
Проверка настройки
Для шагов 3 и 4 нужны кворумные очереди с репликацией как минимум на три узла RabbitMQ и Redis Cluster с репликой для каждого ведущего узла.
- Перезапустите ONLYOFFICE Docs и проверьте журнал DocService:
/var/log/onlyoffice/documentserver/docservice/out.logв Linux.- Ошибки подключения к RabbitMQ записываются в журнал как
[AMQP] connect errorс номером попытки и временем до следующей попытки. - Ошибки Redis содержат
redisClient.
- Ошибки подключения к RabbitMQ записываются в журнал как
- Откройте документ в двух браузерах и отредактируйте его совместно.
- Пока документ открыт, остановите один узел RabbitMQ. Убедитесь, что редактирование продолжается и что документ сохраняется после его закрытия.
- Снова запустите узел RabbitMQ, затем повторите проверку с одним ведущим узлом Redis. После проверки снова запустите узел Redis.