12.1. Technická dokumentace

12.1.1. Instalace

Zdrojový kód je kompilován pomocí Apache Maven: mvn clean package -DskipTests

Zkompilovaná aplikace je zabalena v spustitelném archival-storage.jar souboru.

Závislosti:

  • PostgreSQL (verze 15 a vyšší)

  • Java 17+ (OpenJDK)

ActiveMQ 6.x (volitelné)

ActviveMQ je použito pro distribuci operací z Archival Storage do logických úložišť - každé logické úložiště má svou persistentní frontu.

Defaultně je použit embedded ActiveMQ broker, v tomto případě není třeba nic instalovat ani konfigurovat. Data fronty jsou uložena v složce data/kahadb v pracovním adresáři aplikace Archival Storage. Pokud je to potřeba je možné tento adresář změnit v application.yml

Standalone služba

Pro podporu monitoringu a správy front je možné nainstalovat ActiveMQ jako standalone aplikaci. Pro stažení může být použit např. tento odkaz: https://activemq.apache.org/components/classic/download/

Při spuštění v standalone režimu jsou data defaultně uložena v složce data/kahadb v pracovním adresáři aplikace ActiveMQ. V konfiguračním souboru aplikace Archival Storage je v tomto případě nutno nastavit: spring.activemq.broker-url: tcp://localhost:61616 Defaultní port ActiveMq je 61616. Webové rozhraní je defaultně na adrese http://localhost:8161/admin, jméno:heslo je admin:admin .

V konfiguračním souboru activemq.xml je nutné zadefinovat podporu prioritizace pro fronty:

<broker>
 <destinationPolicy>
  <policyMap>
   <policyEntries>
    <policyEntry queue="archival-storage.*" prioritizedMessages="true" useCache="false" expireMessagesPeriod="0" queuePrefetch="1"/>

Při přechodu z jednoho režimu na druhý (Embedded <-> Standalone) je možné při vypnutém systému překopírovat datový obsah a neztratit tak data fronty.

Spuštění aplikace z příkazové řádky

Restartování aplikace spuštěné přímo z příkazové řádky:

  • pomocí ps xw nalézt PID JAVA procesu archival-storage.jar

  • kill <PID>

  • nohup java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 archival-storage.jar $> arcstorage.log

  • agentlib:jdwp lze vypustit, slouží pro možnost remote debuggingu

  • pracovní adresář je automaticky adresář z nějž je aplikace spuštěna, lze změnit přepínačem -Duser.dir={cesta}

Spuštění aplikace jako služby

  • archival-storage.service - vzorový konfigurační soubor pro systemd službu


[Unit]
Description=Archival Storage
After=syslog.target

[Service]
Type=simple
User=ais
Group=ais
WorkingDirectory=/opt/ais/archival-storage
ExecStart=/opt/ais/archival-storage/archival-storage.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
  • archival-storage.conf - konfigurační soubor systemd služby - vložit do pracovního adresáře aplikace

JAVA_OPTS="-XX:MaxMetaspaceSize=800M -Xmx4096M

12.1.2. Konfigurace

Logování

Logy se ukládají do složky {pracovní adresář}/../logs

Systém

Aplikace je konfigurovatelná skrze soubor application.yml který se nachází v pracovním adresáři. Konfigurační hodnoty v tomto souboru překrývají defaultní konfigurační hodnoty v souboru application.yml nacházejícím se ve složce src/main/resources. Po přepsání souboru je pro projevení změn nutné aplikaci restartovat. Při konfigurování atributů cest na souborovém systému lze zadat relativní cestu vzhledem k pracovnímu adresáři.

server:
  port: 8081
  tomcat:
# maximální počet aktivních vláken aplikačního serveru - počet HTTP požadavků které mohou být odbaveny paralelně
    max-threads: 70
# velikost fronty aplikačního serveru - při vyčerpání aktivních vláken jsou požadavky řazeny do fronty, po naplnění fronty je každý další požadavek zamítnut, velikost fronty je součtem následujících dvou hodnot
    accept-count: 1 # min 1
    max-connections: 99 # min 1
spring:
  activemq:
# URL ActiveMQ broker serveru, vm://localhost pro vnořené ActiveMQ, pro standalone službu např. tcp://localhost:61616
    broker-url: vm://localhost
# pracovní adresář aplikace do kterého jsou mimo jiné nahrávány objekty při cestě do úložiště a z úložiště
  servlet.multipart.location: tmp
