MongoDB中怎么实现副本集

60次阅读
没有评论

共计 17892 个字符,预计需要花费 45 分钟才能阅读完成。

自动写代码机器人,免费开通

MongoDB 中怎么实现副本集,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1、环境

节点 IP 操作系统 MongoDB 数据节点 110.163.91.15RHLE6.5_x64mongodb-linux-x86_64-rhel62-3.4.7.tgz 数据节点 210.163.91.16RHLE6.5_x64mongodb-linux-x86_64-rhel62-3.4.7.tgz 数据节点 310.163.91.17RHLE6.5_x64mongodb-linux-x86_64-rhel62-3.4.7.tgz

2、分别在 3 个节点安装配置和启动 MongoDB
[root@D2-POMS15 ~]# rpm -qa | grep openssl
openssl098e-0.9.8e-17.el6_2.2.x86_64
openssl-1.0.1e-15.el6.x86_64
[root@D2-POMS15 ~]# mkdir /usr/local/mongodb
[root@D2-POMS15 ~]# tar -xvzf mongodb-linux-x86_64-rhel62-3.4.7.tgz
[root@D2-POMS15 ~]# mv mongodb-linux-x86_64-rhel62-3.4.7/* /usr/local/mongodb/
[root@D2-POMS15 ~]# vim .bash_profile
# .bash_profile

# Get the aliases and functions
if [-f ~/.bashrc]; then
  . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH=$PATH:/usr/local/mongodb/bin/
export PATH
[root@D2-POMS15 ~]# . .bash_profile
[root@D2-POMS15 ~]# mkdir /usr/local/mongodb/db
[root@D2-POMS15 ~]# mkdir /usr/local/mongodb/log
[root@D2-POMS15 ~]# touch /usr/local/mongodb/log/mongodb.log
[root@D2-POMS15 ~]# vim /usr/local/mongodb/mongodb.conf
dbpath=/usr/local/mongodb/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
noauth=true
port=27017
fork=true
replSet=stoners
[root@D2-POMS15 ~]# mongod -f /usr/local/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 11580
child process started successfully, parent exiting
[root@D2-POMS15 ~]# mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.

[root@D2-POMS15 ~]# mongod -f /usr/local/mongodb/mongodb.conf
[root@D2-POMS16 ~]# mongod -f /usr/local/mongodb/mongodb.conf
[root@D2-POMS17 ~]# mongod -f /usr/local/mongodb/mongodb.conf

3、在任一节点进行副本集配置
初始化副本集配置。
语法:
{
    _id : setname ,
     members : [
         {_id : 0, host : host0},
         {_id : 1, host : host1},
         {_id : 2, host : host2},
     ]
}
配置其中一个节点为仲裁的语法:
{
    _id : my_replica_set ,
     members : [
         {_id : 0, host : rs1.example.net:27017},
         {_id : 1, host : rs2.example.net:27017},
         {_id : 2, host : rs3.example.net , arbiterOnly: true},
     ]
}

rs.initiate({_id: stoners ,members:[{_id:0,host: 10.163.97.15:27017}]})
{ok : 1}
stoners:SECONDARY rs.conf()
{
  _id : stoners ,
  version : 1,
  protocolVersion : NumberLong(1),
  members : [
  {
  _id : 0,
  host : 10.163.97.15:27017 ,
  arbiterOnly : false,
  buildIndexes : true,
  hidden : false,
  priority : 1,
  tags : {

  },
  slaveDelay : NumberLong(0),
  votes : 1
  }
  ],
  settings : {
  chainingAllowed : true,
  heartbeatIntervalMillis : 2000,
  heartbeatTimeoutSecs : 10,
  electionTimeoutMillis : 10000,
  catchUpTimeoutMillis : 60000,
  getLastErrorModes : {

  },
  getLastErrorDefaults : {
  w : 1,
  wtimeout : 0
  },
  replicaSetId : ObjectId(5996b49a33625594149428f2)
  }
}

添加节点:
stoners:PRIMARY rs.add(10.163.97.16)
{ok : 1}
stoners:PRIMARY rs.add(10.163.97.17)
{ok : 1}

