Dalam dunia teknologi informasi, otomatisasi bukanlah hal baru bagi kebanyakan dari kita. Faktanya, sebagian besar organisasi menggunakannya untuk berbagai tujuan tergantung pada jenis dan tujuan pekerjaan mereka. Misalnya, analis data menggunakan otomatisasi untuk menghasilkan laporan, administrator sistem menggunakan otomatisasi untuk tugas berulang mereka seperti membersihkan ruang disk, dan developer menggunakan otomatisasi untuk mengotomatiskan proses pengembangan mereka.
Saat ini, ada banyak alat otomatisasi untuk TI yang tersedia dan dapat dipilih, berkat era DevOps. Yang merupakan alat terbaik? Jawabannya adalah 'tergantung' yang dapat diprediksi, karena itu tergantung pada apa yang ingin kita capai serta pengaturan lingkungan kita. Beberapa alat otomatisasi adalah Terraform, Bolt, Chef, SaltStack dan yang sangat trendi adalah Ansible. Ansible adalah mesin TI tanpa agen sumber terbuka yang dapat mengotomatiskan penerapan aplikasi, manajemen konfigurasi, dan orkestrasi TI. Ansible didirikan pada tahun 2012 dan telah ditulis dalam bahasa paling populer, Python. Ini menggunakan buku pedoman untuk mengimplementasikan semua otomatisasi, di mana semua konfigurasi ditulis dalam bahasa yang dapat dibaca manusia, YAML.
Dalam postingan hari ini, kita akan mempelajari cara menggunakan Ansible untuk melakukan penerapan database Postgresql.
Apa yang Membuat Ansible Istimewa?
Alasan mengapa ansible digunakan terutama karena fitur-fiturnya. Fitur-fitur tersebut adalah:
-
Apa pun dapat diotomatisasi dengan menggunakan bahasa sederhana yang dapat dibaca manusia YAML
-
Tidak ada agen yang akan diinstal pada mesin jarak jauh (arsitektur tanpa agen)
-
Konfigurasi akan didorong dari mesin lokal Anda ke server dari mesin lokal Anda (model push)
-
Dikembangkan menggunakan Python (salah satu bahasa populer yang saat ini digunakan) dan banyak perpustakaan dapat dipilih
-
Koleksi modul Ansible yang dipilih dengan cermat oleh Tim Red Had Engineering
Cara Kerja yang Mungkin
Sebelum Ansible dapat menjalankan tugas operasional apa pun ke host jarak jauh, kita perlu menginstalnya di satu host yang akan menjadi node pengontrol. Di node pengontrol ini, kami akan mengatur tugas apa pun yang ingin kami lakukan ke host jarak jauh yang juga dikenal sebagai node terkelola.
Node pengontrol harus memiliki inventaris node terkelola dan perangkat lunak Ansible untuk mengelolanya. Data yang diperlukan untuk digunakan oleh Ansible seperti hostname atau alamat IP node yang dikelola akan ditempatkan di dalam inventaris ini. Tanpa inventaris yang tepat, Ansible tidak dapat melakukan otomatisasi dengan benar. Lihat di sini untuk mempelajari lebih lanjut tentang inventaris.
Ansible tidak memiliki agen dan menggunakan SSH untuk mendorong perubahan, yang berarti kita tidak harus menginstal Ansible di semua node, tetapi semua node yang dikelola harus memiliki python dan semua pustaka python yang diperlukan diinstal. Baik node pengontrol dan node terkelola harus disetel sebagai tanpa kata sandi. Perlu disebutkan bahwa koneksi antara semua node pengontrol dan node yang dikelola baik dan telah diuji dengan benar.
Untuk demo ini, saya telah menyediakan 4 Centos 8 VM dengan menggunakan gelandangan. Satu akan bertindak sebagai node pengontrol dan 2 VM lainnya akan bertindak sebagai node database yang akan digunakan. Kami tidak akan membahas detail tentang cara menginstal Ansible di posting blog ini, tetapi jika Anda ingin melihat panduannya, silakan kunjungi tautan ini. Perhatikan bahwa kami menggunakan 3 node untuk menyiapkan topologi replikasi streaming, dengan satu node utama dan 2 node siaga. Saat ini, banyak basis data produksi berada dalam penyiapan ketersediaan tinggi dan penyiapan 3 node adalah yang umum.
Menginstal PostgreSQL
Ada beberapa cara untuk menginstal PostgreSQL dengan menggunakan Ansible. Hari ini, saya akan menggunakan Ansible Roles untuk mencapai tujuan ini. Ansible Roles singkatnya adalah serangkaian tugas untuk mengonfigurasi host untuk melayani tujuan tertentu seperti mengonfigurasi layanan. Ansible Roles didefinisikan menggunakan file YAML dengan struktur direktori yang telah ditentukan sebelumnya yang tersedia untuk diunduh dari portal Ansible Galaxy.
Ansible Galaxy di sisi lain adalah repositori untuk Ansible Roles yang tersedia untuk dimasukkan langsung ke Playbook Anda untuk merampingkan proyek otomatisasi Anda.
Untuk demo ini, saya telah memilih peran yang telah dipertahankan oleh dudefellah. Agar kami dapat menggunakan peran ini, kami perlu mengunduh dan menginstalnya ke node pengontrol. Tugasnya cukup mudah dan dapat dilakukan dengan menjalankan perintah berikut asalkan Ansible telah diinstal pada node pengontrol Anda:
$ ansible-galaxy install dudefellah.postgresql
Anda akan melihat hasil berikut setelah peran berhasil diinstal di node pengontrol Anda:
$ ansible-galaxy install dudefellah.postgresql
- downloading role 'postgresql', owned by dudefellah
- downloading role from https://github.com/dudefellah/ansible-role-postgresql/archive/0.1.0.tar.gz
- extracting dudefellah.postgresql to /home/ansible/.ansible/roles/dudefellah.postgresql
- dudefellah.postgresql (0.1.0) was installed successfully
Agar kita dapat menginstal PostgreSQL menggunakan role ini, ada beberapa langkah yang perlu dilakukan. Di sinilah Playbook Ansible. Playbook Ansible adalah tempat kita dapat menulis kode Ansible atau kumpulan skrip yang ingin kita jalankan di node yang dikelola. Ansible Playbook menggunakan YAML dan terdiri dari satu atau lebih drama yang dijalankan dalam urutan tertentu. Anda dapat menentukan host serta serangkaian tugas yang ingin Anda jalankan pada host yang ditetapkan atau node terkelola tersebut.
Semua tugas akan dijalankan sebagai pengguna yang memungkinkan yang masuk. Agar kami dapat menjalankan tugas dengan pengguna yang berbeda termasuk 'root', kami dapat menggunakan menjadi. Mari kita lihat pg-play.yml di bawah ini:
$ cat pg-play.yml
- hosts: pgcluster
become: yes
vars_files:
- ./custom_var.yml
roles:
- role: dudefellah.postgresql
postgresql_version: 13
Seperti yang Anda lihat, saya telah mendefinisikan host sebagai pgcluster dan memanfaatkan menjadi sehingga Ansible menjalankan tugas dengan hak istimewa sudo. Gelandangan pengguna sudah ada di grup sudoer. Saya juga telah mendefinisikan peran yang saya instal dudefellah.postgresql. pgcluster telah didefinisikan dalam file host yang saya buat. Penasaran seperti apa tampilannya, bisa dilihat di bawah ini:
$ cat pghost
[pgcluster]
10.10.10.11 ansible_user=ansible
10.10.10.12 ansible_user=ansible
10.10.10.13 ansible_user=ansible
Selain itu, saya telah membuat file kustom lain (custom_var.yml) di mana saya menyertakan semua konfigurasi dan pengaturan untuk PostgreSQL yang ingin saya terapkan. Detail untuk file kustom adalah sebagai berikut:
$ cat custom_var.yml
postgresql_conf:
listen_addresses: "*"
wal_level: replica
max_wal_senders: 10
max_replication_slots: 10
hot_standby: on
postgresql_users:
- name: replication
password: [email protected]
privs: "ALL"
role_attr_flags: "SUPERUSER,REPLICATION"
postgresql_pg_hba_conf:
- { type: "local", database: "all", user: "all", method: "trust" }
- { type: "host", database: "all", user: "all", address: "0.0.0.0/0", method: "md5" }
- { type: "host", database: "replication", user: "replication", address: "0.0.0.0/0", method: "md5" }
- { type: "host", database: "replication", user: "replication", address: "127.0.0.1/32", method: "md5" }
Untuk menjalankan instalasi, yang harus kita lakukan adalah menjalankan perintah berikut. Anda tidak akan dapat menjalankan perintah ansible-playbook tanpa file playbook yang dibuat (dalam kasus saya ini adalah pg-play.yml).
$ ansible-playbook pg-play.yml -i pghost
Setelah saya menjalankan perintah ini, itu akan menjalankan beberapa tugas yang ditentukan oleh peran dan akan menampilkan pesan ini jika perintah berhasil dijalankan:
PLAY [pgcluster] *************************************************************************************
TASK [Gathering Facts] *******************************************************************************
ok: [10.10.10.11]
ok: [10.10.10.12]
TASK [dudefellah.postgresql : Load platform variables] ***********************************************
ok: [10.10.10.11]
ok: [10.10.10.12]
TASK [dudefellah.postgresql : Set up role-specific facts based on some inputs and the OS distribution] ***
included: /home/ansible/.ansible/roles/dudefellah.postgresql/tasks/role_facts.yml for 10.10.10.11, 10.10.10.12
Setelah ansible menyelesaikan tugas, saya masuk ke slave (n2), menghentikan layanan PostgreSQL, menghapus konten direktori data (/var/lib/pgsql/13/data/) dan jalankan perintah berikut untuk memulai tugas pencadangan:
$ sudo -u postgres pg_basebackup -h 10.10.10.11 -D /var/lib/pgsql/13/data/ -U replication -P -v -R -X stream -C -S slaveslot1
10.10.10.11 is the IP address of the master. We can now verify the replication slot by logging into the master:
$ sudo -u postgres psql
postgres=# SELECT * FROM pg_replication_slots;
-[ RECORD 1 ]-------+-----------
slot_name | slaveslot1
plugin |
slot_type | physical
datoid |
database |
temporary | f
active | t
active_pid | 63854
xmin |
catalog_xmin |
restart_lsn | 0/3000148
confirmed_flush_lsn |
wal_status | reserved
safe_wal_size |
Kami juga dapat memeriksa status replikasi saat standby menggunakan perintah berikut setelah kami memulai kembali layanan PostgreSQL:
$ sudo -u postgres psql
postgres=# SELECT * FROM pg_stat_wal_receiver;
-[ RECORD 1 ]---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 229552
status | streaming
receive_start_lsn | 0/3000000
receive_start_tli | 1
written_lsn | 0/3000148
flushed_lsn | 0/3000148
received_tli | 1
last_msg_send_time | 2021-05-09 14:10:00.29382+00
last_msg_receipt_time | 2021-05-09 14:09:59.954983+00
latest_end_lsn | 0/3000148
latest_end_time | 2021-05-09 13:53:28.209279+00
slot_name | slaveslot1
sender_host | 10.10.10.11
sender_port | 5432
conninfo | user=replication password=******** channel_binding=prefer dbname=replication host=10.10.10.11 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any
Seperti yang Anda lihat, ada banyak pekerjaan yang harus dilakukan agar kami dapat menyiapkan replikasi untuk PostgreSQL meskipun kami telah mengotomatiskan beberapa tugas. Mari kita lihat bagaimana hal ini dapat dicapai dengan ClusterControl.
Deployment PostgreSQL Menggunakan GUI ClusterControl
Sekarang setelah kita mengetahui cara men-deploy PostgreSQL dengan menggunakan Ansible, mari kita lihat bagaimana kita bisa men-deploy dengan menggunakan ClusterControl. ClusterControl adalah perangkat lunak manajemen dan otomatisasi untuk cluster database termasuk MySQL, MariaDB, MongoDB serta TimescaleDB. Ini membantu menyebarkan, memantau, mengelola, dan menskalakan klaster database Anda. Ada dua cara untuk men-deploy database, dalam posting blog ini kami akan menunjukkan cara menyebarkannya menggunakan antarmuka pengguna grafis (GUI) dengan asumsi bahwa Anda sudah menginstal ClusterControl di lingkungan Anda.
Langkah pertama adalah masuk ke ClusterControl Anda dan klik Deploy:
Anda akan disajikan tangkapan layar di bawah untuk langkah penerapan selanjutnya , pilih tab PostgreSQL untuk melanjutkan:
Sebelum kita melangkah lebih jauh, saya ingin mengingatkan Anda bahwa koneksi antara node ClusterControl dan node database harus tanpa kata sandi. Sebelum penerapan, yang perlu kita lakukan adalah membuat ssh-keygen dari node ClusterControl dan kemudian menyalinnya ke semua node. Isi inputan untuk SSH User, Sudo Password serta Cluster Name sesuai kebutuhan Anda dan klik Continue.
Pada tangkapan layar di atas, Anda perlu menentukan Port Server (jika Anda ingin menggunakan yang lain), pengguna yang Anda inginkan serta kata sandi dan Versi yang Anda inginkan untuk menginstal.
Di sini kita perlu mendefinisikan server baik menggunakan nama host atau alamat IP, seperti dalam hal ini 1 master dan 2 budak. Langkah terakhir adalah memilih mode replikasi untuk cluster kami.
Setelah Anda mengeklik Deploy, proses penerapan akan dimulai dan kami dapat memantau perkembangannya di tab Aktivitas.
Penerapan biasanya akan memakan waktu beberapa menit, kinerja sebagian besar bergantung pada jaringan dan spesifikasi server.
Sekarang kita telah menginstal PostgreSQL menggunakan ClusterControl.
Deployment PostgreSQL Menggunakan ClusterControl CLI
Cara alternatif lain untuk menerapkan PostgreSQL adalah dengan menggunakan CLI. asalkan kita sudah mengonfigurasi koneksi tanpa kata sandi, kita bisa menjalankan perintah berikut dan membiarkannya selesai.
$ s9s cluster --create --cluster-type=postgresql --nodes="10.10.50.11?master;10.10.50.12?slave;10.10.50.13?slave" --provider-version=13 --db-admin="postgres" --db-admin-passwd="[email protected]$$W0rd" --cluster-name=PGCluster --os-user=root --os-key-file=/root/.ssh/id_rsa --log
Anda akan melihat pesan di bawah ini setelah proses selesai dengan sukses dan dapat masuk ke web ClusterControl untuk memverifikasi:
...
Saving cluster configuration.
Directory is '/etc/cmon.d'.
Filename is 'cmon_1.cnf'.
Configuration written to 'cmon_1.cnf'.
Sending SIGHUP to the controller process.
Waiting until the initial cluster starts up.
Cluster 1 is running.
Registering the cluster on the web UI.
Waiting until the initial cluster starts up.
Cluster 1 is running.
Generated & set RPC authentication token.
Kesimpulan
Seperti yang Anda lihat, ada beberapa cara tentang cara menerapkan PostgreSQL. Dalam posting blog ini, kami telah belajar bagaimana menerapkannya dengan menggunakan Ansible dan juga menggunakan ClusterControl kami. Kedua cara tersebut mudah diikuti dan dapat dicapai dengan kurva belajar yang minimal. Dengan ClusterControl, penyiapan replikasi streaming dapat dilengkapi dengan HAProxy, VIP, dan PGBouncer untuk menambahkan failover koneksi, IP Virtual, dan penyatuan koneksi ke penyiapan.
Perhatikan bahwa penerapan hanyalah salah satu aspek dari lingkungan database produksi. Menjaga dan menjalankannya, mengotomatiskan failover, memulihkan node yang rusak, dan aspek lain seperti pemantauan, peringatan, pencadangan sangat penting.
Semoga postingan blog ini bermanfaat bagi sebagian dari Anda dan memberikan ide tentang cara mengotomatiskan penerapan PostgreSQL.