# databáze
  datasource:
    url: jdbc:postgresql://localhost:5432/{DB name}
    username: {DB username}
    password: {DB password}
    tomcat:
# default = 100, hodnota musí být vhodně nastavena vzhledem k celkovému počtu vláken které v aplikaci mohou synchronně běžet a s ohledem na PostgreSQL max_conn
      max-active: 100
# default = 10, aplikace si již při startu rezervuje 10 PostgreSQL spojení
      initial-size: 10
# mail - konfigurace služby
 mail: 
    host: smtp.gmail.com
    port: 465
    username: {sender mail username}
    password: {sender mail password}
    protocol: smtp
    properties.mail.smtp:
      auth: true
      starttls.enable: false
      ssl.trust: smtp.gmail.com
      ssl.enable: true
# mail - konfigurace těla mailu
mail: 
  sender:
    name: Archival Storage
  app:
    name: Archival Storage
    logo: logo.png
    link: http://arclib.inqool.cz
    url: http://arclib.inqool.cz
arcstorage:
  embedded-queue:
# konfigurace datové složky ActiveMQ, pokud je použita vnořená ActiveMQ namísto standalone služby
    data-dir: data/kahadb
  consistencyCheck:
# cron dle kterého budou probíhat periodické kontroly stavu balíků na úložišti
    cron: "0 */30 * * * ?"
# počet AIP zkontrolovaných v rámci jedné periody kontroly, hodnotu je možné vynechat - v tom případě jsou v rámci periody zkontrolovány všechny dostupné AIPy
    count: 10
  storageStateCheck:
# cron dle kterého budou probíhat pravidelné reporty stavu logických úložišť
    cron: "0 0 8 ? * 2"
  threadPools:
# počet vláken rezervovaných pro periodické procesy, např. kontrolu dostupnosti úložišť
    scheduled: 2
# mez velikosti pracovního adresáře v MB, po jejímž dosažení přestane aplikace přijímat jakékoliv požadavky na uložení objektů
  tmpFolderUploadSizeLimit: 500000
# timeout pro navázání spojení s vzdálenými logickými úložišti, v milisekundách
  connectionTimeout: 5000
# timeout pro transakce při nichž se mění stav AIP, v sekundách
  stateChangeTransactionTimeout: 5
# v případě požadavku na přípojení nového logického úložiště musí do tohoto timeoutu (sekundy) všechny rozpracované objekty změnit svůj stav, pokud se tak nestane, synchronizace nezačne
  synchronizationInitTimeout: 15
# timeout operace uložení na sekundárním úložišti, -1 znamená bez timeoutu
  jmsMessageProcessTimeout: -1
# max. počet aktivních vláken pro zpracování požadavků jedné fronty
  jmsQueueConsumerThreads: 8
# při nastavení true jsou při startu aplikace promazány/vyčištěny všechny objekty které nejsou v finálním požadovaném stavu
  cleanUpAtApplicationStart: false
# cesta k adresáři do kterého jsou exportovány data pro zálohování
  backupDirPath: backup
# cesta k privátnímu klíči kterým se archival storage autentizuje skrze SSH v případě logického úložiště na vzdáleném serveru
  ssh:
    authKey: arcstorage.ppk
    userName: {username}
  optionalFeatures:
# true pro zapnutí volitelné funkcionality Forget
    forgetObject: false
# true pro zapnutí volitelné funkcionality Inkrementálního zálohování
    incrementalBackup: false

Cron používaný aplikací musí být ve formátu: second, minute, hour, day of month, month, day(s) of week.

12.1.3. Fronty a primární úložiště

Základní informace

Rozlišujeme primární úložiště (definované v DB konfiguraci systému) a sekundární úložiště. Každé logické úložiště má svou ActiveMQ frontu s podporou prioritizace. V rámci API požadavku je typicky operace poznačena do DB, zkontrolována dostupnost primárního úložiště, zpráva zaslána do fronty/front a následně vrácena odpověď klientovi.

Je-li úložiště připojené, jeho fronta má aktivní JMS Consumery - vlákna zpracovávající požadavky. Počet vláken je konfigurovatelný v application.yml.

Při selhání zprávy na primárním úložišti je poznačen chybový stav objektu v DB. Při selhání zprávy na sekundárním úložišti je úložiště odpojeno, tzn. jsou odebrány JMS consumery dané fronty. O takovémto odpojení je administrátor informován emailem a pro opětovné zapojení úložiště využívá k tomu určený endpoint. Mezitím však systém dále funguje - plní se fronta.

