mongodb 4.0 copy set to build the whole process
- 2021-01-22 05:34:01
- OfStack
preface
Recently, some students asked mongodb how difficult it is to deploy replica sets. My answer is not difficult, it is fast, it takes a few minutes to do it, and it is much easier than mysql MHA. So how do you deploy it? See below.
1. Preparation
1.1 Download Software
Select the version and download the mongodb software, pay attention to the operating system version, etc. This time, I choose mongodb 4.2.8 version of percona branch to build, and the operating system is centos6
cd /usr/local/
wget https://www.percona.com/downloads/percona-server-mongodb-LATEST/percona-server-mongodb-4.2.8-8/binary/tarball/percona-server-mongodb-4.2.8-8-centos6-x86_64.tar.gz
tar -zxvf percona-server-mongodb-4.2.8-8-centos6-x86_64.tar.gz
ln -s percona-server-mongodb-4.2.8-8 mongodb
1.2 Plan the roles of each node
The roles of each node are as follows
IP | port | role |
192.168.128.208 | 27017 | PRIMARY |
192.168.128.209 | 27017 | SECONDARY |
192.168.128.209 | 28017 | ARBITER |
2 the deployment
2.1 Create relevant directories for each node
Create data directory, log directory and other related directories
[root@m1 ~]# mkdir -p /data/mongodb/27017/{data,logs,tmp,etc,keyfile}
[root@m1 ~]# cd /data/mongodb/27017/
[root@m1 27017]# ll
The total amount 20
drwxr-xr-x 2 root root 4096 8 month 7 16:59 data
drwxr-xr-x 2 root root 4096 8 month 7 16:59 etc
drwxr-xr-x 2 root root 4096 8 month 7 16:59 keyfile
drwxr-xr-x 2 root root 4096 8 month 7 16:59 logs
drwxr-xr-x 2 root root 4096 8 month 7 16:59 tmp
2.2 Configuration file
Create the configuration file and add the corresponding configuration information, noting the port of the quorum node
[root@m1 27017]# cd /data/mongodb/27017/etc/
[root@m1 etc]# vim mongod.conf
Add the following
storage:
dbPath: /data/mongodb/27017/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /data/mongodb/27017/logs/mongod.log
processManagement:
fork: true
pidFilePath: /data/mongodb/27017/tmp/mongod.pid
net:
port: 27017
bindIp: 0.0.0.0replication: replSetName: "test1" # Replica set name
2.3 Start each node
Take one of the nodes as an example, the other nodes can modify the corresponding configuration file
[root@m1 local]# /usr/local/mongodb/bin/mongod -f /data/mongodb/27017/etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 30019
child process started successfully, parent exiting
2.4 Initialize the replica set
Initialize the replica set, specifying id and roles for each node. Note that the replica set name and configuration file are 1.
Execute the following statement on any node
> use admin
switched to db admin
> rs.initiate( {
... _id: "test1",
... members: [
... { _id: 0, host: "192.168.128.208:27017" },
... { _id: 1, host: "192.168.128.209:27017" },
... { _id: 2, host: "192.168.128.209:28017",arbiterOnly:true }
... ] })
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1596792682, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1596792682, 1)
}
After completion, the status of each cluster can be viewed as follows. It can be seen that the current 192.168.128.208:27017 is the PRIMARY node
test1:PRIMARY> rs.status()
{
"set" : "test1",
"date" : ISODate("2020-08-07T11:09:24.454Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2020-08-07T11:09:23.663Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2020-08-07T11:09:23.663Z"),
"appliedOpTime" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-08-07T11:09:23.663Z"),
"lastDurableWallTime" : ISODate("2020-08-07T11:09:23.663Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1596798513, 1),
"lastStableCheckpointTimestamp" : Timestamp(1596798513, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-08-07T09:31:33.409Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1596792682, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2020-08-07T09:31:33.444Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-08-07T09:31:34.050Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.128.208:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5950,
"optime" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-08-07T11:09:23Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1596792693, 1),
"electionDate" : ISODate("2020-08-07T09:31:33Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.128.209:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 5882,
"optime" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1596798563, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-08-07T11:09:23Z"),
"optimeDurableDate" : ISODate("2020-08-07T11:09:23Z"),
"lastHeartbeat" : ISODate("2020-08-07T11:09:23.672Z"),
"lastHeartbeatRecv" : ISODate("2020-08-07T11:09:22.804Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.128.208:27017",
"syncSourceHost" : "192.168.128.208:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.128.209:28017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 5882,
"lastHeartbeat" : ISODate("2020-08-07T11:09:23.672Z"),
"lastHeartbeatRecv" : ISODate("2020-08-07T11:09:22.952Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1596798563, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1596798563, 1)
}
test1:PRIMARY>
Change to authentication mode
Authentication mode needs to be enabled for security reasons (need to login with user name/password)
3.1 Create Users
Create super administrator account
test1:PRIMARY> db.createUser({user: "root", pwd: "Root#123", roles: [{role: "root", db: "admin"}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
3.2 Create the key file
Execute the script on the primary library to generate the key file, and then copy the nodes to the other two nodes
[root@m1 mongodb]# cd /data/mongodb/27017/keyfile/
[root@m1 keyfile]# openssl rand -base64 756 > mongo.key
[root@m1 keyfile]# chmod 600 mongo.key # Must be modified to 600 Permission, otherwise cannot be started
When this is done, copy the file to the other two nodes
3.3 Modify the configuration file
Add the following to the configuration file, noting the file paths of the different nodes
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /data/mongodb/27017/keyfile/mongo.key
3.4 Restart and login in authentication mode
# Shut down mongodb
[root@m1 keyfile]# /usr/local/mongodb/bin/mongod -f /data/mongodb/27017/etc/mongod.conf -shutdown
killing process with pid: 30675
# Start the mongodb
[root@m1 keyfile]# /usr/local/mongodb/bin/mongod -f /data/mongodb/27017/etc/mongod.conf about to fork child process, waiting until server is ready for connections.
forked process: 2430
child process started successfully, parent exiting
# Authenticated mode login
[root@m1 keyfile]#
[root@m1 keyfile]# /usr/local/mongodb/bin/mongo -u root -p 'Root#123' --authenticationDatabase admin
At this point, the mongodb replica set is set up, you will?
conclusion