MongoDB学习随笔(1)

索引的小细节

  • Mongodb 的多键索引指的是索引中有一个键在某一个文档中是一个数组,那么在explain操作中,"isMultikey"为true,而且比非多键索引效率低,因为可能有多个索引指向一个文档,返回结果集需要去重操作。

  • explain 中的 n / nscannedObjects /nscanned

n:本次查询返回的文档数量
nscannedObjects :mongodb 按照索引指针去磁盘上查找实际文档的次数
nscanned : 如果有使用索引,那么这个数字就是查找过的索引条目数量
  • 索引的嵌套文档,如果对loc.city建立索引,那么这个索引只能对查询中使用{loc.city:“nanjing”}起作用
{
    “username”:"sid",
    "loc":{
        "city":"nanjing",
        "street":"A"
    }
}
如果对loc建索引,那么查询条件是   
 "loc":{
        "city":"nanjing",
        "street":"A"
    }
才行
  • 对数组建索引,实际上是对数组中的每个元素建索引,代价比较高,数组元素有10个,索引条目就有十个,在一个索引中,

  • {"$natural":1}会强制全表扫描,对于一般的集合意义不大,因为一般的集合会经常的更新操作,导致数据顺序变化,而固定集合却是按插入顺序进行保存的,所以自然顺序就是插入顺序

db.xxx.find().sort({"$natural",-1}) //这个就是从新到旧的更新

同步操作

  • 副本集的同步操作,实际上是使用固定集合oplog来实现的,oplog中记录每一次更新操作,oplog是主节点的local数据库中的一个固定集合

  • 初始化同步

1.删除现有的数据
2.将同步源现有的数据快照复制到本地,比较耗时
3.将第二步过程中发生的操作记录到oplog中
4.备份节点具有某个时间点的数据了,建立索引,也比较耗时
5.将建立索引期间的操作记录下来
6.完成初始化同步

当备份节点落后同步源太多,就有可能造成脱节,同步源oplog可能来不及被复制就会被新的日志给覆盖掉了

  • 等待写入复制操作
db.runCommand({"getLastError":1,"w":"majority","wtimeout",1000})
这个命令的意思是getLastError可以获得上一次的错误,因为mongodb执行一系列的指令,
只有最后一个命令错误,才会显示错误,中间命令错误,最后一个不出现错误,
都不会显示出现问题。w说明要登台大多数节点的反应,wtimeout是超时时间设置
  • mongodb 可以自定义 复制保证规则

  • 管理副本集成员,许多维护工作不能在备份节点上进行,也不能在主节点上运行,这个时候需要以单机模式启动副本集的服务器

1.重启成员服务器,重启时不使用-replset的参数选项
2.修改服务器监听端口,这样集群中其他服务器会认为这个服务器down了
3.维护工作结束后,用副本集参数重启这台服务器
  • 利用rs.status()观察整个副本集的运作情况

  • 在副本集中创建索引的操作流程

1.切忌在主节点上直接创建索引,因为从节点在复制操作时,也会创建索引,导致整个副本集的性能下降

所以应当每次在一个非主节点的成员上创建索引,降低性能影响,即以单机模式启动从节点,
创建索引后,再将从节点上线运行,这样就将集群中所有从节点上成功创建索引了
最后只剩主节点了,有以下两个主要解决方法

1.在主节点业务空窗期创建索引,由于从节点已有索引,复制索引影响不大
2.主节点退化为从节点,即stepdown操作,再将原主节点单机模式启动,创建索引。
  • 备份节点的一般配置
 priority :0  优先级为0是被动节点,永远不能成为主节点
 hidden : true 客户端不会发送读请求给隐藏节点
 buildindex : false 如果光备份,不处理读的请求,那么就不用在复制的时候创建索引

猜你喜欢

转载自blog.csdn.net/whp404/article/details/83004535