Dojde-li k odpojení úložiště (chybou či uživatelem) ve chvíli kdy vlákno či vlákna již zpracovávají požadavky, vlákna standardně nejsou ukončena a v případě že se požadavky úspěšně zpracují, jsou odebrány z fronty. Výjimkou je více požadavků nad stejným objektem sekundárního úložiště, kde selže-li jeden selžou automaticky i následující.

Při fatálním pádu systémů zůstávají nedokončené zprávy ve frontě a po startu jsou na aktivních úložištích odbaveny.

JMS Zprávy

Rozlišujeme následující typy zpráv a jejich prioritu (vyšší číslo značí vyšší prioritu):

CONFIGURATION(9)

  • ACTIVATE_DATASPACE

Volání endpointu pro aktivaci dataspace po přidání nového systémového účtu Archival Storage s jiným dataspace než mají dosavadní účty.

NEW_OBJECT(7)

  • SAVE_AIP

  • SAVE

Uložení nového AIP/objektu.

Při API požadavku na uložení objektu je:

  • záznam objektu uložen do DB

  • objekt uložen do workspace

  • operace zařazena do fronty primárního úložiště

  • vrácena odpověď klientovi

Následně JMS vlákno zpracovává zprávu primárního úložiště a na závěr je:

  • objekt odebrán z workspace

  • poznačen cílový stav

  • v případě úspěšného stavu operace zařazena do front sekundárních úložišť

Pokud sekundární úložiště balíček na primárním úložišti nenalezne požadavek je tiše přeskočen, předpokládá se že primární úložiště již balíček odebralo např. na základě ROLLBACK zprávy, která čeká i ve frontě sekundárního úložiště.

OLD_OBJECT(5)

  • COPY

Kopírování objektu v aktuálním stavu z primárního úložiště na nově zapojené úložiště. Pokud je časová značka vytvoření objektu na novém úložišti novější něž je časová značka v zprávě, je zpracování zprávy přeskočeno.

MODIFICATION(3)

  • DELETE

  • ROLLBACK

  • RENEW

  • REMOVE

  • FORGET

Propagace operace na objektu. Pokud je časová značka vytvoření objektu na úložišti novější něž je časová značka v zprávě, je zpracování zprávy přeskočeno.

Vybrané implementační detaily

Více požadavků nad stejnými objekty

Archival Storage si pro každou frontu drží v paměti seznam objektů které právě zpracovává některé vlákno z JMS poolu (zámek na objekt). Pokud vlákno z JMS poolu narazí na zamčený objekt, čeká na uvolnění zámku. Pokud vlákno držící zámek selže a jedná se o sekundární úložiště (které je tímto odpojeno) nastaví k danému zámku příznak a selžou automaticky i ostatní vlákna čekající na uvolnění zámku k danému objektu.

Timeout

Zpracování zpráv SAVE_AIP, SAVE a COPY na sekundárních úložištích může být omezeno timeoutem definovaným v application.yml. Nastane-li timeout úložiště je odpojeno. V rámci timeoutu je vyslán signál na přerušení vlákna, to však nezaručuje jeho okamžité přerušení. Nejpozději na konci procesu vlákno signál rozpozná a vyvolá chybu, což zaručí že zpráva zůstane ve frontě.

Přeskočení starého požadavku na uložení

V rámci (API) požadavku na rollback, smazání, zapomenutí a cleanup konkrétního objektu Archival Storage je do front přidána příslušná zpráva (ROLLBACK,DELETE,FORGET) a je-li v frontách historický požadavek na uložení tohoto objektu, je odebrán:

  • Projde se seznam právě ukládaných objektů na každém úložišti, a je-li zde nalezen onen objekt, je vyslán signál k zastavení uložení. Tento signál nezpůsobí chybu, zpráva je úspěšně zpracována a odebrána z fronty ale objekt ve skutečnosti kompletně uložen není.

  • Projde se i zbytek fronty (požadavky které teprv čekají na zpracování) a maže požadavky na uložení onoho objektu.

Chybové systémové přepnutí do read-only režimu

V případě fatální chyby nedostupnosti primárního úložiště či selhání JMS healthchecku Archival Storage automaticky přepíná systém do read-only režimu a zasílá email. Do read-write režimu jej může přepnout administrátor skrze HTTP API.

