ITKeyword,专注技术干货聚合推荐

注册 | 登录

Mongodb的副本集+分片部署

q383965374 2013-03-18

相关推荐:mongodb副本集部署(四)

简述:副本集合(Replica Sets),是一个基于主/从复制机制的复制功能,但增加了自动故障转移和恢复特性。一个集群最多可以支持7个服务器,并且任意节点都可以是


前面尝试了三种部署:

1.主从部署(Mongodb的主从部署)

2.副本集部署(Mongodb的副本集部署)

3.分片部署(Mongodb的分片部署)


现在尝试一下副本集+分片的部署,也就是比副本集多了分片的功能,在分片配置时,分片节点从单一mongod变成了一个集合。

参考资料(http://blog.csdn.net/irelandken/article/details/8003195)

步骤如下:

1.创建三个副本集

2.创建分片需要的Config Server,Route Process 

3.配置分片(即把副本集添加为分片节点)

4.测试

我们还是在同一台机子192.168.0.188上用不同的端口模拟不同的机子进行部署:


1:创建三个副本集

------------------------------------------------------------------------------------------------------------------------------------

1.1第一个副本集:

创建目录:

mkdir -p /data/replset_sharding/replset1/r0
mkdir -p /data/replset_sharding/replset1/r1
mkdir -p /data/replset_sharding/replset1/r2
mkdir -p /data/replset_sharding/replset1/log




用后台运行的方式启动三个Mongod:


进入mongodb的启动目录bin运行下面的代码:

./mongod --dbpath /data/replset_sharding/replset1/r0 --replSet  replset1 --port 18010 --logpath=/data/replset_sharding/replset1/log/r0.log --logappend --fork --directoryperdb

./mongod --dbpath /data/replset_sharding/replset1/r1 --replSet  replset1 --port 18011 --logpath=/data/replset_sharding/replset1/log/r1.log --logappend --fork --directoryperdb

./mongod --dbpath /data/replset_sharding/replset1/r2 --replSet  replset1 --port 18012 --logpath=/data/replset_sharding/replset1/log/r2.log --logappend --fork --directoryperdb





初始化复本集: 在Mongodb的启动目录运行下面代码,启动端口18010的shell:
./mongo --port 18010

config_replset1 = {
_id:"replset1",
members:
[
{_id:0,host:"192.168.0.188:18010",priority:4},
{_id:1,host:"192.168.0.188:18011",priority:2},
{_id:2,host:"192.168.0.188:18012",arbiterOnly : true}
]
}
rs.initiate(config_replset1);

ps:注意arbiter仲裁节点只投票,不接收复制的数据!



------------------------------------------------------------------------------------------------------------------------------------

1.2第二个副本集:

创建目录:

mkdir -p /data/replset_sharding/replset2/r0
mkdir -p /data/replset_sharding/replset2/r1
mkdir -p /data/replset_sharding/replset2/r2
mkdir -p /data/replset_sharding/replset2/log

以后台的方式启动三个mogod:

./mongod --dbpath /data/replset_sharding/replset2/r0 --replSet  replset2 --port 28010 --logpath=/data/replset_sharding/replset2/log/r0.log --logappend --fork --directoryperdb

./mongod --dbpath /data/replset_sharding/replset2/r1 --replSet  replset2 --port 28011 --logpath=/data/replset_sharding/replset2/log/r1.log --logappend --fork --directoryperdb

./mongod --dbpath /data/replset_sharding/replset2/r2 --replSet  replset2 --port 28012 --logpath=/data/replset_sharding/replset2/log/r2.log --logappend --fork --directoryperdb

初始化复本集: 在Mongodb的启动目录运行下面代码,启动端口28010的shell:
./mongo --port 28010

config_replset2 = {
_id:"replset2",
members:
[
{_id:0,host:"192.168.0.188:28010",priority:4},
{_id:1,host:"192.168.0.188:28011",priority:2},
{_id:2,host:"192.168.0.188:28012",arbiterOnly : true}
]
}
rs.initiate(config_replset2);


------------------------------------------------------------------------------------------------------------------------------------

1.3第三个副本集:

创建目录:

mkdir -p /data/replset_sharding/replset3/r0
mkdir -p /data/replset_sharding/replset3/r1
mkdir -p /data/replset_sharding/replset3/r2
mkdir -p /data/replset_sharding/replset3/log

以后台的方式启动三个mogod:

./mongod --dbpath /data/replset_sharding/replset3/r0 --replSet  replset3 --port 38010 --logpath=/data/replset_sharding/replset3/log/r0.log --logappend --fork --directoryperdb

./mongod --dbpath /data/replset_sharding/replset3/r1 --replSet  replset3 --port 38011 --logpath=/data/replset_sharding/replset3/log/r1.log --logappend --fork --directoryperdb

./mongod --dbpath /data/replset_sharding/replset3/r2 --replSet  replset3 --port 38012 --logpath=/data/replset_sharding/replset3/log/r2.log --logappend --fork --directoryperdb

初始化复本集: 在Mongodb的启动目录运行下面代码,启动端口38010的shell:
./mongo --port 38010

config_replset3 = {
_id:"replset3",
members:
[
{_id:0,host:"192.168.0.188:38010",priority:4},
{_id:1,host:"192.168.0.188:38011",priority:2},
{_id:2,host:"192.168.0.188:38012",arbiterOnly : true}
]
}
rs.initiate(config_replset3);

------------------------------------------------------------------------------------------------------------------------------------




2:创建分片需要的Config Server,Route Process 

-------------------------------------------------------------------------------------------------------------------

2.1启动config Server:40000

创建目录:

mkdir -p /data/replset_sharding/log
mkdir -p /data/replset_sharding/config



进入mongodb的启动bin目录以后台的方式启动:

相关推荐:MongoDB实战系列之四:mongodb副本集部署

简述:副本集合(Replica Sets),是一个基于主/从复制机制的复制功能,但增加了自动故障转移和恢复特性。一个集群最多可以支持7个服务器,并且任意节点都可以是

./mongod  --dbpath /data/replset_sharding/config --configsvr --port 40000  --logpath /data/replset_sharding/log/config.log --fork --directoryperdb --rest


-------------------------------------------------------------------------------------------------------------------

2.2启动Route Process:50000

./mongos --port 50000 --configdb 192.168.0.188:40000 --chunkSize 50 --logpath=/data/replset_sharding/log/route.log --fork


-------------------------------------------------------------------------------------------------------------------





3:配置分片(即把副本集添加为分片节点)

用Mongo Shell 登录 Route Process

./mongo --port 50000


use admin 

(记得执行这一点,切换到admin数据库)


//添加分片节点,每个分片都是一个副本集
db.runCommand({addshard:"replset1/192.168.0.188:18010,192.168.0.188:18011,192.168.0.188:18012",allowLocal:true})
db.runCommand({addshard:"replset2/192.168.0.188:28010,192.168.0.188:28011,192.168.0.188:28012",allowLocal:true})
db.runCommand({addshard:"replset3/192.168.0.188:38010,192.168.0.188:38011,192.168.0.188:38012",allowLocal:true})

(allowLocal:true仅仅开发时才将分片配置到本地,生产时不能这样) -----------------------------------------------------------------------------------

用mongovue连接这几个端口,观察结果:



你会发觉,arbiter仲裁节点因为不接收数据,所以直接被mongos在配置阶段就去掉, db.runCommand({addshard:"replset1/192.168.0.188:18010,192.168.0.188:18011,192.168.0.188:18012",allowLocal:true}) 等价于:db.runCommand({addshard:"replset1/192.168.0.188:18010,192.168.0.188:18011",allowLocal:true})


4:测试

4.1.对数据库mytest启用分片
登录Mongo Shell
./mongo --port 50000

use admin
db.runCommand({enablesharding:"mytest"})



在Mongovue中可以看到 启用分片的数据库已经在config的databases中有登记:


这里以副本集1为基片


4.2对数据库mytest中的集合student启用分片,设置片键为_id


递增片键方式
use admin
db.runCommand({shardcollection:"mytest.student",key:{_id:1}})




4.3分片集群插入数据测试: 测试插入60万条数据 Mongo Shell中运行
use mytest
for(var i=1; i<=600000; i++) db.student.insert({age:i,name:"mary",addr:"guangzhou",country:"China"})


在config的chunks可以看到分了多少片,以及片键的最小到最大的范围

3个replset里可以看到相应的mytest数据库和student集合:




部署成功!


PS:分片的管理(增删与Mongodb的分片部署一样)

目前的分片结构是:


在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。



或者




详情可查看 http://blog.jobbole.com/72643/

摘抄操作部分记录如下:

1、准备机器,IP分别设置为: 192.168.0.136、192.168.0.137、192.168.0.138。
2、分别在每台机器上建立mongodb分片对应测试文件夹。

#存放mongodb数据文件
mkdir -p /data/mongodbtest

#进入mongodb文件夹
cd  /data/mongodbtest

#存放mongodb数据文件
mkdir -p /data/mongodbtest

 
#进入mongodb文件夹
cd  /data/mongodbtest


3、下载mongodb的安装程序包
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz

#解压下载的压缩包
tar xvzf mongodb-linux-x86_64-2.4.8.tgz
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz
 
#解压下载的压缩包
tar xvzf mongodb-linux-x86_64-2.4.8.tgz


4、分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。

因为mongos不存储数据,只需要建立日志文件目录即可。

#建立mongos目录
mkdir -p /data/mongodbtest/mongos/log


#建立config server 数据文件存放目录
mkdir -p /data/mongodbtest/config/data


#建立config server 日志文件存放目录
mkdir -p /data/mongodbtest/config/log


#建立config server 日志文件存放目录
mkdir -p /data/mongodbtest/mongos/log


#建立shard1 数据文件存放目录
mkdir -p /data/mongodbtest/shard1/data


#建立shard1 日志文件存放目录
mkdir -p /data/mongodbtest/shard1/log


#建立shard2 数据文件存放目录
mkdir -p /data/mongodbtest/shard2/data


#建立shard2 日志文件存放目录
mkdir -p /data/mongodbtest/shard2/log


#建立shard3 数据文件存放目录
mkdir -p /data/mongodbtest/shard3/data


#建立shard3 日志文件存放目录
mkdir -p /data/mongodbtest/shard3/log


#建立mongos目录
mkdir -p /data/mongodbtest/mongos/log
 
#建立config server 数据文件存放目录
mkdir -p /data/mongodbtest/config/data
 
#建立config server 日志文件存放目录
mkdir -p /data/mongodbtest/config/log
 
#建立config server 日志文件存放目录
mkdir -p /data/mongodbtest/mongos/log
 
#建立shard1 数据文件存放目录
mkdir -p /data/mongodbtest/shard1/data
 
#建立shard1 日志文件存放目录
mkdir -p /data/mongodbtest/shard1/log
 
#建立shard2 数据文件存放目录
mkdir -p /data/mongodbtest/shard2/data
 
#建立shard2 日志文件存放目录
mkdir -p /data/mongodbtest/shard2/log
 
#建立shard3 数据文件存放目录
mkdir -p /data/mongodbtest/shard3/data
 
#建立shard3 日志文件存放目录
mkdir -p /data/mongodbtest/shard3/log
5、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。

这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.



6、在每一台服务器分别启动配置服务器。

/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --configsvr --dbpath /data/mongodbtest/config/data --port 21000 --logpath /data/mongodbtest/config/log/config.log --fork


/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --configsvr --dbpath /data/mongodbtest/config/data --port 21000 --logpath /data/mongodbtest/config/log/config.log --fork




7、在每一台服务器分别启动mongos服务器。

/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongos  --configdb 192.168.0.136:21000,192.168.0.137:21000,192.168.0.138:21000  --port 20000   --logpath  /data/mongodbtest/mongos/log/mongos.log --fork


/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongos  --configdb 192.168.0.136:21000,192.168.0.137:21000,192.168.0.138:21000  --port 20000   --logpath  /data/mongodbtest/mongos/log/mongos.log --fork



8、配置各个分片的副本集。

#在每个机器里分别设置分片1服务器及副本集shard1
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data  --logpath /data/mongodbtest/shard1/log/shard1.log --fork --nojournal  --oplogSize 10


#在每个机器里分别设置分片1服务器及副本集shard1
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data  --logpath /data/mongodbtest/shard1/log/shard1.log --fork --nojournal  --oplogSize 10
为了快速启动并节约测试环境存储空间,这里加上 nojournal 是为了关闭日志信息,在我们的测试环境不需要初始化这么大的redo日志。同样设置 oplogsize是为了降低 local 文件的大小,oplog是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录Replica Sets操作日志。注意,这里的设置是为了测试!

#在每个机器里分别设置分片2服务器及副本集shard2
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data  --logpath /data/mongodbtest/shard2/log/shard2.log --fork --nojournal  --oplogSize 10


#在每个机器里分别设置分片2服务器及副本集shard2
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data  --logpath /data/mongodbtest/shard2/log/shard2.log --fork --nojournal  --oplogSize 10


#在每个机器里分别设置分片3服务器及副本集shard3
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodbtest/shard3/data  --logpath /data/mongodbtest/shard3/log/shard3.log --fork --nojournal  --oplogSize 10


#在每个机器里分别设置分片3服务器及副本集shard3
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodbtest/shard3/data  --logpath /data/mongodbtest/shard3/log/shard3.log --fork --nojournal  --oplogSize 10
分别对每个分片配置副本集,深入了解副本集参考本系列前几篇文章。


任意登陆一个机器,比如登陆192.168.0.136,连接mongodb


#设置第一个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:22001


#使用admin数据库
use admin


#定义副本集配置
config = { _id:"shard1", members:[
                     {_id:0,host:"192.168.0.136:22001"},
                     {_id:1,host:"192.168.0.137:22001"},
                     {_id:2,host:"192.168.0.138:22001",arbiterOnly:true}
                ]
         }


#初始化副本集配置
rs.initiate(config);


#设置第二个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:22002


#使用admin数据库
use admin


#定义副本集配置
config = { _id:"shard2", members:[
                     {_id:0,host:"192.168.0.136:22002"},
                     {_id:1,host:"192.168.0.137:22002"},
                     {_id:2,host:"192.168.0.138:22002",arbiterOnly:true}
                ]
         }


#初始化副本集配置
rs.initiate(config);


#设置第三个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo    127.0.0.1:22003


#使用admin数据库
use admin


#定义副本集配置
config = { _id:"shard3", members:[
                     {_id:0,host:"192.168.0.136:22003"},
                     {_id:1,host:"192.168.0.137:22003"},
                     {_id:2,host:"192.168.0.138:22003",arbiterOnly:true}
                ]
         }


#初始化副本集配置
rs.initiate(config);


#设置第一个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:22001
 
#使用admin数据库
use admin
 
#定义副本集配置
config = { _id:"shard1", members:[
                     {_id:0,host:"192.168.0.136:22001"},
                     {_id:1,host:"192.168.0.137:22001"},
                     {_id:2,host:"192.168.0.138:22001",arbiterOnly:true}
                ]
         }
 
#初始化副本集配置
rs.initiate(config);
 
#设置第二个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:22002
 
#使用admin数据库
use admin
 
#定义副本集配置
config = { _id:"shard2", members:[
                     {_id:0,host:"192.168.0.136:22002"},
                     {_id:1,host:"192.168.0.137:22002"},
                     {_id:2,host:"192.168.0.138:22002",arbiterOnly:true}
                ]
         }
 
#初始化副本集配置
rs.initiate(config);
 
#设置第三个分片副本集
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo    127.0.0.1:22003
 
#使用admin数据库
use admin
 
#定义副本集配置
config = { _id:"shard3", members:[
                     {_id:0,host:"192.168.0.136:22003"},
                     {_id:1,host:"192.168.0.137:22003"},
                     {_id:2,host:"192.168.0.138:22003",arbiterOnly:true}
                ]
         }
 
#初始化副本集配置
rs.initiate(config);
9、目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。


#连接到mongos
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:20000


#使用admin数据库
user  admin


#串联路由服务器与分配副本集1
db.runCommand( { addshard : "shard1/192.168.0.136:22001,192.168.0.137:22001,192.168.0.138:22001"});


#连接到mongos
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:20000
 
#使用admin数据库
user  admin
 
#串联路由服务器与分配副本集1
db.runCommand( { addshard : "shard1/192.168.0.136:22001,192.168.0.137:22001,192.168.0.138:22001"});
如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入,如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });这样的格式表示 。


