Passa al contenuto principale

Connessione di un cluster RabbitMQ e Redis

Introduzione​

Importante

La seguente guida è valida solo per ONLYOFFICE Docs Enterprise Edition e Developer Edition.

Usa questa guida per connettere ONLYOFFICE Docs a un cluster RabbitMQ e a un Redis Cluster. Per eseguire ONLYOFFICE Docs stesso come cluster, segui la guida ONLYOFFICE Docs per Kubernetes.

note

ONLYOFFICE Docs Community Edition non utilizza Redis. A partire dalla versione 9.4.0, non utilizza nemmeno RabbitMQ.

Modifica della configurazione​

Le impostazioni seguenti si effettuano nel file local.json:

  • Per Linux: /etc/onlyoffice/documentserver/local.json
  • Per Windows: %ProgramFiles%\ONLYOFFICE\DocumentServer\config\local.json

Aggiungi i parametri alle sezioni esistenti del file, quindi riavvia i servizi di ONLYOFFICE Docs.

Connessione di un cluster RabbitMQ​

ONLYOFFICE Docs si connette a un unico URL di RabbitMQ. Il parametro rabbitmq.url accetta una sola stringa; un elenco di URL di broker non è supportato. Rendi il cluster RabbitMQ raggiungibile tramite un unico endpoint:

  • un bilanciatore di carico TCP, ad esempio HAProxy, con un indirizzo ad alta disponibilità (keepalived o VRRP);
  • un nome DNS che si risolve nei nodi in esecuzione.

Specifica questo endpoint in local.json:

{
"rabbitmq": {
"url": "amqp://<user>:<password>@rabbitmq.example.com:5672"
}
}

Per Docker, passa lo stesso URL nella variabile d'ambiente AMQP_URI.

Quando un nodo RabbitMQ smette di funzionare, ONLYOFFICE Docs si riconnette automaticamente. Con le code classiche, riprende a consumare i messaggi quando il nodo proprietario di una coda si riavvia.

Heartbeat​

ONLYOFFICE Docs abilita il keepalive TCP e usa il timeout di heartbeat AMQP proposto da RabbitMQ, 60 secondi per impostazione predefinita, per rilevare le connessioni interrotte. Imposta il timeout di inattività del bilanciatore di carico di RabbitMQ su un valore superiore al timeout dell'heartbeat. Per richiedere un altro timeout, imposta heartbeat in secondi in rabbitmq.url:

{
"rabbitmq": {
"url": "amqp://<user>:<password>@rabbitmq.example.com:5672?heartbeat=30"
}
}

Code quorum​

Per impostazione predefinita, ONLYOFFICE Docs utilizza code classiche. Puoi passare alle code quorum, che RabbitMQ replica tra i nodi del cluster. Imposta x-queue-type su quorum per quattro code:

{
"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"}}}
}
}

Mantieni queuepubsub come coda classica: è una coda esclusiva con eliminazione automatica (auto-delete), cosa che le code quorum non consentono.

Le code quorum supportano due livelli di priorità in RabbitMQ da 4.0 a 4.2 e 32 livelli a partire da RabbitMQ 4.3. Le versioni precedenti non supportano le priorità, quindi le attività di conversione non vengono più classificate per priorità.

warning

RabbitMQ non può modificare il tipo di una coda esistente. Prima di riavviare ONLYOFFICE Docs con le nuove impostazioni, arrestalo ed elimina le code ds.converttask6, ds.convertresponse, ds.convertdead e ds.delayed, oppure imposta nuovi nomi nei parametri name di queste code. Fallo durante una finestra di manutenzione: i messaggi rimasti nelle code eliminate vanno persi.

Connessione di un Redis Cluster​

ONLYOFFICE Docs supporta Redis Cluster con entrambi i client Redis inclusi, node-redis (predefinito) e ioredis. Specifica i nodi del cluster nella sezione services.CoAuthoring.redis di local.json.

Per node-redis, usa 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>"}
}
}
}
}
}

Per ioredis, usa iooptionsClusterNodes e 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 supporta solo il database 0.

Mappatura degli indirizzi dei nodi​

I nodi del cluster comunicano al client i propri indirizzi. Se ONLYOFFICE Docs non riesce a raggiungere questi indirizzi, ad esempio a causa del NAT o delle reti Docker, nei log compaiono errori come MOVED ... o Cannot read properties of undefined (reading 'master').

Associa ogni indirizzo annunciato a uno che ONLYOFFICE Docs può raggiungere. Per node-redis, aggiungi nodeAddressMap a 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}
}
}

Per ioredis, aggiungi natMap a 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}
}
}

Verifica della configurazione​

I passaggi 3 e 4 richiedono code quorum replicate su almeno tre nodi RabbitMQ e un Redis Cluster con una replica per ogni nodo master.

  1. Riavvia ONLYOFFICE Docs e controlla il log di DocService, /var/log/onlyoffice/documentserver/docservice/out.log su Linux.
    • Gli errori di connessione a RabbitMQ vengono registrati come [AMQP] connect error, con il numero del tentativo e il tempo che manca al tentativo successivo.
    • Gli errori di Redis contengono redisClient.
  2. Apri un documento da due browser e modificalo insieme.
  3. Mentre il documento è aperto, arresta un nodo RabbitMQ. Verifica che la modifica continui e che il documento venga salvato dopo averlo chiuso.
  4. Avvia di nuovo il nodo RabbitMQ, quindi ripeti il test con un nodo master Redis. Avvia di nuovo il nodo Redis dopo il test.