GNU/Linux >> Linux の 問題 >  >> Linux

DockerでMongoDB5.0およびRocket.Chat4.0にアップグレードするためのガイド

Rocket.Chat4.0.0が最近リリースされました。以前のバージョンからのアップグレードプロセスは、正直に言うとそれほど単純ではありません。

Rocket.Chatの古い3.x.yバージョンから移行することはできますが、MongoDBの以前のバージョン(3.6および4.0)は、新しいリリース以降、人気のあるチャットサーバーでの使用が非推奨になっています。 MongoDB3.4のサポートも削除されました。これらの変更は、2週間前にマージされたプルリクエスト#22907で最初に確認されました。

このチュートリアルでは、MongoDBデータベースのバージョンを最新の5.0にアップグレードするなど、Rocket.Chatへのアップグレードを成功させるための完全なステップバイステップのプロセスを文書化しました。

さらに、データベースストレージエンジンを MMAPv1から変更する必要もあります。 (これも非推奨) WiredTiger 。そうして初めて、Rocket.Chatの新しいバージョンへのアップグレードを続行できます。その手順は、この包括的なガイドでも詳細に説明されています。

Rocket.Chat3.x.yをまったく新しい4.0.0にアップグレードする方法

LinuxサーバーでDockerを使用してRocket.Chatを最新バージョンにアップグレードするために必要なものを見てみましょう。

前提条件

このドキュメントは特に移行とアップグレードのプロセスの簡素化に焦点を当てているため、既存のRocket.Chat構成( mmap を使用)を想定します。 次のデプロイメントガイドに基づくMongoDBのストレージエンジン):

必要なすべての要件は、上記のガイドで詳しく説明されています。 Linuxコマンドに精通していることは別として、DockerComposeの基本を知っているとここで役立ちます。ただし、このガイドに関連する重要な要件は次のとおりです。

  • 少なくともMongoDB3.4データベースでライブで実行されているRocket.Chat3.x.yベースのDockerデプロイメント。
  • 上記のRocket.Chatサーバーをセルフホストするために使用されるNginxリバースプロキシ設定。

ステップ0:既存のMongoDBのデータベースダンプをバックアップします

データの安全性のために、最初に既存のMongoDBデータベースを作成して保存することをお勧めします:

mkdir ~/backup
cd ~/rocketchat
docker-compose exec mongo mongodump --archive=/dump/mmap --gzip
cp data/dump/mmap ~/backup/mongo-mmap-dump.gzip

Rocket.Chatインスタンスの完全なバックアップも用意することをお勧めします。

これで、次の3つのことを学習します。

  • 廃止されたデータベースストレージエンジンを変更する方法mmap wiredTiger
  • MongoDBインスタンスをアップグレードする
  • Rocket.Chatインスタンスをアップグレードします

ステップ1:すべてのサービスを含む既存のRocket.Chatシステムを停止します

データベースのデータが破損しないようにするため、この手順は特に重要です- MongoDB 。念のために言っておきますが、スケーリングを行っても、実行中のデータベースインスタンスで移行とアップグレードを実行することは避けたほうがよいでしょう。

docker-compose stop

とは異なり、docker-compose down 、上記のコマンドは、コンテナを削除せずに停止するだけなので、ダウンタイムを可能な限り低く抑えます。

ステップ2:「MongoDBmmapからwiredTigerへの移行」リポジトリをダウンロードする

gitを使用して、公式の移行リポジトリをサーバー上の別の場所にフェッチします。これは、Rocket.Chat開発者から便利なように提供されている移行ツールキットと考えてください。

git clone https://github.com/RocketChat/docker-mmap-to-wiredtiger-migration ~/rocketchat-migration

ステップ3:ダウンロードしたリポジトリから「docker」ディレクトリをコピーします

このディレクトリには、カスタム移行イメージのDockerfileが保持されます。新しく改訂されたDockerComposeファイルの場合、既存のcomposeフォルダーにこれが必要です。

cp -r ~/rocketchat-migration/docker ~/rocketchat/docker

ステップ4:既存のDockerComposeファイルをバックアップします

ここでは、docker-compose.old.ymlという名前を付けました。 。新しい構成を使用するときに参照として使用できます(次の手順で説明します):

mv ~/rocketchat/docker-compose.yml ~/rocketchat/docker-compose.old.yml

ステップ5:新しい移行ベースのDockerComposeファイルを使用する

新しくダウンロードされた移行リポジトリには、プロセスを簡単に開始できる新しいDockerComposeファイルも含まれています。ただし、この場合、リバースプロキシ設定に基づいているため、以下の構成に従う必要があります。

version: "3.7"

