PostgreSQL, i když je moderní a všestranný RDBMS, není nejjednodušší z bestií na nastavení a spuštění, když hledáte vývoj aplikace. Čtěte dále a zjistěte, jak můžete začít s nejnovější verzí PostgreSQL na verzi LTS Ubuntu.
Instalace
Ubuntu 18.04 přichází s PostgreSQL 10, ale místo toho můžeme použít úložiště APT hostované týmem PostgreSQL k instalaci nejnovější verze PostgreSQL 11.
Úložiště můžete nastavit pomocí těchto příkazů:
# 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
A poté nainstalujte samotný software pomocí:
sudo apt-get install postgresql-11
Instalace provádí několik věcí:
- Nainstaluje server PostgreSQL, nástroje a klienta příkazového řádku s názvempsql .
- Vytváří uživatele systému Linux s názvem postgres . Všechny datové soubory jsou ve vlastnictví tohoto uživatele a všechny procesy běží jako tento uživatel.
- Vytváří jednu databázi, také nazývanou postgres .
- Vytvoří jednoho uživatele PostgreSQL (ne uživatel systému Linux), také nazývanýpostgres .
Můžete vidět, že to začíná být matoucí!
Databázové clustery
Váš nově nainstalovaný PostgreSQL server se skládá ze sady procesů, které spravují to, co je známé jako „databázový cluster“. Procesy můžete vidět zde:
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
Hlavní proces (zde s PID 4737) je hlavním procesem, který dále vytváří podřízené procesy – běžně se tomu říká „postmaster“ proces.
Použití termínu „cluster“ v PostgreSQL předchází modernímu žargonu distribuovaného shlukování – zde to znamená pouze sadu databází spravovaných na jediném počítači jediným správcem pošty. Přečtěte si více o klastrech zde.
Cluster obsahuje mimo jiné databáze (prozatím máme jen jednu, „postgres“) a uživatele PostgreSQL (zatím opět pouze jednoho, také nazývaného „postgres“). Jen abyste věděli, klastr je spojen s celou řadou datových souborů, z nichž všechny jsou uloženy v jednom jediném adresáři – v tomto případě pod/var/lib/postgresql/11/main . Všimli jste si této cesty v příkazovém řádku postmaster výše?
Když se vaše aplikace nebo psql připojí k Postgresu, musí tak učinit v kontextu uživatele PostgreSQL. Existuje vždy uživatel PostgreSQL spojený s připojením. Ale, jak už jste možná uhodli, uživatel PostgreSQL může, ale nemusí odpovídat systémovému uživateli.
Systémoví uživatelé a uživatelé PostgreSQL
Uživatelé PostgreSQL mohou být vytvořeni pomocí příkazů SQL, jako je CREATE ROLE nebo přidružených nástrojů, jako je createdb.
Když se jakákoli aplikace pokusí připojit k Postgresu, musí zadat uživatelské jméno aPostgreSQL. Podívejme se, co se stane, když spustíte PostgreSQLclient, jako je psql:
alice@devbox:~$ psql
psql: FATAL: role "alice" does not exist
Zde je „alice“ vaše uživatelské jméno systému Linux. psql převezme tento název a použije jej jako uživatelské jméno Postgres. Role (role jsou obecný název pro „uživatel“ nebo „skupina“, BTW) s tímto názvem neexistuje, na což si stěžuje Postgres.
Víme, že existuje role s názvem „postgres“, tak to zkusme. Pro specifikaci uživatelského jména můžeme použít parametr „-U“ psql:
alice@devbox:~$ psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
OK, blížíme se – role/uživatel „postgres“ existuje, ale „peerautentizace“ selhala. Co je to „peer authentication“?
Ověření rovnocenným partnerem a heslem
Klienti PostgreSQL jako psql nebo vaše aplikace se mohou připojit k serveru PostgreSQL prostřednictvím jednoho z těchto mechanismů IPC:
- Doménové sokety Unix
- zásuvky TCP
Na rozdíl od TCP soketů nabízejí Unixové doménové sokety možnost ověření systémového uživatelského ID připojení klienta. Server Postgres může prozkoumat příchozí připojení přes soket domény Unix a určit ID uživatele systému klienta a poté se rozhodnout, zda mu udělí přístup nebo ne.
Ve výchozím nastavení váš server naslouchá pouze připojením přes unixové doménové sokety, nikoli TCP/IP.
Podívejme se, co se stane, když se pokusíme spustit psql jako uživatel systému postgres:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=#
To se povedlo! (Použijte „\q“, „\quit“ nebo ^D
pro ukončení psql, BTW.)
V peer autentizaci, pokud je klientské připojení vytvořeno pomocí Unix domainsocket a klientský proces má stejné systémové uživatelské jméno jako PostgreSQLuser, ke kterému se pokouší připojit, pak je autentizace považována za úspěšnou.
Uživatelům PostgreSQL lze také volitelně přiřadit heslo a můžete požádat PostgreSQL o ověření příchozích připojení pomocí hesla. Ale jak? To je další dílek skládačky.
pg_hba.conf
Nyní je čas otevřít (ne)známý konfigurační soubor pg_hba.conf, který se nachází na adrese/etc/postgresql/11/main/pg_hba.conf
:
sudo vim /etc/postgresql/11/main/pg_hba.conf
HBA je zkratka pro autentizaci založenou na hostiteli. V podstatě se tento soubor používá ke kontrole toho, jak jsou uživatelé PostgreSQL autentizováni. Tento soubor je pravděpodobně nejvíce neintuitivní částí křivky učení PostgreSQL. Referenční dokumentace je zde, měli byste si ji přečíst později.
První řádek (bez komentáře) je:
local all postgres peer
který říká Postgresu, aby akceptoval „lokální“ (unixová doména) připojení ke „všem“ databázím, přičemž se autentizoval jako uživatel „postgres“ pomocí „peer“ autentizace. To je důvod, proč připojení jako systémový uživatel „postgres“ funguje hned po vybalení.
Pořadí řádků v tomto souboru je důležité, vyhrává první odpovídající řádek. Podívejme se na další řádek:
host all all 127.0.0.1/32 md5
Tento řádek umožňuje „všem“ uživatelům přihlásit se pomocí TCP/IP („hostitel“) z localhost („127.0.0.1/32“) do „všech“ databází, pokud se jim podaří ověřit heslo pomocí metody „md5“.
Existuje více metod ověřování hesla (md5, scram-sha-256, gss, ldap, …), než můžeme pokrýt, takže se vraťme k jednodušším příkladům.
Nejprve se však musíme ujistit, že PostgreSQL přijímá také připojení TCP/IP. K tomu musíme upravit hlavní konfigurační soubor.
postgresql.conf
Soubor /etc/postgresql/11/main/postgresql.conf je hlavní konfigurační soubor pro váš cluster PostgreSQL. Tento soubor obsahuje hodně nastavení a pochopit, co to všechno znamená, není vůbec snadný úkol. Prozatím se podívejme na úplně první nastavení:
#listen_addresses = 'localhost'
Tento řádek je ve výchozím nastavení okomentován, zrušme jej, aby byl přečtený:
listen_addresses = 'localhost'
To umožní PostgreSQL naslouchat příchozím TCP/IP připojením na localhost, port 5432 (výchozí). Uložte změny (k tomu budete muset být „root“) a restartujte server Postgres, aby se změny projevily:
sudo systemctl restart postgresql
(Všimněte si, že některé pro většinu změn nastavení stačí „znovu načíst“, nikoli „restartovat“, ale to vyžaduje „restart“).
Nyní můžeme vidět, že Postgres poslouchá na portu 5432, vázaném na 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
Nyní nastavíme nového uživatele a databázi pro použití aplikací.
Nastavení aplikace
Pojďme se připojit jako superuživatel „postgres“, abychom provedli změny:
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=#
Nyní jsme vytvořili databázi s názvem myapp
a uživatel s názvem myapp_user
,s heslem s3cr3t
. Databáze je prázdná a bude ji vlastnit uživatelmyapp_user
, což znamená, že připojením jako myapp_user
klient bude schopen provádět většinu všech příkazů DDL/DML.
Pojďme se nyní připojit k databázi aplikace jako tento uživatel aplikace:
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=>
Fungovalo to! Nyní jste připojeni k „myapp“ (viz výzva) pomocí SSL přes aTCP/IP připojení k 127.0.0.1. Všimněte si, že jsme zadali název databáze také na příkazovém řádku pro psql. Z historických důvodů, pokud je toto vynecháno, se předpokládá, že název databáze je stejný jako jméno uživatele systému (zde „alice“), což není to, co chceme. Je také specifikováno uživatelské jméno PostgreSQL („-U myapp_user“).
Pokud se potřebujete připojit z jiných počítačů, budete muset upravit pg_hba.conf
pro přidání řádků:
# 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
a znovu načtěte PostgreSQL („sudo systemctl reload postgresql“), aby se změny projevily.
Díky tomu můžete nyní ve svých aplikacích používat řetězce připojení k databázi, jako jsou tyto:
# URL format
postgresql://myapp_user:[email protected]/myapp
# connection string format
host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t
Připraveno!
To by vám mělo přinést nastavení s vyhrazenou databází a uživatelem pro vaši aplikaci. Váš rámec pro vývoj aplikací (jako Django, Drupal atd.) by měl být schopen vytvářet objekty (jako jsou tabulky, pohledy) a spravovat data v této databázi.