iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mongodb复制集部署
  • 248
分享到

mongodb复制集部署

2024-04-02 19:04:59 248人浏览 八月长安
摘要

部署复制集由三个节点组成的 复制集 为网络故障或是其他的系统故障提供了足够的冗余。该复制集也有足够的分布式读操作的能力。复制集应该保持奇数个节点,这也就保证了 选举 可以正常的进行用3台已有的 monGod

部署复制集

由三个节点组成的 复制集网络故障或是其他的系统故障提供了足够的冗余。该复制集也有足够的分布式读操作的能力。复制集应该保持奇数个节点,这也就保证了 选举 可以正常的进行

用3台已有的 monGod 实例来部署一个由三个节点组成的 复制集

192.168.1.3 hadoop1.abc.com hadoop1
192.168.1.4 hadoop2.abc.com hadoop2
192.168.1.5 hadoop3.abc.com hadoop3

 

 

部署复制集的注意事项

架构

在生产环境中,我们应该将每个节点部署在独立的机器上,并使用标准的mongoDB端口 27017 。使用 bind_ip 参数来限制访问MongoDB的应用程序的地址。

若使用了异地分布式架构的复制集,请确保多数 mongod 实例节点位于主数据中心中。

 

连通性

确保各个节点之间可以正常通讯,且各个客户端都处于安全的可信的网络环境中。可以考虑以下事项:

  • 建立虚拟的专用网络。确保各个节点之间的流量是在本地网络范围内路由的。(Establish a virtual private network. Ensure that your network topology routes all traffic between members within a single site over the local area network.)

  • 配置连接限制来防止未知的客户端连接到复制集。

  • 配置网络设置和防火墙规则来对将MongoDB的端口仅开放给应用程序,来让应用程序发的进出数据包可以与MongoDB正常交流。

最后请确保复制集各节点可以互相通过DNS或是主机名解析。我们需要配置DNS域名或是设置 /etc/hosts 文件来配置。

 

这里实验,是关闭防火墙,并把selinux设置成setenforce 0

系统环境如下:

[root@hadoop2 data]# cat /etc/issue
Centos release 6.5 (Final)
Kernel \r on an \m
[root@hadoop2 data]# uname -r
2.6.32-431.el6.x86_64

 

配置文件选项:

 

port = 27017

bind_ip =

dbpath =

fore =  true

replSet  =  testrs0

rest = true

详细步骤

1、建立每个节点都建立据据目录

[root@hadoop1 ~]# mkidr -pv /mongodb/data/
[root@hadoop1 ~]# chown mongod.mongod /mongodb/data/

2

将复制集中的每个节点以适当的配置参数启动。

在每个节点上启动 mongod 并通过制定 replSet 参数来指定其复制集名,并可以指定其他需要的参数

[root@hadoop1 ~]# vim /etc/mongod.conf
//添加如下
#Replica Set
replSet = testrs0
或者
[root@hadoop1 ~]# mongod --replSet "testrs0"

 

确保每个节点都有相同复制集名称

[root@hadoop1 ~]# scp /etc/mongod.conf root@hadoop2:/etc/;scp /etc/mongod.conf root@hadoop2:/etc/;

 

注意了,如果解决启动mongod 时,出现addr already in use错误,原因启动端口被占用

