mongo dbのセッティングの話

mongo db

RDB とは違い NoSQL である(詳しいのは他の人のがわかりやすい)

とりあえず pacman にあるやろと思ったらなかったMongoDB - ArchWiki

AUR にあったので入れようとしたがいろいろある
どうやら bin がついていないものはソースからビルドするらしい。

mongodbAUR - builds from source, requiring 180GB+ free disk space, and may take several hours to build (i.e. 6.5 hours on Intel i7, 1 hour on 32 Xeon cores with high-end NVMe.)

bin で一番新しそうなのを入れた。

$ yay -S mongodb
-> mongodb-bin

入れたあとのエラーへの対処

インストール後、mongo を実行するとエラーがでた。

MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1

とりあえず archWiki(日本語)を見るとトラブルシューティングがあるのでやってみる。

  • データベースへのパスの設定
$ cat /usr/lib/systemd/system/mongodb.service
ExecStart行にパスを書く
ExecStart=/usr/bin/numactl --interleave=all mongod --quiet --config /etc/mongodb.conf --dbpath /var/lib/mongodb

そもそも DB サーバを起動していないのが原因だった。

# systemctl start mongodb

ついでなので自動起動の設定をしておく。

# systemctl enable mongodb
# systemctl is-enabled mongodb # 確認

systemctl のサービス名は <service名> でもいいし <service名>.service でもいいらしい

mongoDB を触る

mongo でローカルのサーバと接続できる
RDB じゃないので色々用語が違うが。

root
└── DB
    └── Collection
        └── Document.json

{field:value}

管理者ユーザを作る

なにもしないとセキュリティがアレなので作る。

$ mongo
> use admin
> db.createUser({
    user: "<username>",
    pwd: "<password>",
    roles: [{
        role: "userAdminAnyDatabase",
        db: "admin"
    }]
})
> db.auth("<username>", "<password>") # 一応確認
1

管理者ユーザを作ってもデフォルトだと認証しないので設定する。

# vim /etc/mongodb.conf
- #secrity:
+ secrity:
+   authorization: enabled

authorization とか authorize とか authentication とかタイポしやすくてきらい

サービスを再起動する。

# systemctl restart mongodb

認証ありで mongodb を起動。

$ mongo -u admin -authenticationDatabase admin

connection refused で詰まってたけど reboot したらうまくいった。多分プロセスがうまく start してなかったんだと思う

新しい colletion をつくって読み書きできるユーザをつくる。

> use test_col
> db.createUser({
    user: "test_user",
    pwd: "testpwd",
    roles: [{
        role: "readWrite",
        db: "test_col"
    }]
})

新しいコレクションを作ってユーザをつくる部分を外部スクリプト化しようと思う。