Každý vývojář občas obdrží požadavek na synchronizaci produkční databáze se stage prostředím pro účely testování nad reálnými daty. Pgsync umí tenhle nudný proces vyřešit v okamžiku. Krom toho za nás může řešit i anonymizaci citlivých dat.
Pgsync je opensource nástroj pro synchronizaci dat z jedné Postgres databáze do druhé. Nahrazuje jedním příkazem repetitivní pg_dump a pg_restore, které ještě navíc předčí svým výkonem. Přenáší se pouze rozdíl dvou databází a tabulky jsou synchronizovány paralelně.
Článek rozhodně nemá obsáhnout celou dokumentaci, pouze ukazuje nejčastější užití. Pro rozšiřující informace navštivte dokumentaci.
Instalace
Pgsync je teoreticky možné nainstalovat na libovolný server, ale z hlediska bezpečnosti a rychlosti je optimální stage prostředí.
V příkazové řádce spustíme:
gem install pgsync
Pokud příkaz skončí chybou, pravděpodobně nemáte nainstalované Ruby https://github.com/ankane/pgsync#dependencies.
Úspěšnou instalaci ověříte spuštěním příkazu pgsync -v, který vypíše současnou verzi programu.
Konfigurace
Spuštěním pgsync --init v adresáři projektu zde vygenerujeme konfigurační soubor .pgsync.yml. Tento bychom měli uvést do .gitignore, abychom v repozitáři nevystavovali citlivá data.
Níže uvádím typické nastavení. Nejedná se o kompletní výčet, pro další možnosti nahlédněte do dokumentace.
1 - source database
from: postgres://username:password@productionHost:5432/db-name?sslmode=verify-full
2 - destination database
to: postgres://username:password@localhost:5432/db-name
3 - exclude tables
exclude:
- log
4 - protect sensitive information
data_rules:
email: unique_email
api_token: unique_secret
phone: unique_phone
patient_age:
statement: "(RANDOM() * 100)::int"
/// 1 – source database
Zdrojová databáze (produkční), ze které chceme brát data. Z důvodu bezpečnosti je nutné mezi servery komunikovat přes SSH či VPN, případně použít SSL mód. Pokud se rozhodnete pro poslední možnost, do query stringu připojte na konec *?sslmode=verify-full&sslrootcert=/var/**/cert.pem*. Je samozřejmě nutné mít na stage tento certifikát k dispozici.
/// 2 – destination database
Cílová databáze (stage), kam chceme zdrojová data přenést. Aby nedošlo omylem k záměně, pgsysc zde dovoluje uvést pouze hosta localhost či 127.0.0.1.
/// 3 – exclude tables
Často není nutné přenášet všechny tabulky, typicky půjde o logy. Tabulky uvedené v této sekci budou vynechány.
/// 4 – protect sensitive information
Další běžný požadavek je nepřenášet na stage citlivé informace jako třeba email. Vyhneme se tím velkým problémům při chybném nastavení SMP serveru na stage. Není totiž úplně vhodné posílat ostrým uživatelům maily při testování :)
Spuštění
Nyní již zbývá jen pgsync spustit. Tímto příkazem se provede synchronizace struktury i samotných dat:
pgsync
Je pravděpodobné, že příkaz vám nedoběhne kvůli definovaným constraints. V takovém případě je buď nutné uvést v příkazu jednotlivé tabulky tak jak mají jít za sebou a nebo jednoduše udělat deffer (constraints kontrolovány až po celé transakci):
pgsync --defer-constraints-v2
V případě, že chcete synchronizovat pouze některé tabulky.
pgsync table1,table2