分散MongoDBクラスターは、次のコンポーネントで構成されています。
シャード
シャードは、データの一部をシャードコレクションに格納するmongodインスタンスです。 実稼働環境で使用するには、各シャードがレプリカのセット(replicaSet)である必要があります。
構成サーバー
クラスタメタデータを格納するmongodインスタンスもあります。 メタデータは、どのデータがどのシャードに保存されているかを示します。
ルーティングサーバー
インスタンスmongos。 そのタスクは、アプリケーションからのリクエストをシャードにルーティングすることです。
以下は、シュレッドされたクラスターMongoDBの作業の図です

必要な役割を次のようにグループ化すると最も便利です。
- 構成サーバー+ルーティングサーバー
- シャード
これらのロールを作成する3つのサーバーがあるとします。
- mongos01
- mongos02
- mongos03
構成サーバーの構成
mongodが構成サーバーとして機能するために、 / etc / mongod.confを次の形式にします。
logpath=/var/log/mongodb/mongod.log logappend=true fork=true dbpath=/opt/mongocfg pidfilepath=/var/run/mongodb/mongod.pid bind_ip=<lo ip>,<eth ip> configsvr=false
その後、サービスを開始します
#サービスmongod start
ルーティングサーバーを構成する
ルーティングサーバーの構成に進む前に、mongodb-org-mongosパッケージがシステムにインストールされていることを確認する必要があります
#rpm -qa | grep mongos
mongodb-org-mongos-2.6.2-1.x86_64
最初に、mongos /etc/mongos.confサービスの構成ファイルを作成し、次の形式にします。
configdb=mongos01:27019,mongos02:27019,mongos03:27019 # Mongo config servers addresses port = 27017 logpath = /var/log/mongodb/mongos.log logappend = true fork = true bind_ip=<lo ip>,<eth ip> verbose = false
Mongoには、パッケージにmongosの初期化スクリプトが含まれていなかったため、作成します。
cat > /etc/init.d/mongos << TheEnd #!/bin/bash # mongos - Startup script for mongos # chkconfig: 35 85 15 # description: Mongo Router Process for sharding # processname: mongos # config: /etc/mongos.conf # pidfile: /var/run/mongos.pid . /etc/rc.d/init.d/functions # mongos will read mongos.conf for configuration settings # Add variable to support multiple instances of mongos # The instance name is by default the name of this init script # In this way another instance can be created by just copying this init script # and creating a config file with the same name and a .conf extension # For Example: # /etc/init.d/mongos2 # /etc/mongos2.conf # Optionally also create a sysconfig file to override env variables below # /etc/sysconfig/mongos2 INSTANCE=`basename $0` # By default OPTIONS just points to the /etc/mongod.conf config file # This can be overriden in /etc/sysconfig/mongod OPTIONS=" -f /etc/${INSTANCE}.conf" PID_PATH=/var/run/mongo PID_FILE=${PID_PATH}/${INSTANCE}.pid MONGO_BIN=/usr/bin/mongos MONGO_USER=mongod MONGO_GROUP=mongod MONGO_ULIMIT=12000 MONGO_LOCK_FILE=/var/lock/subsys/${INSTANCE} # Source sysconfig options so that above values can be overriden SYSCONFIG="/etc/sysconfig/${INSTANCE}" if [ -f "$SYSCONFIG" ]; then . "$SYSCONFIG" || true fi # Create mongo pids path if it does not exist if [ ! -d "${PID_PATH}" ]; then mkdir -p "${PID_PATH}" chown "${MONGO_USER}:${MONGO_GROUP}" "${PID_PATH}" fi start() { echo -n $"Starting ${INSTANCE}: " daemon --user "$MONGO_USER" --pidfile $PID_FILE $MONGO_BIN $OPTIONS --pidfilepath=$PID_FILE RETVAL=$? echo [ $RETVAL -eq 0 ] && touch $MONGO_LOCK_FILE return $RETVAL } stop() { echo -n $"Stopping ${INSTANCE}: " killproc -p $PID_FILE -t30 -TERM $MONGO_BIN RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f $MONGO_LOCK_FILE [ $RETVAL -eq 0 ] && rm -f $PID_FILE return $RETVAL } restart () { stop start } ulimit -n $MONGO_ULIMIT RETVAL=0 case "$1" in start) start ;; stop) stop ;; restart|reload|force-reload) restart ;; condrestart) [ -f $MONGO_LOCK_FILE ] && restart || : ;; status) status -p $PID_FILE $MONGO_BIN RETVAL=$? ;; *) echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" RETVAL=1 esac exit $RETVAL TheEnd
実行可能にする
chmod + x /etc/init.d/mongos
これで実行できます
サービスモンゴス開始
そして忘れないで
# chkconfig mongod on # chkconfig mongos on
次に、残りのサーバーでこれらの手順を繰り返す必要があります。
シャードのセットアップ
実稼働環境用にシャードをセットアップする際に最初に覚えておくべきことは、各シャードがレプリカセットであることです。
MongoDBでのレプリケーションの詳細については、 公式ドキュメントをご覧ください。
これについては詳しく説明しませんが、設定を進めます。
4つのサーバーがあります。
- 最初のシャードのマスター(mongo01-rs01)
- 最初のシャードのスレーブ(mongo02-rs01)
- 2番目のシャードのマスター(mongo01-rs02)
- 2番目のシャードのスレーブ(mongo02-rs02)
4つのサーバーすべてにシステムが既にインストールされており、mongodbがインストールされているとします
mongo01-rs01およびmongo02-rs01の/etc/mongodb.confで、このシャードが使用するレプリカセットの名前を指定する必要があります
replSet=rs01
mongodを保存して実行します。
次に、マスターにする予定のサーバーのmongoコンソールに移動します
#モンゴ
そして、レプリカセットを初期化します
> rs.initiate()
レプリカセットが初期化されていることを確認するには、その構成を見てみましょう
rs01:PRIMARY> rs.conf()
出力には次のように表示されます。
{ "_id" : "rs01", "version" : 7, "members" : [ { "_id" : 0, "host" : "mongo01-rs01:27017" } ] }
次に、このセットに2番目のサーバーを追加します。
rs01:PRIMARY> rs.add( "mongo02-rs01")
そして、設定を確認してください
rs01:PRIMARY> rs.conf()
{ "_id" : "rs01", "version" : 7, "members" : [ { "_id" : 0, "host" : "mongo01-rs01:27017" }, { "_id" : 1, "host" : "mongo02-rs01:27017", } ] }
MongoDBのフォールトトレランスを向上させるには、セット内のマシンの数を奇数にすることをお勧めします。
データの別のコピーを作成したくないので、 アービトレーターを作成できます
アービターは、レプリカセットのメンバーであるが、データを格納しないmongodのインスタンスです。 彼は新しいマスターの選択に関与しています。
選挙の編成方法については、 公式文書に詳細に記載されています
別のマシンを割り当てないために、以前に作成したものの1つmongos01を使用します。
ここで思い出すように、 mongod startサービスでは、mongodのインスタンスが起動されます。これは構成サーバーです。
アービターを手で開始しないために、そのための初期化スクリプトを作成する必要があります
cat > /etc/init.d/mongo-rs01-arb << TheEnd #!/bin/bash # mongod - Startup script for mongod # chkconfig: 35 85 15 # description: Mongo is a scalable, document-oriented database. # processname: mongod # config: /etc/mongod.conf # pidfile: /var/run/mongodb/mongod.pid . /etc/rc.d/init.d/functions # things from mongod.conf get there by mongod reading it # NOTE: if you change any OPTIONS here, you get what you pay for: # this script assumes all options are in the config file. CONFIGFILE="/etc/mongod-rs01-arb.conf" OPTIONS=" -f $CONFIGFILE" SYSCONFIG="/etc/sysconfig/mongod-rs01-arb" # FIXME: 1.9.x has a --shutdown flag that parses the config file and # shuts down the correct running pid, but that's unavailable in 1.8 # for now. This can go away when this script stops supporting 1.8. DBPATH=`awk -F= '/^dbpath[[:blank:]]*=[[:blank:]]*/{print $2}' "$CONFIGFILE"` PIDFILE=`awk -F= '/^pidfilepath[[:blank:]]*=[[:blank:]]*/{print $2}' "$CONFIGFILE"` mongod=${MONGOD-/usr/bin/mongod} MONGO_USER=mongod MONGO_GROUP=mongod if [ -f "$SYSCONFIG" ]; then . "$SYSCONFIG" fi # Handle NUMA access to CPUs (SERVER-3574) # This verifies the existence of numactl as well as testing that the command works NUMACTL_ARGS="--interleave=all" if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null then NUMACTL="numactl $NUMACTL_ARGS" else NUMACTL="" fi start() { # Recommended ulimit values for mongod or mongos # See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings # ulimit -f unlimited ulimit -t unlimited ulimit -v unlimited ulimit -n 64000 ulimit -m unlimited ulimit -u 32000 echo -n $"Starting mongod: " daemon --user "$MONGO_USER" "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1" RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongod-rs01-arb } stop() { echo -n $"Stopping mongod: " killproc -p "$PIDFILE" -d 300 /usr/bin/mongod RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongod-rs01-arb } restart () { stop start } RETVAL=0 case "$1" in start) start ;; stop) stop ;; restart|reload|force-reload) restart ;; condrestart) [ -f /var/lock/subsys/mongod ] && restart || : ;; status) status $mongod RETVAL=$? ;; *) echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" RETVAL=1 esac exit $RETVAL TheEnd
実行可能にします
#chmod + x /etc/init.d/mongo-rs01-arb
BaseDirとその構成ファイルを作成しましょう
#mkdir / opt / mongo-rs01-arb; chown mongod:mongod / opt / mongo-rs01-arb
#cp -av /etc/mongod.conf /etc/mongod-rs01-arb.conf
次に、ファイル/etc/mongod-rs01-arb.confで 、次の行を編集します
port=27020 dbpath=/opt/mongo-rs01-arb pidfilepath=/var/run/mongodb/mongod-rs01-arb.pid
そして、行を削除/コメントします
configsvr=true
ファイルを保存して、サービスを開始します
#service mongo-rs01-arb start
次に、rs01のマスターに戻り、mongoコンソールでアービターをレプリカセットに追加します
> rs.addArb( "mongos01:27020")
設定の確認
rs01:PRIMARY> rs.conf()
{ "_id" : "rs01", "version" : 7, "members" : [ { "_id" : 0, "host" : "mongo01-rs01:27017" }, { "_id" : 1, "host" : "mongo02-rs01:27017", }, { "_id" : 2, "host" : "mongos01:27020", "arbiterOnly" : true } ] }
クラスターの2番目の断片(mongo01-rs02およびmongo02-rs02)になるレプリカの2番目のセットの下にある残りの2つのサーバーでこの手順を繰り返します。
そのため、2セットのレプリカを作成しました。これを分散クラスターに追加する必要があります。
これを行うには、mongos01に移動してmongoコンソールに移動します(この場合、mongosサービスに接続することに注意してください)。
> sh.addShard( "rs01 // mongo01-rs01:27017、mongo02-rs01:27017")
> sh.addShard( "rs02 / mongo01-rs02:27017、mongo02-rs02:27017")
私たちはチェックします:
> sh.status()
出力には次の行が含まれている必要があります。
shards: { "_id" : "rs01", "host" : "rs01/mongo01-rs01:27017,mongo02-rs01:27017" } { "_id" : "rs02", "host" : "rs02/mongo01-rs02:27017,mongo02-rs02:27017" }
これは、クラスターに2つのシャードが正常に追加されたことを意味します。
ここで、分散クラスターにベースを追加して、シャードします。
私たちの場合、それはGridFSファイルシステムを含むデータベースになります
>ファイルストアを使用
> sh.enableSharding(「ファイルストア」)
> sh.shardCollection( "filestore.fs.chunks"、{files_id:1、n:1})
ステータスを確認する
> sh.status()
出力は次のようになります。
shards: { "_id" : "rs01", "host" : "rs01/mongo01-rs01:27017,mongo02-rs01:27017" } { "_id" : "rs02", "host" : "rs02/mongo01-rs02:27017,mongo02-rs02:27017"} databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : false, "primary" : "rs02" } { "_id" : "filestore", "partitioned" : true, "primary" : "rs01" } filestore.fs.chunks shard key: { "files_id" : 1, "n" : 1 } chunks: rs01 1363 rs02 103 too many chunks to print, use verbose if you want to force print
以上で、アプリケーションで分散GridFSを使用してmongosインスタンスにアクセスできるようになりました
PS:PMのエラーと不正確さについて書いてください。