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

Source: https://habr.com/ru/post/J227395/


All Articles