今回は「MongoDB の レプリカセットにmongoシェルを使ってアクセスする方法」についてまとめます。
接続する
何はともあれサーバーへの接続から見ていきます。
サーバーを指定して接続する
もっとも単純な接続は接続先サーバーを指定した接続で、サーバーIPが 127.0.0.1:8001 であれば以下のようなコマンドで接続できます。
C:\work>mongo --host 127.0.0.1:8001
単一ノードの場合と基本的に接続方法は変わりません。
接続できれば接続先サーバーが PRIMARY か SECONDARY かなどがわかる表記があります。
MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:8001/
MongoDB server version: 3.6.2
MongoDB Enterprise rs0:PRIMARY>
プライマリサーバーを探す
レプリカセットで書き込みができるのは唯一プライマリサーバーのみなので、書き込みたい場合はプライマリサーバーを探す必要があります。
任意のサーバーへ接続したのち、 rs.status()
を実行すると接続中レプリカセットの各メンバーステータスを確認できます。
PRIMARY> rs.status()
上記コマンドを実行すると以下のような応答を取得できます。
stateStr
に各サーバーがどの状態で稼働しているかが記載されているので、この中からプライマリを探します。
{
"set" : "rs0",
"date" : ISODate("2018-02-27T05:13:26.672Z"),
"myState" : 1,
"term" : NumberLong(18),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
},
"appliedOpTime" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
},
"durableOpTime" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
}
},
"members" : [
{
"_id" : 0,
"name" : "127.0.0.1:8001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 144787,
"optime" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
},
"optimeDate" : ISODate("2018-02-27T05:13:26Z"),
"electionTime" : Timestamp(1519563637, 1),
"electionDate" : ISODate("2018-02-25T13:00:37Z"),
"configVersion" : 7,
"self" : true
},
{
"_id" : 1,
"name" : "127.0.0.1:8002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 144759,
"optime" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
},
"optimeDurable" : {
"ts" : Timestamp(1519708406, 1),
"t" : NumberLong(18)
},
"optimeDate" : ISODate("2018-02-27T05:13:26Z"),
"optimeDurableDate" : ISODate("2018-02-27T05:13:26Z"),
"lastHeartbeat" : ISODate("2018-02-27T05:13:26.413Z"),
"lastHeartbeatRecv" : ISODate("2018-02-27T05:13:25.208Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "127.0.0.1:8001",
"configVersion" : 7
},
{
"_id" : 2,
"name" : "127.0.0.1:8003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 144780,
"lastHeartbeat" : ISODate("2018-02-27T05:13:26.431Z"),
"lastHeartbeatRecv" : ISODate("2018-02-27T05:13:22.188Z"),
"pingMs" : NumberLong(0),
"configVersion" : 7
}
],
"ok" : 1,
"operationTime" : Timestamp(1519708406, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1519708406, 1),
"signature" : {
"hash" : BinData(0,"0vruFBe4bYLFcuHiqSa9gtgUhRo="),
"keyId" : NumberLong("6518666083560325121")
}
}
}
ユーザー名とパスワードを指定して接続する
レプリカセットがアクセス制御を有効化している場合、ユーザー名とパスワードおよび認証先データベースを指定して接続する必要があります。
認証の仕方は2通りあり、「接続時にユーザー名とパスワードを指定する方法」と「接続後にユーザー名とパスワードを指定する方法」があります。
例えば、ユーザー名「user」、パスワード「password」、認証先データベース「test」でサーバー「127.0.0.1:8001」へ接続する場合、それぞれどのように接続するか見ていきます。
接続時にユーザー名とパスワードを指定する方法
接続時にユーザー名、パスワード、認証情報を渡して接続
C:\work>mongo --host 127.0.0.1:8001 -u user -p password --authenticationDatabase test
接続後にユーザー名とパスワードを指定する方法
単純に任意のサーバーへ接続します。
C:\work>mongo --host 127.0.0.1:8001
MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:8001/
MongoDB server version: 3.6.2
MongoDB Enterprise rs0:PRIMARY>
接続で来たら認証したいデータベースへスイッチ(use
)して認証(db.auth()
)を行います。
MongoDB Enterprise rs0:PRIMARY> use test
switched to db admin
MongoDB Enterprise rs0:PRIMARY> db.auth("user", "password")
1
MongoDB Enterprise rs0:PRIMARY>
アクセス制御が有効化されている場合に必要な権限
データベース自身に対する読み書き権限
レプリカセットに対する操作権限
- clusterAdmin
- clusterManager
- clusterMonitor
読み書きしたいデータベースに対して readWrite
があり、レプリカセットの状態確認に clusterMonitor
があればとりあえずは事足りるかと思います。
読み書きする
レプリカセットで書き込みができるのは唯一プライマリサーバーのみです。
セカンダリサーバーでは読み取りのみになります。
プライマリサーバーで読み書き
プライマリサーバーは単一ノードの場合と同じで通常通りのコマンド実行ができます。
PRIMARY> db.orders.find()
PRIMARY> db.orders.insert({ name: "orange", amount: 4 })
セカンダリサーバーで読取
セカンダリサーバーで読取操作を行う場合、あらかじめセカンダリサーバーへ接続した後、読取設定(rs.slaveOk()
)を行う必要があります。
SECONDARY> rs.slaveOk()
上記コマンドを一度実行した後は通常通り読み取り操作が利用できます。
SECONDARY> db.orders.find()
今回は「MongoDB の レプリカセットにmongoシェルを使ってアクセスする方法」についてまとめました。
ポイントは以下の通りです。
- rs.status() でプライマリサーバーを探す
- セカンダリサーバーで読取する場合は rs.slaveOk() を実行する
参考になったでしょうか?
本記事がお役に立っていると嬉しいです!!