Modul 6 — Databáze z pohledu DevOps
25. Základy relačních databází (PostgreSQL/MySQL) pro provoz aplikací
Co je relační databáze, jak vypadá jednoduché schéma a SQL dotazy, a co z databázového provozu potřebuje umět člověk v DevOps roli.
Úvod a kontext
Téměř každá webová aplikace potřebuje někam ukládat data — uživatele,
objednávky, články, měření ze senzorů. Nejrozšířenějším řešením jsou
dodnes relační databáze (PostgreSQL, MySQL/MariaDB, dříve i Oracle či
MS SQL Server). DevOps inženýr obvykle databázi nenavrhuje ani nepíše
aplikační dotazy — o to se stará vývojář — ale musí rozumět tomu, jak
databáze funguje z provozního pohledu: jak ji nainstalovat a nastartovat,
jak se k ní bezpečně připojit, jak zkontrolovat, že běží a je zdravá, a
jak základní SQL dotazy použít při diagnostice problému. Tato lekce dává
tento provozní základ.
Teorie
Co je relační databáze
Relační databáze ukládá data do tabulek — mřížek řádků a sloupců,
podobných listu v tabulkovém procesoru, ale s přesně definovanými typy
sloupců a vztahy mezi tabulkami. Každá tabulka má sloupce (např. id,
jmeno, email) a řádky (jednotlivé záznamy). Vztahy mezi tabulkami se
vyjadřují přes cizí klíče (foreign key) — např. tabulka objednavky
odkazuje přes sloupec zakaznik_id na tabulku zakaznici.
"Relační" znamená, že data jsou rozdělená do více souvisejících tabulek
místo jedné velké tabulky se vším — tomu se říká normalizace a cílem
je vyhnout se duplicitě dat (jméno zákazníka se uloží jednou v tabulce
zakaznici, ne znovu u každé jeho objednávky).
K práci s daty se používá jazyk SQL (Structured Query Language) —
standardizovaný jazyk pro definici tabulek, vkládání, čtení, úpravu a
mazání dat, kterému rozumí PostgreSQL, MySQL i většina ostatních
relačních databází (s drobnými rozdíly v syntaxi).
PostgreSQL vs. MySQL/MariaDB
Obě jsou open-source relační databáze a v drtivé většině běžných případů
zvládnou totéž. Praktické rozdíly, které DevOps inženýr běžně řeší:
- PostgreSQL je považován za striktnější v dodržování SQL standardu
a bohatší na pokročilé datové typy (JSON, pole, geodata přes rozšíření
PostGIS) a pokročilé indexy. Často výchozí volba pro nové projekty. - MySQL/MariaDB je historicky rozšířenější (WordPress a spousta PHP
aplikací), má o něco jednodušší replikaci pro základní scénáře a je
často mírně rychlejší na jednoduchých čtecích dotazech. - Provozně jsou si podobné: obě běží jako démon naslouchající na portu
(PostgreSQL5432, MySQL3306), obě mají klientský nástroj příkazové
řádky (psql,mysql), obě podporují zálohování, replikaci i
transakce.
Volba mezi nimi je většinou dána zvyklostmi týmu nebo požadavky aplikace,
ne zásadním technickým rozdílem pro běžné použití.
Základní SQL příkazy
Definice tabulky:
CREATE TABLE zakaznici (
id SERIAL PRIMARY KEY,
jmeno VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
vytvoreno TIMESTAMP DEFAULT NOW()
);
SERIAL PRIMARY KEY— automaticky rostoucí unikátní identifikátor
řádku (v MySQL by se použiloAUTO_INCREMENT),NOT NULL— sloupec musí mít vždy hodnotu,UNIQUE— hodnota se v tabulce nesmí opakovat.
Vložení a čtení dat:
INSERT INTO zakaznici (jmeno, email) VALUES ('Jana Nováková', 'jana@example.cz');
SELECT * FROM zakaznici WHERE email = 'jana@example.cz';
UPDATE zakaznici SET jmeno = 'Jana Svobodová' WHERE id = 1;
DELETE FROM zakaznici WHERE id = 1;
Spojení dvou tabulek přes cizí klíč (JOIN) — typický dotaz, na který
DevOps při diagnostice narazí, i když ho sám nenapsal:
SELECT zakaznici.jmeno, objednavky.castka
FROM objednavky
JOIN zakaznici ON objednavky.zakaznik_id = zakaznici.id
WHERE objednavky.vytvoreno > NOW() - INTERVAL '7 days';
Transakce a ACID
Databáze garantují tzv. ACID vlastnosti: Atomicity (transakce
proběhne buď celá, nebo vůbec), Consistency (data zůstanou v konzistentním
stavu), Isolation (souběžné transakce se navzájem neruší nekontrolovaně),
Durability (jednou potvrzená data přežijí i pád serveru). Transakce se v
SQL ohraničuje:
BEGIN;
UPDATE ucty SET zustatek = zustatek - 100 WHERE id = 1;
UPDATE ucty SET zustatek = zustatek + 100 WHERE id = 2;
COMMIT;
Kdyby aplikace spadla mezi oběma UPDATE, bez transakce by peníze
"zmizely" — s transakcí se buď provedou obě změny, nebo žádná
(ROLLBACK).
Indexy
Index je pomocná datová struktura, která databázi umožní najít řádky
rychle bez procházení celé tabulky — podobně jako rejstřík na konci
knihy. Bez indexu na sloupci email by hledání zákazníka podle e-mailu
u milionu řádků znamenalo projít je všechny (tzv. full table scan):
CREATE INDEX idx_zakaznici_email ON zakaznici (email);
Cena za rychlejší čtení je pomalejší zápis (index se musí při každém
INSERT/UPDATE také aktualizovat) a extra místo na disku — proto se
indexy nedávají automaticky na každý sloupec, jen na ty, podle kterých se
často vyhledává nebo řadí.
Praktický příklad
Instalace PostgreSQL na Ubuntu/Debianu a základní ověření provozu:
sudo apt update
sudo apt install postgresql
# ověření, že služba běží
sudo systemctl status postgresql
# připojení jako uživatel postgres (výchozí administrátorský účet)
sudo -u postgres psql
Uvnitř psql konzole — vytvoření databáze a uživatele pro aplikaci:
CREATE DATABASE moje_appka;
CREATE USER appka_user WITH PASSWORD 'silne-heslo';
GRANT ALL PRIVILEGES ON DATABASE moje_appka TO appka_user;
Užitečné diagnostické psql příkazy, které DevOps používá při řešení
provozních problémů:
\l seznam všech databází
\c nazev přepnutí na danou databázi
\dt seznam tabulek v aktuální databázi
\d tabulka popis struktury konkrétní tabulky
\du seznam uživatelů a jejich oprávnění
Kontrola aktivních připojení a dlouho běžících dotazů (časté při ladění
"proč je databáze pomalá"):
SELECT pid, now() - query_start AS doba_behu, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY doba_behu DESC;
Shrnutí
Relační databáze ukládají data do provázaných tabulek a k práci s nimi
slouží jazyk SQL; PostgreSQL a MySQL/MariaDB jsou nejrozšířenější
open-source zástupci a pro běžné provozní účely jsou si podobné.
Transakce garantují, že se skupina změn provede celá, nebo vůbec, a
indexy zrychlují vyhledávání za cenu pomalejšího zápisu. DevOps inženýr
nemusí umět navrhovat databázové schéma, ale musí umět databázi
nainstalovat, připojit se k ní, zkontrolovat její stav a použít základní
SQL dotazy při diagnostice provozních problémů.
Kontrolní otázky
- Co znamená zkratka ACID a proč jsou transakce důležité při převodu
peněz mezi dvěma účty? - K čemu slouží index a proč se nepřidává automaticky na každý sloupec?
- Jakým příkazem v
psqlzjistíte seznam tabulek v aktuální databázi a
jakým strukturu konkrétní tabulky? - Napište SQL dotaz, který vypíše jméno zákazníka a částku objednávky
pro všechny objednávky vytvořené za posledních 7 dní.
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.