-
Notifications
You must be signed in to change notification settings - Fork 641
MongoDB Replica Set
In this article, I'm going to guide you about how to set up a MongoDB replica set. Since a copy of the data is kept on all servers in the Replica Set structure, the same data can be read from other servers in case of an error in any server. In short, it has a structure that makes itself failover.
First, we determine the primary server ourselves, if any failure occurs on the primary server, other nodes re-determine the primary server among themselves, and when the failed server starts again, the data is automatically synchronized to the failed server.
Test Environment 3 x Ubuntu 20.04 MongoDB 5.0
In the MongoDB Replica Set installation, we will use a total of 3 servers, 1 primary and 2 secondaries. You can start the installation by following the steps below.
Installation
Set the hostnames and host files on all nodes as below.
#node1 hostnamectl set-hostname mongodb1
#node2 hostnamectl set-hostname mongodb2
#node3 hostnamectl set-hostname mongodb3
cat <> /etc/hosts 192.168.1.231 mongodb1 192.168.1.232 mongodb2 192.168.1.233 mongodb3 EOF
Install the 5.0 version of MongoDB on all nodes.
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu lsb_release -cs
/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
I have added the admin user by selecting mongodb1 server as primary.
Run the query below by writing mongo in CL and accessing the mongodb console.
use admin
db.createUser( { user: "superadmin", pwd: "admin", roles: [ "root" ] } )
Edit the mongodb.conf file on all nodes as below.
net: port: 27017 bindIp: 0.0.0.0
security: authorization: enabled keyFile: "/etc/key"
replication: replSetName: antmediarepl
Save the changes and exit.
Create a key with openssl on the primary node as below and copy the same key to all nodes.
openssl rand -base64 756 > /etc/key
After copying the key file to all nodes, run the command below and give them the necessary permissions and ownership.
chown -R mongodb:mongodb /etc/key && chmod 400 /etc/key
Lastly, enable the mongodb service on all nodes and restart.
systemctl enable mongod systemctl restart mongod
Now, let’s start the replication process. Login to mongodb on Primary as below and start the replicaset process by using rs.initiate()
mongo -u superadmin -p
rs.initiate()
Use the rs.add(“node:port”) parameter to add the other nodes.
rs.add("192.168.1.231:27017") rs.add("192.168.1.232:27017")
After all the nodes are added, you can see the status of the nodes in detail with the rs.status() command. What you should pay attention to here is that PRIMARY/SECONDARY nodes should be correct and they have the same timestamp.
rs.status()
antmediarepl:PRIMARY> rs.status() { "set" : "antmediarepl", "date" : ISODate("2021-07-25T12:16:49.796Z"), "myState" : 1, "term" : NumberLong(1), "syncSourceHost" : "", "syncSourceId" : -1, "heartbeatIntervalMillis" : NumberLong(2000), "majorityVoteCount" : 2, "writeMajorityCount" : 2, "votingMembersCount" : 3, "writableVotingMembersCount" : 3, "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "lastCommittedWallTime" : ISODate("2021-07-25T12:16:41.403Z"), "readConcernMajorityOpTime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "lastAppliedWallTime" : ISODate("2021-07-25T12:16:41.403Z"), "lastDurableWallTime" : ISODate("2021-07-25T12:16:41.403Z") }, "lastStableRecoveryTimestamp" : Timestamp(1627215381, 1), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2021-07-25T10:21:21.110Z"), "electionTerm" : NumberLong(1), "lastCommittedOpTimeAtElection" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "lastSeenOpTimeAtElection" : { "ts" : Timestamp(1627208481, 1), "t" : NumberLong(-1) }, "numVotesNeeded" : 1, "priorityAtElection" : 1, "electionTimeoutMillis" : NumberLong(10000), "newTermStartDate" : ISODate("2021-07-25T10:21:21.119Z"), "wMajorityWriteAvailabilityDate" : ISODate("2021-07-25T10:21:21.127Z") }, "members" : [ { "_id" : 0, "name" : "mongodb1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 7360, "optime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2021-07-25T12:16:41Z"), "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1627208481, 2), "electionDate" : ISODate("2021-07-25T10:21:21Z"), "configVersion" : 5, "configTerm" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "192.168.1.232:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 6903, "optime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2021-07-25T12:16:41Z"), "optimeDurableDate" : ISODate("2021-07-25T12:16:41Z"), "lastHeartbeat" : ISODate("2021-07-25T12:16:49.760Z"), "lastHeartbeatRecv" : ISODate("2021-07-25T12:16:49.759Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncSourceHost" : "mongodb1:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 5, "configTerm" : 1 }, { "_id" : 2, "name" : "192.168.1.233:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 6899, "optime" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1627215401, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2021-07-25T12:16:41Z"), "optimeDurableDate" : ISODate("2021-07-25T12:16:41Z"), "lastHeartbeat" : ISODate("2021-07-25T12:16:49.760Z"), "lastHeartbeatRecv" : ISODate("2021-07-25T12:16:48.484Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncSourceHost" : "mongodb1:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 5, "configTerm" : 1 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1627215401, 1), "signature" : { "hash" : BinData(0,"d1Mk1W/Y8DK73Q/GVFNXAxsu5og="), "keyId" : NumberLong("6988807209668837380") } }, "operationTime" : Timestamp(1627215401, 1) }
You can login to the replica set as following. mongo --host "antmediarepl/mongodb1,mongodb2,mongodb3"
- Introduction
- Quick Start
- Installation
- Publishing Live Streams
- Playing Live Streams
- Conference Call
- Peer to Peer Call
- Adaptive Bitrate(Multi-Bitrate) Streaming
- Data Channel
- Video on Demand Streaming
- Simulcasting to Social Media Channels
- Clustering & Scaling
- Monitor Ant Media Servers with Apache Kafka and Grafana
- WebRTC SDKs
- Security
- Integration with your Project
- Advanced
- WebRTC Load Testing
- TURN Servers
- AWS Wavelength Deployment
- Multi-Tenancy Support
- Monitor Ant Media Server with Datadog
- Clustering in Alibaba
- Playlist
- Kubernetes
- Time based One Time Password
- Kubernetes Autoscaling
- Kubernetes Ingress
- How to Install Ant Media Server on EKS
- Release Tests
- Spaceport Volumetric Video
- WebRTC Viewers Info
- Webhook Authentication for Publishing Streams
- Recording Streams
- How to Update Ant Media Server with Cloudformation
- How to Install Ant Media Server on GKE
- Ant Media Server on Docker Swarm
- Developer Quick Start
- Recording HLS, MP4 and how to recover
- Re-streaming update
- Git Branching
- UML Diagrams