阅读 mongodb 副本集的 笔记

1.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成

2. /mongod --port=5536 --fork --noscriptiong  --nohttpinter-face --dbpath=/data/Chunbai/app/mongodb/data/db --logappend --logpath=/data/Chunbai/app/mongodb/log/mongodb.log

关掉mongo   

kill -2  `cat mongo.pid`  会等所有的数据都写到文件里后,才关闭mongo  比较安全


3.mongodb插入数据 一条数据(文档) 根据版本的不同 最大插入数不同(4M)


4.对于 更新修改器  和查询条件器 会发现以$开头的键处在不同的位置,在查询中,'$lt'在内层文档,而更新'$inc'在外层文档。例如db.user.find({'age':{'$lt':30,'$gt':20}}) 与 db.user.update({'age':30},{'$inc':{age:1}})对比


5.mongodb 客户端的游标,及其服务端的游标。


6.索引 ensureIndex(array('key'=>1),'unique'=>true)   唯一索引ensureIndex(array('key'=>1),'unique'=>true) ,可以更好的控制索引的使用:hint()。复合索引:ensureIndex(array('key'=>1),'name'=>1).索引的用法 和mysql 相同,优化器根据查询条件,选择最优的索引,也可以用explain 去优化索引:db.'表明'.find({'key':'value','key1':'value2'}).explain().空间索引:根据坐标可以查询信息(觉着很NB)。现在的社交软件我觉着都用到了这个。


7.mongodb:普通集合插入顺序是如果一段文档数据处理前增大的话,就会忘集合尾部累加。耗时,性能不优。
固定集合: 必须先建立集合名,当集合写满时,会把最早的数据删掉

优点: 固定集合 插入速度比动态集合快,因为 已经分配好了 集合的固定大小(可以自己分配),直接插入到末尾,不用去分配空间,因为是按顺序插入的  所以查询页较快。


8.js代码 在php里使用的话  得先用MongoDbCode(‘字符串’)处理赋给一个变量,给下文用,或者 把 js代码 写入到db.system.js这个即合理,这样的话,就可以在当前数据库的所有集合里用到,相当于全局的。


9.mongodb主从复制,  
主服:10.204.150.69  ./mongod --master --por=27017 --fork --dbpath=/data/Chunbai/app/mongodb/data/db --logappend --logpath=/data/Chunbai/app/mongodb/log/mongodb.log
从服: 10.204.36.38  ./mongod --slave --source 10.204.150.69 --port=5536 --dbpath=/data/Chunbai/app/mongodb/data/slave_5536 --fork --logappend --logpath=/data/Chunbai/app/mongodb/log/mongodb_slave_5536.log

结果 在主服务器上插入一条  从对应一条


10.副本集

准备三台服务器【虚拟ip也行】

A:10.204.150.69

B:182.36.38

C:10.182.7.88

这里面有个重要的参数  --replSet  '参数名'/'ip 地址:端口'   :参数名值得是 你配置的这个副本集的名字,ip是指别的服务器的ip地址 ,意思是说 这个副本集中除了自己 还有别的服务器在这个副本集里

A: ./mongod --dbpath=/data/Chunbai/app/mongodb/data/r0 --logpath=/data/Chunbai/app/mongodb/log/r0.log --logappend --fork --replSet  mongoset/10.182.36.38 --port=27017

B: ./mongod --dbpath=/data/Chunbai/app/mongodb/data/r1 --logpath=/data/Chunbai/app/mongodb/log/r1.log --logappend --fork --replSet mongoset/10.204.150.69 --port=27017

C:  ./mongod --dbpath=/data/Chunbai/app/mongodb/data/r2 --logpath=/data/Chunbai/app/mongodb/log/r2.log --logappend --fork --replSet mongoset/10.204.150.69,10.182.36.38 --port=27017

这样启动以后 在  日志里 看以看到 这样的日志 ,意思是说 副本集群还没有启动,监测不到对方

2014-06-27T17:51:47.669+0800 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)

然后 在 bin 目录下  ./mogo   10.182.7.88:27017/admin    随便连接一个服务器然后启动他的 admin数据库

定义变量

config = {"_id" : "mongoset", "members":[{"_id" : 1,"host" : "10.204.150.69:27017"},{"_id" : 2,"host" : "10.182.36.38:27017"},{"_id":3,"host":"10.182.7.88:27017"}]} 

然后  rs.initiate(config)  时间可能回有点长 耐心等,我自己前两次 都以为 卡机 所以 ctrl +c   导致只初始化了主节点 别的服务器都没有初始化 【注意不要把config 的值义字符串直接放在这个方法里会报如下错】

