暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[Mo]MongoDB简单副本集的搭建介绍

M小小虾米 2021-08-04
181

        搭建一主两从三节点副本集,版本使用3.4.14

        步骤:

        1.三个节点都安装并启动MongoDB

        解压:

tar -zxvf mongodb-linux-x86_64-rhel62-3.4.14.tgz

        设置安装路径:mv mongodb-linux-x86_64-rhel62-3.4.14 usr/local/mongodb

        启动并设置副本集名称为rs0:

cd usr/local/mongodb/bin/

./mongod --dbpath=/data/db --logpath=/data/db/go.log --port=21007 --replSet=rs0 &  

         2.登陆任意一台节点添加副本集

        

> rs.slaveOk()

> show dbs

local  0.000GB

> use admin

switched to db admin

> rs.initiate()  初始化

{

"info2" : "no configuration specified. Using a default configuration for the set",

"me" : "daifu:27017",

"ok" : 1

}

rs0:OTHER> rs.conf()  #查看配置信息,刚登陆时角色还是other

{

"_id" : "rs0",

"version" : 1, #目前只有自己一个节点信息

"protocolVersion" : NumberLong(1),

"members" : [

{

"_id" : 0,

"host" : "daifu:21007",

"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("5ae12ae28599baf861799d5d")

}

}

添加另外两个节点

rs0:PRIMARY> rs.add('test:21007') 

{ "ok" : 1 }

rs0:PRIMARY> rs.add('qposbak:21007')

{ "ok" : 1 }

rs0:PRIMARY> rs.conf() #再次查看配置信息,可看到有三位成员

{

"_id" : "rs0",

"version" : 3,

"protocolVersion" : NumberLong(1),

"members" : [

{

"_id" : 0, #第一个节点信息

"host" : "daifu:21007",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1, #设置优先级

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

},

{

"_id" : 1, #第二个节点信息

"host" : "test:21007",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

},

{

"_id" : 2, #第三个节点信息

"host" : "qposbak:21007",

"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("5ae12ae28599baf861799d5d")

}

}

rs0:PRIMARY> rs.status() #查看成员副本集状态

{

"set" : "rs0", #副本集名字

"date" : ISODate("2018-04-26T01:29:32.322Z"),

"myState" : 1,

"term" : NumberLong(1),

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524706158, 1),

"t" : NumberLong(1)

},

"appliedOpTime" : {

"ts" : Timestamp(1524706170, 1),

"t" : NumberLong(1)

},

"durableOpTime" : {

"ts" : Timestamp(1524706170, 1),

"t" : NumberLong(1)

}

},

