位置:首页  >   数据库  > mongodb复制集学习笔记

mongodb复制集学习笔记

conf.conf 如下

bind_ip=192.168.1.100
 port = 28001

 logpath=/usr/local/mongodb/logs/28001
 logappend=true
 dbpath=/usr/local/mongodb/datas/28001
 replSet=imooc

 fork = true

查看当前复制集状态
rs.status()
或者
use admin;
db.adminCommand({replSetGetStatus:1})

查看当前复制集配置文件
rs.conf()

show log rs  #查看当前mongodb的日志

rs.stepDown(50) ## 把当前主节点50秒内降级为从节点

rs.isMaster()  # 查看节点信息

/usr/local/mongodb/bin/mongo 10.51.105.19:28001/admin
//建立配置
config={_id:"imooc",members:[{_id:0,host:"10.51.105.19:28001"}, {_id:1,host:"10.51.105.19:28002"},{_id:2,host:"10.51.105.19:28003"}]}
//配置仲裁节点
config.members[2]={"_id":2,"host":"10.51.105.19:28003","arbiterOnly":true}
//使配置文件生效,初始化
rs.initiate(config)  ### rs.reconfig(config) 重新加载配置文件

测试同步
主节点上
use study
imooc:PRIMARY> db.test.insert({"name":"xd"})
子节点上
imooc:SECONDARY> rs.slaveOk(1)
imooc:SECONDARY> use study
imooc:SECONDARY> db.test.find()

复制集配置文件参数

_id: 整数0
host:字符串 “127.0.0.1:27017“
arbiterOnly: 布尔值 true
priority:整数 0|1   该节点的优先级,如果设置为0,则永远不会升级为主节点
hidden:布尔值 true|false 或者 1|0 ,如果设置为false, 优先级 要设置为0,隐藏节点
votes:整数  0|1  具有投票
slaveDelay 整数 slaveDelay 3600  延迟节点 延迟多少秒进行复制
buildIndexes 布尔值  true|false 或者 1|0  主节点建立索引,子节点是否同步,如果设为false, 优先级 应设置为0

关于oplog
Oplog大小及意义
默认大小
     64位操作系统linux,windows为当前分区可用空间的5%,体积不会超过50G

imooc:PRIMARY> use local
imooc:PRIMARY> db.oplog.rs.status()
imooc:PRIMARY> db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty()  //查看最近的一条数据,pretty()格式化输出

单节点启动复制后,如果要增加机器
rs.add({_id:1,host:" 10.51.105.19:28002"})

调整oplog大小
imooc:PRIMARY>rs.freeze(100)
imooc:PRIMARY>rs.stepDown(100)
然后退出kill掉这个进程,注释掉配置文件的  replSet=imooc,重新启动

>use local
>show table ## 可以看到    oplog.rs
> db.oplog.rs.find().sort({$natural:-1}).limit(1)
>db.temp.save( db.oplog.rs.find().sort({$natural:-1}).limit(1).next())
>db.oplog.rs.drop()
>db.createCollection("oplog.rs",{capped:true,size:1024 * 1024 * 1024 * 3})
>db.oplog.rs.save(db.temp.findOne())

步骤总结
1.将成员以单机模式启动
2.将oplog最新的一条记录保存到临时表中   db.temp.save( db.oplog.rs.find().sort({$natural:-1}).limit(1).next())

3.删除原来的oplog.rs集合
4.以创建封顶表的形式创建oplog.rs , db.createCollection("oplog.rs",{capped:true,size:1024 * 1024 * 1024 * 3})

5.将之前保存的原oplog中的最新操作插入到新的oplog.rs集合中   db.oplog.rs.save(db.temp.findOne())

6.将单节点模式的节点返回到复制集中

复制集状态查看
rs.status()  复制集状态查询
rs.printReplicationInfo() 查看oplog状态
rs.printSlaveReplicationInfo() 查看复制延迟
db.serverStatus() 查看状态详情

mongodb 监控工具
1.mongostat
     mongostat 常用选项
          --host      主机名,或者 主机名:端口

          --port     端口
         --username 用户(验证)
          --password 密码(验证)
          --authenticationDatabase 从哪个数据库进行验证
          --discover 发现集群其他节点
     重点关注字段
     getmore 大量的排序操作在进行
     faults 需要的数据不在内存中
     locked db 锁比例最高的库
     index miss 索引未命中
     qr|qw读写产生队列,供求失衡
2.mongotop 监控当前集合读写统计信息
           --host     主机名,或者 主机名:端口
          --port     端口
         --username 用户(验证)
          --password 密码(验证)
          --authenticationDatabase 从哪个数据库进行验证

安全篇
     开启认证
          auth 单点  auth=true
          keyfile  集群之前认证

    集群认证

          keyfile文件的生成(内容base64编码集[a-zA-Z+/],长度1000字节,权限chmod 600 keyFile)
          openssl rand -base64 102  > .keyFile
          调整权限
          chmod 600  .keyFile
          开启认证需要在配置文件中增加
          setParameter=enableLocalhostAuthBypass=1  ## 本地例外,mongo localhost:28001
           keyFile=/usr/local/mongodb/.keyFile


     创建用户(创建第一个用户role要为root,db为admin)
          db.createUser(
          {
               user:'action',#字符串
               pwd:'123',#字符串
               roles:[{role:'root',db:'admin'}] #数组+对象,
          })
          创建用户后,然后登录客户端
          use admin
          db.auth('admin','123')

      删除用户
          db.dropUser(<username>)  ###删除某个用户
          db.dropAllUsers() ###删除当前库的所有用户

     权限
          built-in roles
                 读写
                    read  readWrite
                  管理员
                    dbAdmin dbOwner userAdmin  clusterAdmin clusterManager clusterMonitor hostManager
                  备份
                    backup  restore
                   全局
                    readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase
                    超级用户
                    root
             自定义角色
                   use admin
                    db.createRole(
                    {
                         role:<role_name>,
                         privileges:[
                             {resource:{db:<db_name>,collection:<coll_name>},actions:[<action_name>]}
                         ],
                         roles:[{role:<role_name>,db:<db_name>}]
                    })

                    db.runCommand({userInfo:'admin',showPrivileges:1})  ##查看权限详情


          修改用户名密码
          需要具备 changePassword changeOwnPassword
          db.changeUserPassword(<user_name>,<new_password>)
          db.updateUser(<user_name>,{update_object})

          权限伸缩
               如何增加权限
               db.grantRolesToUser(
                    <user_name>,
                    [{role:<role_name>,db:<db_name>}]
               )
               如何收缩权限
               db.revokeRolesFromUser(
                    <user_name>,
                    [{role:<role_name>,db:<db_name>}]
               )

文章属性
精彩评论