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>}]
           )