services:
  rocketchat:
    image: rocketchat/rocket.chat:3.18.2
    command: >
      bash -c
        "for (( ; ; )); do
          node main.js &&
          s=$$? && break || s=$$?;
          echo \"Could not start Rocket.Chat. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    restart: on-failure
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=https://chat.domain.com
      - LETSENCRYPT_HOST=chat.domain.com
      - VIRTUAL_HOST=chat.domain.com
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - Accounts_UseDNSDomainCheck=false
    depends_on:
      - mongo
    networks:
      - net
      - rocket

  mongo:
    image: mongo:4.0
    restart: on-failure
    volumes:
      - ./data/db:/data/db
      - ./data/dump:/dump
    command: >
      bash -c
        "while [ ! -f /data/db/WiredTiger ]; do
          echo \"wiredTiger migration hasn't started yet. Waiting 30 secs...\";
          sleep 30;
        done;
        docker-entrypoint.sh mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger;"
    depends_on:
      - migrator
    networks:
      - rocket

  migrator:
    build: ./docker/
    volumes:
      - ./data/db:/data/db
    networks:
      - rocket

  mongo-init-replica:
    image: mongo:4.0
    command: >
      bash -c
        "for (( ; ; )); do
          mongo mongo/rocketchat --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Could not reach MongoDB. Waiting 5 secs ...\";
          sleep 5;
        done; (exit $$s)"
    depends_on:
      - mongo
    networks:
      - rocket

networks:
  net:
    external: true
  rocket:
    internal: true

上記を最終的な構成としないでください。さらに多くのステップと変更が残っています。上記の設定は、このステップでのみ必要です。今後の変更については後で説明します。

migrator mmap が見つかった場合、サービスは1回だけ実行されます ストレージエンジン。 wiredTigerに変更されます 。それ以外の場合は、それ自体が終了します。 mongo サービスも同じように動作します。次のステップに進んで、その方法を確認しましょう。

ステップ6:移行イメージをビルドして移行を開始します

次のコマンドは、移行イメージを構築し、移行プロセスを開始します。また、コンテナを再起動します。 Rocket.Chatは、データベースが初期化を完了するのを待ってから、最終的に起動します。

docker-compose up --build -d

プロセス全体を監視するために、DockerComposelogsコマンドを使用して完全な手順を監視できます。

docker-compose logs -f migrator

wiredTiger の後に終了コード0のターミナルプロンプトが表示されるまで、上記のコマンドが完了するのを待ちます。 インスタンスは正常なシャットダウンを実行します:

rocketchat_migrator_1 exited with code 0

次に、データベースを監視します。

docker-compose logs -f mongo

初期化して最後にRocket.Chatインスタンスを確認するために少し時間がかかります:

docker-compose logs -f rocketchat

「SERVERRUNNING」メッセージが表示されるまで待ちます。次のようになります:

rocketchat_1         | ➔ +--------------------------------------------------+
rocketchat_1         | ➔ |                  SERVER RUNNING                  |
rocketchat_1         | ➔ +--------------------------------------------------+
rocketchat_1         | ➔ |                                                  |
rocketchat_1         | ➔ |  Rocket.Chat Version: 3.18.2                     |
rocketchat_1         | ➔ |       NodeJS Version: 12.22.1 - x64              |
rocketchat_1         | ➔ |      MongoDB Version: 4.0.18                     |
rocketchat_1         | ➔ |       MongoDB Engine: wiredTiger                 |
rocketchat_1         | ➔ |             Platform: linux                      |
rocketchat_1         | ➔ |         Process Port: 3000                       |
rocketchat_1         | ➔ |             Site URL: https://chat.domain.com    |
rocketchat_1         | ➔ |     ReplicaSet OpLog: Enabled                    |
rocketchat_1         | ➔ |          Commit Hash: 2ffdd13795                 |
rocketchat_1         | ➔ |        Commit Branch: HEAD                       |
rocketchat_1         | ➔ |                                                  |
rocketchat_1         | ➔ +--------------------------------------------------+

上記のように、MongoDB Engine: wiredTiger Rocket.ChatインスタンスがWiredTigerを使用していることを示します ストレージエンジンであり、廃止された MMAPv1ではなくなりました 。これは、今後のアプリケーションアップデートに対応できるようになったことを意味します。しかし、待ってください、MongoDB Version: 4.0.18 また、非推奨です。これは、MongoDBを少なくともバージョン4.2にアップグレードせずにRocket.Chat 4.0.0にアップグレードした場合に気付くことができます:

