Turvaserveri sõnumilogide haldus

Kui Teie X-tee v6 sõnumilogi andmebaasi maht ja kettaruumi kasutus on kasvanud suuremaks, kui Te esialgu planeerisite ning kettamaht aina kasvab on arvatavasti probleem sõnumilogide arhiveerimise vaikesätete mittesobimisega Teie turvaserveris. X-tee v6 turvaserver pakub võimalust sõnumilogide arhiveerimist ja puhastamist automatiseerida ning soovi korral teise masinasse transportida hoides kettamahu kontrolli all. 

Sõnumilogide arhiveerimine koosneb 4-st järjestikusest protsessist, mida käivitatakse konfigureeritud intervallide kaupa:

  1. Andmebaasi tabelist kirjete arhiveerimine zip pakkidesse
  2. Andmebaasi tabelist kirjete puhastamine ehk kustutamine
  3. Arhiivipakkide transportimine(soovi korral)
  4. Andmebaasi vabastamata tühja ruumi vabastamine

Esimese sammuna võetakse andmebaasist sõnumilogi tabelist kirjed, millel on küljes ajatempel ja pakitakse kokku zip faili ning iga arhiveeritud kirjele lisatakse andmebaasi tabelis märge, et see on arhiveeritud.
Peale arhiveerimist käivitatakse tabeli puhastus, mis kustutab tabelist kõik kirjed, mis on vanemad kui 30 päeva(vaikimisi) ning mille küljes on märge, et see on juba arhiveeritud.
Juhul, kui on soov transportida arhiivipakid mõnda teise masinasse või kettale, saab selleks kasutada abiskripti, mis kasutab pakkide transpordiks HTTP/HTTPS protokolli.
Viimaseks sammuks on andmebaasi vabastamata tühja ruumi vabastamine ehk VACUUM, mida teeb andmebaas taustal iseseisvalt. Tühja ruumi vabastamine on viimane samm, mis vabastab ruumi, mida kasutati andmete hoidmiseks.


Sõnumilogi sätted ja parameetrid


Sõnumilogi arhiveerimise vaikesätted asuvad failis /etc/xroad/conf.d/addons/message-log.ini.
Juhul, kui Teie andmebaasi suurus on kasvanud liiga suureks, on enamasti esimeseks põhjuseks vaikesätete mittesobimine.
Kui on soov või vajadus vaikesätteid muuta, saab seda teha failis /etc/xroad/conf.d/local.ini, mis eirab vaikesätteid. 

Sõnumilogi arhiveerimist, puhastamist ja soovi korral ka arhiivipakkide transportimist käivitab tööriist Cron.
Vaikimisi hoitakse andmebaasis 30 päeva vanuseid arhiveeritud sõnumilogisi.
Arhiveerimisintervall on vaikimisi 0 0 0/6 1/1 * ? *, mis tähendab, et arhiveerimine käivitatakse iga 6 tunni tagant, alustades päeva algusest ehk 00:00.
Puhastusintervall on vaikimisi 0 0 0/12 1/1 * ? *, mis tähendab, et puhastamine käivitatakse iga 12 tunni tagant, alustades päeva algusest ehk 00:00.


Sõnumilogi arhiveerimise konfigureerimiseks on olemas erinevad parameetrid, millega on võimalik arhiveerimist häälestada vastavalt enda turvaserveri vajadustele.

keep-records-for - aeg päevades, kui kaua hoitakse turvaserveri andmebaasis arhiveeritud sõnumilogisi. Vaikimisi on selleks 30 päeva.

archive-max-filesize - ühe sõnumilogide arhiivipaki maksimum suurus baitides. Vaikimisi on selleks 32MB ehk 33554432 baiti.

archive-interval - arhiveerimise intervall, mida kasutab tööriist Cron, et käivitada sõnumilogide arhiveerimisprotsess. Vaikimisi on selleks iga 6H tagant.

archive-path - kataloog, kuhu arhiveeritud sõnumilogide pakid paigutatakse. Vaikimisi on selleks /var/lib/xroad/.

clean-interval - andmebaasi puhastamise intervall, mida kasutab tööriist Cron, et käivitada sõnumilogide puhastus andmebaasi tabelis logrecords. Vaikimisi on selleks iga 12H tagant.

archive-transfer-command - arhiveeritud sõnumilogide pakkide transportimise käsk, mis käivitatakse arhiveerimisprotsessi lõpus. Vaikimisi ei ole antud funktsionaalsust sisse lülitatud.

archive-transaction-batch - maksimum kogus sõnumilogisi, mida ajatembeldatakse ühe korraga. Vaikimisi on selleks 10 000.


