ひとりMongoDB University 12/12

公開:2020/12/12
更新:2020/12/13
10 min読了の目安(約9600字TECH技術記事

この記録は、アドベントカレンダー形式の、MongoDB Universityの学習コースの記録、12日目になります!
ただいまコース: M103[1]を進めています。目標は12/25までにChapter1の完走!

Chapter 1: File Structure (おさらい)

こちらの記事で、MongoDBのプロセスを起動した環境は、手元でDockerのコンテナを使うことにしたので、Chapter1でのコマンドの結果を貼ってみます。

ls -l /data/db

total 180
-rw------- 1 mongodb mongodb    47 Dec 12 07:52 WiredTiger
-rw------- 1 mongodb mongodb    21 Dec 12 07:52 WiredTiger.lock
-rw------- 1 mongodb mongodb  1246 Dec 12 07:53 WiredTiger.turtle
-rw------- 1 mongodb mongodb 32768 Dec 12 07:53 WiredTiger.wt
-rw------- 1 mongodb mongodb  4096 Dec 12 07:52 WiredTigerHS.wt
-rw------- 1 mongodb mongodb 20480 Dec 12 07:53 _mdb_catalog.wt
-rw------- 1 mongodb mongodb 20480 Dec 12 07:53 collection-0-4700852292765613384.wt
-rw------- 1 mongodb mongodb 20480 Dec 12 07:53 collection-2-4700852292765613384.wt
-rw------- 1 mongodb mongodb  4096 Dec 12 07:52 collection-4-4700852292765613384.wt
drwx------ 2 mongodb mongodb  4096 Dec 12 07:53 diagnostic.data
-rw------- 1 mongodb mongodb 20480 Dec 12 07:53 index-1-4700852292765613384.wt
-rw------- 1 mongodb mongodb 20480 Dec 12 07:53 index-3-4700852292765613384.wt
-rw------- 1 mongodb mongodb  4096 Dec 12 07:52 index-5-4700852292765613384.wt
-rw------- 1 mongodb mongodb  4096 Dec 12 07:52 index-6-4700852292765613384.wt
drwx------ 2 mongodb mongodb  4096 Dec 12 07:52 journal
-rw------- 1 mongodb mongodb     2 Dec 12 07:52 mongod.lock
-rw------- 1 mongodb mongodb  4096 Dec 12 07:52 sizeStorer.wt
-rw------- 1 mongodb mongodb   114 Dec 12 07:52 storage.bson
ls -l /data/db/diagnostic.data

total 28
-rw------- 1 mongodb mongodb  8918 Dec 12 07:52 metrics.2020-12-12T07-52-41Z-00000
-rw------- 1 mongodb mongodb 14572 Dec 12 07:54 metrics.interim
ls -l /data/db/journal

total 307200
-rw------- 1 mongodb mongodb 104857600 Dec 12 07:53 WiredTigerLog.0000000001
-rw------- 1 mongodb mongodb 104857600 Dec 12 07:52 WiredTigerPreplog.0000000001
-rw------- 1 mongodb mongodb 104857600 Dec 12 07:52 WiredTigerPreplog.0000000002
ls /tmp/mongodb-27017.sock

/tmp/mongodb-27017.sock
cat !$
cat /tmp/mongodb-27017.sock

ファイルが確認できました。
これでなんとか進めます!

Lab: Change the Default DB Path(練習問題)

Problem:

課題は以下の通り。Web内IDEの環境から、mongodを起動して確認するというものです。

1 Create a new folder /var/mongodb/db/:
mkdir -p /var/mongodb/db

2 Edit your config file to use this new directory as the dbpath.

Here are the updated requirements for your mongod instance:

  • runs on port 27000
  • stores its data files in /var/mongodb/db/
  • listens to connections from localhost
  • uses authentication

3 Launch mongod with the new configuration.

ここまでの設定を反映。mongodはまだ起動していません。


bash-4.4# cat mongod.conf
storage:
  dbPath: /var/mongodb/db/
net:
  bindIp: localhost
  port: 27000
security:
  authorization: enabled
bash-4.4# ls /var/mongodb/db
bash-4.4# ps  -elf | grep [m]ongo

4 Use the following command to connect to the Mongo shell and create the following user. You will need to create this user in order to validate your work.

mongo admin --host localhost:27000 --eval '
  db.createUser({
    user: "m103-admin",
    pwd: "m103-pass",
    roles: [
      {role: "root", db: "admin"}
    ]
  })
'

5 Click "Run Tests" to run a test that will check the updated dbpath.

実際の確認

まず単純にmongodの起動がない状態でRun Testすると失敗します。

次に、dbPathの設定を変更してmongodを起動。
この後、MQLを流して、テスト接続用の設定を追加します。

テスト接続用のユーザを作成し、あらためてRun Testすると成功となりました!

Basic Commands (動画)

やっと次の内容になりました。ここではMongoDB shellで利用するコマンドについて。
いくつかタイプがありますが、今回は先にShell Helperとして短いコマンドで利用できるものを紹介。

  • db.<collection>.<method>()
    • これは前のコースで学んだCRUD操作でも出てきたもの
      - データベースのコレクションに対する更新や追加削除、アブリゲーションに利用
  • rs.<method>()
    • これは管理用で、レプリカセットに対する操作用
  • sh.<method>()
    • こちらはシャーディングに関する操作用
    • シャーディングされたクラスタのデプロイや管理に利用

今回は、db.<collection>.<method>() について学習(おさらい)
ただし、データ操作ではなく、セキュリティやアクセスコントロール、ユーザ作成についてを扱います。

ユーザ管理用のコマンド

db.createUser()
db.dropUser()

コレクション全体の操作

RDBのAlter table的な操作もあります。
コレクションのリネーム、削除、インデックス設定。

db.<collection>.renameCollection()
db.<collection>.createIndex()
db.<collection>.drop()

データベースの操作

データベースの削除や作成を行います。
どちらも引数を指定。

db.dropDatabase()
db.createCollection()

データベースのステータス

このコマンドはレプリケーションやシャーディングの学習でも出てきます。

db.serverStatus()

Database Commandでの操作

db.runCommand(コマンドの内容)という形で指定します。
実は、 db.runCommand(....) の引数として制御文を細かく指定になります。
ただし、上記で出てきた db.collection.method や db.dropDatabase()などは、Shell Helperとして簡単に指定できるように短いコマンドが用意されている形になります。

本来のインデックス作成コマンド

db.runCommand(
  { "createIndexes": <collection> },
  { "indexes": [
    {
      "key": { "product": 1 }
    },
    { "name": "name_index" }
    ]
  }
)

Shell Helperを使う場合

db.<collection>.createIndex(
  { "product": 1 },
  { "name": "name_index" }
)

Basic Commands (クイズ)

Problem

Which of the following methods executes a database command?

答え

db.runCommand() を使います!
(いくつかのパターンの操作に関しては、Helperとして簡略化されたコマンドが用意されています!)

Logging Basics(動画)

ここでは、MongoDBのプロセスのロギングについて。
これもデータベース単位で db.XXXXX 的にログに対する操作(表示やレベルの調整)をします。

ログのコンポーネント

ログのコンポーネントはログとして取り上げるイベントを、カテゴリ別にまとめたものになります。
たとえば、ネットワークやコマンド操作、といったものです。

db.getLogComponents()でログのコンポーネントを表示してみます。
たくさん表示されますね....

Ref. https://docs.mongodb.com/manual/reference/log-messages/#components

> db.getLogComponents()
{
        "verbosity" : 0,
        "accessControl" : {
                "verbosity" : -1
        },
        "command" : {
                "verbosity" : -1
        },
        "control" : {
                "verbosity" : -1
        },
        "executor" : {
                "verbosity" : -1
        },
        "geo" : {
                "verbosity" : -1
        },
        "index" : {
                "verbosity" : -1
        },
        "network" : {
                "verbosity" : -1,
                "asio" : {
                        "verbosity" : -1
                },
                "bridge" : {
                        "verbosity" : -1
                },
                "connectionPool" : {
                        "verbosity" : -1
                }
        },
        "query" : {
                "verbosity" : -1
        },
        "replication" : {
                "verbosity" : -1,
                "election" : {
                        "verbosity" : -1
                },
                "heartbeats" : {
                        "verbosity" : -1
                },
                "initialSync" : {
                        "verbosity" : -1
                },
                "rollback" : {
                        "verbosity" : -1
                }
        },
        "sharding" : {
                "verbosity" : -1,
                "shardingCatalogRefresh" : {
                        "verbosity" : -1
                },
                "migration" : {
                        "verbosity" : -1
                }
        },
        "storage" : {
                "verbosity" : -1,
                "recovery" : {
                        "verbosity" : -1
                },
                "journal" : {
                        "verbosity" : -1
                }
        },
        "write" : {
                "verbosity" : -1
        },
        "ftdc" : {
                "verbosity" : -1
        },
        "tracking" : {
                "verbosity" : -1
        },
        "transaction" : {
                "verbosity" : -1
        },
        "test" : {
                "verbosity" : -1
        }
}

network のところを見ると入れ子になっているのがわかります。
verbosity はログのレベルで、-1だと親の設定を継承。1-5 はデバッグになります。

ログレベルの調整

db.setLogLevel(ログレベルの数字, コンポーネント名) で、コンポーネント単位で変更が可能。

db.setLogLevel(0, "index")

ログの確認

mongodb.logか、Mongo shellの中で db.adminCommand({ "getLog": "global" }) とコマンドを発行することで取得可能。

db.adminCommand({ "getLog": "global" }) の例はこちら。

> db.adminCommand({ "getLog": "global" })
{
        "totalLinesWritten" : 36,
        "log" : [
                "{\"t\":{\"$date\":\"2020-12-12T07:52:38.897+00:00\"},\"s\":\"I\",  \"c\":\"CONTROL\",  \"id\":23285,   \"ctx\":\"main\",\"msg\":\"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'\"}",
                "{\"t\":{\"$date\":\"2020-12-12T07:52:39.219+00:00\"},\"s\":\"W\",  \"c\":\"ASIO\",     \"id\":22601,   \"ctx\":\"main\",\"msg\":\"No TransportLayer configured during NetworkInterface startup\"}",
......

ログレベルはこちら:

Logging Basics (クイズ)

Problem

Which of the following operations can be used to access the logs?

こたえ

  • db.adminCommand({ "getLog": "global" }) を実行する (Mongo shellから)
  • tail -f <path-to-log-file> を実行する(ターミナルのコマンドラインから)

今日の進捗

なんとか進みました!
でも、このコースはまだまだなので、12/25までにChapter1というのが現実的そう。
レプリケーションとシャーディングは触れたことがないので、1月中になんとか...というところです。

本日のメモ

shellの操作は、やっぱり動画を見ながらのほうがよさそうですね!

きょうのzenn

前日と同じように記事を作成しています。
GitHubと連携させているので、記事をかくことでかろうじて毎日のアクティビティが生まれています。

脚注
  1. M103: Basic Cluster Administration のコースになります。コースを開始すると、完了までの期限は2ヶ月以内です。 ↩︎