メインコンテンツまでスキップ

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が必要です。

  1. ONLYOFFICE Docsを再起動し、DocServiceのログ(Linuxでは/var/log/onlyoffice/documentserver/docservice/out.log)を確認します。
    • RabbitMQの接続エラーは、試行回数と次の再試行までの時間とともに[AMQP] connect errorとして記録されます。
    • RedisのエラーにはredisClientが含まれます。
  2. 2つのブラウザーでドキュメントを開き、共同で編集します。
  3. ドキュメントを開いたまま、RabbitMQノードを1つ停止します。編集が継続できること、およびドキュメントを閉じた後に保存されることを確認します。
  4. RabbitMQノードを再び起動し、次にRedisのマスターノードを1つ停止して同じテストを繰り返します。テスト後、Redisノードを再び起動します。