Turvaserveri sõnumilogide haldus
Kui Teie X-tee 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 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:
Andmebaasi tabelist kirjete arhiveerimine zip pakkidesse
Andmebaasi tabelist kirjete puhastamine ehk kustutamine
Arhiivipakkide transportimine(soovi korral)
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.
Täpsemat infot leiab siit - https://github.com/nordic-institute/X-Road/blob/develop/doc/Manuals/ug-syspar_x-road_v6_system_parameters.md#37-message-log-add-on-parameters-message-log
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
# alates X-Road v7.0 korral:
sudo service xroad-addon-messagelog restart
# vanemate versioonide korral:
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 täistund ja puhastatakse iga tunni 30-ndal minutil.
$ cat /etc/xroad/conf.d/local.ini
[message-log]
keep-records-for=1
archive-interval=0 0 1/1 1/1 * ? *
clean-interval=0 30 1/1 1/1 * ? *
Arhiveeritud pakkide transport
Soovitame kasutada RSYNC teenust failide transpordiks masinate vahel.
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:
https://www.x-tee.ee/docs/live/xroad/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õnumilogi kaupa ajatempel. Kui sõnumilogidel on ajatempel olemas saab neid arhiveerida. Kui uusi sõnumilogisi, millel ajatemplit ei ole on rohkem kui 10 000, siis protsessi korratakse, kuni jääb ajatembeldamata arv alla limiidi (alates v6.20).
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:
messagelog=> select count(1) from logrecord where discriminator::text = 'm'::text and signaturehash is not null;
count
-------
275
(1 row)
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. Soovitame kontrollida, et kas kõige vanem ajatembeldamata kanne on vanem, kui 48 minutit. Kui jah, siis tuleb uurida proxy.log logikandeid, et leida põhjus, miks ajatembeldamine viimati ebaõnnestus.
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 andmebaasmessagelogning luua laiendus pgstattuple.
$ psql -d messagelog
messagelog=# create extension pgstattuple;
Esmalt tasub vaadata sõnumilogi tabeli logrecord hetkeseisu
messagelog=# SELECT * FROM pgstattuple('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;"
reindexdb messagelog
Kui on toimunud suured muutused baasi suurustes (eriti baasi kasvamine), siis soovitame käivitada messagelog baasis olevate indeksite reindexeerimist:
messagelog=# reindexdb messagelog;
Kõiki erinevaid sõnumilogi puudutavaid parameetreid ja detailsemat infot leiab turvaserveri kasutusjuhendist pt 11, mis kirjeldab sõnumilogi ja selle kasutusvõimalusi.
https://www.x-tee.ee/docs/live/xroad/ug-ss_x-road_6_security_server_user_guide.html#11-message-log