mongodbクラスタの導入


一、ケース
mongos:    192.168.1.3     hadoop1.abc.com     hadoop1config server:    192.168.1.4     hadoop2.abc.com     hadoop2Shard1:    192.168.1.5     hadoop3.abc.com     hadoop3Shard2:    192.168.1.6     hadoop4.abc.com     hadoop4
 
 
二、構成サーバーの起動
構成サーバは、クラスタメタ情報を格納mongodの例である.--configsvrを使用してmongodを構成サーバとして指定し、各構成サーバはクラスタの完全なメタ情報を格納する.
 
本番環境では、正常な稼働時間とデータの安全を保証するために、3つの構成サーバを配備する必要があります.各構成サーバは異なるサーバで動作します.テスト環境では、3台の構成サーバを1台のサーバで実行できます.
 
1、構成サーバのデータディレクトリを作成する、デフォルトでは、構成サーバはデータファイルを/data/configdbディレクトリに格納する.データファイルを格納するために異なる場所を自分で指定することもできます.簡単なコマンドでデータディレクトリを作成します.
[root@hadoop2 ~]# mkdir -pv /mongodb/data 
[root@hadoop2 ~]# chown -R mongod.mongod /mongodb/

2、配置サーバーを起動し、各台は以下のコマンドで起動する.
mongod --configsvr --dbpath <path> --port <port>

構成サーバのデフォルトポートは27019である.自分で指定することもできます.次の例では、デフォルトのポートとデフォルトのデータディレクトリを使用して構成サーバを起動します.
 [root@hadoop2 ~]# mongod --configsvr --dbpath /mongodb/data --port 27019 &

 
プロファイルを編集することもできます
dbpath = /mongod/data
configsvr = true
 
プロファイルの設定形式:
=
 
三、mongosの配置
クラスタではmongosがクエリーと書き込みをスライスに配布する.mongosを使用すると、クラスタの各スライスに直接アクセスする必要がなく、クラスタにアクセスする統一されたエントリが適用されます.
 
構成サーバにおけるクラスタのメタ情報をキャッシュすることにより、mongosはデータが位置するスライスを知ることができる.mongosはこれらのメタ情報を用いてアプリケーションの読み書き要求を異なるスライスに配布し、mongosはクラスタの持続的な状態を記憶しない(mongosはクラスタのデータ損失をもたらすことなく、クラスタの異常をもたらすことなく、いつでも再起動または追加することができることを意味する).システムリソースが少ない.
 
