MongoDB复制和分片

MongoDB复制和分片

参考:《MongoDB权威指南》

搭建MongoDB集群有三种方式,分别是主从复制副本集分片,搭建的难度也是递增的

搭建一个MongoDB集群

参考: https://blog.csdn.net/luonanqin/article/details/8497860

本节将讲述搭建三种不同集群的具体步骤

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}之类无效。
  • 扩展索引:如果有数百万的用户,每人每天有数十条状态更新。那么对于每次最新状态的查询,数据库都会将不同的页载入内存,所以要改变索引的顺序,尽量将查询比较多的页存入内存。
  • 创建索引的思考:索引字段是否是查询中常用到的字段,方向是否合适?

mongodb内存