"members" : [

{

"_id" : 0,

"name" : "daifu:21007",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 270,

"optime" : {

"ts" : Timestamp(1524706170, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-26T01:29:30Z"),

"electionTime" : Timestamp(1524706018, 2),

"electionDate" : ISODate("2018-04-26T01:26:58Z"),

"configVersion" : 3,

"self" : true

},

{

"_id" : 1,

"name" : "test:21007",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 73,

"optime" : {

"ts" : Timestamp(1524706158, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524706158, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-26T01:29:18Z"),

"optimeDurableDate" : ISODate("2018-04-26T01:29:18Z"),

"lastHeartbeat" : ISODate("2018-04-26T01:29:32.214Z"),

"lastHeartbeatRecv" : ISODate("2018-04-26T01:29:28.199Z"),

"pingMs" : NumberLong(5),

"configVersion" : 3

},

{

"_id" : 2,

"name" : "qposbak:21007",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 14,

"optime" : {

"ts" : Timestamp(1524706158, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524706158, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-26T01:29:18Z"),

"optimeDurableDate" : ISODate("2018-04-26T01:29:18Z"),

"lastHeartbeat" : ISODate("2018-04-26T01:29:32.128Z"),

"lastHeartbeatRecv" : ISODate("2018-04-26T01:29:28.247Z"),

"pingMs" : NumberLong(0),

"configVersion" : 3

}

],

"ok" : 1

}


        3.移除从库节点(两步)

        1>首先关闭从库

rs0:SECONDARY> use admin

switched to db admin

rs0:SECONDARY> db.shutdownServer()

        2>然后在主库中删除从库节点信息

rs0:PRIMARY> rs.remove('test:21007')

{ "ok" : 1 }

        4.副本集Failover测试

        副本集默认2秒Ping一次,如果10秒没有回应认为对方不再存活。当存活的节点中优先级相同的情况下,MongoDB选择将Optime最高的从库选为主库。

        测试:关闭主库

rs0:PRIMARY> use admin

switched to db admin

rs0:PRIMARY> db.shutdownServer()

        从库查看是否提升为主库

rs0:PRIMARY> rs.status()

{

"set" : "rs0",

"date" : ISODate("2018-04-26T02:11:19.917Z"),

"myState" : 1,

"term" : NumberLong(2),

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524708674, 1),

"t" : NumberLong(2)

},

"appliedOpTime" : {

"ts" : Timestamp(1524708674, 1),

"t" : NumberLong(2)

},

"durableOpTime" : {

"ts" : Timestamp(1524708674, 1),

"t" : NumberLong(2)

}

},

"members" : [

{

"_id" : 0,

"name" : "daifu:21007",

"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("2018-04-26T02:11:19.648Z"),

"lastHeartbeatRecv" : ISODate("2018-04-26T02:09:44.187Z"),

"pingMs" : NumberLong(0),

"lastHeartbeatMessage" : "Connection refused",

"configVersion" : -1

},

{

"_id" : 2,

"name" : "qposbak:21007",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY", #qposbak已经成为主

"uptime" : 2680,

"optime" : {

"ts" : Timestamp(1524708674, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-26T02:11:14Z"),

"infoMessage" : "could not find member to sync from",

"electionTime" : Timestamp(1524708593, 1),

"electionDate" : ISODate("2018-04-26T02:09:53Z"),

"configVersion" : 5,

"self" : true

},

{

"_id" : 3,

"name" : "test:21007",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 1289,

"optime" : {

"ts" : Timestamp(1524708674, 1),

"t" : NumberLong(2)

},

"optimeDurable" : {

"ts" : Timestamp(1524708674, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-26T02:11:14Z"),

"optimeDurableDate" : ISODate("2018-04-26T02:11:14Z"),

"lastHeartbeat" : ISODate("2018-04-26T02:11:19.817Z"),

"lastHeartbeatRecv" : ISODate("2018-04-26T02:11:19.816Z"),

"pingMs" : NumberLong(4),

"syncingTo" : "qposbak:27017",

"configVersion" : 5

}

],

"ok" : 1

}

        如果将宕机的原主库重新启动后,查看会变成什么角色状态

rs0:SECONDARY> rs.status()

{

"set" : "rs0",

"date" : ISODate("2018-04-26T02:11:56.714Z"),

"myState" : 2,

"term" : NumberLong(2),

"syncingTo" : "qposbak:21007",

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"appliedOpTime" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"durableOpTime" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

}

},

"members" : [

{

"_id" : 0,

"name" : "daifu:21007",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY", #可以发现,变成了secondary状态。当然我们可以通过更改优先级来实现原主库启动后重新变回主库。

"uptime" : 71,

"optime" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-26T02:13:14Z"),

"syncingTo" : "qposbak:21007",

"configVersion" : 5,

"self" : true

},

{

"_id" : 2,

"name" : "qposbak:21007",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 70,

"optime" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"optimeDurable" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-26T02:13:14Z"),

"optimeDurableDate" : ISODate("2018-04-26T02:13:14Z"),

"lastHeartbeat" : ISODate("2018-04-26T02:11:56.173Z"),

"lastHeartbeatRecv" : ISODate("2018-04-26T02:11:56.572Z"),

"pingMs" : NumberLong(0),

"electionTime" : Timestamp(1524708593, 1),

"electionDate" : ISODate("2018-04-26T02:09:53Z"),

"configVersion" : 5

},

{

"_id" : 3,

"name" : "test:21007",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 70,

"optime" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"optimeDurable" : {

"ts" : Timestamp(1524708794, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-26T02:13:14Z"),

"optimeDurableDate" : ISODate("2018-04-26T02:13:14Z"),

"lastHeartbeat" : ISODate("2018-04-26T02:11:56.591Z"),

"lastHeartbeatRecv" : ISODate("2018-04-26T02:11:55.953Z"),

"pingMs" : NumberLong(11),

"syncingTo" : "qposbak:21007",

"configVersion" : 5

}

],

"ok" : 1

}

        MongoDB的成员中,除了Primary,Secondary和仲裁节点外,还有Hidden隐藏节点,Secondary-Only只作为从节点,Delayed延迟节点和Non-Voting备份节点。


文章转载自M小小虾米,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论