Centos 6.5上のMongoDBシャードクラスター

この記事では、Mongaリポジトリの接続とシステムへのパッケージのインストールの問題に触れずに、MongoDBの構成のみを見ていきます。



分散MongoDBクラスターは、次のコンポーネントで構成されています。



シャード

シャードは、データの一部をシャードコレクションに格納するmongodインスタンスです。 実稼働環境で使用するには、各シャードがレプリカのセット(replicaSet)である必要があります。



構成サーバー

クラスタメタデータを格納するmongodインスタンスもあります。 メタデータは、どのデータがどのシャードに保存されているかを示します。



ルーティングサーバー

インスタンスmongos。 そのタスクは、アプリケーションからのリクエストをシャードにルーティングすることです。

以下は、シュレッドされたクラスターMongoDBの作業の図です







必要な役割を次のようにグループ化すると最も便利です。





これらのロールを作成する3つのサーバーがあるとします。





構成サーバーの構成


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つのサーバーがあります。





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のエラーと不正確さについて書いてください。



All Articles