notebook

都内でWEB系エンジニアやってます。

複数configサーバで動かしてみる

「configサーバも複数あるべき」みたいな話だったのでレプリカセットを組んでみました

mongoDBのクラスタ環境をいじってみる - notebook

swfz.hatenablog.com

レプリカセットを試す - notebook

swfz.hatenablog.com

シャーディング + レプリカセット - notebook

swfz.hatenablog.com

上記の続き

構成

f:id:swfz:20161201020216p:plain

サーバの起動

sudo mongod --configsvr --port 27032 --dbpath=/data/mongo/shardconfig2 --logpath /data/mongo/shardconfig2/log --fork --replSet rsc
sudo mongod --configsvr --port 27033 --dbpath=/data/mongo/shardconfig3 --logpath /data/mongo/shardconfig3/log --fork --replSet rsc

レプリカセットの設定

PRIMARY予定のノード(localhost:27031)で実行します

> config = {_id: "rsc", members: [ {_id: 0, host: 'localhost:27031'} ] }
> rs.initiate(config)
{ "ok" : 0, "errmsg" : "Missing expected field \"version\"", "code" : 93 }

configサーバのレプリカセットではversionが必要なようです

> config = {_id: "rsc", members: [ {_id: 0, host: 'localhost:27031'} ], version: 0 }
> rs.initiate(config)
{
        "ok" : 0,
        "errmsg" : "version field value of 0 is out of range",
        "code" : 93
}

今度は0じゃだめだそう

> config = {_id: "rsc", members: [ {_id: 0, host: 'localhost:27031'} ], version: 1 }
> rs.initiate(config)
{ "ok" : 1 }
> rs.status()
{
        "info" : "configsvr",
        "ok" : 0,
        "errmsg" : "not running with --replSet",
        "code" : 76
}

起動時に--replSetを指定してなかったのでエラーになりました

オプションを付け直して起動します

sudo mongod --configsvr --port 27031 --dbpath=/data/mongo/shardconfig --logpath /data/mongo/shardconfig/log --fork --replSet rsc
  • 再度設定をして確認
 rs.status()
{
        "set" : "rsc",
        "date" : ISODate("2016-11-02T03:54:50.489Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "configsvr" : true,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "localhost:27031",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 19,
                        "optime" : {
                                "ts" : Timestamp(1478058882, 4),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2016-11-02T03:54:42Z"),
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1478058871, 1),
                        "electionDate" : ISODate("2016-11-02T03:54:31Z"),
                        "configVersion" : 1,
                        "self" : true
                }
        ],
        "ok" : 1
}

無事PRIMARYのサーバが出来ました

メンバーの追加

ここからメンバーを追加していきます

  • PRIMARYサーバで実行
> rs.add("localhost:27032");
{ "ok" : 1 }
> rs.add("localhost:27033");
{ "ok" : 1 }

これでレプリカセットが完成しました

configで設定した値やシャーディングの情報などをmongoに保存しているようです

> show dbs
config  0.003GB
local   0.003GB
rsc:PRIMARY> use config
switched to db config
rsc:PRIMARY> show collections
actionlog
changelog
chunks
collections
databases
lockpings
locks
mongos
settings
shards
tags
version

configdbの設定変更

mongosの起動時設定を変更するため再起動します

--configdb localhost:27031

--configdb localhost:27031,localhost:27032,localhost:27033

sudo mongos --port 27017 --configdb localhost:27031,localhost:27032,localhost:27033 --chunkSize 1 --logpath /data/mongo/shardmongos/log --fork

OK!!!!

ただ、本番運用するならmongosも複数あったほうがいいですね