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
关掉mongokill -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)。现在的社交软件我觉着都用到了这个。
固定集合: 必须先建立集合名,当集合写满时,会把最早的数据删掉
优点: 固定集合 插入速度比动态集合快,因为 已经分配好了 集合的固定大小(可以自己分配),直接插入到末尾,不用去分配空间,因为是按顺序插入的 所以查询页较快。
8.js代码 在php里使用的话 得先用MongoDbCode(‘字符串’)处理赋给一个变量,给下文用,或者 把 js代码 写入到db.system.js这个即合理,这样的话,就可以在当前数据库的所有集合里用到,相当于全局的。
主服: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
在各个从节点 执行 db.getMongo().setSlaveOk(); 这个就行了
11.分片 【手动分片 自动分片】
分片有时候也用 mysql中的分区 来表示这个概念 ,但是又和 分区不太一样,一个共同点都是为了 快速查询。
何时分片
机器的磁盘不够用了,一个服务器满足不了 写的时候,