Meskipun saya sudah menggunakan Sistem Operasi berbasis Linux sejak lebih dari 8 tahun lalu.
Cukup jarang saya harus berkutat dengan bash/shell scripting/programming, saya hanya sekedar tahu dan tidak pernah belajar lebih dalam.
Tapi karena tuntutan profesi (*haha profesi jare), mau tidak mau saya harus sedikit belajar, dengan bekal script warisan dari SysAdmin sebelumnya.
Langsung saja studi kasusnya adalah membuat bash script untuk melakukan proses backup database sistem (kami menggunakan PostgreSQL) ke layanan Google Drive (berikutnya kita sebut gdrive). Kami mempunyai beberapa database server dan beberapa diantaranya dibatasi hanya bisa diakses dan mengakses via jaringan lokal (private network).
Untuk keperluan komunikasi dengan Google Drive via terminal, saya menggunakan tool bernama drive yang merupakan project open source dan bisa diakses via https://github.com/odeke-em/drive.
Gambaran untuk prosesnya adalah seperti ini:
Berikut detail langkah yang saya lakukan
Cukup jarang saya harus berkutat dengan bash/shell scripting/programming, saya hanya sekedar tahu dan tidak pernah belajar lebih dalam.
Tapi karena tuntutan profesi (*haha profesi jare), mau tidak mau saya harus sedikit belajar, dengan bekal script warisan dari SysAdmin sebelumnya.
Langsung saja studi kasusnya adalah membuat bash script untuk melakukan proses backup database sistem (kami menggunakan PostgreSQL) ke layanan Google Drive (berikutnya kita sebut gdrive). Kami mempunyai beberapa database server dan beberapa diantaranya dibatasi hanya bisa diakses dan mengakses via jaringan lokal (private network).
Untuk keperluan komunikasi dengan Google Drive via terminal, saya menggunakan tool bernama drive yang merupakan project open source dan bisa diakses via https://github.com/odeke-em/drive.
Gambaran untuk prosesnya adalah seperti ini:
Di node backup masih ada file backup yang lama untuk keperluan menghapusnya dari gdrive dan menggantinya dengan file backup baru. Lalu proses backup dilakukan, sehingga akan ada file backup baru dan backup lama di dalam satu folder. Langkah selanjutnya adalah menghapus file backup lama dari gdrive kemudian mengupload file backup yang baru. File backup yang lama kemudian dihapus dari node backup. Dan yang terakhir, untuk menghemat space di node backup, content file backup yang baru akan direset, sebab proses delete dari gdrive kita cukup mengetahui nama filenya saja.
Berikut detail langkah yang saya lakukan
- Buat bash script di node yang bertugas untuk menjalankan backup (berikutnya kita sebut node backup), tentunya merupakan node yang bisa mengakses internet untuk keperluan upload ke gdrive
- backup database postgres dan lakukan kompresi untuk menghemat space (di node backup maupun di gdrive nantinya) dan meringankan proses transfer dari node database ke node backup (meskipun proses ini melalui private network yang tentu jauh lebih cepat dibanding via internet). Perintahnya mudah, tinggal pipe hasil pg_dump ke gzip
pg_dump -U[user] [nama database] | gzip > $nama_file - selanjutnya adalah melakukan file transfer dari node database (karena nantinya proses backup terjadi di node database bukan di node backup, dan karena saya tidak ingin melakukan backup langsung via jaringan *opsi -h [host database]). Saya menggunakan ftp untuk proses transfernya. Perintahnya adalah
ftp -n -v $HOST_NODE_BACKUP << EOT
ascii
user $USERNAME $PASSWORD
prompt
# lakukan perintah ftp di sini
quit
EOT - Seperti yang saya tulis di langkah ke-1, bahwa script backup ditulis di node backup, namun akan dijalankan di node database, untuk itu kita bisa menulis perintah
cat script_backup_database.sh | ssh [user@node_database] - Strateginya adalah saya ingin menghapus file backup yang lama dari gdrive dan menggantinya dengan file backup yang baru. Untuk keperluan (drive delete) ini saya perlu tahu nama file backup sebelumnya. Saya mengambil langkah untuk tetap menyimpan file backup yang sudah diupload ke gdrive di node backup, hanya saja saya juga tidak ingin memenuhi space di node backup. Saya hanya perlu tahu nama filenya saja. Jadi ketika proses upload selesai saya mereset content dari file backup dengan perintah
cat /dev/null > $nama_file_backup*perintah ini ditulis di baris paling akhir dalam script nantinya
dengan begitu nantinya saya bisa menghapus file dari gdrive dengan perintah
drive delete -quiet $nama_file_backup_lama
*pakai opsi -quiet agar tidak ada prompt Yes/No sebelum menjalan proses aka forcing the process.
Ketika proses backup database selesai (sebelum diupload ke gdrive), file backup baru maupun file backup lama masih tetap ada di node backup. Jadi ketika harus melakukan proses upload untuk file baru saja dengan perintah
ls -t [filter file] | head -n 2 | xargs drive push -quiet -destination [folder di gdrive] 2>/dev/null
*di sini kita bisa belajar kehebatan proses piping (meneruskan output perintah sebelumnya sebagai input ke proses setelahnya) di bash/shell - ls -t berfungsi untuk menampilkan list file berurutan mulai dari file terbaru di posisi teratas, tambah filter file yang ingin dilist jika perlu
- head -n 2 bertugas untuk mengambil n file teratas, dalam kasus ini saya mengambil 2 file teratas (file backup yang terbaru)
- xargs berfungsi untuk menampung output sebagai argument untuk perintah setelahnya, dalam hal ini,
- drive push -quiet yang berfungsi untuk mengupload file ke gdrive, dalam kasus ini adalah file yang masuk ke xargs. Opsi -destination bisa kita tambahkan jika ingin file diupload ke folder tertentu, bukan pada folder root dari gdrive. Opsi -quiet sama fungsinya dengan sample drive delete.
- 2>/dev/null berfungsi untuk meredirect error output ke /dev/null
- Setelahnya adalah menghapus file backup yang lama, karena sudah tidak diperlukan lagi. Sebab ketika script dijalankan lagi nantinya, file backup yang baru saja diupload akan berubah statusnya menjadi "file backup lama". Perintah yang dijalankan adalah
ls -t [filter file] | tail -n +3 | xargs rm 2>/dev/null - tail -n +3 adalah kebalikan dari perintah head, yang mengambil n file terbawah, jika ditambahkan opsi +, berarti file terbawah yang diambil dimulai dari index ke-3. Sesuai dengan langkah sebelumnya, file backup terbaru adalah 2 file teratas
- rm sudah tentunya untuk menghapus file yang ditampung oleh xargs
- Terakhir adalah reset content file backup baru dengan perintah yang sudah saya sebutkan di awal langkah ke-3
- Tambahan, script backup belum masuk dalam cronjob, maka saya harus mengeksekusi script tersebut secara manual. Namun karena koneksi saya tidak stabil dan tidak mau jika nantinya proses backup tidak bisa terpantau jika koneksi saya putus, maka opsi yang ada adalah mengeksekusi bash script ke background proses. Perintahnya adalah
nohup file_bash_script.sh &
Jadi meskipun koneksi bash/terminal saya putus atau saya logout dari bash sekalipun, proses backup akan tetap berjalan. Sehingga ketika login kembali, saya masih bisa memantau proses backup.
Semoga bermanfaat
Then it's time to take good sleep now ^_^!
TODO:
Then it's time to take good sleep now ^_^!
TODO:
- Memasukan file script ke cronjob
- Menambahkan strategi checksum agar kita bisa melakukan kroscek apakah file yang terupload di gdrive sudah valid atau belum
Comments
Post a Comment