Dockerにmongodbスライスコピークラスタを配備します.


一、dockerをインストールする.
以下を参照してください.http://www.cnblogs.com/hehexiaoxia/p/6150584.html
二、dockerfileを書く.
1、ルートディレクトリの下にmongodのdockerfileを作成します.
$ vi dockerfile

#version 1.0
from ubuntu
#maintainer 
maintainer hdx

#install 
run apt-get clean
run apt-get update
run apt-get install -y vim
run apt-get install -y openssh-server
run mkdir -p /var/run/sshd

#open port 22 20001
expose 22
expose 20001
#cmd ["/usr/sbin/sshd","-D"]

run apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

run echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org.list
#install mongodb
run apt-get update
run apt-get install -y mongodb-org
#create the mongodb data directory
run mkdir -p /data/db
entrypoint ["usr/bin/mongod"]


2、ルートディレクトリの下にmongodのdockerfileを作成するmongos.
$ vi dockerfile_mongos
from ubuntu/mongo:latest
entrypoint ["usr/bin/mongos"]

三、dockerfileでimageミラーを生成する.
$ sudo docker build -t  ubuntu/mongo:latest -

イメージの生成状況を表示します.
$ sudo docker images 
 REPOSITORY      TAG       IMAGE ID        CREATED     VIRTUAL SIZE
 ubuntu/mongo  latest   522eeeae18e5    54 minutes ago 
 ubuntu/mongos  latest   522eeeae18e6    54 minutes ago 

イメージが生成されていることがわかり、イメージでコンテナを作成できます.
四、imageミラーによるmongoクラスタの構築.
1、2個のスライスサービス(shardsvr)を作成し、各shardsvrは3個のコピーを含み、そのうち1個のプライマリノード、1個のスレーブノード、1個の仲裁ノードである.
-dはバックグラウンド運転を示す
-pはhostホストとdockerのポートをバインドし、最初の20001はhostホストポートを表し、2番目は対応するdockerポートを表し、バインド後にhostホストip:portを呼び出すことでdockerのmongodbにアクセスできます.
注意:最後に追加した--forkを退けてmongoサービスのバックグラウンドを実行することはできません.dockerは仕事がなくて自殺します.
$ sudo docker run -d -p 20001:20001 --name rs1_container1 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs1
$ sudo docker run -d -p 20002:20001 --name rs1_container2 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs1
$ sudo docker run -d -p 20003:20001 --name rs1_container3 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs1
$ sudo docker run -d -p 20011:20001 --name rs2_container1 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs2
$ sudo docker run -d -p 20012:20001 --name rs2_container2 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs2
$ sudo docker run -d -p 20013:20001 --name rs2_container3 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs2

2、2つの構成サービス(configsvr)を作成します.
$ sudo docker run -d -p 21001:20001 --name config_container1 ubuntu/mongo:lastest --configsvr --dbpath /data/db --replSet crs --port 20001
$ sudo docker run -d -p 21002:20001 --name config_container2 ubuntu/mongo:lastest --configsvr --dbpath /data/db --replSet crs --port 20001 

注意: --dbpath/data/dbは必ず指定してください.--configsvrのデフォルトパスは/data/configdbです.見つからないと間違いを報告し、dockerは直接自殺します.
         --replset crsはmongodbバージョン3.2以降configsvrのコピーセットをサポートします.
3、2つのルーティングサービス(mongos)を起動します.
$ sudo docker run -d -p 22001:20001 --name mongos_container1 ubuntu/mongos:lastest --configdb crs/192.168.30.200:21001,192.168.30.200:21002 --port 20001
$ sudo docker run -d -p 22002:20001 --name mongos_container2 ubuntu/mongos:lastest --configdb crs/192.168.30.200:21001,192.168.30.200:21002 --port 20001

注意: crs/192.168.128.30:2100192.168.128.30:21002:mongodbバージョン3.2以降、configdbをこの形式で指定します.そうしないと、エラーが発生し、ipはホストの実際のipに書き込みます.
4、現在のdockerサービスの起動状況を表示します.
$ sudo docker ps 

在Docker上部署mongodb分片副本集群。_第1张图片
スライス、構成サービス、ルーティングサービスが起動していることがわかりました.
五、mongo基本操作.
サービスは開始されましたが、サービスは互いに独立しているので、次はこれらのサーバを直列に接続します.
1、スライスrs 1コピーセットを初期化する.
#     rs1       
root@ubuntu:/# mongo --port 20001
#      
use admin
#      
config = {_id:"rs1",members:[ {_id:0,host:"192.168.30.200:20001"}, {_id:1,host:"192.168.30.200:20002"}, {_id:2,host:"192.168.30.200:20003",arbiterOnly:true} ] }
#       
rs.initiate(config)#        
rs.status()