查看状态:
stoners:PRIMARY rs.status()
{
  set : stoners ,
  date : ISODate(2017-08-18T09:49:18.307Z),
  myState : 1,
  term : NumberLong(1),
  heartbeatIntervalMillis : NumberLong(2000),
  optimes : {
  lastCommittedOpTime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  appliedOpTime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  durableOpTime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  }
  },
  members : [
  {
  _id : 0,
  name : 10.163.97.15:27017 ,
  health : 1,
  state : 1,
  stateStr : PRIMARY ,
  uptime : 144,
  optime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDate : ISODate(2017-08-18T09:49:15Z),
  infoMessage : could not find member to sync from ,
  electionTime : Timestamp(1503049643, 2),
  electionDate : ISODate(2017-08-18T09:47:23Z),
  configVersion : 3,
  self : true
  },
  {
  _id : 1,
  name : 10.163.97.16:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 86,
  optime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDurable : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDate : ISODate(2017-08-18T09:49:15Z),
  optimeDurableDate : ISODate(2017-08-18T09:49:15Z),
  lastHeartbeat : ISODate(2017-08-18T09:49:17.787Z),
  lastHeartbeatRecv : ISODate(2017-08-18T09:49:16.774Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.15:27017 ,
  configVersion : 3
  },
  {
  _id : 2,
  name : 10.163.97.17:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 52,
  optime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDurable : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDate : ISODate(2017-08-18T09:49:15Z),
  optimeDurableDate : ISODate(2017-08-18T09:49:15Z),
  lastHeartbeat : ISODate(2017-08-18T09:49:17.787Z),
  lastHeartbeatRecv : ISODate(2017-08-18T09:49:16.883Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.15:27017 ,
  configVersion : 3
  }
  ],
  ok : 1
}

4、测试数据写入
主节点写入数据:
stoners:PRIMARY use hr
switched to db hr
stoners:PRIMARY db.emp.insert({num :1})
WriteResult({nInserted : 1})
stoners:PRIMARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }

直接查询副本节点报错:
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
Error: error: {
  ok : 0,
  errmsg : not master and slaveOk=false ,
  code : 13435,
  codeName : NotMasterNoSlaveOk
}

设置副本节点可读:
stoners:SECONDARY db.getMongo().setSlaveOk();
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }

另一个副本节点:
stoners:SECONDARY db.getMongo().setSlaveOk();
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }

5、测试故障切换
先关闭主节点:
stoners:PRIMARY use admin
switched to db admin
stoners:PRIMARY db.shutdownServer();
server should be down…

其中一个副本节点变为了主节点:
stoners:SECONDARY
stoners:PRIMARY
stoners:PRIMARY rs.status()
{
  set : stoners ,
  date : ISODate(2017-08-18T10:03:49.050Z),
  myState : 1,
  term : NumberLong(2),
  heartbeatIntervalMillis : NumberLong(2000),
  optimes : {
  lastCommittedOpTime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  appliedOpTime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  durableOpTime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  }
  },
  members : [
  {
  _id : 0,
  name : 10.163.97.15:27017 ,
  health : 0,
  state : 8,
  stateStr : (not reachable/healthy) ,
  uptime : 0,
  optime : {
  ts : Timestamp(0, 0),
  t : NumberLong(-1)
  },
  optimeDurable : {
  ts : Timestamp(0, 0),
  t : NumberLong(-1)
  },
  optimeDate : ISODate(1970-01-01T00:00:00Z),
  optimeDurableDate : ISODate(1970-01-01T00:00:00Z),
  lastHeartbeat : ISODate(2017-08-18T10:03:47.314Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:01:03.792Z),
  pingMs : NumberLong(0),
  lastHeartbeatMessage : Connection refused ,
  configVersion : -1
  },
  {
  _id : 1,
  name : 10.163.97.16:27017 ,
  health : 1,
  state : 1,
  stateStr : PRIMARY ,
  uptime : 929,
  optime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:03:44Z),
  electionTime : Timestamp(1503050473, 1),
  electionDate : ISODate(2017-08-18T10:01:13Z),
  configVersion : 3,
  self : true
  },
  {
  _id : 2,
  name : 10.163.97.17:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 845,
  optime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  optimeDurable : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:03:44Z),
  optimeDurableDate : ISODate(2017-08-18T10:03:44Z),
  lastHeartbeat : ISODate(2017-08-18T10:03:47.252Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:03:47.998Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.16:27017 ,
  configVersion : 3
  }
  ],
  ok : 1
}

在主节点插入数据:
stoners:PRIMARY use hr
switched to db hr
stoners:PRIMARY db.emp.insert({num :2})
WriteResult({nInserted : 1})
stoners:PRIMARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }
{_id : ObjectId( 5996bbcb5945237d11f3052d), num : 2 }