JMS healthcheck je prováděn

  • v rámci vybraných API požadavků před zápisem do databáze

  • na konci procesu uložení do primárního úložiště, před distribucí požadavků na uložení do front sekundárních úložišť

12.1.4. Databáze

  • Všechny entity používají UUID.

  • Tabulky jsou generovány při prvním spuštění aplikace.

  • Aplikačnímu serveru musí být povolen přístup k DB s přihlašováním typu “md5”

Systémové účty

Archival Storage je systémová komponenta - neautentizují se vůči ní běžní uživatelé ale systémy. Archival Storage může sloužit více systémům, kde každý má svůj dataspace a v něm separátně uložená data. V případě logických úložišť realizovaných souborovým systémem je dataspace reprezentován složkou. Hodnota dataspace by měla obsahovat pouze malá písmena ASCII tabulky (a-z).

Pro každý dataspace může existovat několik účtů, typicky jsou však právě dva, jeden pouze pro čtení a druhý pro čtení i zápis. Jedná se o účty s rolemi ROLE_READ a ROLE_READ_WRITE. Pro jeden systém musí mít oba účty stejnou hodnotu dataspace. Email u tohoto účtu není prozatím využíván, není povinný.

Třetí rolí v systému je ROLE_ADMIN - tento typ účtu je používán výlučně administrátorem, autorizuje ho především ke konfiguraci logických úložišť ale neautorizuje ho pro běžné požadavky na práci s objekty. Tento typ účtu nemusí mít přidělen dataspace, naopak je vhodné aby měl přidělen email, na který jsou zasílány notifikace o neočekávaných chybách apod.

