RabbitMQおよびRedisクラスターの接続
はじめに
このガイドは、ONLYOFFICE Docsエンタープライズ版およびデベロッパー版にのみ有効です。
このガイドは、ONLYOFFICE DocsをRabbitMQクラスターとRedis Clusterに接続する場合に使用してください。ONLYOFFICE Docs自体をクラスターとして実行する場合は、Kubernetes向けONLYOFFICE Docsの手順に従ってください。
ONLYOFFICE Docsコミュニティ版は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は1つのRabbitMQ URLに接続します。rabbitmq.urlパラメーターは1つの文字列を受け取り、ブローカーURLのリストはサポートされていません。RabbitMQクラスターに1つのエンドポイントからアクセスできるようにしてください:
- 高可用性アドレス(keepalivedまたはVRRP)を持つTCPロードバランサー(例:HAProxy)。
- 稼働中のノードに名前解決されるDNS名。
このエンドポイントをlocal.jsonで指定します:
{
"rabbitmq": {
"url": "amqp://<user>:<password>@rabbitmq.example.com:5672"
}
}
Dockerの場合は、同じURLを環境変数AMQP_URIで渡します。
RabbitMQノードがダウンすると、ONLYOFFICE Docsは自動的に再接続します。クラシックキューの場合は、キューを所有するノードが再起動した時点でメッセージの受信を再開します。
ハートビート
ONLYOFFICE DocsはTCP keepaliveを有効にし、RabbitMQが提示するAMQPハートビートのタイムアウト(デフォルトは60秒)を使用して、切断された接続を検出します。RabbitMQのロードバランサーのアイドルタイムアウトは、ハートビートのタイムアウトより長く設定してください。別のタイムアウトを要求するには、rabbitmq.urlでheartbeatを秒単位で指定します:
{
"rabbitmq": {
"url": "amqp://<user>:<password>@rabbitmq.example.com:5672?heartbeat=30"
}
}
クォーラムキュー
デフォルトでは、ONLYOFFICE Docsはクラシックキューを使用します。RabbitMQがクラスターノード間で複製するクォーラムキューに切り替えることもできます。4つのキューについて、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では2段階、RabbitMQ 4.3以降では32段階の優先度をサポートします。それより前のバージョンでは優先度をサポートしていないため、変換タスクの優先順位付けは行われなくなります。
RabbitMQは既存のキューのタイプを変更できません。新しい設定でONLYOFFICE Docsを再起動する前に、ONLYOFFICE Docsを停止し、ds.converttask6、ds.convertresponse、ds.convertdead、ds.delayedキューを削除するか、これらのキューのnameパラメーターに新しい名前を設定してください。この作業はメンテナンス時間中に行ってください。削除したキューに残っていたメッセージは失われます。
Redis Clusterの接続
ONLYOFFICE Docsは、同梱されている両方のRedisクライアント、node-redis(デフォルト)とioredisでRedis Clusterをサポートしています。クラスターノードは、local.jsonのservices.CoAuthoring.redisセクションで指定します。
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のみをサポートします。
ノードアドレスのマッピング
クラスターノードは、自身のアドレスをクライアントに通知します。NATやDockerネットワークなどの理由でONLYOFFICE Docsがこれらのアドレスに到達できない場合、MOVED ...やCannot read properties of undefined (reading 'master')などのエラーがログに表示されます。
通知された各アドレスを、ONLYOFFICE Docsが到達できるアドレスにマッピングします。node-redisの場合は、optionsClusterにnodeAddressMapを追加します:
"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の場合は、iooptionsClusterOptionsにnatMapを追加します:
"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には、少なくとも3つのRabbitMQノードに複製されたクォーラムキューと、各マスターにレプリカを持つRedis Clusterが必要です。
- ONLYOFFICE Docsを再起動し、DocServiceのログ(Linuxでは
/var/log/onlyoffice/documentserver/docservice/out.log)を確認します。- RabbitMQの接続エラーは、試行回数と次の再試行までの時間とともに
[AMQP] connect errorとして記録されます。 - Redisのエラーには
redisClientが含まれます。
- RabbitMQの接続エラーは、試行回数と次の再試行までの時間とともに
- 2つのブラウザーでドキュメントを開き、共同で編集します。
- ドキュメントを開いたまま、RabbitMQノードを1つ停止します。編集が継続できること、およびドキュメントを閉じた後に保存されることを確認します。
- RabbitMQノードを再び起動し、次にRedisのマスターノードを1つ停止して同じテストを繰り返します。テスト後、Redisノードを再び起動します。