結果:
rs1:RECOVERING> rs.status()
{
    "set" : "rs1",
    "date" : ISODate("2016-12-20T09:01:16.108Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.30.200:20001",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 7799,
            "optime" : {
                "ts" : Timestamp(1482224415, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-12-20T09:00:15Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1482224414, 1),
            "electionDate" : ISODate("2016-12-20T09:00:14Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.30.200:20002",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 71,
            "optime" : {
                "ts" : Timestamp(1482224415, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-12-20T09:00:15Z"),
            "lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
            "lastHeartbeatRecv" : ISODate("2016-12-20T09:01:15.376Z"),
            "pingMs" : NumberLong(1),
            "syncingTo" : "192.168.30.200:20001",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "192.168.30.200:20003",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 71,
            "lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
            "lastHeartbeatRecv" : ISODate("2016-12-20T09:01:11.334Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 1
        }
    ],
    "ok" : 1
}

2、スライスrs 2コピーセットを初期化する.
#     rs1       
root@ubuntu:/# mongo --port 20011
#      
use admin
#      
config = {_id:"rs2",members:[ {_id:0,host:"192.168.30.200:20011"}, {_id:1,host:"192.168.30.200:20012"}, {_id:2,host:"192.168.30.200:20013",arbiterOnly:true} ] }
#       
rs.initiate(config)
#        
rs.status()


3、構成サービスコピーセットを初期化する.
#     crs       
root@ubuntu:/# mongo --port 21001
#      
use admin
#      
config = {_id:"crs", configsvr:true, members:[ {_id:0,host:"192.168.30.200:21001"}, {_id:1,host:"192.168.30.200:21002"} ] }
#       
rs.initiate(config)
#        
rs.status()


4、mongosでスライス関係をconfigsvrに追加する.
root@ubuntu:/# mongo --port 22001
use admin
db.runCommand({addshard:"rs1/192.168.30.200:20001,192.168.30.200:20002,192.168.30.200:20003"})
db.runCommand({addshard:"rs2/192.168.30.200:20011,192.168.30.200:20012,192.168.30.200:20013"})

クエリーの結果は次のとおりです.仲裁ノードは表示されません.
mongos> db.runCommand({listshards:1})
{
    "shards" : [
        {
            "_id" : "rs1",
            "host" : "rs1/192.168.30.200:20001,192.168.30.200:20002"
        },
        {
            "_id" : "rs2",
            "host" : "rs2/192.168.30.200:20011,192.168.30.200:20012"
        }
    ],
    "ok" : 1
}


5、データベース、コレクションスライスを設定します.
#     
use mydb
db.person.ensureIndex({id:1,company:1})
#       
db.runCommand({enablesharding:"mydb"})
db.runCommand({shardcollection:"mydb.person", key:{id:1, company:1}})

データベースmydb、mydbのpersonテーブル(セット)にスライスを適用するように設定します.スライスキーはpersonセットのid、companyフィールドです.
説明:データベース内のすべてのコレクションがスライスされているわけではありません.shardcollectionが設定されている場合にのみスライスされます.すべてのコレクションがスライスされるわけではありません.
6、試験スライス結果.
use mydb
for (i =0; i<10000;i++){
db.person.save({id:i, company:"baidu"})}

テスト結果は以下の通りである:スライスに成功したことが発見され、rs 1とrs 2のスライスが不均一であり、これはブロックの大きさとスライスキーと関係があり、興味のあるパートナーもスライスキーの選択方法の文章を詳しく調べることができる.
db.person.stats()
{
    "sharded" : true,
    "capped" : false,
    "ns" : "mydb.person",
    "count" : 10000,
    "size" : 530000,
    "storageSize" : 192512,
    "totalIndexSize" : 311296,
    "nchunks" : 3,
    "shards" : {
        "rs1" : {
            "ns" : "mydb.person",
            "count" : 9999,
            "size" : 529947,
            "avgObjSize" : 53,
            "totalIndexSize" : 278528,
            "ok" : 1
        },
        "rs2" : {
            "ns" : "mydb.person",
            "count" : 1,
            "size" : 53,
            "avgObjSize" : 53,
            "storageSize" : 16384,
            "ok" : 1
        }
    },
    "ok" : 1
}


 
これで.