Londiste

Allikas: Kuutõrvaja

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.

Kasulikud lisamaterjalid