Účty jsou uloženy v tabulce arcstorage_user. Systém se vůči Archival Storage autentizuje skrze Basic Auth. Heslo je v DB zašifrováno pomocí BCrypt (pro vygenerování za účely testu lze použít např. https://bcrypt-generator.com/).

Systém

Tabulka arcstorage_system_state obsahuje záznamy:

min_storage_count

  • hodnota je kontrolována při startu aplikace, v případě nedostatečného počtu logických úložišť jsou účty s rolí ADMIN notifikování emailem, aplikace však běží dál

  • hodnota je také kontrolována při odebírání úložiště skrze API

read_only

  • při nastavení systém zamítá operace na uložení nebo úpravu stavu objektů

  • systém nastavuje readOnly=true

  • na chvíli při začátku synchronizace nového úložiště

  • na stálo (resp. dokud admin manuálně nenastaví false) v případě fatálního selhání komunikace s ActiveMQ

reachability_checkInterval_in_minutes

  • automaticky aktualizuje hodnotu reachable logických úložišť v tabulce arcstorage_storage

  • změna skrze API je propagována bez nutnosti restartu aplikace

last_reachability_check, last_verified_object_creation

  • řídící atributy, spravovány systémem

primary_storage_id

  • ID primárního úložiště

V tabulce se musí vždy nacházet právě jeden záznam. Při prvním spuštění aplikace je vyplněn záznam defaultní konfigurace:

  • min_storage_count=2

  • read_only=false

  • reachability_checkInterval_in_minutes=60

Logické úložiště

K systému může být připojeno jedno či více logických úložišť, čímž je zajištěna redundance na úrovni Archival Storage. K jednotlivým úložištím je přistupováno skrze Java rozhraní StorageService, které zajišťuje abstrakci od konkrétní technologie. V současnosti existují implementace pro obyčejný filesystém (FS), ZFS a Ceph. V případě FS/ZFS je navíc podporováno jak lokální úložiště (případně mapované např. skrze NFS) tak přístup přes SSH ke vzdálenému serveru.

Tabulka arcstorage_storage obsahuje záznam pro každé připojené logické úložiště.

host

  • pokud je při FS/ZFS nastaveno localhost nebo 127.0.0.1 je automaticky použita implementace pro lokální/mapovaný FS, v ostatních případech je použito SSH

port v případě lokálního FS/ZFS ignorován

priority

  • pro čtení se používá úložiště s nejvyšší prioritou, pokud je takových více, je jedno z nich náhodně vybráno

type (FS/ZFS/CEPH)

reachable

  • Nastavován automaticky při každém požadavku na úložiště (všechny logické úložiště jsou kontrolovány na dostupnost). Úložiště které nejsou dostupné nejsou použitelné pro čtení. Pokud je v systému alespoň jedno nedostupné úložiště, systém se chová jako by byl read-only. Dostupnost je také kontrolována periodicky dle intervalu nastaveném v application.yml

config JSON s atributy specifickými dle typu úložiště

detached_by_admin časová značka uživatelsky vyvolaného odpojení úložiště

detached_by_error časová značka systémem vyvolaného odpojení úložiště z důvodu chyby

Další tabulky

  • arcstorage_aip_sip - entita reprezentující datovou část AIP (zip)

  • arcstorage_aip_xml - entita AIP XML

  • arcstorage_object

  • Archival Storage je navrhnuto s myšlenkou nevázat se pouze na případ užití AIP ale umožnit i práci s objekty obecně. Tato podpora však není zatím implementována, tabulka zůstává prázdná.

  • arcstorage_object_audit

  • operace REMOVAL, DELETION, RENEWAL, ROLLBACK, ARCHIVAL_RETRY, FORGET jsou zaznamenány do databáze před distribucí požadavku na logická úložiště

  • operace ARCHIVED je zaznamenána po úspěšném uložení na primární úložiště.

  • záznamy jsou použity při synchronizaci nového úložiště a exportu dat do úložiště pro zálohování

  • arcstorage_storage_sync_status

  • Informace o probíhající/proběhlé synchronizaci nově přidaného úložiště

12.1.5. Konfigurace logických úložišť

Pro připojení úložiště je z administrátorského účtu volán endpoint POST /api/administration/storage s JSON konfiguračním souborem v těle requestu.

JSON konfiguraci nelze po připojení úložiště zpětně zmenit skrze API.

Lokální FS

Příkladový JSON

{
    "id": "4fddaf00-43a9-485f-b81a-d3a4bcd6dd83",
    "name": "local storage",
    "host": "localhost",
    "port": 0,
    "priority": 10,
    "storageType": "FS",
    "note": null,
    "config": "{\"rootDirPath\":\"d:\\\\arcstorage\"}",
    "reachable": true
}

rootDirPath je cesta ke kořenovému adresáři pro ukládání souborů

  • v tomto adresáři je pro každý účet vytvořena složka pojmenovaná dle hodnoty dataspace

  • aplikace musí mít k této složce R/W přístup

Vzdálený FS

Příkladový JSON

{
    "id": "01f839b4-842a-4caf-b237-8f43ee01d0e9",
    "name": "remote storage",
    "host": "176.74.145.50",
    "port": 22,
    "priority": 10,
    "storageType": "FS",
    "note": null,
    "config": "{\"rootDirPath\":\"/opt/data/test\"}",
    "checksumCmd": "{\"MD5\":\"md5sum $filePath | awk '{print $1}'\",\"SHA512\":\"sha512sum $filePath | awk '{print $1}'\"}",
    "reachable": true
}
  • na vzdáleném serveru je třeba založit arcstorage uživatele a přidat jeho veřejný klíč

  • pokud se jedná o ZFS, arcstorage uživatel musí mít na serveru passwordless sudo oprávnění aby mohly být příkazy zfs list a zpool list volány skrze SSH

  • atribut port je nastaven na číslo SSH portu

  • checksumCmd je volitelný atribut pro optimalizaci výpočtu checksumu MD5 a SHA512

  • není-li vyplněn, Archival Storage při výpočtu checksumu čte soubor z vzdáleného úložiště

  • je-li vyplněn, Archival Storage spouští uvedený příkaz v terminálu na serveru vzdáleného úložiště a pouze přebírá výstup¨

  • výstup příkazu musí být textový řetězec obsahující checksum

  • Archival Storage nahradí $filePath cestou k objektu jehož checksum ověřuje

ZFS

Defaultně může ZFS příkazy volat pouze root, pro povolení ostatním sudo uživatelům (arcstorage user) lze vytvořit zfs soubor v /etc/sudeoers.d, s následujícím obsahem:

Cmnd_Alias C_ZFS = \
    /sbin/zfs "", /sbin/zfs help *, \
    /sbin/zfs get, /sbin/zfs get *, \
    /sbin/zfs list, /sbin/zfs list *, \
    /sbin/zpool "", /sbin/zpool help *, \
    /sbin/zpool iostat, /sbin/zpool iostat *, \
    /sbin/zpool list, /sbin/zpool list *, \
    /sbin/zpool status, /sbin/zpool status *, \
    /sbin/zpool upgrade, /sbin/zpool upgrade -v
ALL ALL = (root) NOPASSWD: C_ZFS
  • k ZFS lze přistupovat lokálně nebo přes SSH, JSON konfigurace je obdobná jako v případě Lokální FS resp. Vzdálený FS, musí však navíc obsahovat poolName, tedy např. pro vzdálený ZFS:

  • „config“: „{"rootDirPath":"/opt/data/test","poolName":"arcpool"}“

Ceph

  • je nutné nainstalovat Ceph a RGW http://docs.ceph.com/docs/master/start/

  • instalace může zabrat několik hodin, vyžaduje infrastrukturu uzlů a administrátorský uzel z něhož jsou řízeny

  • dle CEPH RGW manuálu je vytvořen uživatel

  • Pro získání stavu Cephu musí RGW server umožnit SSH připojení aplikace (uživatel arcstorage, použit je stejný klíč jako v případě vzdáleného FS). Navíc musí mít tento uživatel na RGW serveru passwordless sudo práva, aby mohla aplikace skrze SSH zavolat příkazy ceph df a ceph -s

Příkladový JSON

{
    "name": "ceph",
    "host": "192.168.10.61",
    "port": 7480,
    "priority": 1,
    "storageType": "CEPH",
    "note": null,
    "config": "{\"adapterType\":\"S3\", \"userKey\":\"SKGKKYQ50UU04XS4TA4O\",\"userSecret\":\"TrLjA3jdlzKcvyN1vWnGqiLGDwCB90bNF71rwA5D\",\"sshPort\":2226,\"https\":\"true\"}",
    "reachable": true,
    "virtualHost": false,
    "id": "8c3f62c0-398c-4605-8090-15eb4712a0e3"
}
  • port je Ceph RADOS gateway port

  • config obsahuje

  • povinné properties

  • adapterType - v současnosti podpora pouze pro S3

  • userKey a userSecret - údaje použité pro přístup k Ceph S3 clusteru

  • properties které překrývají defaultní properties

  • https true/false

  • virtualHost true pokud mají být buckety na RGW instanci adresované skrze doménu místo cesty, viz https://docs.ceph.com/docs/mimic/radosgw/s3/commons/

  • region region, pokud je v Ceph instanci definovaný.. v některých verzích Ceph je tento atribut v API vyžadován nehledě na to zda je konfigurován v Ceph instanci, v tom případě použijte us-east-1

  • properties použité pro zjištění stavu Ceph úložiště, tyto lze využít pouze má li Archival Storage SSH přístup k Ceph serveru (což typicky nemá, poskytuje-li Ceph třetí strana)

  • sshServer a sshPort na kterém RGW instance naslouchá

  • cluster pokud běží v clusteru

  • cephBinHome cesta k ceph binárce

12.1.6. Lazení výkonu

Aplikační server

Požadavek na uložení má synchronní a asynchronní část. V synchronní části jsou vstupní soubory nahrány do workspace Archival Storage, zkontrolovány jejich kontrolní součty po přenosu a je zaznačen začátek zpracování. Následně je vlákno aplikačního serveru vráceno do poolu a požadavek je dále zpracováván asynchronně. Vlákna aplikačního serveru jsou konfigurovány v sekci server.tomcat. V případě že je počet vláken AS vyčerpán a fronty zaplněny, každý další požadavek končí chybou „Connection refused“.

Archival Storage

Archival Storage zamítne požadavek na jakýkoliv datový i metadatový update pokud velikost jeho workspace přesáhne konfigurovaný limit (503). Cestu do workspace i limit je možné konfigurovat v souboru application.yml: spring.servlet.multipart.location, arcstorage.tmpFolderUploadSizeLimit Např. pokud je průměrná velikost balíku 0.5GB, parametr je nastaven na 5GB a zrovna jsou exportovány čtyři balíky (z čtyř dávek), zbývá 3 GB pro 6 nových zápisů (z 6 dávek) přičemž 7. už povolen není, i kdyby bylo dostupných X vláken.

Vhodným nastavením parametru lze počet právě probíhajících zápisů a tedy zátěž Archival Storage rozumně limitovat a takto lze zajistit dostatečný výpočetní výkon pro odbavování exportů a chodu systému. V případě že limit není nastaven vůbec, může se workspace zaplnit natolik že nebude fungovat např. při exportu. Pokud limit není nastaven, Archival Storage zamítne požadavek pouze v hraničním případě kdy dojde místo na disku workspace (500). Všechny požadavky na uložení které nejsou zamítnuty jsou frontovány a postupně zpracovány.

Poznámka: Hodnota volného místa ve workspace musí být minimálně dvojnásobek velikosti vkládaného objektu.

Postgres

Vzhledem k tomu že jeden databázový server může využívat více aplikací, může lehce dojít k tomu že defaultní počet connections které poskytuje PostgreSQL (100) nebude stačit.

Konfigurace by měla být taková že PGSQL max_conn musí být větší než součet hodnot spring.datasource.tomcat.max-active všech připojených aplikací, je vhodné navíc ponechat pár connections volných pro případné ostatní klienty. V opačném případě může tomcat JDBC pool vyhodit při pokusu o získání connection chybu FATAL: sorry, too many clients already

Dále by mělo platit že spring.datasource.tomcat.max-active je větší než definovaný počet paralelních vláken aplikace, tedy aby každé vlákno mělo zajištěno jedno spojení z poolu. Počet paralelních vláken aplikace není pouze součtem server.tomcat.max-threads (vlákna AS pro synchronní zpracování) se všemi programátorem definovanými pooly (arcstorage.threadPools), navíc si je totiž aplikace schopna tvořit vlákna pro asynchronní zpracování dle potřeby. Aplikace si takto tvoří vlákna v případech kdy není vhodné aby byla limitována, např. při synchronním uložením AIP XML skrze GUI, při automatické opravě v případě že je zjištěna chyba při namátkové kontrole, při exportu do adresáře pro zálohování nebo při synchronizaci nového úložiště, při čištění úložiště od nekompletních uploadů apod. Ve většině těchto případů se jedná o jednorázové operace, i přesto je však vhodné nechat pro tyto operace pár desítek connections v rezervě.

K stabilitě systému přispívá že transakční je pouze část operací vlákna, vlákno tedy nedrží spojení po celou dobu svého běhu, přesto je vhodné dodržet výše zmíněná opatření a snažit se udržet vztah počet dostupných spojení > maximální počet souběžně běžících vláken.

12.1.7. Zálohování a obnova

Postup pro zálohování

Pro zálohování úložiště je použit backup endpoint (GET /api/administration/backup) který provede export všech nových objektů a nových stavových souborů existujících objektů zaznamenaných v daném časovém intervalu do adresáře specifikovaném v application.yml (arcstorage.backupDirPath). Volání vyžaduje autorizační header účtu s rolí ROLE_ADMIN (basic auth). Odpověď je vrácena ihned po kontrole možnosti zápisu/čtení do backup adresáře, samotný export poté probíhá asynchronně, průběh je zaznamenáván v logu. Administrátor ve větších časových intervalech provádí plnou zálohu, v menších intervalech provádí zálohu inkrementální. Za tímto účelem vytvoří na úrovni OS skript který backup endpoint periodicky provolává. Časový interval je zadán jako query param (since,until) v formátu odpovídajícím ISO-8601 formátu (nelze však zadat jakýkoliv ISO-8601 formát, časová značka musí být v UTC formátu s přesností alespoň na sekundy, volitelně milisekundy). Příklad: /api/administration/backup?since=2019-10-27T:16:16:40.700Z&until=2019-10-27T17:16:40Z. Oba parametry jsou volitelné, v případě nevyplnění není výsledek časově zdola/shora omezen. Nevyplnění ani jednoho parametru zodpovídá plné záloze.

Zálohu databáze Archival Storage doporučujeme provádět společně s zálohováním databází ostatních modulů systému nativní PostgreSQL utilitou pg_dump, pro následnou obnovu do předem vytvořené databáze lze použít pg_restore, příklad:

  • pg_dump -U postgres -W -F t {dbname} > backup.tar

  • pg_restore -U postgres –dbname={dbname} backup.tar

Postup při obnově

AIS očekává že v složce z které čte data k obnově jsou soubory uloženy přesně tak jak je v průběhu času exportoval do exportní složky. Takováto data jsou téměř zrcadlovým obrazem reálných dat zálohovaného logického úložiště. Při obnově je vytvořen v DB záznam pro FS/ZFS logické úložiště a rootDirPath je nastaven na složku obsahující všechna data k obnově.

Při obnově je potřebné vypnout script provádějící zálohování. Některé operace vyžadují systém v read-only režimu. Systém lze do režimu přepnout přímo editací tabulky arcstorage_system_state nebo skrze endpoint POST /api/administration/config

Níže jsou detailněji popsány způsoby obnovy dle situací které mohou nastat.

K dispozici je pouze záloha úložiště

  • 1.1 Je spuštěna aplikace, čímž se vytvoří defaultní záznam konfigurace systému.

  • 1.2) Je vytvořen záznam pro FS/ZFS logické úložiště, rootDirPath je nastaven na složku obsahující všechna data k obnově.

  • 1.3) Do DB je vložen nový záznam ADMIN účtu (tabulka arcstorage_user).

  • 1.4) Do DB je vložen nový záznam R/W účtu. Atribut dataspace se musí shodovat s atributem dataspace původního AIS systémového R/W účtu, respektive musí se shodovat s názvem kořenové složky exportované do exportní složky.

  • 1.5) Je volán endpoint POST /api/administration/recover_db?storageId={UUID logického úložiště} (ADMIN, při volání musí úložiště běžet v read-only režimu)

