Big_Cake

晓雨杂记

也许我们会分别,但我们将永远不会忘记彼此
bilibili
github
twitter
zhihu
telegram
tg_channel

LeanCloud から MongoDB Cloud への Waline の移行

前言#

Hexo 時代から、私の Waline は Vercel でホストされており、データストレージには LeanCloud の国際版を使用しています。これは、Waline 公式の推奨デプロイ方法です。簡単ですが、時間が経つと Waline の速度は必然的に LeanCloud に制約を受けます。以前、杜老师が私のブログの「谈人际交往」という記事のコメントで、私の Waline の読み込み速度が遅すぎると指摘しました。

1693363403499.webp

後で私自身が記事を読み返したり、コメントに返信したりするときにも、読み込み速度の問題がいくつかあることに気付きました。そのため、データベースを切り替えて、LeanCloud から移行してコメントエリアのパフォーマンスを最適化することにしました。

過程#

データベースと Waline の設定#

まず、私は MongoDB Cloud で、中国香港地域にある Azure の無料の M0 データベースを作成しました。ストレージ容量は 512 MB で、Waline にとっては十分すぎるほどです。もし足りなくなったら、将来的には無料の 5 GB の TiDB に移行することもできます。

作成したら、「ネットワークアクセス」ページですべての IP のアクセスリクエストを許可し、次に SRV 形式の接続文字列をコピーします。Navicat を使用して MongoDB に接続した後、walineという名前のデータベースを作成し、名前をメモしておきます。

Vercel にデプロイされた Waline プロジェクトを開き、環境変数の設定に移動し、元の LeanCloud 関連の設定項目を削除し、Waline のドキュメントに従って MongoDB の接続情報を入力します。ここで注意する点が 1 つあります:MongoDB Cloud の M0 データベースにはクラスタ情報がないため、誤ったMONGO_REPLICASETを設定すると、Waline がコメント情報を取得する際に500の接続タイムアウトエラーが発生します。私は移行中にこの問題にぶつかり、後で Waline のリポジトリで Issue を見つけてこの問題を知りました。

複数のマシン接続情報は次の場所で見つけることができます:

1693364544500.webp接続方法としてDriversを選択し、Driverを Node.js、Version2.2.12以降に設定します。

黄色い蛍光ペンで囲まれた部分が複数のマシン接続情報であり、ポート番号は含まず、それらを環境変数に Waline のドキュメントの形式に従って順番に入力します。

:::warning 注意
Vercel プロジェクトの地域も、データベースの所在地域と同じ地域またはできるだけ近い地域に設定する必要があります。そうしないと、速度が大幅に低下します!

1693365560260.webpデータベースの所在地

1693365602464.webpプロジェクトの所在地
:::

データのバックアップと復元#

設定が完了したら、まず Waline の管理バックエンドの「インポート / エクスポート」ページですべてのデータをエクスポートします。一定時間後にブラウザが自動的にエクスポートされた JSON をダウンロードしない場合は、おそらく Vercel のサーバーレス関数がタイムアウトしているためです。その場合は、もう一度エクスポート操作を実行すればエクスポートできるはずです。

エクスポートされるのは標準の JSON で、すべてのコメントと登録ユーザーの情報が含まれています。これを削除せずに残し、Vercel で Waline を再デプロイします。デプロイが完了したら、管理ページにアクセスして、新しいアカウントを登録するか、OAuth でアカウントを登録します。ログインした後、「インポート / エクスポート」ページで再度インポート操作を実行し、以前にエクスポートした Waline のすべてのデータが含まれる JSON ファイルを選択します。Waline は自動的にインポートとインデックスの作成を開始します。

ここで、ブラウザの DevTools を開いて、「ネットワーク」タブに切り替えることをおすすめします。これにより、Waline のインポート操作が正常に進行しているかをある程度判断することができます。インポートが突然停止し、管理ページの進行状況表示が完了せずに消えた場合、おそらく Vercel のサーバーレス関数がタイムアウトしました(Hobby プランでは、Vercel のサーバーレス関数は最大 10 秒しか実行されず、それ以上の場合はタイムアウトして504エラーが返されます)。その場合は、何があっても、もう一度インポート操作を実行すればよいです。

ここでインポートが失敗することはありませんでしたが、このような解決策を提供することしかできません。

インポートが完了したら、すべて正常に動作するはずです。コメントエリアからログアウトし、以前の LeanCloud をデータベースとして使用していたときの Waline のアカウントとパスワードでログインすれば、問題ありません。その後、ブログのすべての記事をスクロールしてみると、コメントの読み込み速度が大幅に向上していることに気付くでしょう。デモページでコメントをテストしてみると、LeanCloud と比べて大幅に向上していることがわかります。

その他の最適化#

MongoDB には「インデックス」という機能があり、大きなコレクションを読み取る際のデータベースの応答速度を向上させることができます。したがって、いくつかの大きなコレクションにインデックスを設定すると、Waline の応答速度が向上します。

これらの大容量のコレクションは通常、ページビューとコメント情報(CounterCommentコレクション)ですので、それらにインデックスを設定するだけで十分です。

参考#

Hexo 去 LeanCloud 依赖 | Finisky Garden

注意点#

後で、ほとんどの登録ユーザーの緑色のチェックマークがなくなっていることに気付きました。見ていて非常に不快です。

1694171153453.webp

その後、データベースを見てみると、ほとんどのコメントに空のuser_idフィールドがあることがわかりました。Userテーブルを開いて比較してみると、ここでのuser_idフィールドは実際には MongoDB の各データの先頭にあるidです。これで問題が発生しましたので、以前のコメントにユーザー情報フィールドを再設定する必要があります。

スクリプトの作成経験がなかったため、これらの操作はすべて Navicat で手動で行いました。少し疲れました...

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。