rs.initiate('{"_id" : "mongoset", "members":[{"_id" : 1,"host" : "10.204.150.69:27017"},{"_id" : 2,"host" : "10.182.36.38:27017"},{"_id":3,"host":"10.182.7.88:27017"}]}')
{
        "info2" : "no configuration explicitly specified -- making one",
        "me" : "VM_150_69:27017",
        "ok" : 0,
        "errmsg" : "couldn't initiate : can't find self in the replset config"
}

执行成功:

rs.initiate(config)
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}

这时候重新连接 服务器会显示      mongoset:PRIMARY>     mongoset:SECONDARY>  这两种的命令行   主节点是mongdb 内部机制自己处理的  对操作者是透明的 ,但是也可以通过参数 增加主节点的几率。这里只讲最基础的

这时候  use  local  (本地数据库)  show collections   会看到一下集合

me
oplog.rs   可以起到同步数据的 日志, 从服务器 通过读这个集合的文档可进行同步数据   下面会将关于它的大小
replset.minvalid   当前同步到的  最新时间戳

{ "_id" : ObjectId("53ad468f21c3453942597e5a"), "ts" : Timestamp(1403865965, 1) }

timesetamp  指的是当前数据的最新的时间戳   (如果三个服务器第一次开启的话 ,这个数据是准确的,但是途中如果 主节点当机,7.88变成主节点时,在7.88 上 这个集合 的时间戳是插入数据最新的 时间戳【插入集合的记录。在oplog.rs中可以看到】,也就是说是相等的)【{ db.oplog.rs.find() ; 最后一条的文档 "ts" : Timestamp(1403865965, 1), "h" : NumberLong("-2638396285159547658"), "v" : 2, "op" : "i", "ns" : "weibo.page", "o" : { "_id" : ObjectId("53ad4b6d176e168960b4ec92"), "xierqi" : "beijing" } }】,这时候在看150.69 时,replset.minvalid的时间戳  还是1403865965,也就是说没有更新,如果这时候主节点再变成150.69时  他的 也就变成最新的了。36.38  同样。
slaves  除了当前操作服务器意外的  服务器.从节点连接主节点时会用到 (这里指的是另外两个ip)  以 150.69  为列:

{ "_id" : ObjectId("53ad3f7147eb196a16abc241"), "config" : { "_id" : 3, "host" : "10.182.7.88:27017" }, "ns" : "local.oplog.rs", "syncedTo" : Timestamp(1403865965, 1) }
{ "_id" : ObjectId("53ad3f71db703e66b9906c45"), "config" : { "_id" : 2, "host" : "10.182.36.38:27017" }, "ns" : "local.oplog.rs", "syncedTo" : Timestamp(1403865965, 1) }

主节点上也有 slaves   他会通过  这个集合 来观察  从节点的更新情况,如果Timestamp  和 主节点的  主节点的 Timestamp  相同则最新【根据syncedTo  跟踪从节点的 同步情况的】

通过 db.printSlaveReplicationInfo()  可以看到  从服务器的更新数据的时间
source: 10.204.150.69:27017
        syncedTo: Sat Jun 28 2014 12:00:53 GMT+0800 (CST)
        0 secs (0 hrs) behind the primary
source: 10.182.7.88:27017
        syncedTo: Sat Jun 28 2014 12:00:53 GMT+0800 (CST)
        0 secs (0 hrs) behind the primary     :停顿时间


oplog.rs 它有固定的大小 也就是说  是先创建此集合 才能往里存东西。

可以通过  ./mongo   --oploSize  size  来设置  大小  但是 必须得删除 local数据库的文件   为大型的oplog  预分配 空间  ,可能很耗时间 ,所以最好要手动分配

  










startup_log  一些服务器的信息
system.indexes   索引  目前情况下  只有 “_id”索引   因为是默认增加的
system.replset  三个服务器列表

{ "_id" : "mongoset", "version" : 1, "members" : [ { "_id" : 1, "host" : "10.204.150.69:27017" }, { "_id" : 2, "host" : "10.182.36.38:27017" }, { "_id" : 3, "host" : "10.182.7.88:27017" } ] }



 这时候在主节点增加一条数据 试下   别的服务器应该也有(在不错的情况下)

当在从节点查看数据时  会报错 no  master  and slave=false

首先这是正常的,因为SECONDARY是不允许读写的,在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
对于replica set 中的secondary 节点默认是不可读的,

在各个从节点  执行  db.getMongo().setSlaveOk();    这个就行了



11.分片   【手动分片 自动分片】

分片有时候也用 mysql中的分区 来表示这个概念 ,但是又和 分区不太一样,一个共同点都是为了 快速查询。

何时分片

机器的磁盘不够用了,一个服务器满足不了 写的时候,




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值