1.mongodb的主从复制:主服务器:mongod--dbpathF:\mongodb\data--port27017从服务器:mongod--slave--dbpathF:\mongodb-slave\data--port10001--sourcelocalhost:27017--onlytest选项说明:--on
1. mongodb的主从复制:
主服务器:
mongod --dbpath "F:\mongodb\data" --port 27017
从服务器:
mongod --slave --dbpath "F:\mongodb-slave\data" --port 10001 --source localhost:27017 --only test
选项说明:
--only
在从节点上指定复制某个数据库(默认复制所有数据库)
--slavedelay
用在从节点上,当应用主节点的操作时增加延时(秒)
--fastsync
以主节点的数据快照为基础启动从节点,如果数据目录一开始是主节点的数据快照,从节点用这个选项启动要比完整同步快多了
--autoresync
如果从节点与主节点不同步,则自动重新同步
--oplogSize
主节点oplog的大小(MB)
一般一个主从服务群点不超过12个从节点,避免成千上万的从节点对单个主节点发起查询会拖垮主节点
2. mongodb的副本集:
副本集就是有自动故障恢复功能的主从集群。
主从集群和副本集最为明显的区别就是副本集没有固定的主节点,可以把副本集当做一个集群,整个集群会选出一个主节点,当其不能正常工作时则会激活其他节点。
注意:不能用localhost作为mongodb地址成员,我们需要找到主机名(fornane-PC)
另外,给该mongodb集群一个名称,如:blort
配置mongodb副本集群的主要步骤分为两大部分:
第一部分:启动节点服务
第一个节点启动命令:
mongod --dbpath "F:\mongodb-node1\data" --port 10001 --replSet blort/fornane-PC:10002
第二个节点启动命令:
mongod --dbpath "F:\mongodb-node2\data" --port 10002 --replSet blort/fornane-PC:10001
第二部分:初始化配置信息
该部分其实是往mongodb的主节点中初始化整个集群的配置信息,该信息记录在primary节点(活跃节点)的local库的system.replset集合中,可以通过以下命令查看:
use local;
db.system.replset.find();
或者
rs.conf();
以下内容是用于初始化集群信息的命令(在shell中执行):
db.runCommand({
"replSetInitiate": {
"_id": "blort",
"members": [{
"_id": 1,
"host": "fornane-PC:10001"
},
{
"_id": 2,
"host": "fornane-PC:10002"
}]
}
})
当然也可以使用
rs.initiate({
_id : "blort",
members : [
{"_id" : 1,"host" : "PC-201007141658:10001"},
{"_id" : 2,"host" : "PC-201007141658:10002"}
]
})
ok,到此包含两个节点的mongodb集群配置完成,可以通过shell分别连接两个服务器查看状态,注意只能在primary的节点中进行数据的读写。
测试是否成功,只需在primary节点中新建一个db,然后再写入数据后在secondary节点查看该db是否同步成功即可!
若要在secondary节点中查询数据需要执行以下命令(读扩展):
db.getMongo().setSlaveOk();
或者:
rs.slaveOk();
在以上两个节点的基础上增加第三个节点的方法:
第一步:启动节点服务,并想其他已有节点中的任意一台进行广播:
mongod --dbpath "F:\mongodb-node3\data" --port 10003 --replSet blort/fornane-PC:10002
第二步:修改当前primary节点中的 system.replset 信息,增加新加入的节点的信息:
rs.add("fornane-PC:10003")
到此,第三个节点加入完成,增加后续的更多的节点方式与此一致。
测试方式同上文所述。
以下分别是各节点的数据同步结果:
node 1:
node 2:
node 3:
集群信息如下:
注:1. 主机名为PC-201007141658
2.
初始的primary节点(10001)关闭后,原secondary节点(10003)被选举为primary节点
附常用查看集群信息的命令:
rs.status(); 当前状态
rs.conf(); 当前配置信息
rs.slaveOk(); 读扩展
rs.remove("fornane-PC:10003"); 删除节点
参考:
http://cn.docs.mongodb.org/manual/reference/method/js-replication/
3. mongodb的自动分片
结构如下图:
如此,仅仅需要暴露 Mongos ,具体的查询、插入等全部由 mongodb 自动进行分片
部署步骤:
1. 启动 Config Server
mongod --dbpath "F:/mongodb-shard/config-server/data" --port 20000
2. 启动 Mongos Server
mongod --port 30000 --configdb localhost:20000
3. 启动 Mongod Server
mongod --dbpath "F:/mongodb-shard/mongod-server/data" --port 10000
4. 通过 shell 连接Mongos Server
mongo --port localhost:30000/admin
注意:使用admin登录,否则后面会没权限
检查是否连接在 Mongos Server
sh._checkMongos()
若报错,先执行
use admin
参考:http://docs.mongodb.org/manual/reference/method/js-sharding/
5. 添加分片
sh.addShard("localhost:10000")
或者
db.runCommand({addShard : "localhost:10000" , allowLocal : true})
6. 切分数据
sh.shardCollection("foo");
sh.shardCollection("foo.users", { _id:1} , unique : true )
或者
db.runCommand({"enablesharding":foo})
db.runCommand({"shardcollection":"foo.users", "key":{"_id":1}, "unique" : true})
ok,到这里分片配置完成。
当然为了看到具体的分片想过我们继续添加一个 Mongod Server ,启动后执行
sh.addShard("localhost:10001")
最后通过java连接mongodb,并写入1030002条记录,即可看到效果,java
Mongo mongo = new Mongo("localhost" , 30000);
DB db = mongo.getDB("foo");
DBCollection users = db.getCollection("users");
for(int i =0 ; i<1000000 ; i++) {
DBObject user = new BasicDBObject();
user.put("username", "cbpan" + Math.random());
users.save(user);
}
DBCursor cur = users.find();
System.out.println(cur.count());
最终测试结果:
by fornane