rocketchat_1         | +--------------------------------------------------+
rocketchat_1         | |                  SERVER RUNNING                  |
rocketchat_1         | +--------------------------------------------------+
rocketchat_1         | |                                                  |
rocketchat_1         | |  Rocket.Chat Version: 4.0.0                      |
rocketchat_1         | |       NodeJS Version: 12.22.1 - x64              |
rocketchat_1         | |      MongoDB Version: 4.0.18                     |
rocketchat_1         | |       MongoDB Engine: wiredTiger                 |
rocketchat_1         | |             Platform: linux                      |
rocketchat_1         | |         Process Port: 3000                       |
rocketchat_1         | |             Site URL: https://chat.domain.com    |
rocketchat_1         | |     ReplicaSet OpLog: Enabled                    |
rocketchat_1         | |          Commit Hash: 2ffdd13795                 |
rocketchat_1         | |        Commit Branch: HEAD                       |
rocketchat_1         | |                                                  |
rocketchat_1         | +--------------------------------------------------+
rocketchat_1         | +----------------------------------------------------------------------+
rocketchat_1         | |                              DEPRECATION                             |
rocketchat_1         | +----------------------------------------------------------------------+
rocketchat_1         | |                                                                      |
rocketchat_1         | |  YOUR CURRENT MONGODB VERSION (4.0.18) IS DEPRECATED.                |
rocketchat_1         | |  IT WILL NOT BE SUPPORTED ON ROCKET.CHAT VERSION 5.0.0 AND GREATER,  |
rocketchat_1         | |  PLEASE UPGRADE MONGODB TO VERSION 4.2 OR GREATER                    |
rocketchat_1         | |                                                                      |
rocketchat_1         | +----------------------------------------------------------------------+

MongoDB 3.4を使用している場合は、Rocket.Chat4.0.0がそれをサポートしていないことにも注意してください。また、MongoDBの最新バージョンにアップグレードして、将来の一時的な中断を防ぐことをお勧めします。

ステップ7:MongoDBとRocket.Chatをアップグレードする

MongoDBバージョン3.4とRocket.Chat3.18.2を実行しているとしましょう。バージョン5.0にアップグレードするには、段階的にアップグレードすることをお勧めします。したがって、順次、3.6、4.0、4.2、および4.4(最終版)にアップグレードします。最後に、バージョン5.0にアップグレードできます。方法を見てみましょう:

ステップ7a:最初にインスタンスを停止します

docker-compose stop

ステップ7b:DockerComposeファイルを更新します

mongoの内部 およびmongo-init-replica Docker Composeファイル内のサービス定義で、上記のようにイメージバージョンを次の2番目のインクリメンタルバージョンに変更します。したがって、MongoDB 3.4を実行している場合は、バージョン3.6に変更してください。保存したら、変更を有効にするために更新された構成を再デプロイします。

docker-compose up -d

MongoDBコンテナーは、バージョン3.6に基づいて再作成されます。

ステップ7c:以前のバージョンのMongoDBと互換性のないデータを保持する機能を有効にする

この手順はオプションではありません。次のバージョン(> 3.6)にアップグレードできるようにするには、MongoDBコンテナーで次のコマンドも使用する必要があります。

docker-compose exec mongo bash -c 'mongo --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"3.6\" } )"'

コマンドが成功したことを確認するには、次のような出力が表示されます。

MongoDB shell version v3.6.23
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("fb1e57ff-d2ec-4ac0-8187-c1ae8a36418b") }
MongoDB server version: 3.6.23
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1633455129, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1633455129, 1)
}

"ok" : 1,が表示されていることを確認してください 。設定が有効になったことを確認します。次に、手順7aに戻り、バージョン4.2にアップグレードして機能の互換性を有効にするまで、このプロセスを繰り返します。

ステップ7d:Rocket.Chat4.0.0にアップグレード

おめでとうございます。これで、MongoDB 4.2を使用しているため、まったく新しい4.0.0バージョンにアップグレードする準備が整いました。スケーリングを使用して、新しいRocket.Chatインスタンスを起動し、ダウンタイムを最小限に抑えることができます。 Docker Composeファイルでイメージバージョンを4.0.0に修正すると、すべて設定されます。

docker-compose up -d --scale rocketchat=2 --no-recreate
sleep 20 && docker rm -f rocketchat_rocketchat_1
docker-compose up -d --scale rocketchat=1 --no-recreate

新しい変更についてログから確認することもできます:

