MongoDB笔记02——副本集

MongoDB副本集配置

一、副本集架构简述

副本集保证数据在生产部署时的冗余和可靠性,通过在不同的机器上保存副本来保证数据的不会因为单点损坏而丢失。能够随时应对数据丢失、机器损坏带来的风险。
基本的架构由3台服务器组成,一个三成员的复制集,由三个有数据,或者两个有数据,一个作为仲裁者。

三个有数据

含有仲裁节点架构

(仲裁节点不存储数据,可少了数据复制的压力或利用低配服务器)

二、安装MongoDB

部署说明:三台机器192.168.1.100,192.168.1.101,192.168.1.102
配置副本集(一个Master节点+两个SECONDARY节点)+用户认证

每台机器安装好mongodb,mongodb.conf配置文件内容相同,如下

systemLog:
  destination: file
  path: /usr/local/mongodb/logs
  logAppend: true
storage:
  dbPath: /usr/local/mongodb/data
replication:
  replSetName: "rs0"
net:
  bindIp: 0.0.0.0
  port: 27017
processManagement:
  fork: true
setParameter:
  enableLocalhostAuthBypass: false
  maxTransactionLockRequestTimeoutMillis: 3600
  transactionLifetimeLimitSeconds: 600
#security:
#  authorization: enabled
#  clusterAuthMode: "keyFile"
#  keyFile: /usr/local/mongodb/keyfile

三、配置副本集

# 在192.168.1.100上执行rs.initiate() (也可以选择其他机器)

rs.initiate({_id:'rs0',members:[{_id:1,host:'192.168.1.100:27017'}]});

# 创建admin用户
use admin;
db.createUser({
	user:"root",pwd:"123456",
	roles: [{role:"userAdminAnyDatabase",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"root",db:"admin"}, "readWriteAnyDatabase" ]
});
db.auth("root","123456");

注意:副本集需要clusterAdmin角色权限,如果之前没有配置,可以后面追加授权db.grantRolesToUser("admin",[{role:"clusterAdmin",db:"admin"}]);


# 配置副本集keyFile认证文件
[root@localhost mongodb]# openssl rand -base64 666 > /usr/local/mongodb/keyfile
[root@localhost mongodb]# chmod 600 keyfile
[root@localhost mongodb]# scp keyfile root@192.168.1.101:/usr/local/mongodb
[root@localhost mongodb]# scp keyfile root@192.168.1.102:/usr/local/mongodb

# 关闭mongodb 修改配置文件mongodb.conf打开security认证,然后重启mongodb


# 通过rs.add增加SECONDARY节点 
(也可以通过rs.addArb()增加仲裁节点)
rs0:PRIMARY> rs.add("192.168.1.101:27017");
rs0:PRIMARY> rs.add("192.168.1.102:27017");
rs0:PRIMARY> rs.isMaster() --查看状态
rs0:PRIMARY> rs.status() --查看状态

登录SECONDARY节点查看状态
rs0:SECONDARY> db.getMongo().setSlaveOk(); --或rs.slaveOk()
rs0:SECONDARY> rs.isMaster()

四、其他相关操作

# 查看复制集相关命令帮助
rs.help()

rs0:PRIMARY> rs.help()
        rs.status()                                { replSetGetStatus : 1 } checks repl set status
        rs.initiate()                              { replSetInitiate : null } initiates set with default settings
        rs.initiate(cfg)                           { replSetInitiate : cfg } initiates set with configuration cfg
        rs.conf()                                  get the current configuration object from local.system.replset
        rs.reconfig(cfg)                           updates the configuration of a running replica set with cfg (disconnects)
        rs.add(hostportstr)                        add a new member to the set with default attributes (disconnects)
        rs.add(membercfgobj)                       add a new member to the set with extra attributes (disconnects)
        rs.addArb(hostportstr)                     add a new member which is arbiterOnly:true (disconnects)
        rs.stepDown([stepdownSecs, catchUpSecs])   step down as primary (disconnects)
        rs.syncFrom(hostportstr)                   make a secondary sync from the given member
        rs.freeze(secs)                            make a node ineligible to become primary for the time specified
        rs.remove(hostportstr)                     remove a host from the replica set (disconnects)
        rs.slaveOk()                               allow queries on secondary nodes

        rs.printReplicationInfo()                  check oplog size and time range
        rs.printSlaveReplicationInfo()             check replica set members and replication lag
        db.isMaster()                              check who is primary

        reconfiguration helpers disconnect from the database so the shell will display
        an error, even if the command succeeds.



# 副本集也可以这样初始化
rs.initiate(
  {
    _id : 'rs0',
    members: [
      {_id:0, host:'192.168.1.100:27017',priority:6},
      {_id:1, host:'192.168.1.101:27017',priority:4},
      {_id:2, host:'192.168.1.102:27017',priority:2}
    ]
  }
)
或
rs.initiate(
  {
    _id : 'rs0',
    members: [
      {_id:0, host:'192.168.1.100:27017',priority:6},
      {_id:1, host:'192.168.1.101:27017',priority:4},
      {_id:2, host:'192.168.1.102:27017',arbiterOnly:true}
    ]
  }
)

# 移除节点
rs.remove("192.168.1.102:27017"); 

# 关闭当前示例
db.shutdownServer()

# 将当前主库“降级”
rs0:PRIMARY>rs.stepDown(30)
rs0:SECONDARY>

# 冻结Secondary节点(PRIMARY维护时,可让Secondary不参与PRIMARY选举)
rs0:SECONDARY> rs.freeze(100)

# 查看复制集情况
db.printSlaveReplicationInfo()

其中:
source:从库的ip和端口
syncedTo:目前的同步情况,以及最后一次同步的时间


# rs.add 所有参数
 {
   _id: <int>,
   host: <string>,        // required
   arbiterOnly: <boolean>,
   buildIndexes: <boolean>,
   hidden: <boolean>,
   priority: <number>,
   tags: <document>,
   slaveDelay: <int>,
   votes: <number>
}

hidden:这样设置后此机器在读写中都不可见,并且不会被选举为Primary,但是可以投票,一般用于备份数据。
slaveDelay:可以指定一个时间延迟从primary节点同步数据。主要用于处理误删除数据马上同步到从节点导致的不一致问题。
Secondary-Only:priority为0,不能成为primary节点,只能作为secondary副本节点,防止一些性能不高的节点成为主节点。
Non-Voting:votes为0,没有选举权的secondary节点,纯粹的备份数据节点。

五、程序连接副本集方式示例

  data:
    mongodb:
      uri: mongodb://user:password@hostname1:27017,hostname2:27017,hostname3:27017/dbname?slaveOk=true&replicaSet=rs0

六、相关参考

posted @ 2020-04-18 19:52  一片相思林  阅读(325)  评论(0编辑  收藏  举报