MongoDB复制和分片
参考:《MongoDB权威指南》
搭建MongoDB集群有三种方式,分别是主从复制、副本集和分片,搭建的难度也是递增的
搭建一个MongoDB集群
本节将讲述搭建三种不同集群的具体步骤
1. 主从复制
主从复制是最简单的一种搭建MongoDB的方式,可以是一主一从,也可以是一主多从。
./mongod --master --dbpath 主节点数据地址 --port 10000 #主节点
./mongod --slave --dbpath 从节点数据地址 --port 10001 --source localhost:10000 #从节点
如上就在同一台主机上搭建了一主一从的MongoDB集群,这种方式的优点是简单、灵活,缺点是只允许主节点作数据更新操作,一旦主节点宕机服务将不可用。这种方式MongoDB官方已经不推荐。
2. 副本集
首先,建立数据文件夹
mkdir -p /mongodb/data/master
mkdir -p /mongodb/data/slaver
mkdir -p /mongodb/data/arbiter
其次,创建主备和仲裁节点配置文件
#master.conf
dbpath=/mongodb/data/master
logpath=/mongodb/log/master.log
pidfilepath=/mongodb/master.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=10.10.148.130
port=27017
oplogSize=10000
fork=true
noprealloc=true
#slaver.conf
dbpath=/mongodb/data/slaver
logpath=/mongodb/log/slaver.log
pidfilepath=/mongodb/slaver.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=10.10.148.131
port=27017
oplogSize=10000
fork=true
noprealloc=true
#arbiter.conf
dbpath=/mongodb/data/arbiter
logpath=/mongodb/log/arbiter.log
pidfilepath=/mongodb/arbiter.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=10.10.148.132
port=27017
oplogSize=10000
fork=true
noprealloc=true
然后,进入每个mongod的bin文件启动MongoDB
./monood -f master.conf
./mongod -f slaver.conf
./mongod -f arbiter.conf
最后,在Mongo Shell中配置config集合
./mongo 10.10.148.130:27017 #ip和port是某个节点的地址
>use admin
>cfg={ _id:"testrs", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1},
{_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] };
>rs.initiate(cfg) #使配置生效
3. 分片
首先,启动三个数据节点
./mongod --fork --dbpath ../data/set1/ --logpath ../log/set1.log --replSet test #192.168.4.43
./mongod --fork --dbpath ../data/set2/ --logpath ../log/set2.log --replSet test #192.168.4.44
./mongod --fork --dbpath ../data/set3/ --logpath ../log/set3.log --replSet test #192.168.4.45 决策 不存储数据
其次,启动配置节点
./mongod --configsvr --dbpath ../config/set1/ --port 20001 --fork --logpath ../log/conf1.log #192.168.4.30
./mongod --configsvr --dbpath ../config/set2/ --port 20002 --fork --logpath ../log/conf2.log #192.168.4.31
然后,启动路由节点
./mongos --configdb 192.168.4.30:20001,192.168.4.31:20002 --port 27017 --fork --logpath ../log/root.log #192.168.4.29
然后,配置副本集
./mongo 192.168.4.43:27017 #ip和port是某个节点的地址
>use admin
>cfg={ _id:"testrs", members:[ {_id:0,host:'192.168.4.43:27017',priority:2}, {_id:1,host:'192.168.4.44:27017',priority:1},
{_id:2,host:'192.168.4.45:27017',arbiterOnly:true}] };
>rs.initiate(cfg) #使配置生效
最后,配置sharding
./mongo 192.168.4.29:27017 #这里必须连接路由节点
>sh.addShard("test/192.168.4.43:27017") #test表示replica set的名字 当把主节点添加到shard以后,会自动找到set里的主,备,决策节点
>db.runCommand({enableSharding:"diameter_test"}) #diameter_test is database name
>db.runCommand( { shardCollection: "diameter_test.dcca_dccr_test",key:{"__avpSessionId":1}})
查询与索引
查询的基础使用不再赘述
游标
游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口.客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等!当使用find的时候,shell并不立即查询数据库,而是返回一个游标,这样用户可以给查询附加额外的限制,如limit、skip和sort。
- 不使用skip做分页的方法:比如按照date降序显示文档,可以限制获取第一页,然后用最后一个值作为查询条件再限制获取查询第二页,依次类推。
索引
创建索引:> db.ensureIndex({"date":1}) 表示给date建创建一个顺序方向检索的索引
- 同样遵循前缀原则:比如有一个索引{“a”:1,”b”:1,….”z”:1},那么对于{“a”:1},{“a”:1,”b”:1},{“a”:1,”b”:1,”c”:1}等有效,对于{“b”:1},{“a”:1,”c”:1}之类无效。
- 扩展索引:如果有数百万的用户,每人每天有数十条状态更新。那么对于每次最新状态的查询,数据库都会将不同的页载入内存,所以要改变索引的顺序,尽量将查询比较多的页存入内存。
- 创建索引的思考:索引字段是否是查询中常用到的字段,方向是否合适?