在另一个副本节点查看:
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }
{_id : ObjectId( 5996bbcb5945237d11f3052d), num : 2 }

现在启动关闭的节点:
[root@D2-POMS15 ~]# mongod -f /usr/local/mongodb/mongodb.conf
启动后自动成为副本节点:
stoners:SECONDARY rs.status()
{
  set : stoners ,
  date : ISODate(2017-08-18T10:08:25.401Z),
  myState : 2,
  term : NumberLong(2),
  syncingTo : 10.163.97.17:27017 ,
  heartbeatIntervalMillis : NumberLong(2000),
  optimes : {
  lastCommittedOpTime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  appliedOpTime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  durableOpTime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  }
  },
  members : [
  {
  _id : 0,
  name : 10.163.97.15:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 49,
  optime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:09:34Z),
  syncingTo : 10.163.97.17:27017 ,
  configVersion : 3,
  self : true
  },
  {
  _id : 1,
  name : 10.163.97.16:27017 ,
  health : 1,
  state : 1,
  stateStr : PRIMARY ,
  uptime : 48,
  optime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDurable : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:09:34Z),
  optimeDurableDate : ISODate(2017-08-18T10:09:34Z),
  lastHeartbeat : ISODate(2017-08-18T10:08:24.973Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:08:23.753Z),
  pingMs : NumberLong(0),
  electionTime : Timestamp(1503050473, 1),
  electionDate : ISODate(2017-08-18T10:01:13Z),
  configVersion : 3
  },
  {
  _id : 2,
  name : 10.163.97.17:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 48,
  optime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDurable : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:09:34Z),
  optimeDurableDate : ISODate(2017-08-18T10:09:34Z),
  lastHeartbeat : ISODate(2017-08-18T10:08:24.973Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:08:23.520Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.16:27017 ,
  configVersion : 3
  }
  ],
  ok : 1
}

数据也同步过来了。
stoners:SECONDARY db.getMongo().setSlaveOk();
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }
{_id : ObjectId( 5996bbcb5945237d11f3052d), num : 2 }

2、分别在 3 个节点安装配置和启动 MongoDB
[root@D2-POMS15 ~]# rpm -qa | grep openssl
openssl098e-0.9.8e-17.el6_2.2.x86_64
openssl-1.0.1e-15.el6.x86_64
[root@D2-POMS15 ~]# mkdir /usr/local/mongodb
[root@D2-POMS15 ~]# tar -xvzf mongodb-linux-x86_64-rhel62-3.4.7.tgz
[root@D2-POMS15 ~]# mv mongodb-linux-x86_64-rhel62-3.4.7/* /usr/local/mongodb/
[root@D2-POMS15 ~]# vim .bash_profile
# .bash_profile

# Get the aliases and functions
if [-f ~/.bashrc]; then
  . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH=$PATH:/usr/local/mongodb/bin/
export PATH
[root@D2-POMS15 ~]# . .bash_profile
[root@D2-POMS15 ~]# mkdir /usr/local/mongodb/db
[root@D2-POMS15 ~]# mkdir /usr/local/mongodb/log
[root@D2-POMS15 ~]# touch /usr/local/mongodb/log/mongodb.log
[root@D2-POMS15 ~]# vim /usr/local/mongodb/mongodb.conf
dbpath=/usr/local/mongodb/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
noauth=true
port=27017
fork=true
replSet=stoners
[root@D2-POMS15 ~]# mongod -f /usr/local/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 11580
child process started successfully, parent exiting
[root@D2-POMS15 ~]# mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.

[root@D2-POMS15 ~]# mongod -f /usr/local/mongodb/mongodb.conf
[root@D2-POMS16 ~]# mongod -f /usr/local/mongodb/mongodb.conf
[root@D2-POMS17 ~]# mongod -f /usr/local/mongodb/mongodb.conf

3、在任一节点进行副本集配置
初始化副本集配置。
语法:
{
    _id : setname ,
     members : [
         {_id : 0, host : host0},
         {_id : 1, host : host1},
         {_id : 2, host : host2},
     ]
}
配置其中一个节点为仲裁的语法:
{
    _id : my_replica_set ,
     members : [
         {_id : 0, host : rs1.example.net:27017},
         {_id : 1, host : rs2.example.net:27017},
         {_id : 2, host : rs3.example.net , arbiterOnly: true},
     ]
}

