Aggiornamento immagine Docker: Redis 6 e dimensione immagine ridotta del 25%

Abbiamo appena rilasciato una nuova immagine container che verrà utilizzata al prossimo ./launcher rebuild app. Come sempre, non è necessario modificare alcuna configurazione, a patto che abbiate seguito la nostra Installazione Standard Ufficiale di Discourse. Detto questo, sono state introdotte nuove funzionalità che aiuteranno alcune installazioni.

Redis 6

Facciamo un uso massiccio di Redis in molte parti di Discourse, sia per la cache, Sidekiq, MessageBus, che per i Distributed Locks e i Rate Limits. Nel complesso, è stato una scelta estremamente solida per noi.

Tuttavia, in alcuni carichi di lavoro molto specifici, Redis potrebbe diventare un collo di bottiglia. E a causa della natura single-thread di Redis, unita alla nostra incapacità di utilizzare più istanze a causa degli script LUA, questo rappresentava un collo di bottiglia difficile da aggirare.

Fortunatamente, Redis 6 introduce il supporto per l’uso di un thread pool per le operazioni di I/O e, durante i nostri test, ha funzionato molto bene con i cluster Discourse limitati da Redis.

Quindi, se state eseguendo su una macchina con molti core CPU e le metriche mostrano che Redis fatica a gestire il carico, ora potete attivare l’uso dei thread per le operazioni di scrittura tramite la sezione params di app.yml:

params:
  redis_io_threads: "4" # 1 disabilita la funzionalità, n>1 utilizza n-1 thread aggiuntivi per le scritture I/O

Immagine più piccola

Abbiamo scelto di distribuire un’immagine container di grandi dimensioni nelle prime fasi del progetto, per rendere più semplice a chi non è tecnico l’esecuzione di Discourse e per gestire tutte le dipendenze necessarie, il versionamento, gli aggiornamenti, ecc.

Detto questo, di recente l’immagine compressa ha superato 1 GB, e questo era un po’ eccessivo.

Quindi, per mitigare l’aumento costante delle dimensioni dell’immagine, abbiamo spostato il codice sorgente di Discourse all’interno dell’immagine: da una copia completa del codice sorgente a un “clone superficiale” (shallow clone) contenente solo la versione più recente del codice.

Questa modifica riduce le dimensioni dell’immagine compressa del 25%, il che si traduce in meno spazio server necessario e rebuild più rapidi quando viene rilasciata una nuova immagine. Dovrebbe anche controllare la crescita dell’immagine nel tempo.

L’abbiamo testato su tests-passed/beta/stable, sia con rebuild che con aggiornamenti web, e non rompe alcun percorso standard. Tuttavia, gli utenti che eseguono operazioni git più esotiche negli hook di app.yml potrebbero dover adattare le loro personalizzazioni.

42 Mi Piace

Cosa succede, se mai, all’esperienza del browser dopo un aggiornamento di Redis? Ci sono impatti sulle risorse memorizzate nella cache? Vengono svuotate a seguito dell’aggiornamento?

3 Mi Piace

Nulla.

Le risorse vengono salvate sul disco locale o nell’archiviazione oggetti e memorizzate nella cache della CDN. Redis non ha alcun impatto.

I dati di Redis vengono mantenuti durante l’aggiornamento.

10 Mi Piace

Qual è il valore predefinito? 1?

5 Mi Piace

Sì. Deriva dal file di configurazione di Redis, dove 1 indica un singolo thread, come nella versione precedente.

8 Mi Piace

Ho un caso in cui ho aggiunto:

after_redis:
  - replace:
      filename: "/etc/redis/redis.conf"
      from: /^databases.*/
      to: "databases 50"

E la ricostruzione fallisce perché:

25:M 01 Dec 2020 20:21:08.830 # FATAL: Il file dei dati è stato creato con un server Redis configurato per gestire
 più di 16 database. Uscita

Esiste un altro hook che posso intercettare per aggiornare il numero di database prima che tenti la migrazione o qualsiasi altra cosa faccia?

Hmm. E ora, dopo la ricostruzione apparentemente fallita, vedo questo nei log di docker:

chgrp: gruppo non valido: 'syslog'
2 Mi Piace

Perché hai bisogno di più di un database?

3 Mi Piace

Multisito. Più istanze che utilizzano un singolo Redis. Avrei probabilmente dovuto usare un contenitore Redis più generico, ma ho pensato di attenermi al tuo.

2 Mi Piace

:face_with_raised_eyebrow:

Non è che multisite utilizza un singolo database e gli spazi dei nomi standard di Redis? Per quanto ne so, i database Redis sono un livello sottile e abbiamo comandi che attraversano i loro confini, quindi non dovresti fare affidamento su questo.

6 Mi Piace

Sì, multisite utilizza un unico database

3 Mi Piace

Ah. Quindi non multisito, ma solo più istanze in esecuzione su una macchina, ciascuna delle quali necessita di un Redis separato. Ho aumentato il valore predefinito da 16 a 50 solo perché ero troppo pigro per mantenere un controllo rigoroso su quali database Redis fossero in uso.

Quindi dovrei eseguire un container Redis separato per ogni istanza, immagino?

2 Mi Piace

Sì, altrimenti potresti riscontrare interferenze tra le istanze.

5 Mi Piace

OH. Maledizione.

Per fortuna, l’ho scoperto su un server usato solo per i test.

Per gli altri siti, dovrei semplicemente fornire un nuovo Redis e scartare ciò che era in coda? Fare un backup/ripristino?

Per la cronaca, non ho notato alcun problema di interferenza negli ultimi anni o giù di lì. :man_shrugging: E c’è un modo per impostare il DB.

EDIT: Beh, la buona notizia è che posso entrare nel container, modificare redis.conf, riavviarlo e riprende a funzionare.

Se hai un suggerimento su come spostare un sito da DISCOURSE_REDIS_DB: 12 su un container Redis a un altro container Redis, mi farebbe piacere saperlo. O forse non ti importano affatto i lavori schedulati?

3 Mi Piace

Esatto. Discourse dovrebbe sopravvivere ragionevolmente a un flush di Redis. Qualcosa va perso, ma nulla di critico.

7 Mi Piace

È quello che pensavo, dato che non conosco alcun metodo con cui i backup tentino di ripristinarlo (ma ci sono molte cose che non conosco). Sembra che potrei farlo in questo modo: https://stackoverflow.com/questions/23222616/copy-all-keys-from-one-db-to-another-in-redis, e sembra che abbia funzionato in un test che ho appena eseguito, ma sarà molto più semplice modificare il mio playbook per creare semplicemente un nuovo contenitore Redis e utilizzarlo.

Grazie.

Ora devo capire se eseguire quei Redis sul server del database o sul server web…

3 Mi Piace

Allora a cosa si riferisce db_id: 2 nella configurazione multisito?

2 Mi Piace

Un’impostazione deprecata:

5 Mi Piace

LOL. Sì, è davvero confuso!

Grazie. Sto lavorando su un argomento relativo a una ‘configurazione multisito con Let’s Encrypt e senza reverse proxy esterno’, e quando lo farò, pulirò anche l’altro.

4 Mi Piace

Assicurati solo di riavviare Unicorn subito dopo, in modo che ricrei le attività programmate.
Perderai tutto ciò che è in coda, quindi devi trovare il momento giusto per farlo.

6 Mi Piace

Funziona ancora come dovrebbe? C’è un semplice comando in una riga per scoprire quanto è grande l’immagine compressa?

1 Mi Piace