Anda mungkin menghosting MongoDB Anda di penyedia layanan cloud yang andal, misalnya Atlas, karena Anda benar-benar ingin fokus pada ide Anda dan mendelegasikan semua area manajemen kunci yang halus seperti jaringan, penyimpanan, akses, dll.
Semuanya terlihat bagus pada awalnya sampai ide kecil Anda mulai berubah menjadi bisnis dan biayanya mulai meroket. Meskipun bukan itu masalahnya, postingan ini akan tetap memberi Anda gambaran umum tentang kerumitan teknis yang terlibat (dan banyak uang yang dihemat!) jika Anda ingin bermigrasi ke solusi yang dihosting sendiri.
BTW, berapa banyak penghematan yang kita bicarakan? Mari kita lakukan perbandingan cepat antara Atlas instance dan MongoDB yang dihosting sendiri di AWS .
Atlas (~$166/bulan)
$0,23/jam berdasarkan persyaratan yang dipilih di atas (~ cloud.mongodb.com)
AWS (~$36/bulan)
$0,0416/jam untuk instans dan harga tambahan berdasarkan jenis dan penyimpanan EBS (~ kalkulator.aws)
Penghematan hampir 4,5x hanya dalam hal infrastruktur!
Sekarang setelah Anda mengetahui alasan utamanya dan masih membaca postingan ini, tanpa basa-basi lagi, mari selami teknologinya.
Garis Besar
- Menyiapkan infrastruktur
- Menyiapkan MongoDB
- Migrasi massal
- Sinkronisasi delta untuk menjembatani latensi sakelar koneksi (tidak berlaku untuk kluster basi)
Karena seluruh konten bisa sedikit melelahkan di satu tempat, saya akan membaginya menjadi 2 postingan terkait.
1. Menyiapkan Infrastruktur
Saya akan menyebutkan di bawah panduan untuk menyiapkan instance yang menjalankan RedHat Enterprise Linux 8 di AWS. Ini karena MongoDB umumnya berkinerja lebih baik dengan sistem file xfs. Berikut ini artikel untuk memahaminya dengan lebih baik.
Memutar Instans EC2
Saya telah menggunakan t3.small
instance yang datang dengan 2 vCPU dan 2Gb RAM meskipun Anda dapat memilih contoh pilihan Anda.
Direkomendasikan bahwa DB Anda harus memiliki akses ke setidaknya 1GB RAM dan 2 inti asli karena hal itu secara langsung memengaruhi kinerja selama mekanisme caching &konkurensi seperti yang ditangani oleh mesin default WiredTiger . Anda dapat membaca lebih lanjut tentang catatan produksi yang terkait dengan persyaratan RAM dan CPU di sini .
Ikhtisar Konfigurasi:
- OS:Redhat Enterprise Linux 8 (berbasis intel x64)
- Jenis Instance:t3.small
- Penyimpanan:10 GB (os) + 30 GB (data) + 3 GB (log) dari EBS yaitu 3 volume terpisah
Saya berasumsi bahwa Anda sudah terbiasa membuat VM di AWS.
Sekarang, setelah instance dalam status berjalan, tetapkan IP Elastis untuk itu dan kemudian cukup lakukan login jarak jauh ke dalam mesin.
Kami membutuhkan IP Elastis untuk menyiapkan nama host publik untuk instance
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Pasang Volume Tambahan
Kami telah menambahkan 2 volume EBS tambahan selain FS Root untuk Data dan Log yang belum dipasang (Ingat 30Gb dan 3Gb? ). Anda dapat membuat daftar blok volume menggunakan,
$ sudo lsblk
Volume tambahan akan dicantumkan tepat setelah blok root (lihat panah)
Pada gambar di atas, Anda dapat melihat bahwa volume tambahan diberi nama
- xvdb (Ruang 30 Gb untuk menyimpan data)
- xvdc (3 Gb ruang untuk menyimpan log)
Sekarang, mari kita buat sistem file dalam volume tersebut.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
adalah opsi alias untuk menyetel label volume
Dan kemudian pasang volumenya.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
Agar perubahan ini terlihat, sistem harus di-boot ulang. Oleh karena itu, sekarang kita juga membutuhkan kegigihan partisi sehingga jika terjadi reboot yang tidak disengaja, kita tidak kehilangan penyimpanan Database.
Kita dapat mencapai ini dengan menentukan aturan pemasangan di file fstab. Anda dapat membaca lebih lanjut di sini.
Sebelum itu mari kita salin UUID dari partisi di atas (karena mereka unik dan tidak akan berubah setelah sistem restart )
$ sudo blkid
Salin UUID yang terdaftar untuk /dev/xvdb dan /dev/xvdc . Lihat “LABEL” untuk identifikasi blok
Sekarang buka /etc/fstab
file dan rekatkan konfigurasi dalam format berikut.
UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0
Perbarui Nama Inang
Nama host akan digunakan untuk mengidentifikasi server database Anda di jaringan. Anda dapat menggunakan IP Elastis yang ditetapkan di atas atau Nama domain (jika tersedia). Buka /etc/hostname
file dan tambahkan entri. Untuk mis.
ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
Perbarui Batas Proses (Opsional)
Ini opsional diperlukan untuk mengontrol jumlah maksimum koneksi yang dapat diterima sambil menjaga sistem tetap stabil. Buka /etc/security/limits.conf
file dan tambahkan entri berikut.
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Sekarang setelah semua prasyarat terkait infra diurutkan, boot ulang instance, dan mari kita lanjutkan ke instalasi MongoDB.
1. Menyiapkan MongoDB
Tambahkan Sumber Repo
Buat file /etc/yum.repos.d/mongodb-org.4.2.repo
dan tambahkan detail repositori paket berikut.
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
Sekarang mari kita instal MongoDB.
$ sudo yum -y install mongodb-org
Buat direktori dan izin penyiapan
MongoDB secara default menggunakan jalur berikut untuk menyimpan data dan log internal:
/var/lib/mongo → Data
/var/log/mongodb → Log
Buat direktori
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Ubah izin pengguna &grup
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Buat Pengguna Admin
daemon/layanan mongod harus dijalankan terlebih dahulu sebelum kita melanjutkan untuk membuat pengguna. Mari kita gunakan konfigurasi default (disimpan di /etc/mongod.conf
) untuk saat ini dan mulai proses daemon.
$ sudo -u mongod mongod -f /etc/mongod.conf
Perintah di atas akan memulai daemon mongod dalam mode fork (default).
Sekarang, mari login ke server dan buat pengguna admin pertama kita.
Buka cangkang mongo
$ mongo
Gunakan database "admin" untuk membuat root-admin
> use admin
Buat pengguna admin
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Buat pengguna biasa
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Matikan server untuk saat ini. Kami akan memulai ulang lagi dengan konfigurasi yang dimodifikasi
> db.shutDownServer()
Menyiapkan Otentikasi
Di sini, kami akan mengaktifkan otentikasi basis data dan memodifikasi alamat-bind agar server kami dapat diakses di domain publik. Buka /etc/mongod.conf
dan buat perubahan di bawah ini.
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # accessible on the network address
security:
authorization: enabled # creds will be required for making db operations
Simpan konfigurasi dan mulai ulang server.
$ sudo -u mongod mongod -f /etc/mongod.conf
Uji Masuk
Anda dapat memverifikasi apakah kredensial berfungsi menggunakan,
$ mongo -u admin -p password
Itu saja tentang pengaturan awal! Harap pantau terus postingan terkait saya berikutnya tentang proses migrasi mendetail dan kiat-kiat untuk menjaga produksi DB tetap siap.
P.S. Terima kasih kepada Piyush Kumar karena telah membantu menyusun postingan ini!