K dispozici je záloha DB i záloha úložiště

  • 2.1) DB je obnovena ze zálohy

  • 2.2) Je zajištěno že všechna exportovaná data jsou zkopírována do lokace rootDirPath dříve existujícího logického FS/ZFS úložiště.

  • 2.3) Je spuštěna aplikace, konfigurační hodnota arcstorage.cleanUpAtApplicationStart=false (application.yml)

  • 2.4) Pokud je záloha DB starší než záloha úložiště, je volán endpoint POST /api/administration/recover_db?storageId={UUID logického úložiště}&override=true (ADMIN, při volání musí úložiště běžet v read-only režimu)

  • 2.5) Je volán endpoint POST /api/administration/cleanup?all=true

  • 2.6) Pokud je záloha DB novější než záloha úložiště, je nastavena periodická kontrola systému tak aby proběhla nad všemi objekty. Tímto způsobem administrátor zjistí která data jsou na úložišti v nekonzistentním stavu a manuálně zasáhne buď do úložiště nebo databáze. Alternativně lze pro rychlejší detekci inkonzistence použít POST /api/administration/recover_db?storageId={UUID logického úložiště}&override=false - proces na konci loguje veškeré konfliktní objekty a objekty které jsou uloženy v DB ale nejsou na úložišti. Narozdíl od předchozího způsobu však nekontroluje kontrolní součty objektů jež konfliktní nejsou.

