我们组用mongodb已经一年度多了,这个实验是很久之前就记录在evernote了的,最近想建一个博客,所以就搬进来,可能有同学会搜到能有帮助吧。
1、安装mongodb,记住要下源码安装,apt-get install 不一定是最新版
2、一开始因为空间不足,无法启动,我的虚拟机当时只分配了8g,启动mongodb是剩余更少,后来就扩充vbox的磁盘空间,于是有了vbox里面那两篇笔记
3、我启动四个数据mongod,一个conf的mongod,一个mongos,其中四个数据mongod组成两个shard。启动脚本分别如下
在机器1上面:(机器1的ip: 192.168.45.232)
mkdir -p /data/mongodata/shard1_0_pri && mkdir -p /data/mongodata/dblog && numactl --interleave=all /usr/bin/mongodb/mongod --port 11001 --dbpath /data/mongodata/shard1_0_pri --logpath /data/mongodata/dblog/shard1_0_pri --replSet shard1_0 --fork --shardsvr --logappend
mkdir -p /data/mongodata/shard1_1_pri && mkdir -p /data/mongodata/dblog && numactl --interleave=all /usr/bin/mongodb/mongod --port 13001 --dbpath /data/mongodata/shard1_1_pri --logpath /data/mongodata/dblog/shard1_1_pri --replSet shard1_1 --fork --shardsvr --logappend
mkdir -p /data/mongodata/conf1 && mkdir -p /data/mongodata/dblog && numactl --interleave=all /usr/bin/mongodb/mongod --port 9001 --dbpath /data/mongodata/conf1 --logpath /data/mongodata/dblog/conf1 --fork --logappend --oplogSize 1024 --configsvr --rest
【为什么连接上mongos可以设置shard的机器?答:因为mongos的启动需要指定一台已经启动的conf机器】
mkdir -p /data/mongodata/dblog && numactl --interleave=all /usr/bin/mongodb/mongos --port 27227 --configdb 192.168.45.232:9001 --logpath /data/mongodata/dblog/mongos1 --fork --maxConns 500 --chunkSize 128 --logappend --noAutoSplit
在机器2上面:(机器2的ip: 192.168.45.224)
mkdir -p /data/mongodata/shard1_0_sed && mkdir -p /data/mongodata/dblog && numactl --interleave=all /usr/bin/mongodb/mongod --port 11002 --dbpath /data/mongodata/shard1_0_sed --logpath /data/mongodata/dblog/shard1_0_sed --replSet shard1_0 --fork --shardsvr --logappend
mkdir -p /data/mongodata/shard1_1_sed && mkdir -p /data/mongodata/dblog && numactl --interleave=all /usr/bin/mongodb/mongod --port 13002 --dbpath /data/mongodata/shard1_1_sed --logpath /data/mongodata/dblog/shard1_1_sed --replSet shard1_1 --fork --shardsvr --logappend
4、之前总是在郁闷,机器之间怎么建立关系,同一个shard的不同mongod是在不同机器上面如何互相感知?好吧,就是这部操作!
进入机器1的一个mongod
yyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:11001> config={_id:"shard1_0", members:[... {_id:0, host:"192.168.45.232:11001"},... {_id:1, host:"192.168.45.224:11002"}]}> rs.initiate(config)> rs.status() 过稍微一会就发现已经组成了shard了shard1_0:SECONDARY> rs.status() 现在已经组成shard了,而且光标前面也有了shard1_0:SECONDARY,在另外一台机器上也有>exit
5、进入机器1的另一个mongod
yyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:13001> config={_id:"shard1_1", members:[... {_id:0, host:"192.168.45.232:13001"},... {_id:1, host:"192.168.45.224:13002"}]}> rs.initiate(config)> rs.status()shard1_1:PRIMARY> exit
6、我觉得这一步奇怪的是,为什么在一台机子的mongod上面做这些设置,那么另外一台机器就会接受他的设置?? 难道是由shard名字共同约定的?? 不需要其他认证??
7、到这里,同一个shard之间的mongod已经互相感知到对方了,知道和谁是组成一个shard了,但是起路由作用的mongos还不知道呢
8、登陆一个mongos
9、接着我们要告知集群,哪个数据库是要做分片的yyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:27227mongos> use adminmongos> sh.addShard("shard1_0/192.168.45.232:11001,192.168.45.224:11002")mongos> sh.addShard("shard1_1/192.168.45.232:13001,192.168.45.224:13002")接着打印一下shard列表是什么样子的,发现确实已经加到集群里面了,mongos已经感知到shard的存在了:mongos> db.runCommand({"listshards":1}){"shards" : [{"_id" : "shard1_0","host" : "shard1_0/192.168.45.224:11002,192.168.45.232:11001"},{"_id" : "shard1_1","host" : "shard1_1/192.168.45.224:13002,192.168.45.232:13001"}],"ok" : 1}
mongos> db.runCommand({enableSharding:"user"})
10、接着告知集群,哪个集合是要按哪个key值做分片的
mongos> db.runCommand( { shardCollection: "user.user", key: {"_id":1} })
11、做预分片
把某个集合按{"_id":0}分成两部分:
mongos> db.runCommand({split:"user.user", middle:{"_id":0}})
其中<0的部分扔给shard1_0:
mongos> db.adminCommand({moveChunk:"user.user", find:{"_id":0}, to:"shard1_0"})
其中<0的部分扔给shard1_0:
mongos> db.adminCommand({moveChunk:"user.user", find:{"_id":0}, to:"shard1_0"})
(假如
把某个集合按{"_id":10000}分成两部分:
mongos> db.runCommand({split:"user.user", middle:{"_id":10000}})
其中<10000的部分扔给shard1_1:
mongos> db.adminCommand({moveChunk:"user.user", find:{"_id":10000}, to:"shard1_1"})
)
这时会被告知,这部分chunk已经在shard1_1了,确实,因为第一次分片就已经把<0的扔给一个shard,其他的就被自动分到另一个shard了(是mongodb的自动处理,具体策略不清楚)
12、做测试
13、注意在机器1上面mongos> db.user.insert({"_id":0, "name":"jack"})mongos> db.user.insert({"_id":10000, "name":"john"})mongos> db.user.insert({"_id":-100, "name":"jack-100"})在机器2上面,进入一个mongodyyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:13002shard1_1:SECONDARY> db.user.find(){ "_id" : 0, "name" : "jack" }{ "_id" : 10000, "name" : "john" }{ "_id" : 100, "name" : "jack+100" }在机器2上面,进入另外一个mongodyyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:11002shard1_0:SECONDARY> db.user.find(){ "_id" : -100, "name" : "jack-100" }果然分片成功!
在rs中,如果报错 error: { "$err" : "not master and slaveOk=false", "code" : 13435 }则执行 db.getMongo().setSlaveOk()