#串联路由服务器与分配副本集2
db.runCommand( { addshard : "shard2/192.168.0.136:22002,192.168.0.137:22002,192.168.0.138:22002"});


#串联路由服务器与分配副本集2
db.runCommand( { addshard : "shard2/192.168.0.136:22002,192.168.0.137:22002,192.168.0.138:22002"});


#串联路由服务器与分配副本集3
db.runCommand( { addshard : "shard3/192.168.0.136:22003,192.168.0.137:22003,192.168.0.138:22003"});


#串联路由服务器与分配副本集3
db.runCommand( { addshard : "shard3/192.168.0.136:22003,192.168.0.137:22003,192.168.0.138:22003"});


#查看分片服务器的配置
db.runCommand( { listshards : 1 } );


#查看分片服务器的配置
db.runCommand( { listshards : 1 } );
#内容输出




{
         "shards" : [
                {
                        "_id" : "shard1",
                        "host" : "shard1/192.168.0.136:22001,192.168.0.137:22001"
                },
                {
                        "_id" : "shard2",
                        "host" : "shard2/192.168.0.136:22002,192.168.0.137:22002"
                },
                {
                        "_id" : "shard3",
                        "host" : "shard3/192.168.0.136:22003,192.168.0.137:22003"
                }
        ],
        "ok" : 1
}


