スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
ConoHa VPS移設記/2GB・3コア → 4GB・4コア/Ubuntu 26.04 LTS

⑭ MongoDB

アクセスログ保存用のMongoDB。PECLとComposer、2種類のドライバーが混在していたが実は同じ拡張の話だった。 本題は、Ubuntu 26.04の新しいカーネルとMongoDBのTCMallocが衝突するという、今まさに世界中で起きているらしい問題への対処だった。

作業端末: iPad mini(Termius)

MIGRATION ROADMAP — 全17工程
  1. ① SSH、ユーザー追加
  2. ② IPv4/IPv6追加、netplan、ufw
  3. ③ Apache2
  4. ④ Let's Encrypt
  5. ⑤ PHP
  6. ⑥ MariaDB
  7. ⑦ WordPress
  8. ⑧ Dovecot、Postfix
  9. ⑨ Vsftpd
  10. ⑩ Python
  11. ⑪ llama.cpp、ChromaDB
  12. ⑫ Anaconda、Keras、TensorFlow
  13. ⑬ Node.js
  14. ⑭ MongoDB
  15. ⑮ Mosquitto
  16. ⑯ RabbitMQ
  17. ⑰ Supervisor

01PECLとComposer、実は同じ拡張だった

PHPアプリのMongoDB接続は、初期のものがPECL、最近作成したものがComposerライブラリ(mongodb/mongodb)と分かれていた。 調べてみると、Composerのmongodb/mongodbはPECLのmongodb拡張(Cで書かれた低レベルドライバー)の上に構築された高レベルライブラリで、 内部的に同じ拡張へ依存している。つまりPECL拡張を1回入れれば、新旧どちらのアプリも満たせる。

login-user@新サーバー
$ sudo apt install php8.5-dev libssl-dev pkg-config $ sudo pecl install mongodb $ echo "extension=mongodb.so" | sudo tee /etc/php/8.5/mods-available/mongodb.ini $ sudo phpenmod mongodb $ sudo systemctl restart php8.5-fpm

02Ubuntu 26.04向けの公式リポジトリがまだない

MongoDB社の公式aptリポジトリは、26.04(コードネーム: resolute)向けにまだ提供されていなかった。 現時点での標準的な回避策として、Ubuntu 24.04(noble)向けのリポジトリをそのまま使う。

login-user@新サーバー
$ sudo apt install -y gnupg curl $ curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \ sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor $ echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | \ sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list $ sudo apt update $ sudo apt install -y mongodb-org

03起動失敗:カーネル6.19以降との既知の非互換

journalctl -u mongod
"msg":"MongoDB cannot start: Linux kernel versions 6.19 and newer has a known incompatibility with this version of MongoDB. See https://jira.mongodb.org/browse/SERVER-121912 for more information."

MongoDB 8.x系に同梱されているTCMalloc(メモリアロケータ)と、Linuxカーネル6.19以降のrseq(restartable sequences)関連の変更に非互換がある、既知の問題だった。 バージョンを上げても直らない(TCMalloc側の問題でMongoDBのバージョン番号とは無関係なため)。mongodのsystemdユニットは標準でGLIBC_TUNABLES=glibc.pthread.rseq=0(rseq無効化)を設定しているが、 これがTCMallocとの相性問題を引き起こしているため、上書き設定で再度有効化する。

/etc/systemd/system/mongod.service.d/override.conf
[Service] Environment="GLIBC_TUNABLES=glibc.pthread.rseq=1"
login-user@新サーバー
$ sudo systemctl daemon-reload $ sudo systemctl restart mongod $ sudo systemctl status mongod Active: active (running)

04mongorestoreのディレクトリ指定でつまずく

--dirにデータベース名のディレクトリそのものを指定してしまい、直下の.bsonファイルがどのデータベースに属すか判断できず「skipping」される事態に。 --dirには本来、データベース名ディレクトリを含む親ディレクトリを指定する。今回はMariaDBのバックアップと同じ場所に格納していた事情もあり、 --dbで対象を明示する方法で対応した。

login-user@新サーバー
$ mongorestore --db=logging --dir=/home/login-user/backup/backupdb/logging
確認完了 mongosh loggingでshow collections・db.coll.findOne()を実行し、データ移行を確認。

05ここまでの状態

  • PECL拡張を1つ入れることで、PECL直利用・Composerライブラリ両方のPHPアプリに対応
  • Ubuntu 26.04向け公式リポジトリが未提供のため、Noble(24.04)向けリポジトリで代用
  • カーネル6.19以降とTCMallocの既知の非互換を、systemdのGLIBC_TUNABLES上書きで回避
  • mongorestoreの--dir/--db指定を整理し、データ移行を確認
  • PHPアプリ側(Web経由・MQTT併用)の実地確認は⑮以降にあわせて実施予定
← 前回: ⑬ Node.js 次回: ⑮ Mosquitto →

『ConoHa VPS移設記 ⑭ MongoDB』を公開しました。