जब आप अपने उत्पादन परिवेश में महत्वपूर्ण सेवाएं चलाते हैं तो उच्च उपलब्धता आवश्यक है। इसे डेटाबेस टियर सहित विफलताओं के सभी एकल बिंदुओं को समाप्त करके प्राप्त किया जा सकता है। तो आप हमारे आश्चर्य की कल्पना कर सकते हैं जब भी हम कई वेब सर्वर/एप्लिकेशन के साथ सेटअप में टकराते हैं जो सभी एक ही डेटाबेस इंस्टेंस को मारते हैं।
MongoDB में उच्च उपलब्धता सेवा प्रतिकृति के माध्यम से प्राप्त की जा सकती है। प्रतिकृति सेट शब्द एक सेटअप का वर्णन करता है जहां कई MongoDB प्रक्रियाएं एक ही डेटा को चलाती हैं और बनाए रखती हैं। इस ब्लॉग में, हम चर्चा करेंगे कि उच्च उपलब्धता प्राप्त करने के लिए मोंगोडीबी के लिए पेरकोना सर्वर को कैसे तैनात किया जाए।
MongoDB के लिए परिनियोजन Percona सर्वर
हमें उच्च उपलब्धता के लिए कम से कम 3 नोड्स की आवश्यकता है, एक प्रतिकृति सेट में 1 प्राथमिक नोड और 2 माध्यमिक नोड शामिल होंगे। आप 2 नोड्स, 1 प्राइमरी और 1 सेकेंडरी का उपयोग कर सकते हैं, लेकिन आपको अभी भी तीसरे नोड के रूप में एक आर्बिटर की आवश्यकता है। एक मध्यस्थ एक MongoDB नोड है जो डेटा को कॉपी और संग्रहीत नहीं करता है, लेकिन विफलता होने पर नए प्राथमिक की चुनाव प्रक्रिया में शामिल होता है।
इस उदाहरण में, हम ऑपरेटिंग सिस्टम के रूप में CentOS Linux 7.3 के साथ 3 वर्चुअल वातावरण चला रहे हैं और स्थापना के लिए MongoDB संस्करण 4.2 के लिए Percona सर्वर का उपयोग करेंगे। IP पता नीचे दिया गया है:
- mongo-node8:10.10.10.17
- मोंगो-नोड9:10.10.10.18
- mongo-node10:10.10.10.19
इससे पहले कि हम संस्थापन में कूदें, कृपया सुनिश्चित करें कि सभी नोड पहले से ही प्रत्येक नोड पर /etc/hosts फ़ाइल में कॉन्फ़िगर किए गए हैं।
[[email protected] ~]# cat /etc/hosts
127.0.0.1 mongo-node9 mongo-node9
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.17 mongo-node8
10.10.10.18 mongo-node9
10.10.10.19 mongo-node10
फिर, हमें प्रत्येक नोड पर पेरकोना रिपोजिटरी को कॉन्फ़िगर करने की आवश्यकता है। उसके बाद, जैसा कि नीचे दिखाया गया है, psmdb42 के लिए रिपोजिटरी सक्षम करें:
[[email protected] ~]# percona-release setup psmdb42
* Disabling all Percona Repositories
* Enabling the Percona Server for MongoDB 4.2 repository
* Enabling the Percona Tools repository
<*> All done!
और फिर MongoDB पैकेज के लिए Percona सर्वर इंस्टाल करना जारी रखें:
[[email protected] ~]# yum install percona-server-mongodb*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.mirror.angkasa.id
* extras: centos.mirror.angkasa.id
* updates: centos.mirror.angkasa.id
Resolving Dependencies
--> Running transaction check
---> Package percona-server-mongodb.x86_64 0:4.2.9-10.el7 will be installed
--> Processing Dependency: cyrus-sasl-gssapi for package: percona-server-mongodb-4.2.9-10.el7.x86_64
--> Processing Dependency: numactl for package: percona-server-mongodb-4.2.9-10.el7.x86_64
---> Package percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7 will be installed
--> Processing Dependency: libcrypto.so.10(OPENSSL_1.0.2)(64bit) for package: percona-server-mongodb-mongos-4.2.9-10.el7.x86_64
---> Package percona-server-mongodb-server.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7 will be installed
--> Running transaction check
---> Package cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7 will be installed
--> Processing Dependency: cyrus-sasl-lib(x86-64) = 2.1.26-23.el7 for package: cyrus-sasl-gssapi-2.1.26-23.el7.x86_64
---> Package numactl.x86_64 0:2.0.12-5.el7 will be installed
---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be updated
--> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for package: 1:openssl-1.0.1e-60.el7_3.1.x86_64
---> Package openssl-libs.x86_64 1:1.0.2k-19.el7 will be an update
--> Running transaction check
---> Package cyrus-sasl-lib.x86_64 0:2.1.26-20.el7_2 will be updated
---> Package cyrus-sasl-lib.x86_64 0:2.1.26-23.el7 will be an update
---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be updated
---> Package openssl.x86_64 1:1.0.2k-19.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
================================================================
Package Arch Version Repository
Size
================================================================
Installing:
percona-server-mongodb x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
4.9 k
percona-server-mongodb-debuginfo
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
885 M
percona-server-mongodb-mongos
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
10 M
percona-server-mongodb-server
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
22 M
percona-server-mongodb-shell x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
12 M
percona-server-mongodb-tools x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
30 M
Installing for dependencies:
cyrus-sasl-gssapi x86_64 2.1.26-23.el7 base 41 k
numactl x86_64 2.0.12-5.el7 base 66 k
Updating for dependencies:
cyrus-sasl-lib x86_64 2.1.26-23.el7 base 155 k
openssl x86_64 1:1.0.2k-19.el7 base 493 k
openssl-libs x86_64 1:1.0.2k-19.el7 base 1.2 M
Transaction Summary
================================================================
Install 6 Packages (+2 Dependent packages)
Upgrade ( 3 Dependent packages)
Total download size: 960 M
Is this ok [y/d/N]:
. . . .
Installed:
percona-server-mongodb.x86_64 0:4.2.9-10.el7
percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7
percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7
percona-server-mongodb-server.x86_64 0:4.2.9-10.el7
percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7
percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7
Dependency Installed:
cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7
numactl.x86_64 0:2.0.12-5.el7
Dependency Updated:
cyrus-sasl-lib.x86_64 0:2.1.26-23.el7
openssl.x86_64 1:1.0.2k-19.el7
openssl-libs.x86_64 1:1.0.2k-19.el7
अन्य नोड्स पर इंस्टॉलेशन को दोहराएं। स्थापना पूर्ण होने के बाद, कृपया /etc/mongod.conf पर स्थानीयहोस्ट आईपी पते से बाइंडआईपी कॉन्फ़िगरेशन को सभी निजी आईपी पते में बदलें जैसा कि नीचे दिखाया गया है:
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
आप सुरक्षा कारणों से बाइंडआईपी पैरामीटर पर आईपी पते को प्रतिबंधित भी कर सकते हैं, बस एक विभाजक के रूप में अर्धविराम के साथ आईपी पता जोड़ें।
सुनिश्चित करें कि हम नीचे दिए गए उदाहरण के अनुसार तीन नोड्स के बीच MongoDB इंस्टेंस से जुड़ सकते हैं:
[[email protected] ~]# mongo --host 10.10.10.19 --port 27017
Percona Server for MongoDB shell version v4.2.9-10
connecting to: mongodb://10.10.10.19:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("99afee8f-a194-4d0a-963a-6dfdc17f5bee") }
Percona Server for MongoDB server version: v4.2.9-10
Server has startup warnings:
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten]
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** You can use percona-server-mongodb-enable-auth.sh to fix it.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten]
अगला चरण MongoDB में रेप्लिकासेट को कॉन्फ़िगर करना है। हमें /etc/mongod.conf फ़ाइल को संपादित करने और प्रतिकृति अनुभाग को असम्बद्ध करने और नीचे दिखाए गए अनुसार पैरामीटर replSetName जोड़ने की आवश्यकता है:
replication:
replSetName: "my-mongodb-rs"
हम इस स्थापना में प्रतिकृति सेट नाम my-mongodb-rs का उपयोग करते हैं। प्रतिकृति कॉन्फ़िगरेशन जोड़े जाने के बाद, मोंगोडब सेवा को पुनरारंभ करें।
$ service mongod restart
कॉन्फ़िगरेशन को अन्य नोड्स पर दोहराएं।
एक बार हो जाने के बाद, हमें किसी एक नोड में प्रतिकृति को इनिशियलाइज़ करना होगा। mongodb से कनेक्ट करें और rs.initiate() कमांड चलाएँ जैसा कि नीचे दिखाया गया है:
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "mongo-node8:27017",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604036305, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604036305, 1)
}
my-mongodb-rs:OTHER>
my-mongodb-rs:PRIMARY>
जैसा कि हम नोड्स में देख सकते हैं, पहला नोड जहां हम प्रतिकृति शुरू करते हैं वह प्राथमिक नोड बन जाएगा। प्रतिकृति में शामिल होने के लिए हमें बाकी नोड्स को जोड़ने की जरूरत है।
प्राथमिक नोड्स पर rs.add() कमांड का उपयोग करके अन्य नोड्स को नीचे के रूप में जोड़ें:
my-mongodb-rs:PRIMARY> rs.add("mongo-node9:27017");
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604037158, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604037158, 1)
}
my-mongodb-rs:PRIMARY> rs.add("mongo-node10:27017");
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604037170, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604037170, 1)
}
आरंभ () कमांड का उपयोग करके प्रतिकृति सेट को आरंभ करने का एक अन्य विकल्प सभी नोड्स के लिए नोड के आईपी पते की जानकारी को पास करना है जैसा कि नीचे दिखाया गया है:
rs.initiate( {
_id: "my-mongodb-rs",
members: [
{ _id: 0, host: "mongo-node8:27017" },
{ _id: 1, host: "mongo-node9:27017" },
{ _id: 2, host: "mongo-node10:27017" }
] })
हम किसी भी क्लस्टर नोड पर rs.status() कमांड का उपयोग करके वर्तमान प्रतिकृति सेट क्लस्टर की जांच कर सकते हैं:
my-mongodb-rs:PRIMARY> rs.status()
{
"set" : "my-mongodb-rs",
"date" : ISODate("2020-10-30T06:27:41.693Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"appliedOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"lastDurableWallTime" : ISODate("2020-10-30T06:27:28.305Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1604039245, 1),
"lastStableCheckpointTimestamp" : Timestamp(1604039245, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-10-30T05:38:25.155Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1604036305, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 1,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"newTermStartDate" : ISODate("2020-10-30T05:38:25.171Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-10-30T05:38:25.180Z")
},
"members" : [
{
"_id" : 0,
"name" : "mongo-node8:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3014,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1604036305, 2),
"electionDate" : ISODate("2020-10-30T05:38:25Z"),
"configVersion" : 7,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "mongo-node9:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 226,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
"lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
"lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.519Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongo-node8:27017",
"syncSourceHost" : "mongo-node8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 7
},
{
"_id" : 2,
"name" : "mongo-node10:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 201,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
"lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
"lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.688Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongo-node8:27017",
"syncSourceHost" : "mongo-node8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 7
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604039248, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604039248, 1)
}
ClusterControl का उपयोग करके MongoDB के लिए Percona सर्वर परिनियोजित करें
ClusterControl MongoDB के लिए Percona सर्वर के लिए परिनियोजन का समर्थन करता है। समर्थित संस्करणों में 3.4, 3.6, 4.0 और 4.2 शामिल हैं। परिनियोजन सीधा है, आपको बस परिनियोजन पर जाने की आवश्यकता है, और नीचे दिखाए गए अनुसार MongoDB प्रतिकृति टैब चुनें:
SSH यूजर, पासवर्ड, पोर्ट और क्लस्टर नाम भरें। ClusterControl के लिए आवश्यक है कि आप स्थापना से पहले नियंत्रक नोड और लक्ष्य डेटाबेस नोड के बीच पासवर्ड रहित SSH सेट करें। सभी जानकारी भरने के बाद जारी रखें पर क्लिक करें। एक और पेज होगा जैसा कि नीचे दिखाया गया है:
एक विक्रेता के रूप में Percona चुनें, वह संस्करण चुनें जिसे आप इंस्टॉल करना चाहते हैं। यदि आपके पास एक कस्टम MongoDB डेटा निर्देशिका है, तो आपको इसे निर्दिष्ट करने की आवश्यकता है। अपने MongoDB के लिए व्यवस्थापक उपयोगकर्ता और पासवर्ड सेट करें। यदि आप डिफ़ॉल्ट (पुनः 27017) का उपयोग करने के बजाय किसी अन्य पोर्ट का उपयोग करना चाहते हैं, तो आप इसे किसी अन्य पोर्ट नंबर में बदल सकते हैं। अंतिम चरण ऐड नोड कॉम्बो बॉक्स में अपने लक्षित डेटाबेस नोड का आईपी पता भरना है।
सब समाप्त होने के बाद, बस परिनियोजित करें बटन पर क्लिक करें। यह एक मोंगोडीबी क्लस्टर को तैनात करने के लिए नौकरी को ट्रिगर करेगा जैसा कि नीचे दिखाया गया है:
परिनियोजन हो जाने के बाद, आप वह अवलोकन पृष्ठ देख सकते हैं जो आपके पास पहले से है MongoDB के लिए Percona सर्वर के 3 उदाहरण जो चल रहे हैं और चल रहे हैं।
नीचे दिए गए टोपोलॉजी व्यू से पता चलता है कि आपके पास 1 प्राथमिक और 2 माध्यमिक नोड हैं: