Have a Question?

< All Topics
Print

Rocket.Chat – Migrando da versão 3.18 para a versão 4.0

Migrando MongoDB de MMAPv1 para WiredTiger

As instalações iniciais do Rocket.Chat via docker, traziam como padrão o mecanismo de armazenamento (Storage Engine) MMAPv1.

Este mecanismo, no entanto, foi descontinuado e, para podermos atualizar o Rocket.Chat das versões mais antigas como as 3.x para a versão 4.x, é necessário migrar o armazenamento do MongoDB para WiredTiger.

Este passo-a-passo foi testado na migração de um ambiente Rocket.Chat 3.18.x para 4.0 e é possível que sirva para outras versões.

Primeiramente, edite o arquivo docker-compose.yml, criando dois novos volumes no serviço ou no container do mongodb, conforme abaixo. Colocamos em vermelho o trecho adicionado:

version: '3.4'

services:    
  rocketchat:

    image: rocketchat/rocket.chat:latest
    command: "node main.js"
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - ADMIN_USERNAME=admin
      - ADMIN_PASS=admin
    ports:
      - 3000:3000

  mongo:
    image: mongo:4.0
    restart: unless-stopped
    volumes:
      - mongo-data-rz:/data/db
      - mongo-data-backup-volume:/data/backup
      - mongo-data-dump:/data/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1

  mongo-init-replica:
    image: mongo:4.0
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"    labels:
      - "traefik.enable=false"
    depends_on:
      - mongo

volumes:
  mongo-data-rz:
    driver: local             
  mongo-data-backup-volume:
    driver: local             
  mongo-data-dump:
    driver: local

Inicialize ou atualize o serviço ou o container do mongo com o seguinte comando:

docker-compose up -d mongo

Agora acesse o container do mongo:

docker-compose exec mongo bash

E execute os seguintes comandos para fazer um backup dos arquivos originais e também gerar um dump que permite importação no novo mecanismo de armazenamento:

cp /data/db /data/backup/ -r
mongodump --archive=/data/dump/mmap --gzip

Agora que já temos o backup e o dump, vamos apagar o banco-de-dados:

rm -rf /data/db/*

Agora precisamos fazer um novo ajuste no comando de inicialização do Mongo, para que utilize o mecanismo WiredTiger. Veja a linha que modificamos abaixo, em vermelho:

version: '3.4'

services:    
  rocketchat:

    image: rocketchat/rocket.chat:latest
    command: "node main.js"
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - ADMIN_USERNAME=admin
      - ADMIN_PASS=admin
    ports:
      - 3000:3000

  mongo:
    image: mongo:4.0
    restart: unless-stopped
    volumes:
      - mongo-data-rz:/data/db
      - mongo-data-backup-volume:/data/backup
      - mongo-data-dump:/data/dump
    command: mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger --bind_ip_all

  mongo-init-replica:
    image: mongo:4.0
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"    labels:
      - "traefik.enable=false"
    depends_on:
      - mongo

volumes:
  mongo-data-rz:
    driver: local             
  mongo-data-backup-volume:
    driver: local             
  mongo-data-dump:
    driver: local

Atualize a stack rodando o comando abaixo:

docker-compose up -d mongo

Acesse novamente o container do mongo:

docker-compose exec mongo bash

Agora vamos restaurar o banco do Rocket.Chat dentro do Mongo:

mongorestore --drop --archive=/data/dump/mmap --gzip --noIndexRestore
mongo --eval 'db.repairDatabase()'

Pronto! Agora é só atualizar a versão do Rocket.Chat e do MongoDB no docker-compose.yml:

version: '3.4'

services:    
  rocketchat:

    image: rocketchat/rocket.chat:4.0.0
    command: "node main.js"
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - ADMIN_USERNAME=admin
      - ADMIN_PASS=admin
    ports:
      - 3000:3000

  mongo:
    image: mongo:4.2
    restart: unless-stopped
    volumes:
      - mongo-data-rz:/data/db
      #  Comentar ou remover:
      # - mongo-data-backup-volume:/data/backup
      # - mongo-data-dump:/data/dump
    command: mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger --bind_ip_all

  mongo-init-replica:
    image: mongo:4.2
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"    labels:
      - "traefik.enable=false"
    depends_on:
      - mongo

volumes:
  mongo-data-rz:
    driver: local             
#  Comentar ou remover:
#  mongo-data-backup-volume:
#    driver: local             
#  mongo-data-dump:
#    driver: local

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Sumário