PostgreSQL, meskipun merupakan RDBMS yang modern dan serbaguna, bukanlah yang paling mudah untuk disiapkan dan dijalankan saat Anda ingin mengembangkan aplikasi. Baca terus untuk mengetahui tentang bagaimana Anda dapat memulai dengan PostgreSQL versi terbaru pada versi LTS dari Ubuntu.
Instalasi
Ubuntu 18.04 hadir dengan PostgreSQL 10, tetapi sebagai gantinya kita dapat menggunakan repositori APT yang dihosting oleh tim PostgreSQL untuk menginstal versi terbaru, PostgreSQL 11.
Anda dapat mengatur repositori menggunakan perintah ini:
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
Dan kemudian instal perangkat lunak itu sendiri, menggunakan:
sudo apt-get install postgresql-11
Instalasi melakukan beberapa hal:
- Ini menginstal server PostgreSQL, utilitas, dan klien baris perintah yang disebutpsql .
- Ini membuat pengguna sistem Linux bernama postgres . Semua file data dimiliki oleh pengguna ini, dan semua proses dijalankan sebagai pengguna ini.
- Ini membuat satu database, juga disebut postgres .
- Ini membuat satu pengguna PostgreSQL (bukan pengguna sistem Linux), juga disebutpostgres .
Anda dapat melihat ini mulai membingungkan!
Cluster Basis Data
Server PostgreSQL Anda yang baru diinstal terdiri dari serangkaian proses yang mengelola apa yang dikenal sebagai "klaster basis data". Anda dapat melihat prosesnya di sini:
alice@devbox:~$ ps axfww | grep postgres
4737 ? S 0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
4749 ? Ss 0:00 \_ postgres: 11/main: checkpointer
4750 ? Ss 0:00 \_ postgres: 11/main: background writer
4751 ? Ss 0:00 \_ postgres: 11/main: walwriter
4752 ? Ss 0:00 \_ postgres: 11/main: autovacuum launcher
4753 ? Ss 0:00 \_ postgres: 11/main: stats collector
4754 ? Ss 0:00 \_ postgres: 11/main: logical replication launcher
Proses utama (di sini dengan PID 4737) adalah proses utama yang selanjutnya memunculkan proses anak – ini secara konvensional disebut proses “postmaster”.
Penggunaan PostgreSQL untuk istilah "cluster" mendahului jargon clustering terdistribusi modern yang mewah – di sini itu hanya berarti satu set database yang dikelola pada satu mesin oleh satu postmaster. Baca lebih lanjut tentang cluster di sini.
Sebuah cluster berisi database (untuk saat ini kami hanya memiliki satu, "postgres") dan pengguna PostgreSQL (sekali lagi, hanya satu untuk saat ini, juga disebut "postgres"). Asal tahu saja, cluster dikaitkan dengan sejumlah besar file data, yang semuanya berada di bawah satu direktori – dalam hal ini di bawah/var/lib/postgresql/11/main . Apakah Anda memperhatikan jalur ini di baris perintah postmaster di atas?
Saat aplikasi Anda, atau psql, terhubung ke Postgres, itu harus dilakukan dalam konteks pengguna PostgreSQL. Ada selalu pengguna PostgreSQL yang terkait dengan koneksi. Namun, seperti yang mungkin sudah Anda duga sekarang, pengguna PostgreSQL mungkin berhubungan atau tidak dengan pengguna sistem.
Pengguna Sistem dan Pengguna PostgreSQL
Pengguna PostgreSQL dapat dibuat menggunakan perintah SQL seperti CREATE ROLEatau alat yang dibundel seperti Createdb.
Ketika aplikasi apa pun mencoba untuk terhubung ke Postgres, itu perlu menyediakan nama pengguna aPostgreSQL. Mari kita lihat apa yang terjadi ketika Anda meluncurkan klien PostgreSQL seperti psql:
alice@devbox:~$ psql
psql: FATAL: role "alice" does not exist
Di sini, "alice" adalah nama pengguna sistem Linux Anda. psql mengambil nama ini dan menggunakan itas nama pengguna Postgres. Peran (peran adalah semacam nama generik untuk "pengguna" atau "grup", BTW) dengan nama itu tidak ada, itulah yang dikeluhkan Postgres.
Kita tahu bahwa ada peran dengan nama "postgres", jadi mari kita coba. Kita dapat menggunakan parameter “-U” psql untuk menentukan nama pengguna:
alice@devbox:~$ psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
Oke, kita semakin dekat – peran/pengguna “postgres” ada, tetapi “peerauthentication” gagal. Apa yang dimaksud dengan “otentikasi rekan” ini?
Otentikasi Peer dan Kata Sandi
Klien PostgreSQL seperti psql atau aplikasi Anda dapat terhubung ke server PostgreSQL melalui salah satu mekanisme IPC berikut:
- Soket domain Unix
- Soket TCP
Tidak seperti soket TCP, soket domain Unix menawarkan kemungkinan untuk memvalidasi id pengguna sistem koneksi klien. Server Postgres dapat memeriksa koneksi masuk melalui soket domain Unix dan menentukan ID pengguna sistem klien, lalu memutuskan apakah akan memberikan akses atau tidak.
Secara default, server Anda hanya mendengarkan koneksi melalui soket domain unix dan bukan TCP/IP.
Mari kita lihat apa yang terjadi jika kita mencoba memulai psql sebagai pengguna sistem postgres:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=#
Itu berhasil! (Gunakan “\q”, “\quit” atau ^D
untuk keluar dari psql, BTW.)
Dalam otentikasi rekan, jika koneksi klien dibuat menggunakan soket domain Unix dan proses klien memiliki nama pengguna sistem yang sama dengan pengguna PostgreSQL yang coba disambungkan, maka otentikasi dianggap berhasil.
Pengguna PostgreSQL juga dapat diberi kata sandi secara opsional, dan Anda dapat meminta PostgreSQL untuk memvalidasi koneksi masuk menggunakan kata sandi. Tapi bagaimana caranya? Itulah potongan teka-teki berikutnya.
pg_hba.conf
Sekarang saatnya untuk membuka file konfigurasi pg_hba.conf (di) yang terkenal, terletak di/etc/postgresql/11/main/pg_hba.conf
:
sudo vim /etc/postgresql/11/main/pg_hba.conf
HBA adalah singkatan dari otentikasi berbasis host. Pada dasarnya, file ini digunakan untuk mengontrol bagaimana pengguna PostgreSQL diautentikasi. File ini mungkin adalah bagian yang paling tidak intuitif dari kurva pembelajaran PostgreSQL. Dokumentasi referensi ada di sini, Anda harus membacanya nanti.
Baris pertama (non-komentar) di sini adalah:
local all postgres peer
yang memberi tahu Postgres untuk menerima koneksi "lokal" (domain unix) ke database "semua", mengautentikasi sebagai pengguna "postgres" menggunakan otentikasi "peer". Inilah sebabnya mengapa menghubungkan sebagai "postgres" pengguna sistem bekerja di luar kotak.
Urutan baris dalam file ini penting, baris pertama yang cocok menang. Mari kita lihat baris lain:
host all all 127.0.0.1/32 md5
Baris ini memungkinkan "semua" pengguna untuk login menggunakan TCP/IP ("host") dari host lokal ("127.0.0.1/32") ke database "semua", jika mereka berhasil dalam otentikasi kata sandi menggunakan metode "md5".
Ada lebih banyak metode otentikasi kata sandi (md5, scram-sha-256, gss,ldap, ...) daripada yang dapat kita bahas, jadi mari kita kembali ke contoh yang lebih sederhana.
Tapi pertama-tama, kita perlu memastikan PostgreSQL juga menerima koneksi TCP/IP. Untuk itu, kita perlu mengedit file konfigurasi utama.
postgresql.conf
File /etc/postgresql/11/main/postgresql.conf adalah file konfigurasi utama untuk cluster PostgreSQL Anda. File ini berisi banyak pengaturan, dan memahami apa arti semua itu bukanlah tugas yang mudah sama sekali. Untuk saat ini, mari kita lihat pengaturan pertama:
#listen_addresses = 'localhost'
Baris ini dikomentari secara default, mari batalkan komentar untuk membuatnya terbaca:
listen_addresses = 'localhost'
Ini akan membiarkan PostgreSQL mendengarkan koneksi TCP/IP yang masuk di localhost, port 5432 (default). Simpan perubahan (Anda harus menjadi "root" untuk melakukan ini), dan mulai ulang server Postgres agar perubahan diterapkan:
sudo systemctl restart postgresql
(Perhatikan bahwa untuk sebagian besar perubahan setelan, Anda hanya perlu "memuat ulang", bukan "memulai ulang", tetapi ini memerlukan "memulai ulang").
Sekarang kita dapat melihat Postgres mendengarkan pada port 5432, terikat ke 127.0.0.1:
alice@devbox:~$ sudo netstat -tnlp | grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 8408/postgres
Sekarang mari kita siapkan pengguna dan database baru untuk digunakan oleh aplikasi.
Penyiapan Aplikasi
Mari terhubung sebagai pengguna super “postgres” untuk membuat perubahan:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=# create user myapp_user password 's3cr3t';
CREATE ROLE
postgres=# create database myapp owner myapp_user;
CREATE DATABASE
postgres=#
Kami sekarang telah membuat database bernama myapp
dan pengguna bernama myapp_user
, dengan kata sandi s3cr3t
. Basis data kosong, dan akan dimiliki oleh penggunamyapp_user
, yang berarti dengan menghubungkan sebagai myapp_user
klien akan dapat melakukan hampir semua perintah DDL/DML.
Mari terhubung ke database aplikasi sebagai pengguna aplikasi ini sekarang:
alice@devbox:~$ psql -h 127.0.0.1 -d myapp -U myapp_user
Password for user myapp_user:
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
myapp=>
Itu berhasil! Anda sekarang terhubung ke "myapp" (lihat prompt), menggunakan SSL melalui koneksi aTCP/IP ke 127.0.0.1. Perhatikan bahwa kami menetapkan nama database juga pada baris perintah untuk psql. Untuk alasan historis, jika ini dihilangkan, nama database juga dianggap sama dengan nama pengguna sistem (“alice”di sini), yang bukan yang kita inginkan. Nama pengguna PostgreSQL juga ditentukan ("-U myapp_user").
Jika Anda perlu terhubung dari komputer lain, Anda harus mengedit pg_hba.conf
untuk menambahkan baris seperti ini:
# existing entry, allows connections from localhost
host all all 127.0.0.1/32 md5
# new entry to allow connections from 10.1.2.0/24 subnet,
# only to myapp database for myapp_user
host myapp myapp_user 10.1.2.0/24 md5
dan muat ulang PostgreSQL (“Sudo systemctl reload postgresql”) agar perubahan dapat diterapkan.
Dengan ini, Anda sekarang dapat menggunakan string koneksi database seperti ini di aplikasi Anda:
# URL format
postgresql://myapp_user:[email protected]/myapp
# connection string format
host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t
Siap!
Ini akan membuat Anda menyiapkan database dan pengguna khusus untuk aplikasi Anda. Kerangka kerja pengembangan aplikasi Anda (seperti Django, Drupal, dll.) harus mampu membuat objek (seperti tabel, tampilan) dan mengelola data dalam database ini.