首先了解大体了解mongodb复制集和分片的作用,简单来说复制集是保证数据的安全性,分片提高了数据库的并发性。(随便提一下对于数据安全性这里,mongodb是通过复制集实现的,当然也可以通过计算机的硬件来实现比如有的公司硬盘采用磁盘阵列冗余存储,没见过这东东是啥)
mongodb安装目录下新建data目录用于存放数据
data下对应五个文件夹,分别对应配置父亲,mongos服务器以及三个分片服务器,由于每个分片又是通过复制集来实现的,所有每个shard下面又有三台mongod实例。
 
由于在配置过程中会有大量重复的命令,所有我通过脚本形式来启动。
由于复制集是分片的基础,先说复制集
shard1.sh
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db1/db --logpath=/usr/local/mongodb/data/shard1/db1/log.log --logappend --fork --port 2000 --replSet=shard1
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db2/db --logpath=/usr/local/mongodb/data/shard1/db2/log.log --logappend --fork --port 2001 --replSet=shard1
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db3/db --logpath=/usr/local/mongodb/data/shard1/db3/log.log --logappend --fork --port 2002 --replSet=shard1
其实就是启动一个mongodb实例,—replSet=shard1,是要创建的复制集的标志。
执行后并没有形成一个复制集,还是需要初始化。
登陆任意一个mongod实例,/usr/local/mongodb/bin/mongod 127.0.0.1:2000/admin
执行rs.status(),会有相应的报错提示,大体意思是复制集还没有初始化,请先初始化
那输入配置config = {_id: “shard1”,members: [_{id: 0, host: “127.0.0.1:2000”},{_id: 1, host: “127.0.0.1:2001”},{_id:2, host: “127.0.0.1:2002”}]}
然后执行rs.initiate(config);
OK,第一个复制集就创建好了。其他三个复制集类似,需要注意的是每个分片的复制集的名字。为了好记,我是用shard1 shard2 shard3,另外端口我也是每个shard分别用2001 2001 2002,3000 3001 3002,4000 401 4002
配置服务器
首先启动配置服务器
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/conf/db --logpath=/usr/local/mongodb/data/conf/log.log --logappend --fork -port 5000 –configsvr
然后类似复制集一样需要分片配置的初始化
/usr/local/mongodb/bin/mongod 127.0.0.1:5000/admin
通过命令 db.runCommand({addshard: “replicaSetName/[serverhost[: port], …]”}),添加复制集分片
db.runCommand({addshard: “shard1/127.0.0.1:2000,127.0.0.1:2001,127.0.0.1:2002”})
db.runCommand({addshard: “shard2/127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002”})
db.runCommand({addshard: “shard3/127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002”})
分片添加成功,查看 db.runCommand({listshards:1});
或是 show dbs
use conf
db.conf.find();
mongos服务器
启动服务器 /usr/local/mongodb/bin/mongos –port 5001 –configdb 127.0.0.1:5000
连接 /usr/local/mongodb/bin/mongo 127.0.0.1:5001/admin
使分片生效 db.runCommand({enablesharding: “sand”}),指定数据库
db.runCommand({shardcollection: “sand.decision”, key: {order: 1}}); 指定要分片的collection以及片键,因为并不是需要所有的collection都不要分片,分片的片键也不一样。
至此,分片工作以及完成
连接mongos,如上
use sand
for(var i=1;i<100000000;i++){db.decision.save({name: “decision”+i, order: i});}
千万级还是要等老久了。。。
db.decision.count()
然后分别连接每个复制集的任意一个mongod的实例,执行db.decision.count()查看
复制集的secondary级别的默认是不允许操的,可以通过命令rs.status0k(),使之临时可以操作,此时会发现每个分片上都有数据且不同,但同一个分片上不同的mongod上数据是一样的。
 
自己目前可以通过gulp实现简单的自动化部署,由于对gulp没有深入研究,一致在想能不能通过gulp实现全部的自动化呢?
公司没有这样的需求,只是自己平时玩玩,对稳定性,性能上都没有什么经验,如果有写过这方便的亲们给发个链接。