前言#
從 Hexo 時代開始,我的 Waline 就是托管在 Vercel 的,而數據存儲使用的是 LeanCloud 國際版。這也是 Waline 官方最推薦的部署方式。雖然簡單,但是時間長了 Waline 的速度必然會受制於 LeanCloud。之前 杜老師 就在我博客的「談人際交往」這篇文章下評論說我的 Waline 加載速度太慢了。
我自己後來翻文章、回復評論的時候也發現加載速度上的一些問題,便決定切換數據庫,從 LeanCloud 遷出來優化評論區的性能。
過程#
配置數據庫與 Waline#
首先,我在 MongoDB Cloud 上創建了一個位於中國香港地域的 Azure 免費的 M0 數據庫,存儲空間大小是 512 MB,對 Waline 來說可謂綽綽有餘了。如果不夠了,以後再遷到 5 GB 免費的 TiDB 也可以。
創建好以後,在 “Network Access” 頁面放行所有 IP 的訪問請求,然後複製一下 SRV 格式的連接串。在 Navicat 裡使用連接串連接到 MongoDB 之後創建一個名為 waline
的數據庫,記好名字備用。
打開部署在 Vercel 上的 Waline 項目,轉到環境變量設置,刪除原有的 LeanCloud 相關配置項,然後依照 Waline 的文檔填寫好 MongoDB 的連接信息。這裡有一點需要注意:MongoDB Cloud 的 M0 數據庫是沒有集群信息的,如果設置了錯誤的 MONGO_REPLICASET
,會導致 Waline 在獲取評論信息時出現 500
連接超時錯誤。我當時遷移的時候就是卡在了這裡,後來搜索到了 Waline 倉庫裡的一個 Issue 才知道這個問題。
多機連接信息可以在這裡找到:
選擇
Drivers
作為連接方式,Driver
為 Node.js,Version
為2.2.12 or later
其中形似黃色螢光筆勾住的部分即是多機連接信息,不要帶端口號,按照 Waline 文檔內的格式將其依次填入環境變量。
:::warning 注意
你的 Vercel 項目的地域也需要設置在與數據庫所在地域相同的地域或者盡可能靠近,否則速度會大打折扣!
數據庫所在地域
項目所在地域
:::
備份與恢復數據#
配置好之後,先去 Waline 管理後台 “導入導出” 頁面導出所有數據,如果一段時間後瀏覽器沒有自動下載導出的 JSON,很可能是因為 Vercel 的無服務器函數超時了,此時嘗試再執行一次導出操作應該就能導出了。
導出的是標準的 JSON,包含了所有的評論與註冊用戶的信息。將其留下來,不要刪除,然後在 Vercel 上重新部署一次 Waline。部署完成之後訪問管理頁面,重新註冊賬號或者使用 OAuth 註冊賬號。登錄之後,再在 “導入導出” 頁面執行一次導入操作,然後選中此前導出的包含 Waline 所有數據的 JSON 文件,Waline 就會開始自動進行導入與索引建立操作了。
這裡建議打開瀏覽器的 DevTools,切換到 “網絡” 面板,這樣在一定程度上可以判斷 Waline 的導入操作是否正常進行。如果導入突然停止並且管理頁面的進度指示沒有走完就消失掉的話,多半是 Vercel 的無服務器函數超時了(Hobby 計劃的每個 Vercel 無服務器函數最長只能持續運行 10 秒,否則會超時並返回 504
錯誤)。這時候不管怎麼樣,重新執行一次導入操作,應該就可以了。
這裡我並沒有遇到導入失敗的情況,只能提供一個這樣的解決方案了。
導入完成之後,應該就一切正常了。退出評論區的登錄狀態,用原來 LeanCloud 作為數據庫時 Waline 的賬號密碼進行登錄即可。之後多翻翻博客的每一篇文章,你會發現評論的加載速度有了極大提升。到演示頁面測試一下評論,也會發現相比 LeanCloud 有了極大提升。
其他優化#
MongoDB 有一個 “索引” 功能,能夠在一定程度上加快讀取大的集合時數據庫的響應速度。因此,為一些太大的集合設置索引能夠提升 Waline 的響應速度。
這些大體量的集合通常是頁面瀏覽量和評論信息(Counter
和 Comment
集合),因此為它們設置索引即可。
參考#
Hexo 去 LeanCloud 依賴 | Finisky Garden
坑#
後來有一次我發現幾乎所有註冊用戶的綠色小對勾標誌都沒有了,看著很膈應。
然後一翻數據庫,好家夥,幾乎所有評論都有一個空的 user_id
字段。我打開 User
表一對比,才知道這裡的 user_id
字段其實就是 MongoDB 中每條數據最前面的 id
。這下好了,得重新為之前的評論設置用戶信息字段了。
因為我沒有什麼編寫腳本的經驗,所以這一切操作都是在 Navicat 裡手動進行的。就,挺累的……