Londiste
Sisukord
- 1 Sissejuhatus
- 2 Tööpõhimõte
- 3 Londiste tarkvara paigaldamine failisüsteemi
- 4 Londiste tarkvara paigaldamine andmebaasi
- 5 PgQ seadistamine ja käivitamine masteris
- 6 Londiste kliendi käivitamine slave'is
- 7 Londiste kasutamine
- 8 Londiste haldamine
- 9 PgQ ja Londiste kustutamine andmebaasist
- 10 Testimine
- 11 Monitooring
- 12 Märkused
- 13 Kasulikud lisamaterjalid
Sissejuhatus
Londiste http://wiki.postgresql.org/wiki/Londiste_Tutorial on asünkroonne master/slave-tüüpi andmete replitseerimislahendus. Londiste tarkvara sisaldub Skytools komplektis ühe rakendusena.
Tööpõhimõte
Londiste kasutab PGQ http://wiki.postgresql.org/wiki/PGQ_Tutorial lahendust andmete asünkroonseks replikeerimiseks. Londiste on
- nn 'master to many slaves' lahendus
- sünkroniseeritakse tabeleid (sh loendureid)
Londiste töötamist võiks kujutada sellise skeemiga
MASTER SLAVE ---- > ---- -----|---------------------------------------|----- _|_ _|_ | | | | |___| |___| seadistusfail: ticker.ini p-to-s.ini protsess: pgqadm ticker.ini ticker londiste p-to-s.ini replay skeemid: pgq, londiste londiste
kus
- MASTER - andmebaas, mille tabelites kasutajad muudavad andmeid
- SLAVE - andmebaas, mille tabelite sisu hoitakse masteriga sünkroonis
- pgq, londiste - replikeerimisega seotud skeemid; selliste nimedega skeeme ei tohiks andmebaasis muuks kasutuseks olla
Antud juhul tähendab asünkroonsus seda, et master andmebaasi kasutaja ei saa olla kindel, et tema toiminguga seotud muudatus on lisaks master andmebaasile jõudnud kohale kõigisse slave andmebaasidesse.
Seoses Londistega lisatakse kõigile masteri replikeeritavatele tabelitele juurde vastav nn 'AFTER INSERT OR UPDATE OR DELETE' trigger londiste_replica_logger ja selle abil saab süsteem teada, millal ja millised muudatused toimuvad ning neid propageerida slave'i.
Londiste tarkvara paigaldamine failisüsteemi
Londiste paigaldamiseks Debian Squeeze keskkonnas sobib öelda master ja slave arvutites
# apt-get install skytools
Paigaldamise tulemusena lisanduvad muu hulgas failid
/usr/bin/walmgr /usr/bin/table_dispatcher /usr/bin/skytools_upgrade /usr/bin/scriptmgr /usr/bin/queue_splitter /usr/bin/queue_mover /usr/bin/pgqadm /usr/bin/londiste /usr/bin/cube_dispatcher /usr/bin/bulk_loader
Debian Lenny puhul tuleb tarkvara paigaldada lähtetekstist.
Londiste tarkvara paigaldamine andmebaasi
Londiste tööks tuleb master andmebaasi tekitada skeemid londiste ja pgq ning slave andmebaasi skeem londiste koos seal sisalduvate replikeerimiseks vajalike funktsioonide ja tabelitega.
Üks võimalus on need skeemid moodustada Slave andmebaasi arvutis töötades. Esmalt tuleb tekitada sobiva sisuga Londiste kliendi seadistusfail, nt
$ cat /etc/londiste/londiste.ini [londiste] job_name = test_to_subcriber # source queue location provider_db = dbname=londiste port=5432 host=192.168.10.205 user=postgres password=trust # target database - it's preferable to run "londiste replay" # on same machine and use unix-socket or localhost to connect subscriber_db = dbname=londiste port=5432 host=127.0.0.1 # source queue name pgq_queue_name = londiste.replica logfile = ~/log/%(job_name)s.log pidfile = ~/pid/%(job_name)s.pid # how often to poll event from provider #loop_delay = 1 # max locking time on provider (in seconds, float) #lock_timeout = 10.0
kus on näidatud
- provider_db - master andmebaasi ligipääs
- subscriber_db - slave andmebaasi ligipääs
Tablite ning funktsioonide tekitamiseks masteri skeemidesse pgq ja londiste tuleb öelda nt
$ londiste.py /etc/londiste/londiste.ini provider install
Tabelite ning funktsioonide tekitamiseks Slave'i skeemi londiste tuleb öelda nt
$ londiste.py /etc/londiste/londiste.ini subscriber install
PgQ seadistamine ja käivitamine masteris
Masteri PgQ seadistamiseks sobib kasutada nt sellist seadistusfaili
$ cat /etc/londiste/ticker.ini [pgqadm] # should be globally unique job_name = pgqadm_londiste db = dbname=londiste port=5432 host=127.0.0.1 user=postgres password=trust # how often to run maintenance [minutes] maint_delay_min = 5 # how often to check for activity [secs] loop_delay = 0.1 logfile = ~/log/%(job_name)s.log pidfile = ~/pid/%(job_name)s.pid use_skylog = 0
kus
- db - masteri andmebaas
PgQ käivitamiseks sobib öelda masteris
$ pgqadm /etc/londiste/ticker.ini ticker
Sobib kasutada nt sellist käivitusskripti
#!/bin/bash case "$1" in start) echo "Starting PgQ ticker" /bin/su - postgres -c "/usr/local/skytools/bin/pgqadm.py /opt/postgres/pgq/ticker.ini ticker -d" ;; stop) echo "Stopping PgQ ticker" /bin/su - postgres -c "/usr/local/skytools/bin/pgqadm.py /opt/postgres/pgq/ticker.ini ticker -s" ;; *) echo "Usage: /etc/init.d/pgq-ticker { start | stop }" exit 1 esac exit 0
Londiste kliendi käivitamine slave'is
$ londiste /etc/londiste/londiste.ini replay
Sobib kasutada nt sellist käivitusskripti
#!/bin/bash case "$1" in start) echo "Starting Londiste" /bin/su - postgres -c "/usr/local/skytools/bin/londiste.py /opt/postgres/londiste/londiste.ini replay -d" ;; stop) echo "Stopping Londiste" /bin/su - postgres -c "/usr/local/skytools/bin/londiste.py /opt/postgres/londiste/londiste.ini replay -s" ;; *) echo "Usage: /etc/init.d/londiste { start | stop }" exit 1 esac exit 0
Londiste kasutamine
Tabelite replitseerimise määramisel moodustatakse tabelite juurde triggerid, st et sel ajal ei tohi tabelil olla lukke. Lukud võivad esineda nt teatud päringute tegemisega seoses. Repliteerimise eemaldamisel jäävad vastavad tabelid iseenesest alles. Töötab ka pärilusega seotud tabelite replitseerimine, sh ei kustutata andmeid muudest tabelitest.
Tabelile replitseerumise lisamine
Andmete replitseerimiseks tuleb logiserverisse moodustada vastavad tableid ning seejärel öelda logiserverist
$ londiste.py p-to-s.ini provider add public.T1 public.T2 $ londiste.py p-to-s.ini subscriber add public.T1 public.T2
Tabeli replitseerumise eemaldamine ainult kliendi poolelt
Subscriberi eemaldamiseks sobib öelda
$ londiste p-to-s.ini subscriber remove skeeminimi.tabelinimi
Tabelilt replitseerumise eemaldamine mõlemalt poolelt
Eemaldamiseks sobib öelda
$ londiste p-to-s.ini provider remove skeeminimi.tabelinimi
Londiste haldamine
Master
$ pgqadm /etc/londiste/ticker.ini status Postgres version: 8.4.3 PgQ version: 2.1.8 Event queue Rotation Ticker TLag ------------------------------------------------------------------------------ londiste.replica 3/360s 240/3s/60s 9s ------------------------------------------------------------------------------ Consumer Lag LastSeen ------------------------------------------------------------------------------ londiste.replica: test_to_subcriber 9s 8s ------------------------------------------------------------------------------
Kui slave arvuti on kadunud ja ei nö ei tule enam tagasi, siis saab providerist vastava osa eemaldada kasutades seda sama londiste.ini faili, mida slave kasutas ja öelda masteris nt
$ londiste /etc/londiste/londiste.ini provider remove public.inimene3
Samal ajal peaks ticker masteris käima.
Slave
$ londiste /etc/londiste/londiste.ini subscriber tables Table State skeeminimi.tabelinimi in-copy
PgQ ja Londiste kustutamine andmebaasist
PgQ ja Londiste osa kustutamine andmebaasist seisneb selliste objektide kustutamises
- pgq skeem (ainult masteris)
- londiste skeem
- londiste_replica_logger trigger (replitseerivate tabelite juurest)
Skeemid tuleb kustutada drop cascadega kusjuures triggerid eemaldatakse automaatselt.
SQL> DROP SCHEMA pgq CASCADE; SQL> DROP SCHEMA londiste CASCADE;
Testimine
TODO
Monitooring
Põhimõtteliselt peaks Londiste kasutamisel arvestama kolme katki minemise võimalusega
- provideris lõpetab töö ticker protsess
- subscriberis lõpetab töö londiste protsess
- provideris ja subscriberi vahel katkeb võrguühendus
Kõiki neid juhtumeid saab hõlpsasti avastada nt provideris sellise käsu väljundi põhjal tehtud tehtega
Lag - LastSeen <= 2
Kui vastus on tõene, siis töötab replikeerimine ilusti.
$ pgqadm /opt/postgres/pgq/ticker.ini status Postgres version: 8.4.4 PgQ version: 2.1.8 Event queue Rotation Ticker TLag ------------------------------------------------------------------------------ londiste.replica 3/7200s 500/3s/60s 37s ------------------------------------------------------------------------------ Consumer Lag LastSeen ------------------------------------------------------------------------------ londiste.replica: loomaaed_to_subcriber 37s 36s ------------------------------------------------------------------------------
Märkused
- Andmebaasiühenduse testimiseks Pyhtonist sobib öelda
$ python ... >>> import psycopg2 >>> con = psycopg2.connect('dbname=baasinimi host=10.0.13.170 \ user=postgres password=parool port=5432') >>> Ctrl-D
- Kui master ja slave arvutis on kasutusel ühe nn binary installi all mitu andmebaasi, siis vastavate baaside tabelite omavaheliseks sünkroniseerimiseks on vaja kasutada mitut ticer ja londiste protsessi.
- Londiste abil saab sünkroniseerid aka ühe binary install all töötvaid andmebaase omavahel, praktiliselt toimub kõik samamoodi kui kahes erinevas arvutis töötavate andmebaaside puhul, sh tuleb käivitada samas arvutis nii ticker kui londiste protsessid.
- Londiste kasutamisel inherited tabelitega peab olema ettevaatlik kuna teatud juhtumitel kustutatakse inherited tabelite sisu ära.