{
         "shards" : [
                {
                        "_id" : "shard1",
                        "host" : "shard1/192.168.0.136:22001,192.168.0.137:22001"
                },
                {
                        "_id" : "shard2",
                        "host" : "shard2/192.168.0.136:22002,192.168.0.137:22002"
                },
                {
                        "_id" : "shard3",
                        "host" : "shard3/192.168.0.136:22003,192.168.0.137:22003"
                }
        ],
        "ok" : 1
}
因为192.168.0.138是每个分片副本集的仲裁节点,所以在上面结果没有列出来。
10、目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。连接在mongos上,准备让指定的数据库、指定的集合分片生效。


#指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});


#指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});


#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )


#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
11、测试分片配置结果。


#连接mongos服务器
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:20000


#连接mongos服务器
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo  127.0.0.1:20000


#使用testdb
use  testdb;


#使用testdb
use  testdb;


#插入测试数据
for (var i = 1; i <= 100000; i++)
db.table1.save({id:i,"test1":"testval1"});


#插入测试数据
for (var i = 1; i <= 100000; i++)
db.table1.save({id:i,"test1":"testval1"});


#查看分片情况如下,部分无关信息省掉了
db.table1.stats();


#查看分片情况如下,部分无关信息省掉了
db.table1.stats();
{
        "sharded" : true,
        "ns" : "testdb.table1",
        "count" : 100000,
        "numExtents" : 13,
        "size" : 5600000,
        "storageSize" : 22372352,
        "totalIndexSize" : 6213760,
        "indexSizes" : {
                "_id_" : 3335808,
                "id_1" : 2877952
        },
        "avgObjSize" : 56,
        "nindexes" : 2,
        "nchunks" : 3,
        "shards" : {
                "shard1" : {
                        "ns" : "testdb.table1",
                        "count" : 42183,
                        "size" : 0,
                        ...
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "testdb.table1",
                        "count" : 38937,
                        "size" : 2180472,
                        ...
                        "ok" : 1
                },
                "shard3" : {
                        "ns" : "testdb.table1",
                        "count" :18880,
                        "size" : 3419528,
                        ...
                        "ok" : 1
                }
        },
        "ok" : 1
}