rs.initiate({_id: stoners ,members:[{_id:0,host: 10.163.97.15:27017}]})
{ok : 1}
stoners:SECONDARY rs.conf()
{
  _id : stoners ,
  version : 1,
  protocolVersion : NumberLong(1),
  members : [
  {
  _id : 0,
  host : 10.163.97.15:27017 ,
  arbiterOnly : false,
  buildIndexes : true,
  hidden : false,
  priority : 1,
  tags : {

  },
  slaveDelay : NumberLong(0),
  votes : 1
  }
  ],
  settings : {
  chainingAllowed : true,
  heartbeatIntervalMillis : 2000,
  heartbeatTimeoutSecs : 10,
  electionTimeoutMillis : 10000,
  catchUpTimeoutMillis : 60000,
  getLastErrorModes : {

  },
  getLastErrorDefaults : {
  w : 1,
  wtimeout : 0
  },
  replicaSetId : ObjectId(5996b49a33625594149428f2)
  }
}

添加节点:
stoners:PRIMARY rs.add(10.163.97.16)
{ok : 1}
stoners:PRIMARY rs.add(10.163.97.17)
{ok : 1}

查看状态:
stoners:PRIMARY rs.status()
{
  set : stoners ,
  date : ISODate(2017-08-18T09:49:18.307Z),
  myState : 1,
  term : NumberLong(1),
  heartbeatIntervalMillis : NumberLong(2000),
  optimes : {
  lastCommittedOpTime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  appliedOpTime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  durableOpTime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  }
  },
  members : [
  {
  _id : 0,
  name : 10.163.97.15:27017 ,
  health : 1,
  state : 1,
  stateStr : PRIMARY ,
  uptime : 144,
  optime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDate : ISODate(2017-08-18T09:49:15Z),
  infoMessage : could not find member to sync from ,
  electionTime : Timestamp(1503049643, 2),
  electionDate : ISODate(2017-08-18T09:47:23Z),
  configVersion : 3,
  self : true
  },
  {
  _id : 1,
  name : 10.163.97.16:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 86,
  optime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDurable : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDate : ISODate(2017-08-18T09:49:15Z),
  optimeDurableDate : ISODate(2017-08-18T09:49:15Z),
  lastHeartbeat : ISODate(2017-08-18T09:49:17.787Z),
  lastHeartbeatRecv : ISODate(2017-08-18T09:49:16.774Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.15:27017 ,
  configVersion : 3
  },
  {
  _id : 2,
  name : 10.163.97.17:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 52,
  optime : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDurable : {
  ts : Timestamp(1503049755, 1),
  t : NumberLong(1)
  },
  optimeDate : ISODate(2017-08-18T09:49:15Z),
  optimeDurableDate : ISODate(2017-08-18T09:49:15Z),
  lastHeartbeat : ISODate(2017-08-18T09:49:17.787Z),
  lastHeartbeatRecv : ISODate(2017-08-18T09:49:16.883Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.15:27017 ,
  configVersion : 3
  }
  ],
  ok : 1
}

4、测试数据写入
主节点写入数据:
stoners:PRIMARY use hr
switched to db hr
stoners:PRIMARY db.emp.insert({num :1})
WriteResult({nInserted : 1})
stoners:PRIMARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }

直接查询副本节点报错:
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
Error: error: {
  ok : 0,
  errmsg : not master and slaveOk=false ,
  code : 13435,
  codeName : NotMasterNoSlaveOk
}

设置副本节点可读:
stoners:SECONDARY db.getMongo().setSlaveOk();
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }

另一个副本节点:
stoners:SECONDARY db.getMongo().setSlaveOk();
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }

5、测试故障切换
先关闭主节点:
stoners:PRIMARY use admin
switched to db admin
stoners:PRIMARY db.shutdownServer();
server should be down…