[root@hadoop1 data]# mongod
2015-07-29T19:15:51.728+0800 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for Socket: 0.0.0.0:27017
2015-07-29T19:15:51.728+0800 E NETWORK  [initandlisten]   addr already in use
2015-07-29T19:15:51.729+0800 I STORAGE  [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating
2015-07-29T19:15:51.729+0800 I CONTROL  [initandlisten] dbexit:  rc: 100

 

把端口找出来,kill掉

[root@hadoop1 ~]# netstat -anp|more
unix  2      [ ACC ]     STREAM     LISTENING     15588  2174/mongod         /tmp/mongodb-27017.sock

 

 

[root@hadoop1 ~]# kill 2174
[root@hadoop1 ~]# /etc/init.d/mongod start
Starting mongod:                                           [确定]

[root@hadoop1 ~]# mongo

4、初始化复制集。

//使用rs.initiate()命令,MongoDB将初始化一个由当前节点构成、拥有默认配置的复制集。

> rs.initiate()
{
 "info2" : "no configuration explicitly specified -- making one",
 "me" : "hadoop1.abc.com:27017",
 "info" : "try querying local.system.replset to see current configuration",
 "ok" : 0,
 "errmsg" : "already initialized",
 "code" : 23
}
> rs.status()
{
 "state" : 10,
 "stateStr" : "REMOVED",
 "uptime" : 38,
 "optime" : Timestamp(1438168698, 1),
 "optimeDate" : ISODate("2015-07-29T11:18:18Z"),
 "ok" : 0,
 "errmsg" : "Our replica set config is invalid or we are not a member of it",
 "code" : 93
}

查看日志 文件

2015-07-29T20:00:45.433+0800 W NETWORK  [ReplicationExecutor] Failed to connect to 192.168.1.3:27017, reason: errno:111 Connection refused
2015-07-29T20:00:45.433+0800 W REPL     [ReplicationExecutor] Locally stored replica set configuration does not have a valid entry for the current node; waiting for reconfig or remote heartbeat; Got "NodeNotFound No host described in new configuration 1 for replica set testrs0 maps to this node" while validating { _id: "testrs0", version: 1, members: [ { _id: 0, host: "hadoop1.abc.com:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatTimeoutSecs: 10, getLastErrORModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 } } }
2015-07-29T20:00:45.433+0800 I REPL     [ReplicationExecutor] New replica set config in use: { _id: "testrs0", version: 1, members: [ { _id: 0, host: "hadoop1.abc.com:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatTimeoutSecs: 10, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 } } }
2015-07-29T20:00:45.433+0800 I REPL     [ReplicationExecutor] This node is not a member of the config
2015-07-29T20:00:45.433+0800 I REPL     [ReplicationExecutor] transition to REMOVED
2015-07-29T20:00:45.433+0800 I REPL     [ReplicationExecutor] Starting replication applier threads
2015-07-29T20:00:49.067+0800 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:58852 #1 (1 connection now open)
2015-07-29T20:01:17.436+0800 I COMMAND  [conn1] replSet info initiate : no configuration specified.  Using a default configuration for the set
2015-07-29T20:01:17.436+0800 I COMMAND  [conn1] replSet created this configuration for initiation : { _id: "testrs0", version: 1, members: [ { _id: 0, host: "hadoop1.abc.com:27017" } ] }
2015-07-29T20:01:17.436+0800 I REPL     [conn1] replSetInitiate admin command received from client

[root@hadoop1 ~]# service mongod stop
Stopping mongod:                                           [确定]
You have new mail in /var/spool/mail/root
[root@hadoop1 ~]# vim /etc/mongod.conf
#开启了
bind 127.0.0.1 把本地限制访问了
#bind 127.0.0.1
 
[root@hadoop1 data]# service mongod start
Starting mongod:                                           [确定]
 
> rs.initiate()
{
 "info2" : "no configuration explicitly specified -- making one",
 "me" : "hadoop1.abc.com:27017",
 "info" : "try querying local.system.replset to see current configuration",
 "ok" : 0,
 "errmsg" : "already initialized",
 "code" : 23
 
testrs0:PRIMARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-29T12:13:27.839Z"),
 "myState" : 1,
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 232,
   "optime" : Timestamp(1438168698, 1),
   "optimeDate" : ISODate("2015-07-29T11:18:18Z"),
   "electionTime" : Timestamp(1438171776, 1),
   "electionDate" : ISODate("2015-07-29T12:09:36Z"),
   "configVersion" : 1,
   "self" : true
  }
 ],
 "ok" : 1
}

5、将其他的节点加入复制集。

通过 rs.add() 来将剩下的节点加入复制集。

 

testrs0:PRIMARY> rs.add("192.168.1.4:27017")
{ "ok" : 1 }
testrs0:PRIMARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-30T02:09:45.871Z"),
 "myState" : 1,
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 50410,
   "optime" : Timestamp(1438222179, 1),
   "optimeDate" : ISODate("2015-07-30T02:09:39Z"),
   "electionTime" : Timestamp(1438171776, 1),
   "electionDate" : ISODate("2015-07-29T12:09:36Z"),
   "configVersion" : 2,
   "self" : true
  },
  {
   "_id" : 1,
   "name" : "192.168.1.4:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 6,
   "optime" : Timestamp(1438222179, 1),
   "optimeDate" : ISODate("2015-07-30T02:09:39Z"),
   "lastHeartbeat" : ISODate("2015-07-30T02:09:45.081Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T02:09:45.183Z"),
   "pingMs" : 1,
   "configVersion" : 2
  }
 ],
 "ok" : 1
}
testrs0:PRIMARY> rs.add("192.168.1.5:27017")
{ "ok" : 1 } 
testrs0:PRIMARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-30T02:28:52.382Z"),
 "myState" : 1,
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 51557,
   "optime" : Timestamp(1438223187, 1),
   "optimeDate" : ISODate("2015-07-30T02:26:27Z"),
   "electionTime" : Timestamp(1438171776, 1),
   "electionDate" : ISODate("2015-07-29T12:09:36Z"),
   "configVersion" : 3,
   "self" : true
  },
  {
   "_id" : 1,
   "name" : "192.168.1.4:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 1153,
   "optime" : Timestamp(1438223187, 1),
   "optimeDate" : ISODate("2015-07-30T02:26:27Z"),
   "lastHeartbeat" : ISODate("2015-07-30T02:28:52.337Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T02:28:50.438Z"),
   "pingMs" : 0,
   "syncingTo" : "hadoop1.abc.com:27017",
   "configVersion" : 3
  },
  {
   "_id" : 2,
   "name" : "192.168.1.5:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 13,
   "optime" : Timestamp(1438223187, 1),
   "optimeDate" : ISODate("2015-07-30T02:26:27Z"),
   "lastHeartbeat" : ISODate("2015-07-30T02:28:50.437Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T02:28:50.478Z"),
   "pingMs" : 1,
   "configVersion" : 3
  }
 ],
 "ok" : 1
}
testrs0:PRIMARY> rs.isMaster()
{
 "setName" : "testrs0",
 "setVersion" : 3,
 "ismaster" : true,
 "secondary" : false,
 "hosts" : [
  "hadoop1.abc.com:27017",
  "192.168.1.4:27017",
  "192.168.1.5:27017"
 ],
 "primary" : "hadoop1.abc.com:27017",
 "me" : "hadoop1.abc.com:27017",
 "electionId" : ObjectId("55b8c280790a6c1f967f6147"),
 "maxBsonObjectSize" : 16777216,
 "maxMessageSizeBytes" : 48000000,
 "maxWriteBatchSize" : 1000,
 "localTime" : ISODate("2015-07-30T02:30:18Z"),
 "maxWireVersion" : 3,
 "minWireVersion" : 0,
 "ok" : 1
}

