Wikiサービスで使用するために、CentOS7.4にMongoDB 3.6.4をインストールしたんですが、デフォルトではDBに接続すると以下のエラーが出力されてしまいます。
以下はエラー結果
----
[root@localhost ~]# mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.4
Server has startup warnings:
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-0x-xxT14:43:41.456+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten]
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-0x-xxT14:43:41.457+0900 I CONTROL [initandlisten]
----
出ているエラーは3種類で、一つは「Access control is not enabled for the database」 で「Read and write access to data and configuration is unrestricted」とあるように、ユーザー定義されておらず、制限がされていない為、認証なしにDBにアクセスできてしまうことを指しています。検証くらいだったらいいですが、会社のシステムの一部として利用するなら設定しておいたほうがいいですね。
続いて、こちらですが「THP」が有効になっていると表示されるようで、公式によるとMongoDBのパフォーマンスを最大限出すためには、無効にしたほうがいいとのこと。
Disable Transparent Huge Pages (THP)¶
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
「/sys/kernel/mm/transparent_hugepage/enabled is 'always'.」
「/sys/kernel/mm/transparent_hugepage/defrag is 'always'.」
Transparent Huge Pages(THP)は、大きなメモリーページを使用して大量のメモリーを持つマシンでTranslation Lookaside Buffer(TLB)ルックアップのオーバーヘッドを削減するLinuxメモリー管理システムです。
ただし、データベースワークロードは、連続したメモリアクセスパターンではなく、希薄な傾向があるため、THPでパフォーマンスが低下することがよくあります。 LinuxマシンでTHPを無効にして、MongoDBで最高のパフォーマンスを確保する必要があります。
まずは、THPの無効化から。
THPの無効化
公式の手順に従いTHPを無効化します。
# vi /etc/init.d/disable-transparent-hugepages
以下を編集。
----------
#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO
case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi
echo 'never' > ${thp_path}/enabled
echo 'never' > ${thp_path}/defrag
re='^[0-1]+$'
if $(cat ${thp_path}/khugepaged/defrag) =~ $re
then
# RHEL 7
echo 0 > ${thp_path}/khugepaged/defrag
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi
unset re
unset thp_path
;;
esac
----------
次のコマンドを実行して、initスクリプトを使用できるようにします。
# chmod 755 /etc/init.d/disable-transparent-hugepages
Linuxディストリビューションで新しいinitスクリプトを設定します。
# chkconfig --add disable-transparent-hugepages
以下からはLinux7、CentOS7の手順です。6は手順が異なるので注意してください。
# mkdir /etc/tuned/no-thp
# vi /etc/tuned/no-thp/tuned.conf
-----
[main]
include=virtual-guest
[vm]
transparent_hugepages=never
-----
最後に、次のコマンドを発行して新しいプロファイルを有効にします。
# tuned-adm profile no-thp
続いて確認コマンドですが、[never]になっていることを確認します。再起動しないと「/sys/kernel/mm/transparent_hugepage/defrag」はneverになりませんでした。
# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
WARNING: Access control is not enabled for the databaseを消す方法
WARNING: Access control is not enabled for the databaseを消す方法は以下が参考になりました。
MongoDB 3系を CentOS7 にインストール
上記の情報通り設定すると、表示から警告が消えました。
keyfileの作成
# mkdir -p /usr/local/mongodb/conf
# openssl rand -base64 741 > /usr/local/mongodb/conf/mongodb-keyfile
権限の設定
# chmod 600 /usr/local/mongodb/conf/mongodb-keyfile
# chown -R mongod.mongod /usr/local/mongodb/conf/mongodb-keyfile
# vi /etc/mongod.conf
----
security:
keyFile: /usr/local/mongodb/conf/mongodb-keyfile
-----
サービス再起動
# systemctl restart mongod
[root@localhost ~]# mongo --host 127.0.0.1:27017
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.4
>
管理ユーザを作成
# mongo
------
> use admin
switched to db admin
> db.createUser({user:"ユーザー名",pwd:"パスワード",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
"user" : "myUserAdmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
------
ユーザー名、パスワードは環境に応じて変更してください。
# vi /etc/mongod.conf
------
security:
keyFile: /usr/local/mongodb/conf/mongodb-keyfile
authorization: enabled
------
# systemctl restart mongod
# mongo
> use admin
switched to db admin
> db.auth("ユーザー名","パスワード")
1
※「1」で成功。
とりあえず管理者ユーザーまでの作成が完了しました。