zoukankan      html  css  js  c++  java
  • MongoDB 副本集

                                                                  MongoDB 副本集

     

    • 副本集介绍

    • 副本集是什么

    -   MongoDB 复制是将数据同步在多个服务器的过程。

    -   复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,    可以保证数据的安全性。

    –  复制还允许您从硬件故障和服务中断中恢复数据

    • 复制原理

    • 副本集工作过程

    –  mongodb 的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的 都是从节点,负责复制主节点上的数据。

    –  mongodb 各个节点常见的搭配方式为:一主一从、一主多从。

    –  主节点记录在其上的所有操作 oplog ,从节点定期轮询主节点获取这些操作,然后对自   己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

    • 副本集实现方式

    Master-Slave 主从复制

    –  实现数据同步只需要在某一台服务器启动时加上 "-master" 参数,以指明此服务器的  角色是 primary ;另一台服务器加上 "-slave" "-source" 参数,以指明此服务器 的角色是 slave

    • 主从复制的优点如下:

    –  从服务器可以执行查询工作,降低主服务器访问压力。

    –  在从服务器执行备份,避免备份期间锁定主服务器的数据。

    –  当主服务器出现故障时,可以快速切换到从服务器,减少当机时间。

    • 副本集实现方式(1 )

    Replica Sets 复制集

    –  MongoDB 1.6 版本对开发了新功能 replica set,这比之前的 replication 功能 要强大一 ,增加了故障自动切换和自动修复成员节点,各个 DB 之间数据完全一致, 大大降低了维 护成功。使用 replica set故障切换完全自动。

    –  Replica Sets 的结构类似一个集群,完全可以把它当成一个集群,因为它确实与集群实 现的作用是一样的:如果其中一个节点出现故障,其他节点马上会将业务接管过来而无 须停机操作

     

    运行服务

    • 启动服务时,指定主机所在副本集名称                       

    – 副本集成员间使用相同的副本集名称

    --replSet rs1 // 指定副本集名称

    [root@server0 ~]#mkdir /data/db

    [root@server0 ~]#./mongod --bind_ip 192.168.4.51

    --logpath=/var/log/mongod.log --replSet rs1 &

    [root@server0 ~]# jobs

    Running .........                                       

    • 配置节点信息                                             

    • 在任意一台主机连接 mongod 服务,执行如下操作

    [root@server0 ~]# ./mongo --host 192.168.4.51           

    config = {                                             

    _id:"rs1",

    members:[                                                  

    {_id:0,host:IP 地址 : 端口 "},                   

    {_id:1,host:IP 地址 : 端口 "},

    {_id:2,host:IP 地址 : 端口 "}

    ]

    };                                       


    1.修改配置

    # vim mongodb.conf

    ... ...

    replSet=rs1 

    //加上这条

    2.配置节点

    > config = { _id:"rs1",

    members:[

    {_id:0,host:"192.168.4.51:27051"},  {_id:1,host:"192.168.4.52:27052"},  {_id:2,host:"192.168.4.53:27053"}, ] };

    3.初始化

    • 初始化 Replica Sets 环境                 

    • 执行如下命令

    – >rs.initiate(config)


    • 查看副本集信息                         

    • 查看状态信息

    > rs.status( )

    • 查看是否是 master

    > rs .isMaster( )

    • 验证副本集配置

    • 同步数据验证

    >db.getMongo( ).setSlaveOk( )  //允许从库查看数据

    • 自动切换主库验证

    > rs.isMaster( ) 查看是否是主库

    插入文档

    • save( )

    • 格式

    db. 集合名 .save({ key:”, key:“ })

    • 注意

    – 集合不存在时创建集合,后插入记录

    _id 字段值 已存在时 修改文档字段值

    _id 字段值 不已存在时 插入文档

    • insert()

    • 格式

    db. 集合名 .insert({key:, key:” })

    • 注意

    – 集合不存在时创建集合,后插入记录

    _id 字段值 已存在时放弃插入

    _id 字段值 不已存在时 插入文档

    • insert()( 1)

    • 插入多条记录

    db. 集合名 .insertMany(

    [ {name:"xiaojiu”,age:19} ,

    {name:"laoshi“,email:”yaya@tedu.cn“}]

    )

    • 查询语法

    • 显示所有行,默认一次只输出 20 行 输入 it 显示后续的

    db. 集合名 .find()

    • 显示第 1

    > db. 集合名 .findOne()

    • 指定查询条件并指定显示的字段

    > db. 集合名 .find ( { 条件 },{ 定义显示的字段 } )

    > db.user.find({},{_id:0,name:1,shell:1})

    0 不显示 1 显示

                                    

    • 行数显示限制                 

    limit( 数字 )   // 显示前几行

    > db. 集合名 .find().limit(3)

    skip( 数字 )   // 跳过前几行

    > db. 集合名 .find().skip(2)                                     

    sort({字段名} )  // 排序

    > db. 集合名 .find().sort({age:1|-1}) 1 升序 -1 降序

    > db.user.find({shell:"/sbin/nologin"},{_id:0,name:1,uid:

    1,shell:1}).skip(2).limit(2)

    rs1:PRIMARY> db.user.find({},{_id:0,name:1,uid:1}).limit(10).sort({uid:-1})

    查询条件

    • 查询条

    • 简单条件

    db. 集合名 .find({key:”值”})

    db. 集合名 .find({key:”值”, keyname:”值”})

    db.user.find({shell:"/bin/bash"})

    db.user.find({shell:"/bin/bash",name:"root"})

    • 查询条件(1 )

    • 范围比较

    $in ...

    $nin 不在...

    $or

    > db.user.find({uid:{$in:[1,6,9]}})

    > db.user.find({uid:{$nin:[1,6,9]}})

    > db.user.find({$or: [{name:"root"},{uid:1} ]})

    • 查询条件(2 )

    • 正则匹配

    > db.user.find({name: /^a/ })

    • 数值比较

    $lt $lte $gt $gte $ne

       <  <=  >  >=  !=

    db.user.find( { uid: { $gte:10,$lte:40} } , {_id:0,name:1,uid:1})

    db.user.find({uid:{$lte:5,}})

    • 查询条件(3 )

    • 匹配 null , 也可以匹配没有的字段

    > db.user.save({name:null,uid:null})

    > db.user.find({name:null})

    { "_id" : ObjectId("5afd0ddbd42772e7e458fc75"), "name" : null, "uid" : null }


    更新文档

    • update()

    • 语法格式

    > db. 集合名 .update({ 条件 },{ 修改的字段 } )

    注意:把文件的其他字段都删除了,只留下了 password 字段, 且只修改与条件匹配的第 1 !!!

     

     

     

    • $set / $unset

    $set 条件匹配时,修改指定字段的值

    db.user.update({ 条件 },$set: { 修改的字段 })

    db.user3.update({name:"bin"},{$set:{passwd:"A"}})

    $unset 删除与条件匹配文档的字段                              

    db. 集合名 .update({ 条件 },{$unset:{key:values}})

    db.user3.update({name:"bin"},{$unset:{passwd:"A"}})


     

    1.字段值全改

     

    更新:

    db.user.update({passwd:"x"},{$set:{passwd:"B"}},false,true)  

    查看:

    db.user.find({},{_id:0,passwd:1})

    查看:

    db.user.find({},{_id:0,passwd:1})

    结果:

    {"name":"bob","likes" : [ "a", "b", "c", "d", "e", "f",”w” ] }


     

     多文档更新

    • 语法格式:默认只更新与条件匹配的第 1

    – > db.user.update({ 条件 },{$set:{ 修改的字段 }} ,false,true )

    -  > db.user.update({name:”bin”},{$set:{password:”abc12123”}}

    ,false,true)

    • $inc

    $inc 条件匹配时,字段值自加或自减

    Db. 集合名 .update({ 条件 },{$inc:{ 字段名 : 数字 }})

                    正整数自加 负整数自减!!!!

    db.user.update({name:"bin"},{$inc:{uid:2}}) 字段值自加 2

    db.user.update({name:bin},{$inc:{uid:-1}}) 字段自减 1

    $push / $addToSet

    $push 向数组中添加新元素

    db. 集合名 .update({ 条件 },{$push:{ 数组名 :”值”}})

    db.user.insert({name:"bob",likes:["a","b","c","d","e","f"]})

    db.user.update({name:"bob"},{$push:{likes:"w"}})

    $addToSet 避免重复添加                                        

    db. 集合名 .update({ 条件 },{$addToSet:{ 数组名 :”值” }})  

    >  db.user.update({name:"bob"},{$addToSet:{likes:”f”}})

    $pop /$pull

    $pop 从数组头部删除一个元素

    db. 集合名 .update({ 条件 },{$pop:{ 数组名 : 数字 }})

    db.user.update({name:"bob"},{$pop:{likes:1}})

    db.user.update({name:"bob"},{$pop:{likes:-1}})  

            1 删除数组尾部元素   -1 删除数组头部元素   

    $pull 删除数组指定元素

    db. 集合名 .update({ 条件 },{$pull:{ 数组名 : }})

    db.user.update({name:"bob"},{$pull:{likes:"b"}})

     

    删除文档

    $drop/$remove

    ************************************

    $drop 删除集合的同时删除索引

    db. 集合名 .drop( )

    db.user.drop( )

    remove() 删除文档时不删除索引

    db. 集合名 .remove({}) // 删除所有文档

    db. 集合名 .remove({ 条件 }) // 删除与条件匹配的文档

    db.user.remove({uid:{$lte:10}})

    db.user.remove({})

    文档更新

    更新命令总结

  • 相关阅读:
    【概念】指针
    【c++】随机数
    组装一台计算机
    模拟打印机
    实现手机的某些功能
    作业
    static 静态内部类
    java中编译报错 ClassCastException 是什么原因,如何处理
    作业1 2
    作业2
  • 原文地址:https://www.cnblogs.com/qingbai/p/12017121.html
Copyright © 2011-2022 走看看