rocketchat_2          | +--------------------------------------------------+
rocketchat_2          | |                  SERVER RUNNING                  |
rocketchat_2          | +--------------------------------------------------+
rocketchat_2          | |                                                  |
rocketchat_2          | |  Rocket.Chat Version: 4.0.0                      |
rocketchat_2          | |       NodeJS Version: 12.22.1 - x64              |
rocketchat_2          | |      MongoDB Version: 4.2.17                     |
rocketchat_2          | |       MongoDB Engine: wiredTiger                 |
rocketchat_2          | |             Platform: linux                      |
rocketchat_2          | |         Process Port: 3000                       |
rocketchat_2          | |             Site URL: https://chat.domain.com    |
rocketchat_2          | |     ReplicaSet OpLog: Enabled                    |
rocketchat_2          | |          Commit Hash: 2ffdd13795                 |
rocketchat_2          | |        Commit Branch: HEAD                       |
rocketchat_2          | |                                                  |
rocketchat_2          | +--------------------------------------------------+

ステップ8:今すぐゲーム終了です!

新しいRocket.ChatがMongoDB5.0をサポートするようになったため、この段階でデータベースバージョンのアップグレードを再開することをお勧めします。したがって、もう一度ステップ7aに戻り、MongoDB5.0の7cまで同じプロセスを繰り返すことができます。そうすれば、Rocket.Chatと同様に、MongoDBDockerインスタンスも将来のアップグレードに対応できます。最終バージョンについてはログから確認できます:

rocketchat_2          | +--------------------------------------------------+
rocketchat_2          | |                  SERVER RUNNING                  |
rocketchat_2          | +--------------------------------------------------+
rocketchat_2          | |                                                  |
rocketchat_2          | |  Rocket.Chat Version: 4.0.0                      |
rocketchat_2          | |       NodeJS Version: 12.22.1 - x64              |
rocketchat_2          | |      MongoDB Version: 5.0.3                      |
rocketchat_2          | |       MongoDB Engine: wiredTiger                 |
rocketchat_2          | |             Platform: linux                      |
rocketchat_2          | |         Process Port: 3000                       |
rocketchat_2          | |             Site URL: https://chat.chmod777.ltd  |
rocketchat_2          | |     ReplicaSet OpLog: Enabled                    |
rocketchat_2          | |          Commit Hash: 2ffdd13795                 |
rocketchat_2          | |        Commit Branch: HEAD                       |
rocketchat_2          | |                                                  |
rocketchat_2          | +--------------------------------------------------+

以上で、準備は完了です。新しくアップグレードされたRocket.Chatサーバーをお楽しみください!

ボーナスノート

これからは通常、ダウンタイムなしでRocket.Chatのみが更新用にスケールアップされることを考慮して、Docker Composeファイルをそのまま保持し、migratorを削除しませんでした。 サービス定義またはmongoの改訂 元の設定に基づくデータベースサービスの定義。

一度wiredTiger ストレージエンジンが担当しており、それらは無視され、かなり将来性があるように見えます。誰が知っていますか、それは将来の展開とアップグレードで役立つかもしれませんか?これがmigratorのログレポートです すでに存在するWiredTigerを停止して再起動したときのサービス ストレージエンジンの構成:

Attaching to rocketchat_migrator_1
migrator_1            | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1            | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1            | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1            | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1            | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1            | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
rocketchat_migrator_1 exited with code 0

mongo サービス定義も同じように動作し、 WiredTiger が検出されると、移行者に基づく移行の実行をスキップします。 ストレージエンジンはすでに導入されています。

また、私の場合、MongoDBデータベースをバージョン4.0以降にアップグレードしました。ただし、バージョン4.0の機能互換性コマンド(step7c)を事前に実行する必要はありませんでした。おそらく、将来のアップグレードのためにすでに有効になっています。

概要

このステップバイステップのチュートリアルでは、廃止されたデータベースストレージエンジンを変更する方法を学びました MMAPv1 WiredTiger MongoDBの場合は、MongoDBデータベースを最新バージョンにアップグレードし、Rocket.Chatインスタンス自体もすべてDocker上にアップグレードします。

このガイドがRocketChatDockerインスタンスのアップグレードに役立つことを願っています。これは、Docker上の他のアプリケーションにMongoDBを使用する場合にも役立ちます。フィードバック、質問、コメント、提案がある場合は、以下のコメントセクションでお知らせください。ハッピーセルフホスティング:)!


Linux
  1. BashForループガイドと例

  2. LinuxおよびDockerでGPU用にOpenCLをセットアップする方法[完全ガイド]

  3. セルフホスティングRocket.ChatとDockerの完全ガイド

  1. Ubuntu 18.04にMongoDBをインストールする方法–初心者向けガイド

  2. DockerでのPostgreSQLの実行、クイックで実用的なガイド

  3. Ubuntu16.04にRocket.Chatをインストールする方法

  1. Ubuntu18.04にRocket.Chatをインストールする方法

  2. Amazon Linux AMI での Docker のアップグレード

  3. docker:「top」と「ps」の PID が異なります