K dispozici je záloha úložiště, DB je aktuální

DB je aktuální (není obnovena ze zálohy, nebyla ztracena). Provedou se akce 2.2, 2.3, 2.5, 2.6 z předchozího scénáře.

12.1.8. Instalace v kontextu AIS

Pro instalaci v AIS je pro Archival Storage dodán samostatný instalační balíček.

Databáze je iniciována z DB dumpu arcstorageDump.bin který obsahuje:
  • záznamy AIP migrovaných archiválií (v tabulkách arcstorage_aip_sip a arcstorage_aip_xml)

  • defaultní hodnoty v tabulce arcstorage_system_state

  • jedno logické úložiště typu FS v tabulce arcstorage_storage (záznam v DB administrátor upraví aby odpovídal požadované lokaci migrovaných AIP, viz níže)

  • 3 systémové účty s rolemi ROLE_READ, ROLE_READ_WRITE, ROLE_ADMIN (opět se předpokládá úprava v DB administrátorem)

Kromě DB dumpu je dodán také soubor local-storage-folder.zip obsahující kompletní obsah úložiště po již provedené migraci (obsahuje AIP zaznamenané v arcstorageDump.bin) - extrahovat do složky úložiště nakonfigurované v DB (v dodaném dumpu se jedná o složku local-storage-folder v pracovním adresáři aplikace).

Dále jsou dodány tyto přílohy:

  • archival-storage.jar - zkompilovaná aplikace

  • application.yml - konfigurační soubor překrývající defaultní konfiguraci - vložit do pracovního adresáře aplikace. Jedná se o vzorový soubor, jednotlivé konfigurační hodnoty může být nutné upravit dle konkrétního prostředí.

  • arcstorageInitDump.bin - iniciální Archival Storage DB dump s předkonfigurovaným úložištěm a účty který je možné použít v rámci procesu migrace mezivýstupu z DB PEVA II do DB AIS