{
        "sharded" : true,
        "ns" : "testdb.table1",
        "count" : 100000,
        "numExtents" : 13,
        "size" : 5600000,
        "storageSize" : 22372352,
        "totalIndexSize" : 6213760,
        "indexSizes" : {
                "_id_" : 3335808,
                "id_1" : 2877952
        },
        "avgObjSize" : 56,
        "nindexes" : 2,
        "nchunks" : 3,
        "shards" : {
                "shard1" : {
                        "ns" : "testdb.table1",
                        "count" : 42183,
                        "size" : 0,
                        ...
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "testdb.table1",
                        "count" : 38937,
                        "size" : 2180472,
                        ...
                        "ok" : 1
                },
                "shard3" : {
                        "ns" : "testdb.table1",
                        "count" :18880,
                        "size" : 3419528,
                        ...
                        "ok" : 1
                }
        },
        "ok" : 1
}
可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。
12、java程序调用分片集群,因为我们配置了三个mongos作为入口,就算其中哪个入口挂掉了都没关系,使用集群客户端程序如下:


public class TestMongoDBShards {


       public static void main(String[] args) {


             try {
                  List<ServerAddress> addresses = new ArrayList<ServerAddress>();
                  ServerAddress address1 = new ServerAddress("192.168.0.136" , 20000);
                  ServerAddress address2 = new ServerAddress("192.168.0.137" , 20000);
                  ServerAddress address3 = new ServerAddress("192.168.0.138" , 20000);
                  addresses.add(address1);
                  addresses.add(address2);
                  addresses.add(address3);


                  MongoClient client = new MongoClient(addresses);
                  DB db = client.getDB( "testdb" );
                  DBCollection coll = db.getCollection( "table1" );


                  BasicDBObject object = new BasicDBObject();
                  object.append( "id" , 1);


                  DBObject dbObject = coll.findOne(object);


                  System. out .println(dbObject);


            } catch (Exception e) {
                  e.printStackTrace();
            }
      }
}


