Tulisan ini bersumber dari artikel How to Set Up PostgreSQL for High Availability and Replication with Hot Standby
Perangkat yang dibutuhkan adalah 2 server (di sini saya memakai Ubuntu Server 14.04 LTS di install ke dalam Virtual Box dan dijalankan keduanya), Server #1 sebagai
Primary Server PostgreSQL dan server #2 sebagai
Standby Server.
Penjelasan awal: Karena data merupakan hal yang penting, menyimpan data pada satu tempat adalah sesuatu yang mempunyai resiko besar. Kita harus merencanakan pemulihan data (
data recovery) secepatnya ketika ada kegagalan sistem database. Salah satu cara untuk mencegah kehilangan data adalah menyimpan data yang sama pada beberapa server secara sinkron (sama)
PostgreSQL, atau biasa disebut Postgres menawarkan beberapa cara untuk mengarsipkan dan me-replikasi data utama untuk
backup,
high-availability dan skenario
load-balancing. Pada mode
Hot Standby, sistem menggunakan server dengan jumlah 2 atau lebih. Primary Server (Server #1) menjalankan database yang aktif. Database ini menerima koneksi dari klien dan menjalankan perintah
read-write (sedang beroperasi). Satu atau lebih server menjalankan backup database tersebut, dan dikonfigurasi untuk menerima koneksi dari klien dengan perintah
read-only. Jika server utama
down, sistem dapat mengatasi kegagalan database (
fail over) pada Standby Server, dimana selanjutnya akan menjadi Primary Server. Selagi Server #1 (yang mengalami kegagalan) diperbaiki.
Tutorial kali ini akan mambahas tentang penggunaan 1 server utama dan 1 server standby
Pengertian Hot Standby
Teori dasar yang harus diketahui tentang metode Hot Standby:
- Postgres menggunakan WAL (Write-Ahead Logging) untuk secara terus menerus mengarsipkan transaksi database. Untuk setiap perubahan pada data, WAL membuat file log. Sistem menggunakan file log ini utuk mengoperasikan restorasi dari arsip tadi dan membuat server standby up-to-date dengan data server utama. Dengan kata lain ketika kita mengkonfigurasi mode Hot Standby, secara otomatis kita juga mengkonfigurasi arsip data
- Proses update pada Standby Server dengan entri WAL disebut sebagai streaming replication. Proses ini beroperasi secara asinkronisasi dimana membutuhkan beberapa waktu bagi stanby server untuk menerima pembaharuan (update) dari server utama. Meskipun jeda waktunya bisa sangat pendek (sekali), sinkronisasi di antara 2 server ini tidak instan. Jika aplikasi kita membutuhkan konsistensi yang ketat di antara 2 database, mungkin cara lain harus dipertimbangkan
- Postgres tidak menyediakan software yang secara otomatis mengalihkan server utama kepada standby server ketika down. Pengalihan ini dilakukan secara manual atau paling tidak, kita menggunakan software lain (pihak ketiga) untuk manajemen fail-over.
- Load balancing bukan sistem otomatis ketika kita menjalankan Hot Standby. Jika load balancing merupakan kebutuhan aplikasi kita, maka harus mengkonfigurasi primary server sebagai operasi read-write dan standby server sebagai operasi read-only
Tujuan artikel ini
- Mengkonfigurasi 2 komputer server yang menjalankan Postgres
- Membuat tabel baru untuk aplikasi guestbook
- Konfigurasi server utama
- Backup server utama pada server kedua (standby server)
- Konfigurasi server kedua (standby server) pada mode Hot Standby
- Memulai standby server dan tes konfigurasi bakcup
Persiapan komputer untuk setting Postgres Replication
Untuk konfigurasi primary dan standby server, ikuti langkah instalasi Postgres pada server Ubuntu 14.04 LTS. Dengan catatan di bawah ini:
- Kita tidak perlu menggunakan pgAdmin pada tutorial ini
- Ikuti langkah instalasi dua kali, dilakukan pada tiap server
- Ikuti langkah-langkah koneksi menggunakan remote
- Kita akan membuka port dalam jaringan hanya sekali, bukan kedua server
- Catat kedua ip server untuk konfigurasi nantinya
- Buka jendela SSH untuk kedua server ketika mengikuti langkah-langkah di tutorial ini
Buat tabel guestbook
Pada primary server, buat tabel sederhana untuk tujuan uji coba. Tabel ini nantinya akan diisi oleh data dari buku tamu sebuah website, dimana pengunjung situs dapat meninggalkan komentar. Datanya berisi alamat email pengunjung, waktu, dan isi pesan yang ditulis oleh pengunjung.
Pada terminal SSH primary server:
- Jalankan root shell:
$ sudo -s
- Jalankan PSQL sebagai user postgres dan akses database yang bernama postgres:
$ sudo -u postgres psql postgres
- Pada PSQL prompt, ketikkan perintah di bawah ini untuk membuat tabel:
CREATE TABLE guestbook (visitor_email text, vistor_id serial, date timestamp, message text);
- Tambahkan data pada tabel:
INSERT INTO guestbook (visitor_email, date, message) VALUES ( 'jim@gmail.com', current_date, 'This is a test.');
- Kita akan melihat konfirmasi: INSERT 0 1.
- Ketikkan \q untuk keluar dari prompt PSQL.
Jangan keluar dari root shell terlebih dahulu, kita akan menggunakan root shell pada sepanjang tutorial ini.
Konfigurasi primary server (server utama)
Untuk konfigurasi primary server kita akan:
- Membuat user Postgres untuk aktifitas replikasi.
- Membuat folder/direktori untuk menyimpan file arsip.
- Edit dua file konfigurasi : pg_hba.conf dan postgresql.conf.
Membuat user untuk proses replikasi
Untuk melakukan replikasi, Postgres perlu user, dimana disebut sebagai role, dengan permission khusus. Pada primary server ketikkan perintah ini:
$ sudo -u postgres createuser -U postgres repuser -P -c 5 --replication
Perintah ini melakukan tindakan-tindakan di bawah ini:
- sudo -u postgres memastikan bahwa perintah createuser dijalankan di bawah user postgres. Jika tidak, Postgres akan menjalankan perintah dengan penggunakan peer authentication, dimana perintah akan dijalankan dengan akun ubuntu. Akun ini mungkin tidak mempunyai kewenangan dalam membuat user postgres dan akan menyebabk.
- Untuk -U berarti perintah createuser memerintahkan user postgres untuk membuat user baru.
- Nama dari username baru tersebut adalah repuser. Kita akan menggunakan user ini pada konfigurasi nantinya.
- -P nantinya akan manampilkan password baru untuk user tersebut.
- -c artinya batasan koneksi untuk user baru. Dengan mengisi nilai 5 sudah diaanggap cukup untuk tujuan replikasi.
- --replication memberikan hak REPLICATION pada user repuser.
Membuat direktori arsip
Buat direktori untuk menyimpan file arsip. Direktori ini adalah sub-direktori dari keseluruhan direktori data, yang mana diberi nama 'Main' secara default. Kita akan menggunakan jalur ini untuk konfigurasi file. Jika kita harus mengkonfigurasi keseluruhan data pada lokasi yang berbeda, kita harus membuat direktori arsip pada direktori tersebut dan mengubah konfigurasi yang bersangkutan.
Pada terminal SSH di primary server, ketikkan perintah:
$ mkdir -p /var/lib/postgresql/main/mnt/server/archivedir
Edit file
pg_hba.conf
- File ini berisi konfigurasi untuk autentikasi klien. Kita harus menambahkan data user repuser untuk mengaktifkan replikasi.
$ nano ../../etc/postgresql/9.3/main/pg_hba.conf
- Setelah entri example replication, tambahkan line berikut. Ganti <standby-IP> dengan IP standby server:
host replication repuser <standby-IP>/32 md5
- Simpan dan tutup file tersebut.
Edit file postgresql.conf
File ini berisi konfigurasi utama untuk Postgres. Disini kita akan mengubah konfigurasi untuk mengaktifkan archiving dan replikasi.
Penting!!!
Jangan lupa untuk menghapus tanda # (hashtag) pada line yang akan diubah konfigurasinya atau perubahan konfigurasi tidak ada efeknya.
- Edit filenya, pada terminal primary server, ketikkan perintah:
$ nano ../../etc/postgresql/9.3/main/postgresql.conf
- Pada bagian WRITE AHEAD LOG, di bagian Section, ubah WAL level:
wal_level = hot_standby
- Pada bagian Archiving section, ubah archive mode:
archive_mode = on
- Ubah nilai pada archive command. Konfigurasi ini membuat Postgres untuk menulis data arsip pada direktori yang telah dibuat pada langkah sebelumnya:
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
- Pada bagian REPLICATION, di bagian Sending Server(s), ubah nilai untuk maksimum proses WAL sender:
max_wal_senders = 3
- Pada tutorial ini, nilai 3 cukup untuk mengaktifkan bakcup dan replikasi
Restart the primary server
Sekarang, kita sudah mengubah konfigurasi, restart server, ketikkan perintah:
$ sudo service postgresql restart