Help us understand the problem. What is going on with this article?

MongoDB Replica Set + Sharding

More than 1 year has passed since last update.

目的

各種バージョン

OS: CentOS 7.3
MongoDB: version v3.4.7

構成

■ App1 (config1)、 APP2 (config2)、 APP3 (config3)

  • Mongo Config Server (Port:27001)
  • Mongos (Port:27000)

■ MongoDB1 (shard1)

  • MongoDB (Port:27020)

■ MongoDB2 (shard2)

  • MongoDB (Port:27020)

■ Arbiter (arbiter)

  • MongoDB (Port:27021) 

config1, config2, shard1, shard2に関しては、全てのホストで[/etc/hosts]に記載する必要がある

hosts登録はReplica SetとMongosを結びつけるために必須


MongoDBのコンフィグ

対象

  • MongoDB1
  • MongoDB2
vi /etc/mongodb/conf/shard.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/shard.log

storage:
  dbPath: /var/lib/mongo/data/shard
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/shard.pid

net:
   bindIp: shard1 # MongoDB2の場合はshard2
   port: 27020

replication:
   replSetName: replset1

sharding:
   clusterRole: shardsvr

# ※ Replica Set&ユーザー作成前は無効にしておく。
#security:
#   authorization: enabled
#   keyFile: /etc/mongodb/key/mongodb-keyfile

ディレクトリがないとMongoDBは起動出来ないので注意

MongoDB Arbiterのコンフィグ

対象

  • Arbiter
vi /etc/mongodb/conf/arbiter.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/arbiter.log

storage:
  dbPath: /var/lib/mongo/data/arbiter
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/arbiter.pid

net:
   bindIp: arbiter
   port: 27021

replication:
   replSetName: replset1

sharding:
   clusterRole: shardsvr

# ※ Replica Set&ユーザー作成前は無効にしておく。
#security:
#   authorization: enabled
#   keyFile: /etc/mongodb/key/mongodb-keyfile

MongoDB Server起動

  • MongoDB1 (shard1)
  • MongoDB2 (shard2)
/usr/bin/mongod -f /etc/mongodb/conf/shard.conf
  • Arbiter (arbiter)
/usr/bin/mongod -f /etc/mongodb/conf/arbiter.conf

■ 実行結果

about to fork child process, waiting until server is ready for connections.
forked process: 2529
child process started successfully, parent exiting

Replica Set 作成

$ mongo shard1:27020
> var config = {"_id" : "replset1",
                 "members" : [
                     {
                         "_id" : 0,
                         "host" : "shard1:27020"
                     },
                     {
                          "_id" : 1,
                          "host" : "shard2:27020"
                     },
                     {
                          "_id" : 2,
                          "host" : "shard2:27021",
                          "arbiterOnly" : true
                     }
                             ]
               }

> rs.initiate(config);
replset1:PRIMARY>

■ Replica Set(Config Server)確認

myconfig:PRIMARY>rs.conf();

ユーザー作成

$ mongo shard1:27020
myconfig:PRIMARY> use admin;
myconfig:PRIMARY> db.createUser(
                      {
                          user:"root",
                          pwd:"mongodb",
                      roles:[
                      {
                         "role" : "root",
                         "db" : "admin"
                      }
                      ]
                      }
                );

MongoDB Server停止

/usr/bin/mongod -f /etc/mongodb/conf/shard.conf

Replica Set&ユーザー作成後、一度各サーバのMongoDB Server(Arbiterも)のプロセスを停止し、コンフィグのコメントアウトを外した後に再び起動する

ログイン確認

$ mongo shard1:27020/admin -u root -p
MongoDB shell version v3.4.7
Enter password:

パスワード間違いや認証設定ミスの場合は以下のような結果になります

$ mongo shard1:27001/admin -u root -p
MongoDB shell version v3.4.7
Enter password:
connecting to: mongodb://shard1:27001/admin
MongoDB server version: 3.4.7
2017-09-06T14:26:28.886+0900 E QUERY    [thread1] Error: Authentication failed. :
DB.prototype._authOrThrow@src/mongo/shell/db.js:1461:20
@(auth):6:1
@(auth):1:2
exception: login failed

MongoDB Config Serverのコンフィグ

対象

  • App1
  • App2
  • App3
vi /etc/mongodb/conf/config.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/config.log

storage:
  dbPath: /var/lib/mongo/data/config1
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/config.pid

net:
   bindIp: config1 # APP2の場合はconfig2、 APP3の場合はconfig3
   port: 27001

replication:
   replSetName: myconfig

sharding:
   clusterRole: configsvr

#security:
#   authorization: enabled
#   keyFile: /etc/mongodb/key/mongodb-keyfile

Replica Set(Config Server)作成

$ mongo config1:27001
> var config = {"_id" : "myconfig",
                 "members" : [
                     {
                         "_id" : 0,
                         "host" : "config1:27001"
                     },
                     {
                          "_id" : 1,
                          "host" : "config2:27001"
                     },
                     {
                          "_id" : 2,
                          "host" : "config3:27001"
                     }
                             ]
               }

> rs.initiate(config);
myconfig:PRIMARY>

Replica Set(Config Server)確認

myconfig:PRIMARY>rs.conf();

ユーザー作成(Config Server)

$ mongo config1:27001
myconfig:PRIMARY> use admin;
myconfig:PRIMARY> db.createUser(
                      {
                          user:"root",
                          pwd:"mongodb",
                      roles:[
                      {
                         "role" : "root",
                         "db" : "admin"
                      }
                      ]
                      }
                );

MongoDB Config Server停止

/usr/bin/mongod --shutdown -f /etc/mongodb/conf/config.conf

Replica Set&ユーザー作成後、一度各サーバのConfig Serverのプロセスを停止し、コンフィグのコメントアウトを外した後に再び起動する

ログイン(Config Server)確認

$ mongo shard1:27001/admin -u root -p
MongoDB shell version v3.4.7
Enter password:

Mongosのコンフィグ

vi /etc/mongodb/conf/mongos.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongos.log

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongos.pid

net:
   bindIp: localhost
   port: 27000

sharding:
    configDB:  myconfig/config1:27001,config2:27001,config3:27001

security:
   authorization: enabled
   keyFile: /etc/mongodb/key/mongodb-keyfile

Mongos起動

/usr/bin/mongos -f /etc/mongodb/conf/mongos.conf

Sharding設定

Mongosにログインして以下のコマンドを実行する
ユーザーはMongoDB Serverのものを使用する

$ mongo localhost:27000/admin -u root -p
MongoDB shell version v3.4.7
Enter password:
> db.runCommand({"addShard":"replset1/shard1:27020,shard2:27020,shard2:27021",name:"replset"})

Sharding確認

> db.printShardingStatus()

[test]という名前のDBのみシャーディング有効化

>  db.runCommand( { enablesharding : "test" });
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away