baodeyun 发表于 2018-10-20 11:32:41

mongodb的复制集

下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_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

# 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

# cat /etc/profile

......

export PATH=$PATH:/usr/local/mongodb/bin

# mongod --config /usr/local/mongodb/mongodb.conf


常见错误:

# 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")

# 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    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
config0.000GB
local   0.000GB


模拟主库不能使用,把主库停止,经测试从库可以自动升级成主库。

再次启动主库时,主库就变成从库了。

仲裁节点的安装:

# 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的仲裁节点:

# 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)
                }
        }
}
至此安装完毕。

登陆到仲裁节点:

# 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
2018-10-16T00:13:05.892+0800 I STORAGE ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-10-16T00:13:05.892+0800 I STORAGE **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-10-16T00:13:06.958+0800 I CONTROL
2018-10-16T00:13:06.958+0800 I CONTROL ** WARNING: Access control is not enabled for the database.
2018-10-16T00:13:06.958+0800 I CONTROL **          Read and write access to data and configuration is unrestricted.
2018-10-16T00:13:06.958+0800 I CONTROL ** WARNING: You are running this process as the root user, which is not recommended.
2018-10-16T00:13:06.958+0800 I CONTROL
2018-10-16T00:13:06.959+0800 I CONTROL
2018-10-16T00:13:06.959+0800 I CONTROL ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-10-16T00:13:06.959+0800 I CONTROL **      We suggest setting it to 'never'
2018-10-16T00:13:06.959+0800 I CONTROL
2018-10-16T00:13:06.959+0800 I CONTROL ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-10-16T00:13:06.959+0800 I CONTROL **      We suggest setting it to 'never'
2018-10-16T00:13:06.959+0800 I CONTROL

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
local0.000GB

arbiter作为仲裁者,没有数据副本存储在本地,能读取复制集的信息

上面介绍的是三台mongodb节点:一主一备一仲裁,这样,主节点挂了后,通过仲裁机制将primary自动切换到备机上!
如果上面的三台mongodb节点:一主两备,没有仲裁节点,那么主节点挂了后,primary会自动切换到其余两台备节点中的一台上!


1
23
45
67
89
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
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.priority = 0.5
rs0:PRIMARY> cfg.members.priority = 0.5 rs0:PRIMARY> cfg.members.priority = 0
rs0:PRIMARY> rs.reconfig(cfg)
说明:其中成员编号0/1/2为 rs.status()中的 "_id"值
members表示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服务,这就完成了移除(数据库文件仍保留在当前服务器)。


页: [1]
查看完整版本: mongodb的复制集