下载地址:https://fastdl.mongodb.org/linux ... 64-rhel62-3.6.8.tgz
Primary:192.168.20.141
Secondaries:192.168.20.142
Arbiter:192.168.20.143
mongodb安装:(所有节点都安装)
tar xf mongodb-linux-x86_64-rhel62-3.6.8.tgz
mv mongodb-linux-x86_64-rhel62-3.6.8 /usr/local/mongodb
mkdir /usr/local/mongodb/{data,log} -p
[root@localhost ~]# cat /usr/local/mongodb/mongodb.conf
pidfilepath=/usr/local/mongodb/log/mongod.pid
logpath=/usr/local/mongodb/log/mongod.log
dbpath=/usr/local/mongodb/data
logappend=true
bind_ip=192.168.20.141
port=27017
fork=true
replSet=rs0
[root@localhost ~]# cat /etc/profile
......
export PATH=$PATH:/usr/local/mongodb/bin
[root@localhost ~]# mongod --config /usr/local/mongodb/mongodb.conf
常见错误:
[root@localhost mongodb]# mongod --config /usr/local/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1529
ERROR: child process failed, exited with error number 48
To see additional information in this output, start without the "--fork" option.
由于我的测试环境下没有数据,我将data数据目录下的文件全部清空,然后--repair
rm -rf data/mongod.lock
mongod --repair
重启:
mongod --config /usr/local/mongodb/mongodb.conf
登陆mongodb主节点:
初始化复制集:(集合:"sr0" 第一个成员为:"192.168.20.141:27017")
[root@localhost ~]# mongo 192.168.20.141:27017
> rs.initiate({_id: "rs0",members: [{ _id: 0 , host: "192.168.20.141:27017" }]})
rs0:OTHER> //接着回车,显示这个节点为Primary主节点
rs0:PRIMARY>
接着添加另一个成员:
rs0:PRIMARY> rs.add("192.168.20.142:27017")
查看成员信息:(或者使用:db.isMaster())
rs0:PRIMARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2018-10-15T15:59:47.565Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.20.141:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 107,
"optime" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-10-15T15:59:38Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1539619130, 2),
"electionDate" : ISODate("2018-10-15T15:58:50Z"),
"configVersion" : 2,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.20.142:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 9,
"optime" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1539619178, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-10-15T15:59:38Z"),
"optimeDurableDate" : ISODate("2018-10-15T15:59:38Z"),
"lastHeartbeat" : ISODate("2018-10-15T15:59:46.107Z"),
"lastHeartbeatRecv" : ISODate("2018-10-15T15:59:47.116Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 2
}
],
"ok" : 1,
"operationTime" : Timestamp(1539619178, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1539619178, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
这中方法也可以查询:
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.runCommand( {replSetGetStatus : 1} )
{
"set" : "rs0",
"date" : ISODate("2018-10-15T17:31:13.924Z"),
"myState" : 1,
"term" : NumberLong(2),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.20.141:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4387,
"optime" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-10-15T17:31:06Z"),
"optimeDurableDate" : ISODate("2018-10-15T17:31:06Z"),
"lastHeartbeat" : ISODate("2018-10-15T17:31:12.667Z"),
"lastHeartbeatRecv" : ISODate("2018-10-15T17:31:12.668Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.20.142:27017",
"syncSourceHost" : "192.168.20.142:27017",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 1,
"name" : "192.168.20.142:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5600,
"optime" : {
"ts" : Timestamp(1539624666, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-10-15T17:31:06Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1539620134, 1),
"electionDate" : ISODate("2018-10-15T16:15:34Z"),
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "192.168.20.143:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 4636,
"lastHeartbeat" : ISODate("2018-10-15T17:31:12.677Z"),
"lastHeartbeatRecv" : ISODate("2018-10-15T17:31:13.313Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 3
}
],
"ok" : 1,
"operationTime" : Timestamp(1539624666, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1539624666, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
详细说明如下:
"_id" : #集群中节点编号
"name" : #成员服务器名称及端口
"health" : #表示成员中的健康状态(0:down;1:up)
"state" : #为0~10,表示成员的当前状态
"stateStr" : #描述该成员是主库(PRIMARY)还是备库(SECONDARY)
"uptime" : #该成员在线时间(秒)
"optime" : #成员最后一次应用日志(oplog)的信息
"optimeDate" : #成员最后一次应用日志(oplog)的时间
"electionTime" : #当前primary从操作日志中选举信息
"electionDate" : #当前primary被选定为primary的日期
"configVersion" : #mongodb版本
"self" : #为true 表示当前节点
切换到备库中,能连接但是不能操作:
rs0:SECONDARY> show dbs
2018-10-16T01:32:31.781+0800 E QUERY [thread1] Error: listDatabases failed:{
"operationTime" : Timestamp(1539624746, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1539624746, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1
shellHelper.show@src/mongo/shell/utils.js:849:19
shellHelper@src/mongo/shell/utils.js:739:15
@(shellhelp2):1:1
从库开启都操作()
rs0:SECONDARY> rs.slaveOk();
rs0:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
模拟主库不能使用,把主库停止,经测试从库可以自动升级成主库。
再次启动主库时,主库就变成从库了。
仲裁节点的安装:
[root@localhost ~]# cat /usr/local/mongodb/mongodb.conf
pidfilepath=/usr/local/mongodb/log/mongod.pid
logpath=/usr/local/mongodb/log/mongod.log
dbpath=/usr/local/mongodb/arbiter
logappend=false
bind_ip=192.168.20.143
port=27017
fork=true
replSet=rs0
启动mongodb的仲裁节点:
[root@localhost ~]# mongod --config /usr/local/mongodb/mongodb.conf
在主节点添加仲裁节点并查看结果:
rs0:SECONDARY> rs.addArb("192.168.20.143:27017")
查看结果:
rs0:PRIMARY> db.isMaster()
{
"hosts" : [
"192.168.20.141:27017",
"192.168.20.142:27017"
],
"arbiters" : [
"192.168.20.143:27017"
],
"setName" : "rs0",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.20.142:27017",
"me" : "192.168.20.142:27017",
"electionId" : ObjectId("7fffffff0000000000000002"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1539625486, 1),
"t" : NumberLong(2)
},
"lastWriteDate" : ISODate("2018-10-15T17:44:46Z"),
"majorityOpTime" : {
"ts" : Timestamp(1539625486, 1),
"t" : NumberLong(2)
},
"majorityWriteDate" : ISODate("2018-10-15T17:44:46Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2018-10-15T17:44:50.159Z"),
"logicalSessionTimeoutMinutes" : 30,
"minWireVersion" : 0,
"maxWireVersion" : 6,
"readOnly" : false,
"ok" : 1,
"operationTime" : Timestamp(1539625486, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1539625486, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
至此安装完毕。
登陆到仲裁节点:
[root@localhost ~]# mongo 192.168.20.143:27017
MongoDB shell version v3.6.8
connecting to: mongodb://192.168.20.143:27017/test
MongoDB server version: 3.6.8
Server has startup warnings:
2018-10-16T00:13:05.892+0800 I STORAGE [initandlisten]
2018-10-16T00:13:05.892+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-10-16T00:13:05.892+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-10-16T00:13:06.958+0800 I CONTROL [initandlisten]
2018-10-16T00:13:06.958+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-10-16T00:13:06.958+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-10-16T00:13:06.958+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-10-16T00:13:06.958+0800 I CONTROL [initandlisten]
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten]
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten]
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-10-16T00:13:06.959+0800 I CONTROL [initandlisten]
rs0:ARBITER> rs.slaveOk();
rs0:ARBITER> db.isMaster()
{
"hosts" : [
"192.168.20.141:27017",
"192.168.20.142:27017"
],
"arbiters" : [
"192.168.20.143:27017"
],
"setName" : "rs0",
"setVersion" : 3,
"ismaster" : false,
"secondary" : false,
"primary" : "192.168.20.142:27017",
"arbiterOnly" : true,
"me" : "192.168.20.143:27017",
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1539625616, 1),
"t" : NumberLong(2)
},
"lastWriteDate" : ISODate("2018-10-15T17:46:56Z"),
"majorityOpTime" : {
"ts" : Timestamp(1539625616, 1),
"t" : NumberLong(2)
},
"majorityWriteDate" : ISODate("2018-10-15T17:46:56Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2018-10-15T17:47:02.962Z"),
"minWireVersion" : 0,
"maxWireVersion" : 6,
"readOnly" : false,
"ok" : 1
}
rs0:ARBITER> show dbs
local 0.000GB
arbiter作为仲裁者,没有数据副本存储在本地,能读取复制集的信息
上面介绍的是三台mongodb节点:一主一备一仲裁,这样,主节点挂了后,通过仲裁机制将primary自动切换到备机上!
如果上面的三台mongodb节点:一主两备,没有仲裁节点,那么主节点挂了后,primary会自动切换到其余两台备节点中的一台上!
1
2 3
4 5
6 7
8 9
10 11
12 13
14 15
16 17
18 19
20 21
22 23
24 25
26 27
28 29
30 31
32 33
34 35
36 37
38 39
40 | 一主两从的mongodb配置和上面一主一从的配置一样。
多加的一个从节点,在主节点登陆mongodb,使用rs.add命令将这个成员加到集群中即可!
一主两从的模式,比如: 主节点192.168.20.141的mongodb服务程序挂了后,另外两个从节点中的一个(比如192.168.20.142)会自动变成primary主节点,
另一个节点192.168.20.143则是新的主节点(192.168.20.142)的从节点。
++++++++++++++++++++++++++++++如果想让切换回原来的主节点,做法如下+++++++++++++++++++++++++++++++ 1)恢复原来的主节点192.168.20.141的mongodb服务,使用命令rs.status() 确认数据集成员运行正常。
2)到次节点192.168.20.143中登录mongodb,运行freeze使其120内不会变为主节点。 > rs.freeze(120)
3) 到新的主节点192.168.20.142中强制切换主节点,stepDown将阻止长事务和写入操作 > rs.stepDown(120)
4)此时sign-mongo01.wangshibo.cn节点变成primary主节点。使用rs.status()命令可以查看到集群状态。
+++++++++++++++++++++++若要使某个节点永远不会变为主节点,设置优先级为0即可+++++++++++++++++++++++ 登陆当前主节点的mongodb,执行下面操作:
rs0:PRIMARY> cfg = rs.conf() rs0:PRIMARY> cfg.members[0].priority = 0.5
rs0:PRIMARY> cfg.members[1].priority = 0.5 rs0:PRIMARY> cfg.members[2].priority = 0
rs0:PRIMARY> rs.reconfig(cfg)
说明: 其中成员编号0/1/2为 rs.status()中的 "_id"值
members[2]表示192.168.20.143,则它将永远不会变成主节点!因为优先级设置为0了!
++++++++++++++++++++++++++++++++移除一个复制成员(两种方法)++++++++++++++++++++++++++++++++++++ 登陆当前主节点的mongodb,执行下面操作:
rs0:PRIMARY> rs.remove("192.168.20.143:27017") rs0:PRIMARY> rs.conf()
或者:
rs0:PRIMARY> cfg = rs.conf() rs0:PRIMARY> cfg.members.splice(2,1)
rs0:PRIMARY> rs.reconfig(cfg)
移除后到移除的节点服务器(即192.168.20.143),更改配置文件mongod.conf #replSet=rs0 //将这一行注释
然后再重启mongodb服务,这就完成了移除(数据库文件仍保留在当前服务器)。 |
|