其他节点hadoop2验证一下

testrs0:SECONDARY> rs.isMaster()
{
 "setName" : "testrs0",
 "setVersion" : 3,
 "ismaster" : false,
 "secondary" : true,
 "hosts" : [
  "hadoop1.abc.com:27017",
  "192.168.1.4:27017",
  "192.168.1.5:27017"
 ],
 "primary" : "hadoop1.abc.com:27017",
 "me" : "192.168.1.4:27017",
 "maxBsonObjectSize" : 16777216,
 "maxMessageSizeBytes" : 48000000,
 "maxWriteBatchSize" : 1000,
 "localTime" : ISODate("2015-07-30T02:32:43.546Z"),
 "maxWireVersion" : 3,
 "minWireVersion" : 0,
 "ok" : 1
}

6、在主节点上创建数据,从节点是否获取到

testrs0:PRIMARY> use testdb
switched to db testdb 
testrs0:PRIMARY> db.testcoll.insert({Name: "test",Age: 50,Gender: "F"})
WriteResult({ "nInserted" : 1 })
testrs0:PRIMARY> db.testcoll.find()
{ "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" }

  在从节点上查询,是不可以直接查询,要使用一个命令rs.slave()把自己提升为从节点

testrs0:SECONDARY> rs.slaveOk()
testrs0:SECONDARY> use testdb;
switched to db testdb
testrs0:SECONDARY> db.testcoll.find()
{ "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" }

 

7、让主节点hadoop1挂掉

[root@hadoop1 data]# service mongod stop
Stopping mongod:

 在hadoop3验证一下

