记录一次安装配置mongodb并做数据预分片

我们组用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
yyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:27227
mongos> use admin
mongos> 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
}
9、接着我们要告知集群,哪个数据库是要做分片的
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"})
          (假如
          把某个集合按{"_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、做测试
在机器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上面,进入一个mongod
yyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:13002
shard1_1:SECONDARY> db.user.find()
{ "_id" : 0, "name" : "jack" }
{ "_id" : 10000, "name" : "john" }
{ "_id" : 100, "name" : "jack+100" }
在机器2上面,进入另外一个mongod
yyy@yyy-VirtualBox:~$ /usr/bin/mongodb/mongo 127.0.0.1:11002
shard1_0:SECONDARY> db.user.find()
{ "_id" : -100, "name" : "jack-100" }
果然分片成功!

13、注意
在rs中,如果报错  error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
则执行  db.getMongo().setSlaveOk() 

你可能感兴趣的:(mongodb)