其中一个副本节点变为了主节点:
stoners:SECONDARY
stoners:PRIMARY
stoners:PRIMARY rs.status()
{
  set : stoners ,
  date : ISODate(2017-08-18T10:03:49.050Z),
  myState : 1,
  term : NumberLong(2),
  heartbeatIntervalMillis : NumberLong(2000),
  optimes : {
  lastCommittedOpTime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  appliedOpTime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  durableOpTime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  }
  },
  members : [
  {
  _id : 0,
  name : 10.163.97.15:27017 ,
  health : 0,
  state : 8,
  stateStr : (not reachable/healthy) ,
  uptime : 0,
  optime : {
  ts : Timestamp(0, 0),
  t : NumberLong(-1)
  },
  optimeDurable : {
  ts : Timestamp(0, 0),
  t : NumberLong(-1)
  },
  optimeDate : ISODate(1970-01-01T00:00:00Z),
  optimeDurableDate : ISODate(1970-01-01T00:00:00Z),
  lastHeartbeat : ISODate(2017-08-18T10:03:47.314Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:01:03.792Z),
  pingMs : NumberLong(0),
  lastHeartbeatMessage : Connection refused ,
  configVersion : -1
  },
  {
  _id : 1,
  name : 10.163.97.16:27017 ,
  health : 1,
  state : 1,
  stateStr : PRIMARY ,
  uptime : 929,
  optime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:03:44Z),
  electionTime : Timestamp(1503050473, 1),
  electionDate : ISODate(2017-08-18T10:01:13Z),
  configVersion : 3,
  self : true
  },
  {
  _id : 2,
  name : 10.163.97.17:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 845,
  optime : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  optimeDurable : {
  ts : Timestamp(1503050624, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:03:44Z),
  optimeDurableDate : ISODate(2017-08-18T10:03:44Z),
  lastHeartbeat : ISODate(2017-08-18T10:03:47.252Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:03:47.998Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.16:27017 ,
  configVersion : 3
  }
  ],
  ok : 1
}

在主节点插入数据:
stoners:PRIMARY use hr
switched to db hr
stoners:PRIMARY db.emp.insert({num :2})
WriteResult({nInserted : 1})
stoners:PRIMARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }
{_id : ObjectId( 5996bbcb5945237d11f3052d), num : 2 }

在另一个副本节点查看:
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }
{_id : ObjectId( 5996bbcb5945237d11f3052d), num : 2 }

现在启动关闭的节点:
[root@D2-POMS15 ~]# mongod -f /usr/local/mongodb/mongodb.conf
启动后自动成为副本节点:
stoners:SECONDARY rs.status()
{
  set : stoners ,
  date : ISODate(2017-08-18T10:08:25.401Z),
  myState : 2,
  term : NumberLong(2),
  syncingTo : 10.163.97.17:27017 ,
  heartbeatIntervalMillis : NumberLong(2000),
  optimes : {
  lastCommittedOpTime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  appliedOpTime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  durableOpTime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  }
  },
  members : [
  {
  _id : 0,
  name : 10.163.97.15:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 49,
  optime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:09:34Z),
  syncingTo : 10.163.97.17:27017 ,
  configVersion : 3,
  self : true
  },
  {
  _id : 1,
  name : 10.163.97.16:27017 ,
  health : 1,
  state : 1,
  stateStr : PRIMARY ,
  uptime : 48,
  optime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDurable : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:09:34Z),
  optimeDurableDate : ISODate(2017-08-18T10:09:34Z),
  lastHeartbeat : ISODate(2017-08-18T10:08:24.973Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:08:23.753Z),
  pingMs : NumberLong(0),
  electionTime : Timestamp(1503050473, 1),
  electionDate : ISODate(2017-08-18T10:01:13Z),
  configVersion : 3
  },
  {
  _id : 2,
  name : 10.163.97.17:27017 ,
  health : 1,
  state : 2,
  stateStr : SECONDARY ,
  uptime : 48,
  optime : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDurable : {
  ts : Timestamp(1503050974, 1),
  t : NumberLong(2)
  },
  optimeDate : ISODate(2017-08-18T10:09:34Z),
  optimeDurableDate : ISODate(2017-08-18T10:09:34Z),
  lastHeartbeat : ISODate(2017-08-18T10:08:24.973Z),
  lastHeartbeatRecv : ISODate(2017-08-18T10:08:23.520Z),
  pingMs : NumberLong(0),
  syncingTo : 10.163.97.16:27017 ,
  configVersion : 3
  }
  ],
  ok : 1
}

数据也同步过来了。
stoners:SECONDARY db.getMongo().setSlaveOk();
stoners:SECONDARY use hr
switched to db hr
stoners:SECONDARY db.emp.find();
{_id : ObjectId( 5996b96ca4ca3f4911a83ae8), num : 1 }
{_id : ObjectId( 5996bbcb5945237d11f3052d), num : 2 }

关于 MongoDB 中怎么实现副本集问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计17892字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)