``mongos``どのスライスがリクエストを受信すべきかをどのように決定するか
cluster`では、program:`mongosは次の手順でリクエストを配布します.
  • は、要求を受信しなければならないスライスリストを決定する.
  • は、すべてのターゲットスライス上にカーソルを確立する.

  •  
    場合によっては、クエリ条件にshard keyまたはshard keyのプレフィックスが含まれている場合、program:mongosは要求を部分スライスに配布することができ、そうでなければ、mongosはこのセットを格納すべてのスライスに要求を配布する.
     
    接続がmongosであるかどうかを検出
    アプリケーションの接続がmongosかどうかを検出するためにisMasterコマンドを使用することができる.接続がmongosである場合、isMasterはisdbgrid文字列を含むmsgを返します.たとえば、次のようにします.
    {
       "ismaster" : true,
       "msg" : "isdbgrid",
       "maxBsonObjectSize" : 16777216,
       "ok" : 1}

     
    mongosは軽量レベルのアプリケーションに属し、他のサービスと同じノードで実行できます.起動時にmongosインスタンスに各configサーバのアクセスアドレスを指定する必要があります.
    デフォルトでは、mongosは27017ポートで傍受されています.次のコマンドを使用してmongosインスタンスを起動できます.
    #mongos  --configdb
     
    例:デフォルトポートでmongosを起動するには、次の構成サーバーを使用します.
  • cfg0.example.net
  • cfg1.example.net
  • cfg2.example.net

  • 次のコマンドを使用します.
    mongos --configdb cfg0.example.net:27019,cfg1.example.net:27019,cfg2.example.net:27019

    各mongosはconfigDBを用いて同じ順序で構成サーバのリストを指定する必要がある.
    mongosを起動すると、指定した構成サーバのリストが他のmongosで指定したものと異なる場合、mongosは構成サーバの文字列エラーを返し、起動を終了します.
     
    プロファイルを直接編集することもできます
    1、dbpath指令の注釈
    2、configdb指令を追加し、configサーバーのアドレスを指定する.
     
    次に、次のコマンドを使用してmongosインスタンスを起動します.
    #mongos -f/etc/mongod.conf
     
     
    クラスタへのスライスの追加
    1つのshardは単独であることができる:program:mongodまたはreplica set.本番環境では、各スライスはレプリケーションセットである必要があります.
     
    1、以下のコマンドを使用して、mongo端末からmongosに接続する.
    mongo --host <hostname of machine running mongos> --port <port mongos listens on>
    [root@hadoop2 ~]# mongo --host 192.168.1.3 
    MongoDB shell version: 3.0.4
    connecting to: 192.168.1.3:27017/test
    Server has startup warnings: 
    2015-08-07T18:01:34.816+0800 I CONTROL  ** WARNING: You are running this process as the root user, which is not recommended.
    2015-08-07T18:01:34.816+0800 I CONTROL  
    mongos>

     
    2.次の例のように、sh.addShard()を使用してクラスタにスライスを追加する.毎回sh.addShard()を用いてスライスを追加する.スライスが複製セットである場合、複製セットの名前とメンバーの名前を指定する必要があります.生産環境では、すべてのスライスは複製セットであるべきである.
     
    スライスが複製セットを使用すると仮定すると、複製セットの名前はrs 1であり、mongodb 0で実行される.example.Netでポートが27017のメンバーは、次のコマンドを使用してこのスライスを追加します.
    sh.addShard( "rs1/mongodb0.example.net:27017" )

     
    追加したshardが独立したmongodインスタンスの場合、次のフォーマットが使用されます.
    sh.addShard("RS_SEVER:P")
    mongos> sh.addShard("192.168.1.5:27017")
    { "shardAdded" : "shard0001", "ok" : 1 } 
    mongos> sh.addShard("192.168.1.6:27017")
    { "shardAdded" : "shard0001", "ok" : 1 }
    mongos> sh.status()
    --- Sharding Status --- 
      sharding version: {
     "_id" : 1,
     "minCompatibleVersion" : 5,
     "currentVersion" : 6,
     "clusterId" : ObjectId("55c481b81d1ceaba52187728")
    }
      shards:
     {  "_id" : "shard0000",  "host" : "192.168.1.5:27017" }
     {  "_id" : "shard0001",  "host" : "192.168.1.6:27017" }
      balancer:
     Currently enabled:  yes
     Currently running:  no
     Failed balancer rounds in last 5 attempts:  0
     Migration Results for the last 24 hours: 
      No recent migrations
      databases:
     {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    mongos>

     
    shardの追加は独立したmongodインスタンスであるため、192.168.1.5と192.168.1.6にmongodサービスを起動する必要があります.そうしないと、次のエラー・プロンプトが表示されます.
    mongos> sh.addShard("192.168.1.6:27017")
    {
     "ok" : 0,
     "errmsg" : "couldn't connect to new shard socket exception [CONNECT_ERROR] for 192.168.1.6:27017"

     
     
    クラスタのスライスを開く
    集合をスライスする前に、データベースのスライスを開く必要がある.データベースに対してスライスを開くことは、データの再割り当てを招くことはないが、このデータベースの集合をスライスする前提である.
    データベースにスライスが開くと、MongoDBはこのデータベースにprimary shardを指定し、スライスされていないデータはすべてこのスライスに格納する.
  • mongo端末からmongosに接続するには、次のコマンドを使用します.
    mongo --host <hostname of machine running mongos> --port <port mongos listens on>
  • sh.enableSharding()を使用するには、スライスを開くデータベースの名前を指定する必要があります.構文は次のとおりです.
    sh.enableSharding("<database>")
  • enableShardingコマンドを使用して、データベースのスライスを開くこともできます.構文は次のとおりです.
    db.runCommand( { enableSharding: <database> } )

     
    次のように開きます.
    mongos> sh.enableSharding("testdb")
    { "ok" : 1 }

     
     
     
    集合にスライスを開く
    スライスは集合を基本単位とする.
  • は、まずshard keyを選択する、選択されたシートキーはクラスタの効率に影響を与える.
  • セットに既にデータが含まれている場合は、ensureIndex()を使用してスライスキーにインデックスを作成する必要がある.コレクションが空の場合、MongoDBはsh.shardCollection()中にインデックスを自動的に作成します.
  • mongo端末でsh.shardCollection()を使用して1つのセットにスライスを開きます.構文は次のとおりです.
    sh.shardCollection("<database>.<collection>", shard-key-pattern)
    .文字列をあなたのデータベースのnsに変えて、データベースのフルネーム、1つの点(つまり.)から、集合のフルネームで構成され、shard-key-patternはあなたのキーに変わり、名前はインデックスを作成するときに指定された名前です.例The following sequence of commands shards four collections:
    sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )sh.shardCollection("events.alerts", { "_id": "hashed" } )
    スライスを順番に操作する:
  • recordsデータベースのpeopleセットは{"zipcode":1,"name":1}スライスキーを使用してスライスを開く.このセットはzipcodeフィールドを用いてデータを再割り当てする.多くのドキュメントに同じzipcode値がある場合、chunkはnameの値に従って分裂する.
  • peopleデータベースのaddressesセットには、キー{"state":1,"_id":1}が使用されます.このスライスキーはstateフィールドを用いてデータを再割り当てする.多くのドキュメントに同じstate値がある場合、chunkは_idの値は分裂する.
  • assetsデータベースのchairs集合は{"type":1,"_id":1}を使用してスライスキーを作成する.このスライスキーはtypeフィールドを用いてデータを再割り当てする.多くのドキュメントに同じtype値がある場合、chunkは_idの値は分裂する.
  • eventsデータベースのalerts集合は{"_id":"hashed"}を使用してスライスキー.2.4の新しい機能を作成する.このキーは_idのハッシュ値はデータを再配分する.MongoDBはハッシュインデックス計算_idの値は、クラスタ内のデータの均衡を保証することができる.

  • mongos> for(i=1;i<=100;i++) db.testcoll.insert({Name: "User"+i,Age: i,Gender: "M",PreferBook: ["first book","Second book"]})
    WriteResult({ "nInserted" : 1 })

     
    まず年齢順に索引を作り、名前順に区分する.
    mongos> sh.shardCollection("testdb.testcoll",{Age: 1,Name: 1})
    { "collectionsharded" : "testdb.testcoll", "ok" : 1 }
     mongos> sh.status()
    --- Sharding Status --- 
      sharding version: {
     "_id" : 1,
     "minCompatibleVersion" : 5,
     "currentVersion" : 6,
     "clusterId" : ObjectId("55c481b81d1ceaba52187728")
    }
      shards:
     {  "_id" : "shard0000",  "host" : "192.168.1.5:27017" }
     {  "_id" : "shard0001",  "host" : "192.168.1.6:27017" }
      balancer:
     Currently enabled:  yes
     Currently running:  no
     Failed balancer rounds in last 5 attempts:  0
     Migration Results for the last 24 hours: 
      No recent migrations
      databases:
     {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
     {  "_id" : "test",  "partitioned" : false,  "primary" : "shard0000" }
     {  "_id" : "testdb",  "partitioned" : true,  "primary" : "shard0000" }
      testdb.testcoll
       shard key: { "Age" : 1, "Name" : 1 }
       chunks:
        shard0000 1
       { "Age" : { "$minKey" : 1 }, "Name" : { "$minKey" : 1 } } -->> { "Age" : { "$maxKey" : 1 }, "Name" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)