Kuna sõnumilogi on üks xroad-proxy lisadest on peale /etc/xroad/conf.d/local.ini failis muudatuste tegemist vajalik sellele taaskäivitus teha, nt käsuga

$ sudo service xroad-proxy restart

Näide /etc/xroad/conf.d/local.ini faili sisust, mis võimaldab arhiveerida vanemaid sõnumilogisi kui 1 päev. Arhiveeritakse sõnumilogi iga 15 minuti tagant ja puhastatakse iga 30 minuti tagant.

$ cat /etc/xroad/conf.d/local.ini        
[message-log]
keep-records-for=1
archive-interval=0 0/15 * 1/1 * ? *
clean-interval=0 0/30 * 1/1 * ? *


Arhiveeritud pakkide transport


Arhiveeritud pakkide transportimiseks näiteks mõnda teise masinasse või kettale on olemas abiskript

/usr/share/xroad/scripts/archive-http-transporter.sh
Selle kasutamiseks tuleb sõnumilogi konfiguratsioonifaili /etc/xroad/conf.d/local.ini lisada järgnev parameeter:

archive-transfer-command=/usr/share/xroad/scripts/archive-http-transporter.sh -r http://my-archiving-server/cgi-bin/upload

Antud skript kasutab HTTP/HTTPS protokolli ning võimaldab transportida arhiveeritud pakid näiteks eraldiseisvasse arhiveerimismasinasse. Kasutades käsus lippu -r, kustutatakse turvaserverist juba eelnevalt ära transporditud sõnumilogi arhiivipakid vabastades kettaruumi.

Täpsemat infot arhiivipakkide transpordi ja lippude kasutamise kohta leiab siit:
http://x-road.eu/docs/6.16.0/ug-ss_x-road_6_security_server_user_guide.html#112-transferring-the-archive-files-from-the-security-server


Sõnumilogide ajatembeldamine ja uurimine andmebaasis


Kõik sõnumilogid paigutatakse turvaserveris Postgres andmebaasi messagelog. Vaikimisi, iga 48 minuti tagant lisatakse kuni 10 000 sõnumilogile ajatempel. Kui sõnumilogidel on ajatempel olemas saab neid arhiveerida. Kui uusi sõnumilogisi, millel ajatemplit ei ole on rohkem kui 10 000, jäävad need ilma ajatemplita ning järgneva ajatembelduse käigus lisatakse nendele esmajärjekorras ajatempel.

Kõik turvaserveris olevad sõnumilogi kirjed asuvad andmebaasi tabelis logrecord.
Selleks, et tabelile ligi saada, tuleb Postgres andmebaasi sisse logida messagelog kasutajaga.
Vaikimisi loodud messagelog kasutaja parool asub failis /etc/xroad/db.properties 

$ psql -h 127.0.0.1 -U messagelog messagelog
Tabeli logrecord kõigi veergude vaatamiseks: 


messagelog=> \d logrecord

Iga kirje kohta on tabelis logrecord olemas parameeter archived, mille vaikimisi väärtus on false. Kui kirje on ajatembeldatud ja saab arhiveeritud, muudetakse see true-ks. Kõik kirjed, mille archive parameetri väärtus on true, eemaldatakse puhastuse käigus ära.

Ajatembeldamata sõnumilogide kokku lugemiseks saab kasutada allolevat käsku. Kui tagastatud number on suurem kui 10 000 on probleem ajatembeldamisega ehk turvaserveris toimub tihe liiklus ning iga 48 minuti jooksul tekib rohkem kui 10 000 sõnumilogi. Kuna arhiveerida saab ainult ajatembeldatud sõnumilogisi, jäävad need turvaserverisse. Pikema aja jooksul võib tänu sellele andmebaasi kettamaht kasvada.
Lahendusena soovitame tõsta sõnumilogi konfiguratsioonifailis /etc/xroad/conf.d/local.ini parameetrit timestamp-records-limit, vaikimisi on see 10 000. Sel juhul ajatembeldatakse iga 48 minuti tagant rohkem kui 10 000 sõnumilogi.

messagelog=> select count(1) from logrecord where discriminator::text = 'm'::text and signaturehash is not null;
count
-------
275
(1 row)

Kõige viimase ajatembeldamata sõnumilogi teada saamiseks saab kasutada käsku:

messagelog=> select to_timestamp(min(time)::float/1000) from logrecord where discriminator::text = 'm'::text and signaturehash is not null;  
to_timestamp        
----------------------------
2018-05-18 09:14:45.825+03
(1 row)


Ajatembeldatud aga veel arhiveerimata sõnumilogide kokku lugemiseks saab kasutada käsku:

messagelog=> select count(1) from logrecord where timestamprecord in (select id from logrecord where discriminator::text = 't'::text and archived = false);       
count 
-------
802
(1 row)