public class TestMongoDBShards {
 
       public static void main(String[] args) {
 
             try {
                  List<ServerAddress> addresses = new ArrayList<ServerAddress>();
                  ServerAddress address1 = new ServerAddress("192.168.0.136" , 20000);
                  ServerAddress address2 = new ServerAddress("192.168.0.137" , 20000);
                  ServerAddress address3 = new ServerAddress("192.168.0.138" , 20000);
                  addresses.add(address1);
                  addresses.add(address2);
                  addresses.add(address3);
 
                  MongoClient client = new MongoClient(addresses);
                  DB db = client.getDB( "testdb" );
                  DBCollection coll = db.getCollection( "table1" );
 
                  BasicDBObject object = new BasicDBObject();
                  object.append( "id" , 1);
 
                  DBObject dbObject = coll.findOne(object);
 
                  System. out .println(dbObject);
 
            } catch (Exception e) {
                  e.printStackTrace();
            }
      }
}




相关推荐:【转】Mongodb实现副本集

既然使用Mongodb,就不得不用他的安全备份机制:副本集。 Mongodb副本集是什么东西?   通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一

前面尝试了三种部署:1.主从部署(Mongodb的主从部署)2.副本集部署(Mongodb的副本集部署)3.分片部署(Mongodb的分片部署)现在尝试一下副本集+分片的部署,也就是比副本集多了分片的功能,在分片配

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。