MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara Menyebarkan Server Percona untuk MongoDB untuk Ketersediaan Tinggi

Ketersediaan tinggi adalah suatu keharusan ketika Anda menjalankan layanan penting di lingkungan produksi Anda. Ini dapat dicapai dengan menghilangkan semua titik kegagalan, termasuk tingkat basis data. Jadi, Anda dapat membayangkan keterkejutan kami setiap kali kami melakukan penyiapan dengan beberapa server/aplikasi web yang semuanya mengenai satu instance database.

Layanan ketersediaan tinggi di MongoDB dapat dicapai melalui replikasi. Istilah kumpulan replika menjelaskan pengaturan di mana beberapa proses MongoDB menjalankan dan memelihara data yang sama. Di blog ini, kita akan membahas cara menggunakan Server Percona untuk MongoDB untuk mencapai ketersediaan tinggi.

Menerapkan Server Percona untuk MongoDB

Kami membutuhkan setidaknya 3 node untuk ketersediaan tinggi, set replika akan terdiri dari 1 node Primer, dan 2 node Sekunder. Anda dapat menggunakan 2 node, 1 Primer dan 1 Sekunder, tetapi Anda masih memerlukan arbiter sebagai node ketiga. Arbiter adalah node MongoDB yang tidak menyalin dan menyimpan data, tetapi terlibat dalam proses pemilihan Primer baru saat terjadi failover.

Dalam contoh ini, kami menjalankan 3 lingkungan virtual dengan CentOS Linux rilis 7.3 sebagai sistem operasi dan akan menggunakan Server Percona untuk MongoDB versi 4.2 untuk instalasi. Alamat IP seperti di bawah ini:

  • mongo-node8:10.10.10.17
  • mongo-node9:10.10.10.18
  • mongo-node10:10.10.10.19

Sebelum kita masuk ke instalasi, pastikan semua node sudah dikonfigurasi di file /etc/hosts di setiap node.

[[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

Kemudian, kita perlu mengkonfigurasi Repositori Percona pada setiap node. Setelah itu, aktifkan repositori untuk psmdb42 seperti gambar di bawah ini:

[[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!

Dan kemudian lanjutkan menginstal Server Percona untuk paket MongoDB :

[[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

Ulangi penginstalan di node lain. Setelah instalasi selesai, silahkan ubah konfigurasi bindIP pada /etc/mongod.conf dari IP Address localhost menjadi semua Private IP Address seperti gambar di bawah ini:

# network interfaces

net:

  port: 27017

  bindIp: 0.0.0.0

Anda juga dapat membatasi Alamat IP pada parameter bindIP untuk alasan keamanan, cukup tambahkan alamat IP dengan titik koma sebagai pemisah.

Pastikan kita dapat terhubung ke instance MongoDB antara tiga node seperti contoh di bawah ini:

[[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]

 Langkah selanjutnya adalah mengonfigurasi replicaset di MongoDB. Kita perlu mengedit file /etc/mongod.conf dan menghapus komentar pada bagian replikasi dan menambahkan parameter replSetName seperti yang ditunjukkan di bawah ini:

replication:

  replSetName: "my-mongodb-rs"

Kami menggunakan nama replikaset my-mongodb-rs dalam instalasi ini. Setelah konfigurasi replikasi ditambahkan, kemudian restart layanan mongodb.

$ service mongod restart

Ulangi konfigurasi pada node lain.

Setelah selesai, kita perlu menginisialisasi replikasi di salah satu node. Hubungkan ke mongodb dan jalankan perintah rs.initiate() seperti yang ditunjukkan di bawah ini:

> 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>

Seperti yang bisa kita lihat di node, node pertama tempat kita memulai replikasi akan menjadi node UTAMA. Kita perlu menambahkan sisa node untuk bergabung dengan replikasi.

Tambahkan node lain menggunakan perintah rs.add() pada node PRIMARY seperti di bawah ini:

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)

}

Opsi lain untuk memulai Kumpulan Replika menggunakan perintah inisiasi() adalah dengan meneruskan informasi alamat IP node untuk semua node seperti yang ditunjukkan di bawah ini:

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" }

       ] })

Kita dapat memeriksa cluster kumpulan replika saat ini menggunakan perintah rs.status() pada node cluster mana pun:

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)

}

Terapkan Server Percona untuk MongoDB menggunakan ClusterControl

ClusterControl mendukung penerapan untuk Server Percona untuk MongoDB. Versi yang didukung termasuk 3.4, 3.6, 4.0, dan 4.2. Penerapannya sangat mudah, Anda hanya perlu pergi ke Deploy, dan pilih tab Replika MongoDB seperti yang ditunjukkan di bawah ini:

Isi SSH user, password, port dan nama cluster. ClusterControl mengharuskan Anda untuk mengatur SSH tanpa kata sandi antara node pengontrol dan node database target sebelum instalasi. Setelah semua informasi diisi, klik Continue. Akan ada halaman lain seperti gambar di bawah ini:

Pilih Percona sebagai Vendor, pilih Versi yang ingin Anda instal. Jika Anda memiliki direktori data MongoDB khusus, Anda perlu menentukannya. Tetapkan pengguna dan kata sandi admin untuk MongoDB Anda. Jika Anda ingin menggunakan port lain daripada menggunakan default (re. 27017), Anda dapat mengubahnya ke nomor port lain. Langkah terakhir adalah mengisi alamat IP node database target Anda di kotak kombo Add Node.

Setelah semua selesai, klik saja tombol Deploy. Ini akan memicu tugas untuk menyebarkan cluster MongoDB seperti yang ditunjukkan di bawah ini:

Setelah penerapan selesai, Anda dapat melihat halaman Ikhtisar yang sudah Anda miliki 3 contoh Server Percona untuk MongoDB yang aktif dan berjalan.

Tampilan Topologi di bawah ini menunjukkan bahwa Anda memiliki 1 node Primer dan 2 Node Sekunder:


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Keuntungan MongoDB | Kekurangan MongoDB

  2. Bagaimana cara menanyakan dokumen menggunakan bidang _id di driver Java mongodb?

  3. Dorong dan Setel Operasi dalam Pembaruan MongoDB yang Sama

  4. Simpan gambar di MongoDB menggunakan Node.js/Express dan Mongoose

  5. Bagaimana cara menjatuhkan database MongoDB dari baris perintah?