Kõige viimase ajatembeldatud aga veel arhiveerimata sõnumilogi teada saamiseks saab kasutada allolevat käsku. Kui tagastatud kuupäev on vanem kui nt 30 päeva(vaikimisi parameeter keep-records-for) tähendab, et arhiveerimise on midagi halvasti. Suure tõenäosusega tasuks üle vaadata arhiveerimise intervalli ning vajadusel seda tõsta.

messagelog=> select to_timestamp(min(time)::float/1000) from logrecord where timestamprecord in (select id from logrecord where discriminator::text = 't'::text and archived = false);
to_timestamp        
----------------------------
2018-05-18 06:50:45.854+03
(1 row)


Vabastamata tühi ruum andmebaasis


Juhul, kui sõnumilogide arhiveerimine töötab, aga andmebaasi maht on endiselt liiga suur, võib probleem olla andmebaasi vabastama tühjas ruumis. Vaikimisi töötab Postgres andmebaasides AUTOVACUUM ehk tühja ruumi vabastamine, mis kustutab täielikult andmebaasi tabelitest eemaldatud read ja vabastab selle käigus ka andmete kulunud ruumi. Kahjuks AUTOVACUUMil on mitmeid vigu ning süsteemides, kus toimub palju päringuid võib tekkida probleeme tühja ruumi automaatse vabastamisega. Kui vabastamata tühja ruumi on tekkinud väga palju, tasuks andmebaasile teha VACUUM FULL. Selle suureks miinuseks on aga tabelite lukustamine, ehk samal ajal ei ole võimalik andmebaasi tabelit kasutada. Turvaserveri töötamise mõistes tähendab see katkestust.

Selleks, et saada teada, kui palju on vabastamata tühja ruumi tuleb esmalt logida andmebaasi sisse. 

# su - postgres

Seejärel valida andmebaas messagelog ning luua laiendus pgstattuple.   
$ psql -d messagelog
messagelog=# create extension pgstattuple;

Esmalt tasub vaadata sõnumilogi tabeli logrecord hetkeseisu
messagelog=# SELECT * FROM pgstattuple('public.logrecord');

 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 

-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------

 106192896 | 53390 | 73798005 | 69.49 | 3009 | 4335848 | 4.08 | 27163284 | 25.58

(1 row)


Seejärel tasub vaadata toast tabeli hetkeseisu (Toast tabelit kasutatakse suurte kirjete hoidmiseks).

messagelog=# SELECT * FROM pgstattuple('pg_toast.'||(select relname from pg_class where oid = (select reltoastrelid from pg_class where relname = 'logrecord')));
    

table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 

------------+-------------+------------+---------------+------------------+----------------+--------------------+------------+--------------

 3872366592 | 1743879 | 3103020219 | 80.13 | 259348 | 465236384 | 12.01 | 280865112 | 7.25

(1 row)


Esimese päringu tulemusest näeme, et logrecords tabelis on vabastamata tühja ruumi 27MB ehk 25.58%. Teise päringu tulemusest näeme, et toast tabelis on vabastamata tühja ruumi 280MB ehk 7.25%.
Antud juhul ei ole VACUUM FULL mõistlik. Kui vabastamata tühja ruumi oleks kriitilisel tasemel, nt üle 80% tasuks kaaluda VACUUM FULL kasutamist.


VACUUM FULL kasutamine


Enne VACUUM FULL kasutamist tasub kindlasti kaaluda, kas seda on vaja teha ning millal seda teha kuna antud protsessi käigus lukustatakse andmebaasi tabel, mis tähendab, et tabelit ei saa kuni protsessi lõpetamiseni kasutada. Turvaserveri töötamise mõistes tähendab see katkestust.

Esmalt tuleks logida messagelog kasutajana messagelog andmebaasi sisse

# psql -h 127.0.0.1 -U messagelog messagelog

VACUUM FULL käivitamine logrecords tabelile


messagelog=# VACUUM FULL logrecord;


Antud protsess võib võtta mitmeid tunde aega. Sel ajal saab andmebaasi mahu muutusi jälgida nt käsuga:


$ df -h

Samuti saab andmebaasi protsesse jälgida käsuga: 


$  sudo -i -u postgres psql -c "select * from pg_stat_activity;"


Kõiki erinevaid sõnumilogi puudutavaid parameetreid ja detailsemat infot leiab turvaserveri kasutusjuhendist pt 11, mis kirjeldab sõnumilogi ja selle kasutusvõimalusi.
http://x-road.eu/docs/6.16.0/ug-ss_x-road_6_security_server_user_guide.html#11-message-log

Viimati muudetud: neljapäev, 28. juuni 2018, 14.11