testrs0:PRIMARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-30T04:36:19.677Z"),
 "myState" : 1,
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 0,
   "state" : 8,
   "stateStr" : "(not reachable/healthy)",
   "uptime" : 0,
   "optime" : Timestamp(0, 0),
   "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
   "lastHeartbeat" : ISODate("2015-07-30T04:36:19.503Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T04:33:18.147Z"),
   "pingMs" : 0,
   "lastHeartbeatMessage" : "Failed attempt to connect to hadoop1.abc.com:27017; couldn't connect to server hadoop1.abc.com:27017 (192.168.1.3), connection attempt failed",
   "configVersion" : -1
  },
  {
   "_id" : 1,
   "name" : "192.168.1.4:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 7661,
   "optime" : Timestamp(1438225614, 1),
   "optimeDate" : ISODate("2015-07-30T03:06:54Z"),
   "lastHeartbeat" : ISODate("2015-07-30T04:36:19.335Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T04:36:19.348Z"),
   "pingMs" : 0,
   "configVersion" : 3
  },
  {
   "_id" : 2,
   "name" : "192.168.1.5:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 7664,
   "optime" : Timestamp(1438225614, 1),
   "optimeDate" : ISODate("2015-07-30T03:06:54Z"),
   "electionTime" : Timestamp(1438230801, 1),
   "electionDate" : ISODate("2015-07-30T04:33:21Z"),
   "configVersion" : 3,
   "self" : true
  }
 ],
 "ok" : 1
}
testrs0:PRIMARY> db.isMaster()
{
 "setName" : "testrs0",
 "setVersion" : 3,
 "ismaster" : true,
 "secondary" : false,
 "hosts" : [
  "hadoop1.abc.com:27017",
  "192.168.1.4:27017",
  "192.168.1.5:27017"
 ],
 "primary" : "192.168.1.5:27017",
 "me" : "192.168.1.5:27017",
 "electionId" : ObjectId("55b9a91100e446910c89a0a3"),
 "maxBsonObjectSize" : 16777216,
 "maxMessageSizeBytes" : 48000000,
 "maxWriteBatchSize" : 1000,
 "localTime" : ISODate("2015-07-30T04:37:33.090Z"),
 "maxWireVersion" : 3,
 "minWireVersion" : 0,
 "ok" : 1
}
testrs0:PRIMARY> db.testcoll.insert ({Name: "tom",Age: 45,Gender: "G"})
WriteResult({ "nInserted" : 1 })

 

回到hadoop2查看一下数据

 testrs0:SECONDARY> db.testcoll.find()
{ "_id" : ObjectId("55b9942d92ad0ab98483695c"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b9944892ad0ab98483695d"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" }
{ "_id" : ObjectId("55b9aa714b575261aff42f25"), "Name" : "tom", "Age" : 45, "Gender" : "G" }

 

让hadoop1上线

[root@hadoop1 data]# service mongod start
Starting mongod:

 

再验证一下状态,但不能夺回主动权,除非让它优先级高一点。

这种场景下,它自动成为从的了

 testrs0:SECONDARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-30T04:44:16.534Z"),
 "myState" : 2,
 "syncingTo" : "192.168.1.4:27017",
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 165,
   "optime" : Timestamp(1438231153, 1),
   "optimeDate" : ISODate("2015-07-30T04:39:13Z"),
   "syncingTo" : "192.168.1.4:27017",
   "configVersion" : 3,
   "self" : true
  },
  {
   "_id" : 1,
   "name" : "192.168.1.4:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 164,
   "optime" : Timestamp(1438231153, 1),
   "optimeDate" : ISODate("2015-07-30T04:39:13Z"),
   "lastHeartbeat" : ISODate("2015-07-30T04:44:16.199Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T04:44:15.824Z"),
   "pingMs" : 0,
   "syncingTo" : "192.168.1.5:27017",
   "configVersion" : 3
  },
  {
   "_id" : 2,
   "name" : "192.168.1.5:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 164,
   "optime" : Timestamp(1438231153, 1),
   "optimeDate" : ISODate("2015-07-30T04:39:13Z"),
   "lastHeartbeat" : ISODate("2015-07-30T04:44:16.185Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T04:44:14.902Z"),
   "pingMs" : 0,
   "electionTime" : Timestamp(1438230801, 1),
   "electionDate" : ISODate("2015-07-30T04:33:21Z"),
   "configVersion" : 3
  }
 ],
 "ok" : 1
}
testrs0:SECONDARY> rs.slaveOk()
testrs0:SECONDARY> db.testcoll.find()
testrs0:SECONDARY> use testdb
switched to db testdb
testrs0:SECONDARY> db.testcoll.find()
{ "_id" : ObjectId("55b9942d92ad0ab98483695c"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b9944892ad0ab98483695d"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" }
{ "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" }
{ "_id" : ObjectId("55b9aa714b575261aff42f25"), "Name" : "tom", "Age" : 45, "Gender" : "G" }

 

7、定义优先级

 

使用 rs.conf() 来查看 复制集配置对象

testrs0:SECONDARY> rs.conf()
{
 "_id" : "testrs0",
 "version" : 3,
 "members" : [
  {
   "_id" : 0,
   "host" : "hadoop1.abc.com:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  },
  {
   "_id" : 1,
   "host" : "192.168.1.4:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  },
  {
   "_id" : 2,
   "host" : "192.168.1.5:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  }
 ],
 "settings" : {
  "chainingAllowed" : true,
  "heartbeatTimeoutSecs" : 10,
  "getLastErrorModes" : {
   
  },
  "getLastErrorDefaults" : {
   "w" : 1,
   "wtimeout" : 0
  }
 }
}

 

在hadoop3的主节点把hadoop1的优先级定义为2,让它成为主节点

将复制集配置对象复制给一个变量(如 mycfg )。然后通过该变量对该节点设置优先级。然后通过 rs.reconfig() 来更新复制集配置。

注意,设置优先级用这个命令mycfg.members[数组中第几个节点].priority  =  2

testrs0:PRIMARY> rs.conf()
{
 "_id" : "testrs0",
 "version" : 3,
 "members" : [
  {
   "_id" : 0,
   "host" : "hadoop1.abc.com:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  },
  {
   "_id" : 1,
   "host" : "192.168.1.4:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  },
  {
   "_id" : 2,
   "host" : "192.168.1.5:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  }
 ],
 "settings" : {
  "chainingAllowed" : true,
  "heartbeatTimeoutSecs" : 10,
  "getLastErrorModes" : {
   
  },
  "getLastErrorDefaults" : {
   "w" : 1,
   "wtimeout" : 0
  }
 }
}
testrs0:PRIMARY> mycfg=rs.conf()
{
 "_id" : "testrs0",
 "version" : 3,
 "members" : [
  {
   "_id" : 0,
   "host" : "hadoop1.abc.com:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  },
  {
   "_id" : 1,
   "host" : "192.168.1.4:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  },
  {
   "_id" : 2,
   "host" : "192.168.1.5:27017",
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 1,
   "tags" : {
    
   },
   "slaveDelay" : 0,
   "votes" : 1
  }
 ],
 "settings" : {
  "chainingAllowed" : true,
  "heartbeatTimeoutSecs" : 10,
  "getLastErrorModes" : {
   
  },
  "getLastErrorDefaults" : {
   "w" : 1,
   "wtimeout" : 0
  }
 }
}
testrs0:PRIMARY> mycfg.members[0].priority = 2
2
testrs0:PRIMARY> rs.reconfig(mycfg)
{ "ok" : 1 }
testrs0:PRIMARY> 
2015-07-30T14:34:44.437+0800 I NETWORK  DBClientCursor::init call() failed
2015-07-30T14:34:44.439+0800 I NETWORK  trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2015-07-30T14:34:44.452+0800 I NETWORK  reconnect 127.0.0.1:27017 (127.0.0.1) ok
testrs0:SECONDARY>

 

在hadoop1上查看,并停掉hadoop1的服务

 testrs0:PRIMARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-30T06:51:11.952Z"),
 "myState" : 1,
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 7780,
   "optime" : Timestamp(1438238074, 1),
   "optimeDate" : ISODate("2015-07-30T06:34:34Z"),
   "electionTime" : Timestamp(1438238079, 1),
   "electionDate" : ISODate("2015-07-30T06:34:39Z"),
   "configVersion" : 4,
   "self" : true
  },
  {
   "_id" : 1,
   "name" : "192.168.1.4:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 7780,
   "optime" : Timestamp(1438238074, 1),
   "optimeDate" : ISODate("2015-07-30T06:34:34Z"),
   "lastHeartbeat" : ISODate("2015-07-30T06:51:11.072Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T06:51:11.375Z"),
   "pingMs" : 0,
   "configVersion" : 4
  },
  {
   "_id" : 2,
   "name" : "192.168.1.5:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 7780,
   "optime" : Timestamp(1438238074, 1),
   "optimeDate" : ISODate("2015-07-30T06:34:34Z"),
   "lastHeartbeat" : ISODate("2015-07-30T06:51:11.779Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T06:51:10.299Z"),
   "pingMs" : 0,
   "configVersion" : 4
  }
 ],
 "ok" : 1
}
testrs0:PRIMARY> quit()
You have new mail in /var/spool/mail/root
[root@hadoop1 ~]# service mongo stop
mongo: 未被识别的服务
[root@hadoop1 ~]# service mongod stop
Stopping mongod:

 

在hadoop3查看,两个节点还是会自动选举主节点的

testrs0:PRIMARY> rs.status()
{
 "set" : "testrs0",
 "date" : ISODate("2015-07-30T06:55:18.238Z"),
 "myState" : 1,
 "members" : [
  {
   "_id" : 0,
   "name" : "hadoop1.abc.com:27017",
   "health" : 0,
   "state" : 8,
   "stateStr" : "(not reachable/healthy)",
   "uptime" : 0,
   "optime" : Timestamp(0, 0),
   "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
   "lastHeartbeat" : ISODate("2015-07-30T06:55:16.275Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T06:51:44.879Z"),
   "pingMs" : 5,
   "lastHeartbeatMessage" : "Failed attempt to connect to hadoop1.abc.com:27017; couldn't connect to server hadoop1.abc.com:27017 (192.168.1.3), connection attempt failed",
   "configVersion" : -1
  },
  {
   "_id" : 1,
   "name" : "192.168.1.4:27017",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 16000,
   "optime" : Timestamp(1438238074, 1),
   "optimeDate" : ISODate("2015-07-30T06:34:34Z"),
   "lastHeartbeat" : ISODate("2015-07-30T06:55:17.988Z"),
   "lastHeartbeatRecv" : ISODate("2015-07-30T06:55:17.988Z"),
   "pingMs" : 1,
   "lastHeartbeatMessage" : "could not find member to sync from",
   "configVersion" : 4
  },
  {
   "_id" : 2,
   "name" : "192.168.1.5:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 16003,
   "optime" : Timestamp(1438238074, 1),
   "optimeDate" : ISODate("2015-07-30T06:34:34Z"),
   "electionTime" : Timestamp(1438239108, 1),
   "electionDate" : ISODate("2015-07-30T06:51:48Z"),
   "configVersion" : 4,
   "self" : true
  }
 ],
 "ok" : 1
}

 

把hadoop1服务启动,因为优先级设为2,故推举它为主节点

testrs0:PRIMARY> rs.i
rs.initiate(  rs.isMaster(
testrs0:PRIMARY> rs.isMaster()
{
 "setName" : "testrs0",
 "setVersion" : 4,
 "ismaster" : true,
 "secondary" : false,
 "hosts" : [
  "hadoop1.abc.com:27017",
  "192.168.1.4:27017",
  "192.168.1.5:27017"
 ],
 "primary" : "hadoop1.abc.com:27017",
 "me" : "hadoop1.abc.com:27017",
 "electionId" : ObjectId("55b9ca84ddeeac6a93355c18"),
 "maxBsonObjectSize" : 16777216,
 "maxMessageSizeBytes" : 48000000,
 "maxWriteBatchSize" : 1000,
 "localTime" : ISODate("2015-07-30T06:56:28.472Z"),
 "maxWireVersion" : 3,
 "minWireVersion" : 0,
 "ok" : 1
}

 

8、触发重新选举

       优先级为0的节点,无权触发;仅参与选举

        使用的命令rs.addArb()

 

9、多端口复制集

应用程序需要连接多个复制集,那么每个复制集需要有不同的名字

 

 1)为每个节点建立必要的数据文件夹:

[root@hadoop1 ~]# mkdir -pv /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2
mkdir: 已创建目录 "/srv/mongodb"
mkdir: 已创建目录 "/srv/mongodb/rs0-0"
mkdir: 已创建目录 "/srv/mongodb/rs0-1"
mkdir: 已创建目录 "/srv/mongodb/rs0-2"
You have new mail in /var/spool/mail/root

2)启动mongod实例

第一个节点

[root@hadoop1 rs0-0]# mongod --port 27018 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128 &

第二个节点

[root@hadoop1 ~]# mongod --port 27019 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128 &

第三个节点

 [root@hadoop1 ~]# mongod --port 27020 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128 &

 

验证

[root@hadoop1 ~]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:27019               0.0.0.0:*                   LISTEN      15718/mongod        
tcp        0      0 0.0.0.0:27020               0.0.0.0:*                   LISTEN      15785/mongod        
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1081/rpcbind        
tcp        0      0 0.0.0.0:28017               0.0.0.0:*                   LISTEN      14221/mongod        
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1285/sshd           
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1157/cupsd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1361/master         
tcp        0      0 0.0.0.0:44378               0.0.0.0:*                   LISTEN      1099/rpc.statd      
tcp        0      0 0.0.0.0:27017               0.0.0.0:*                   LISTEN      14221/mongod        
tcp        0      0 0.0.0.0:27018               0.0.0.0:*                   LISTEN      15640/mongod        
tcp        0      0 :::111                      :::*                        LISTEN      1081/rpcbind        
tcp        0      0 :::22                       :::*                        LISTEN      1285/sshd           
tcp        0      0 ::1:631                     :::*                        LISTEN      1157/cupsd          
tcp        0      0 ::1:25                      :::*                        LISTEN      1361/master         
tcp        0      0 :::48510                    :::*                        LISTEN      1099/rpc.statd

 

3)指明所需连接的端口,来通过 mongo 命令连接到某个 mongod 实例

[root@hadoop1 mongodb]# mongo --port 27018
MongoDB shell version: 3.0.5
connecting to: 127.0.0.1:27018/test
2015-07-30T16:26:01.442+0800 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:54185 #1 (1 connection now open)
Server has startup warnings: 
2015-07-30T16:19:14.667+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-07-30T16:19:14.667+0800 I CONTROL  [initandlisten] 
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] 
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] 
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-07-30T16:19:14.668+0800 I CONTROL  [initandlisten] 
>

 

最后关于

部署一个由四个节点组成的异地分布复制集。

由四个节点组成的异地分布复制集有以下两个需要注意的:

  • 一个节点(如``hadoop4.abc.net``) 必须是一个 arbiter。这个节点可以在服务的任何机器上运行,或者在其他的MongoDB机器上运行。

  • 我们需要决定如何分配节点。下列有3种架构类型:

    在大多数情况下,由于第一种架构的易用性,我们更推荐第一种架构。

    • 3个节点在Site A中,一个 优先级为0的节点 在Site B中,与此同时Site A中还要有个投票节点。

    • 两个节点在Site A,两个 优先级为0的节点 在Site B ,同时一个投票节点在Site A。

    • 两个节点在Site A,一个优先级为0的节点在Site B,一个优先级为0的节点在Site C,同时一个投票节点在Site A。

 

在大多数情况下,由于第一种架构的易用性,更推荐第一种架构。

 

 

复制集参考

Replication Methods in the mongo Shell
命令               描述
rs.add()    为复制集新增节点。    

rs.addArb()    为复制集新增一个 arbiter    

rs.conf()    返回复制集配置信息    

rs.freeze()    防止当前节点在一段时间内选举成为主节点。    

rs.help()    返回 replica set 的命令帮助    

rs.initiate()    初始化一个新的复制集。    

rs.printReplicationInfo()    以主节点的视角返回复制的状态报告。    

rs.printSlaveReplicationInfo()    以从节点的视角返回复制状态报告。    

rs.reconfig()    通过重新应用复制集配置来为复制集更新配置。    

rs.remove()    从复制集中移除一个节点。    

rs.slaveOk()    为当前的连接设置 slaveOk 。不推荐使用。使用 readPref() 和 Mongo.setReadPref() 来设置 read preference 。    

rs.status()    返回复制集状态信息。    

rs.stepDown()    让当前的 primary 变为从节点并触发 election 。    

rs.syncFrom()    设置复制集节点从哪个节点处同步数据,将会覆盖默认选取逻辑。

 

 复制集数据库命令

命令                    描述
replSetFreeze    防止当前节点在一段时间内选举成为主节点。    

replSetGetStatus    返回复制集的状态报告。    

replSetInitiate    初始化一个新的复制集。    

replSetMaintenance    开启活关闭维护模式,维护模式将使 secondary 进入 

RECOVERING 状态。    

replSetReconfig    为已存在的复制集应用新的配置。    

replSetStepDown    强制当前的 primary *降职*变为 secondary ,并触发选举。    
replSetSyncFrom    覆盖默认的复制来源选取逻辑。    

resync    强制 mongod 重新从 master 进行初始化复制。仅在主-从模式。    

applyOps    内部命令应用 oplog 在现在的数据集上。    

isMaster    返回该节点的角色信息,包括是否为主节点。    

getoptime    内部命令,返回optime。

您可能感兴趣的文档:

--结束END--

本文标题: mongodb复制集部署

本文链接: https://www.lsjlt.com/news/38172.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 部署MongoDB复制集(主从复制、读写分离、高可用)
    MongoDB 复制集 复制集(Replica Sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余备份并提高了数据的可用性,通过复制集可以对硬件故障和中断的服务进行恢复。 Mon...
    99+
    2024-04-02
  • MongoDB访问控制的副本集如何部署
    这篇文章主要介绍了MongoDB访问控制的副本集如何部署的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MongoDB访问控制的副本集如何部署文章都会有所收获,下面我们一起来看看吧。版本及环境 MongoDB4....
    99+
    2023-06-29
  • MongoDB分片集群部署详解
     一、环境说明 1、我们prod环境MongoDB的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群随时可以分片,对业务方透明 2、各...
    99+
    2024-04-02
  • 聊聊MongoDB 带访问控制的副本集部署问题
    目录一、下载MongoDBServer及MongoDBShell二、副本集初始化三、增加访问控制  当你需要用到一个MongoDB 副本集集群,用于开发测试时, 可以通过下面的步骤简...
    99+
    2024-04-02
  • mongodb之replSet复制集 + auth
    ### 开启auth认证的mongodb的复制集### 注意点- 服务器节点之前时间要同步- 开启防火墙的一定要允许通过- 开启selinux的也要进行设置- 建立双击互信模式最好不过### 提前...
    99+
    2024-04-02
  • mongodb复制集如何维护
    这篇文章将为大家详细讲解有关mongodb复制集如何维护,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、新增副本集成员 1、登录primary 2、use a...
    99+
    2024-04-02
  • 【Mongodb】往分片复制集添加复制成员
    1.新的成员机器上安装mongo,启动shard1 [root@ip-10-1-2-183 etc]# more shard1.conf logpath=/usr/l...
    99+
    2024-04-02
  • mongodb分片集群部署的方法是什么
    MongoDB分片集群部署的方法包括以下步骤: 部署分片服务器:首先需要创建多个分片服务器,每个分片服务器可以包含一个或多个副本...
    99+
    2024-04-09
    mongodb
  • MongoDB复制集与故障恢复机制是什么
    MongoDB复制集是一组维护相同数据集的MongoDB实例。其中有一个主节点(primary)负责处理所有的写操作,其他节点是从节...
    99+
    2024-05-07
    MongoDB
  • MongoDB复制集数据同步流程
    本文转自张友东的文章,文章链接: http://www.mongoing.com/archives/2369 正好解释了我的问题,所以转发记录下 2015/...
    99+
    2024-04-02
  • MongoDB中复制集集群的原理是什么
    这篇文章给大家介绍MongoDB中复制集集群的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。复制集介绍MongoDB中的复制集(也被称为副本)是一组维护相同数据集的mongo...
    99+
    2024-04-02
  • 深入解析MongoDB的集群部署与容量规划
    MongoDB是一种非关系型数据库,已经在许多大型企业中得到广泛应用。与传统的关系型数据库相比,MongoDB具有卓越的灵活性和可扩展性。本文将深入探讨MongoDB集群的部署和容量规划,帮助读者更好地理解和应用MongoDB。一、Mong...
    99+
    2023-11-04
    MongoDB 集群部署 容量规划
  • MongoDB中复制集的原理是什么
    这篇文章给大家介绍MongoDB中复制集的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。复制集简介Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primar...
    99+
    2024-04-02
  • Docker Swarm部署集群
    一、Swarm简介Swarm是Docker的一个编排工具,参考官网:https://docs.docker.com/engine/swarm/Swarm 模式简介 要在Swarm模式下运行docker,需要先安装docker,参考...
    99+
    2023-01-31
    集群 Docker Swarm
  • GreenPlum 5.10.0 集群部署
    第1部分 初始化系统配置 1.1 部署环境 序号 ip地址 主机名 内存 系统版本 内核版本 1 192.168.61.61 gpmaster61 16Gb CentOS 7.5.1804 3...
    99+
    2024-04-02
  • Influxdb Cluster集群部署
    准备工作 确定安装版本 1、此次安装选择的是influxdb-cluster集群部署方案,参考项目开源地址为:https://github.com/chengshiwen/influxdb-clust...
    99+
    2023-10-07
    linux 服务器
  • php中什么是集群部署?如何实现集群部署?
    随着互联网进入快速发展的时代,各种网站、应用如雨后春笋般出现,人们对于服务的需求越来越高。而随着用户量增加,单一服务器已经无法满足需求,集群部署PHP项目成为解决方案之一。一、什么是集群部署?集群部署是将多台服务器组合在一起,按照特定的方式...
    99+
    2023-05-14
    集群部署 php
  • docker compose部署主从复制的实现
    目录配置解析服务搭建目录结构Compose File实例配置启动服务测试受限于 Redis 单点性能,加上我们对数据天生就有的备份的需求,因此 Redis 提供了主从复制的服务。 本...
    99+
    2024-04-02
  • Redis群集部署详解
    博文大纲:一、Redis群集相关概念二、部署Redis群集 1、部署环境 2、配置Redis实例 3、配置node06主机的多Redis实例 4、主机node01安装配置ruby的运行环境,便于管理Re...
    99+
    2024-04-02
  • Nginx集群部署方案
    工作需要,记录一下 一、Nginx安装 集群部署需要在主服务器安装Nginx服务,以下为安装步骤: 1.访问Nginx官网(http://nginx.org/en/download.html),下载Nginx安装包。 2.下载后解压至C盘...
    99+
    2023-09-08
    服务器 nginx 运维
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作