Atualização da imagem Docker: Redis 6 e 25% menor tamanho da imagem

Acabamos de lançar uma nova imagem de contêiner que será utilizada na sua próxima execução de ./launcher rebuild app. Como sempre, não há necessidade de alterar nenhuma configuração, desde que você tenha seguido nossa Instalação Padrão Oficial do Discourse. Dito isso, há novos recursos que ajudarão algumas instalações.

Redis 6

Fazemos uso intenso do Redis em vários lugares do Discourse, seja para cache, Sidekiq, MessageBus, bloqueios distribuídos ou limites de taxa. No geral, tem sido uma escolha extremamente sólida para nós.

No entanto, em cargas de trabalho muito específicas, o Redis pode se tornar um gargalo. E, devido à natureza de thread única do Redis, somada à nossa incapacidade de usar múltiplas instâncias por causa de nossos scripts LUA, isso representava um gargalo difícil de contornar.

Felizmente, o Redis 6 traz suporte para uso de um pool de threads para operações de I/O, e durante nossos testes, funcionou muito bem em clusters do Discourse com gargalo no Redis.

Portanto, se você está rodando em uma máquina com muitos núcleos de CPU e métricas mostrando que o Redis está com dificuldade para lidar com a carga, agora você pode optar por usar threads para operações de escrita através da seção params do app.yml:

params:
  redis_io_threads: "4" # 1 desativa, n>1 usa n-1 threads extras para escritas de IO

Imagem menor

Optamos por lançar uma imagem de contêiner grande no início do projeto, para facilitar a execução do Discourse por pessoas não técnicas e gerenciar todas as dependências necessárias, versionamento, atualizações, etc.

Dito isso, recentemente ultrapassamos 1 GB para a imagem comprimida, o que foi um pouco demais.

Para mitigar o aumento constante do tamanho da imagem, movemos o código-fonte do Discourse dentro da imagem de uma cópia completa para um “clone raso” contendo apenas a versão mais recente do código.

Essa mudança reduz o tamanho da imagem comprimida em 25%, o que resulta em menos espaço em servidor necessário e rebuilds mais rápidos quando uma nova imagem é lançada. Também deve controlar o crescimento da imagem ao longo do tempo.

Testamos nas versões tests-passed/beta/stable, tanto com rebuilds quanto com atualizações via web, e nada quebra os caminhos padrão. No entanto, usuários que fazem coisas mais exóticas com git nos hooks do app.yml podem precisar adaptar suas personalizações.

42 curtidas

O que acontece, se algo, com a experiência do navegador após essa atualização do Redis? Há algum impacto nos ativos em cache? Eles são esvaziados como resultado da atualização?

3 curtidas

Nada.

Os ativos são salvos no disco local ou em armazenamento de objetos e ficam em cache na CDN. O Redis não tem impacto nisso.

Os dados do Redis são mantidos durante a atualização.

10 curtidas

Qual é o valor padrão? 1?

5 curtidas

Sim. Isso vem do próprio arquivo de configuração do Redis, onde 1 significa um único thread, como na versão antiga.

8 curtidas

Tenho um caso em que adicionei:

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

E a reconstrução está falhando porque:

25:M 01 Dec 2020 20:21:08.830 # FATAL: Data file was created with a Redis server configured to handle
 more than 16 databases. Exiting

Existe algum outro hook que eu possa usar para atualizar a contagem de bancos de dados antes que ele tente migrar ou fazer qualquer outra coisa?

Hmm. E agora, após a reconstrução aparentemente falhada, vejo isso nos logs do Docker:

chgrp: invalid group: ‘syslog’
2 curtidas

Por que você precisa de mais de um banco de dados?

3 curtidas

Multissítio. Múltiplas instâncias usando um único Redis. Provavelmente eu deveria ter usado um container Redis mais genérico, mas achei melhor me manter com o seu.

2 curtidas

:face_with_raised_eyebrow:

O multisite não usa um único banco de dados e os espaços de nomes de chaves padrão do Redis? Pelo que sei, os bancos de dados do Redis são uma camada fina e temos comandos que atravessam seus limites, então você não deve confiar nisso.

6 curtidas

Sim, o multisite usa um único banco de dados

3 curtidas

Ah. Então não é multisite, apenas várias instâncias rodando em uma única máquina, cada uma precisando de um Redis separado. Eu aumentei o padrão de 16 para 50 apenas porque tinha preguiça de manter um controle rigoroso sobre quais bancos de dados do Redis estavam em uso.

Então, eu deveria rodar um container Redis separado para cada instância, imagino?

2 curtidas

Sim, caso contrário, você pode ter problemas de comunicação cruzada.

5 curtidas

OH. Droga.

Felizmente, aprendi isso em um servidor usado apenas para testes.

Para os outros sites, devo simplesmente fornecer um Redis novo e descartar o que estava agendado? Fazer um backup/restauração?

A propósito, não notei nenhum problema de interferência cruzada no último ano ou mais. :man_shrugging: E há uma maneira de definir o banco de dados.

EDIT: Bem, a boa notícia é que posso entrar no container, editar redis.conf e reiniciá-lo, e ele volta a funcionar.

Se você tiver alguma dica sobre como mover um site de DISCOURSE_REDIS_DB: 12 em um container Redis para outro container Redis, adoraria ouvir. Ou talvez não se preocupe com os trabalhos agendados?

3 curtidas

Isso. O Discourse deveria sobreviver razoavelmente a um flush do Redis. Algumas coisas são perdidas, mas nada crítico.

7 curtidas

Foi o que eu pensei, já que não conheço nenhum método pelo qual os backups tentem restaurá-lo (mas há muito que eu não sei). Parece que eu poderia fazer assim: https://stackoverflow.com/questions/23222616/copy-all-keys-from-one-db-to-another-in-redis, e parece que funcionou em um teste que acabei de fazer, mas será muito mais fácil ajustar meu playbook para apenas criar um novo container Redis e usá-lo.

Obrigado.

Agora, preciso decidir se executo esses Redis no servidor de banco de dados ou no servidor web…

3 curtidas

[quote=“sam, post:10, topic:171437, full:true”]
Sim, o multisite usa 1 banco de dados
[/quote] Então, a que se refere o db_id: 2 na configuração do multisite?

2 curtidas

Uma configuração obsoleta:

5 curtidas

LOL. Sim, é realmente confuso!

Obrigado. Estou trabalhando em um tópico sobre ‘configuração multisite com lets encrypt e sem proxy reverso externo’, e quando fizer isso, vou limpar o outro também.

4 curtidas

Apenas certifique-se de reiniciar o unicorn logo em seguida, para que ele recrie as tarefas agendadas.
Você perderá tudo o que está em fila, então precisa escolher um bom momento para fazer isso.

6 curtidas

Isso ainda está funcionando como deveria? Existe um comando simples de uma linha para descobrir o tamanho da imagem comprimida?

1 curtida