Tovább a tartalomhoz

Van biztonsági mentésed.
De mikor bizonyítottad, hogy visszaállítható?

Ütemezett visszaállítás eldobható sandboxba, a saját ellenőrzéseiddel, és minden bizonyításról aláírt bizonyítékrekord — mért visszaállítási idővel.

A probavi saját üzemeltetésű, adatbázismotortól független rendszer, amely folyamatosan bizonyítja, hogy az adatbázis-mentések visszaállíthatók, és minden bizonyítást aláírt, auditálható bizonyítékként rögzít, mért visszaállítási idővel.

Mentést nem készít. Azt a meglévő eszközeid már jól csinálják.

A „mentés sikeresen elkészült” szinte semmit nem bizonyít

Szekció neve “A „mentés sikeresen elkészült” szinte semmit nem bizonyít”

A mentések csendben romlanak el. Sérülés az átvitel közben. Hiányzó WAL- vagy binlog-szegmens. Verzióeltérés, ami csak visszaállításkor derül ki. Titkosítókulcs, amit senki nem őrzött meg. Hónapok szorgos mentése — a rossz adatbázisról.

Mindegyik átmegy a mentési feladaton, és megbukik a visszaállításon; a hiba pedig pont abban a pillanatban jelentkezik, amikor a legkevésbé engedheted meg. Közben a „van mentésünk” válaszként elfogadott. Csakhogy nem arra a kérdésre válasz, ami számít: mikor állítottál vissza utoljára egyet?

A drill a munka egysége: egy adatbázis egyetlen ütemezett visszaállításának igazolása.

  1. 1LétrehozásEldobható, elszigetelt futtatókörnyezet: konténer, Kubernetes Job vagy egy gép közvetlenül, SSH-n.
  2. 2VisszaállításEgy adapter valódi mentés valódi visszaállítását végzi, a motor saját eszközeivel.
  3. 3EllenőrzésA visszaállított adatbázison ellenőrzések futnak, az „elindult-e?” kérdéstől a saját SQL-edig.
  4. 4RögzítésEgyetlen aláírt rekord kerül a bizonyítéknaplóba, a sandbox pedig megsemmisül.
A két időtartam külön kerül rögzítésre, így a szám, amihez a helyreállítási célidőd mérve van, nem az ellenőrzésektől lesz nagyobb. Több drillen át követve jóval azelőtt kezd romlani, hogy átlépné a küszöböt.

A mag semmit nem tud a pg_dump-ról, a WAL-szegmensekről vagy a binlogokról. Minden motorspecifikus lépés az adapterben él — egy közönséges külső folyamatban, dokumentált protokollal, amit bárki megírhat bármilyen nyelven.

A lebontás kényszerített, a hibaágakon is. A sandboxban éles adat van, így a megsemmisítéséből semmi nem marad a szerencsés ágra.

Semmit nem kell mellé telepíteni, semmit nem kell életben tartani két drill között, és az adatbázis-kiszolgálókon nincs ügynök.

  1. cron vagy systemd timerAmi már úgyis fut a gépeiden. A Probavihoz nem tartozik ütemező, és nem fut saját szolgáltatása.
  2. probavi runEgy drill, zárolófájllal és időkorláttal. A lebontás kényszerített, a hibaágakon is.
  3. Amit maga után hagy
    • Egy aláírt bizonyítékrekord
    • Egy Prometheus-textfile
    • Egy aláírt webhook, ha kéred

Kilépési kód

0
backup proven restorable
1
recoverability failure (backup, restore, or check)
2
infrastructure error or cancelled
3
usage or setup error
5
evidence record could not be written
A Probavi a középső doboz. Ami elindítja, és ami az eredményt olvassa, olyasmi, ami már fut nálad — ezért nincs itt semmi, amit két drill között életben kellene tartani, és nincs mit telepíteni magukra az adatbázis-kiszolgálókra.

Ettől lesz a folyamatosan több egy határozószónál. Az a visszaállítás, amit akkor futtatsz, amikor eszedbe jut, gyakorlat; az, amelyik akkor is lefut, ha senkinek nem jut eszébe, rekord — és a helyreállíthatóság története pontosan annyit ér, ahány drill kérés nélkül futott le.

A kilépési kód a szerződés, és szétválasztja azt a két hibát, ami számít. Az a mentés, amelyik nem állt vissza, nem ugyanaz az esemény, mint egy leállt konténer-futtatókörnyezet, és az a riasztási szabály, amelyik nem tudja megkülönböztetni őket, egy hónapon belül el lesz némítva. Mindkettő rögzül: a hiba is a drill egyik kimenetele, nem hiányzó sor a naplóban.

Egy teljes DR game-day is így fut. A probavi gameday függőségi sorrendben veszi a game-day tagjait, és mindegyik a saját aláírt rekordját hagyja maga után: az évi egyszeri, runbookkal töltött délutánból egyetlen ütemezett sor lesz.

Visszaállítási tesztet futtatni másolható funkció. A helyreállíthatóság folyamatosan karbantartott, kriptográfiailag ellenőrizhető története nem az.

{
"adapter": {
"digest": "sha256:4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c",
"name": "postgres",
"protocol": "probavi-adapter/0",
"version": "0.1.0"
},
"backup": {
"checksum": "sha256:9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f",
"created_at": "2026-07-30T01:58:02.000Z",
"kind": "pgdump",
"size_bytes": 565248
},
"checks": [
{
"detail": "accepting connections",
"name": "service_healthy",
"ok": true
},
{
"detail": "100000 rows (min 100000)",
"name": "row_count:orders",
"ok": true
}
],
"drill": {
"config_hash": "sha256:7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d",
"name": "prod-orders-db",
"pitr_target": "2026-07-30T14:32:00.000Z"
},
"env": {
"arch": "amd64",
"host_id": "3f7a9c2e5b1d8e04",
"os": "linux",
"probavi_digest": "sha256:1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d",
"probavi_version": "0.1.0"
},
"error": null,
"outcome": "pass",
"prev_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
"sandbox": {
"params": {
"image": "postgres:16",
"memory": "2GiB"
},
"provider": "docker"
},
"schema": "probavi-evidence/2",
"seq": 1,
"sig": {
"alg": "ed25519",
"key_id": "56475aa75463474c",
"sig_b64": "/f2ahJgj08qDVSvbTIZ/+XI7IfkCavp0WfS7ETIezC+E2PMzFzEmX/G8d4d+S42Q9ZegQDU8aMKJTBb/gS5KDQ=="
},
"timings_ms": {
"engine_ready": 1166,
"provision": 1170,
"restore": 190,
"total": 2840,
"transfer": 110,
"validate": 61
},
"ts": "2026-07-31T02:00:11.482Z"
}

Valódi rekord a formátum közzétett példanaplójából, olvashatóság kedvéért újratördelve — a lemezen egyetlen kanonikus sor, és az aláírás arra a formára vonatkozik.

Aláírva ezzel:03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8

A rekordok láncba fűződnek: mindegyik hordozza az előtte lévő SHA-256 lenyomatát, és mindegyik ed25519-cel aláírt. A napló csak bővíthető — a Probaviban nincs olyan kód, amely már létező rekordot átírna vagy törölne.

rekord 1bizonyítottan visszaállíthatókezdőrekord — nincs előzménye
rekord 2helyreállíthatósági hibaprev_hash 30c0e1b670…
rekord 3hiba a drill soránprev_hash 1fab7db153…
  • minden rekord hordozza az előző rekord lenyomatát
  • egy rekord módosítása után minden utána következő láncszem érvénytelen
A formátum közzétett példanaplója, teljes egészében — egy siker, egy bukás és egy hiba. Az a napló, amely csak sikereket rögzít, semmit nem bizonyítana.

Mindennek az ellenőrzéséhez a naplófájl és egy nyilvános kulcs kell. Nem kell hálózat, nem kell licenc, és még Probavi-telepítés sem, mert a formátumhoz önállóan kiadott ellenőrző program tartozik. A bizonyíték ellenőrzése soha nem fizetős. Egy terméknél, amelynek a kimenete maga a bizonyíték, ez nem árazási kérdés.

Motorfüggetlen — és ez miért tartható

Szekció neve “Motorfüggetlen — és ez miért tartható”

Két cserélhető tengely egy olyan mag két oldalán, amely sem adatbázisról, sem konténer-futtatókörnyezetről nem tud semmit.

Motoradapterek
Apache Cassandracassandra
ClickHouseclickhouse
CouchDBcouchdb
DuckDBduckdb
Elasticsearchelasticsearch
etcdetcd
Firebirdfirebird
H2h2
InfluxDBinfluxdb
MariaDBmariadb
MongoDBmongodb
SQL Servermssql
MySQLmysql
Neo4jneo4j
OpenSearchopensearch
Oracle Databaseoracle
PostgreSQLpostgres
Prometheusprometheus
Qdrantqdrant
Redisredis
Apache Solrsolr
SQLitesqlite
Valkeyvalkey
VictoriaMetricsvictoriametrics
MagVezényel, mér, aláír. Nem ismer sem motort, sem futtatókörnyezetet.
Bizonyítéknapló
Sandbox-szolgáltatók
Dockerdocker
Kubernetes Jobk8s
Bare host over SSHremotehost
Egy motor vagy egy futtatókörnyezet hozzáadása soha nem nyúl a maghoz — ezért is írhat adaptert bárki, bármilyen nyelven. Mindkét oszlop a képességmanifestből rajzolódik, tehát azt sorolja fel, ami ténylegesen elérhető.
  • 24motoradapter
  • 3sandbox-szolgáltató
  • 5ellenőrzéstípus
  • 8CLI-parancs
  • 24CLI-nyelv
  • 4verziózott specifikáció

Motorok. Az „Ellenőrizve ezeken” pontosan azt jelenti, amit mond: azokat a verziókat, amelyekből a projekt integrációs tesztje minden futáskor visszaállít. Nem támogatott verziótartomány, és a projekt nem is állít ilyet.

MotorEllenőrizve ezekenForrásokIdőpontra visszaállítás (PITR)
Apache Cassandra4.1, 5.0cassandra_snapshot cassandra_snapshot_dir cassandra_snapshot_tar
ClickHouse26.3, 26.7clickhouse_backup clickhouse_backup_dir
Apache CouchDB3.5.2, 3.4.3couchbackup couchbackup_dir couchdb_data couchdb_data_tar
DuckDB1.4, 1.5duckdb_db duckdb_db_dir duckdb_export
Elasticsearch8.19.20, 9.5.2elasticsearch_repo elasticsearch_repo_zip
etcd3.5, 3.6, 3.7etcd_snapshot etcd_snapshot_dir
Firebird5.0.4, 4.0.7firebird_gbak firebird_gbak_dir
H22.4.240, 2.3.232h2_backup h2_backup_dir h2_db h2_db_dir
InfluxDB2.7, 2.8, 2.9influx_backup influx_backup_dir influx_backup_tar
MariaDB10.11, 11.4, 11.8, 12.3mariadb_backup mariadb_dump mariadb_dump_dir
MongoDB7.0, 8.0mongodump mongodump_dir mongodump_with_oplog mongodump_with_users
Microsoft SQL Server2019, 2022, 2025bak bak_chain bak_dir bak_with_logins
MySQL8.4, 9.7Variáns image: percona/percona-server:8.4.10mysqldump mysqldump_dir mysqldump_with_users xtrabackup
Neo4j5.26neo4j_dump neo4j_dump_dir
OpenSearch2.19.6, 3.8.0opensearch_repo opensearch_repo_tar
Oracle Database23.26.3.0oracle_datapump
PostgreSQL14, 15, 16, 17, 18Variáns image: pgvector/pgvector:0.8.6-pg17Variáns image: timescale/timescaledb:2.29.1-pg17Variáns image: postgis/postgis:17-3.5pgbackrest pgdump pgdump_dir pgdump_with_globals timescaledb_dump timescaledb_dump_dirIgen
Prometheus3.13prometheus_snapshot prometheus_snapshot_dir prometheus_snapshot_tar
Qdrant1.19.0, 1.18.1qdrant_full_snapshot qdrant_full_snapshot_dir qdrant_snapshot qdrant_snapshot_dir
Redis7.2, 7.4, 8.2, 8.10redis_aof redis_rdb redis_rdb_dir
Apache Solr10solr_backup solr_backup_dir solr_backup_tar
SQLite3.46, 3.49, 3.50, 3.51, 3.53sqlite_db sqlite_db_dir sqlite_dump sqlite_dump_dir
Valkey7.2, 8.0, 8.1, 9.0, 9.1valkey_aof valkey_rdb valkey_rdb_dir
VictoriaMetrics1.150victoriametrics_backup victoriametrics_backup_dir victoriametrics_backup_tar

Sandboxok. Ahol a visszaállítás történik, és amit garantálunk róla.

  • docker — Docker nincs publikált portkényszerített lebontás
  • k8s — Kubernetes Job nincs publikált portkényszerített lebontás
  • remotehost — Bare host over SSH nincs publikált portkényszerített lebontás

Ellenőrzések. Amit egy drill állíthat a visszaállított adatbázisról.

  • service_healthy — Engine answers the adapter's healthcheck
  • table_exists — Table exists and is queryable
  • row_count — Row count within bounds
  • freshness — Newest row younger than a maximum age
  • sql — Custom SQL assertion (a saját állításod)

Parancsok. A bináris teljes felülete.

  • probavi run
  • probavi gameday
  • probavi push
  • probavi evidence verify
  • probavi evidence keygen
  • probavi adapter probe
  • probavi adapter conformance
  • probavi version

Specifikációk. A bináristól függetlenül verziózva, így egy integráció szerződésre építhet, nem kiadásra.

A határok az ajánlat részei, ezért ki vannak mondva, nem sejtetve.

  • Probavi takes no backups. It verifies backups produced by other tools — pgBackRest, wal-g, Barman, mysqldump and their equivalents — which are its foundation, never its competitors.
  • Probavi ships no scheduler and no daemon of its own. Drills are started by cron or a systemd timer, with a lock file and a timeout.
  • Probavi runs no agent or daemon on database hosts.
  • Probavi manages no secrets. It reads credentials from environment variables or files for the duration of one drill, and redacts them from logs and evidence.
  • Probavi has no telemetry and never phones home. It is a trust product; that is not negotiable.
  • Probavi ships no web interface. The shipped surfaces are the command line, a Prometheus textfile, and webhooks.

A mentési eszközeidre épül, nem ellenük

Szekció neve “A mentési eszközeidre épül, nem ellenük”
A saját mentési eszközeid
pg_dumppgBackRestmysqldumpxtrabackupmariadb-backupmongodumpcouchbackupBACKUP DATABASEexpdpgbakBACKUP … TO Filenodetool snapshotneo4j-admin database dumpetcdctl snapshotredis-cli --rdbvalkey-cli --rdbsqlite3 .backupEXPORT DATABASEBACKUP TO_snapshotaction=BACKUP/snapshotstsdb/snapshotinflux backupvmbackup
Jók abban, amit csinálnak. A Probavi egyiket sem váltja ki.
Probavi-drillVisszaállítás sandboxba, ellenőrzés, mérés, lebontás.
Aláírt bizonyítékHálózat nélkül ellenőrizhető bárkinek, akinél a nyilvános kulcs van.
A Probavi felé mutató nyíl a meglévő eszközeidből indul. Az, hogy alapnak tekintjük őket és nem versenytársnak, tartós döntés, nem egy szakasz, amit a projekt ki akar nőni.

Ezért is érdemes saját üzemeltetésben. Menedzselt visszaállítási teszt létezik az egyes felhőökoszisztémákon belül, a vállalati mentőrendszerek pedig virtuálisgép-szinten ellenőriznek. Egyik sem segít egy vegyes, saját gépeken futó adatbázisparkon.

Visszaállítási teszt, amit meg is lehet mutatni

Szekció neve “Visszaállítási teszt, amit meg is lehet mutatni”

A DORA, a NIS2 és a NIST üzletmenet-folytonossági útmutatói egyaránt azt várják el, hogy a helyreállítási képesség tesztelt és dokumentált legyen, ne pusztán beállított. Az automatizált drillek pontosan ezt állítják elő: dátumozott, aláírt rekordokat arról, mit állítottunk vissza, mennyi ideig tartott, és mit ellenőriztünk az eredményen.

Nyitott mag — és ami nyitott is marad

Szekció neve “Nyitott mag — és ami nyitott is marad”

A teljes ellenőrzési hurok nyílt forráskódú, Apache-2.0 alatt, és az is marad: drillek és game-dayek, adapterek, sandbox-szolgáltatók, ellenőrzések, bizonyítékok előállítása, bizonyítékok ellenőrzése, a parancssor, a metrikák. Bárki bizonyíthatja, hogy a mentései visszaállíthatók, határidő nélkül, engedélykérés nélkül. A specifikációk és a független ellenőrző program ugyanezért nyilvánosak — az a bizonyíték, amit csak az előállítója tud ellenőrizni, nem bizonyíték.

A binárisban semmit nem old fel hálózati hívás. Ha valaha licenckulcsot kér, az ed25519-cel aláírt token, amit kapcsolat nélkül ellenőriz — egy termék, amely azt ígéri, hogy soha nem küld haza adatot, a saját számlázásával sem tehet kivételt.

Egy drill egy fájl:

drill.yaml
target:
name: prod-orders-db
adapter: postgres
source:
kind: pgdump
path: /backups/orders/latest.dump
sandbox:
provider: docker
params:
image: postgres:16
timeout: 30m
checks:
- builtin: service_healthy
- builtin: row_count
table: orders
min: 100000
evidence:
path: /var/lib/probavi/evidence.jsonl
sign_key: /etc/probavi/ed25519.key

Azután drillenként egy parancs, és egy a napló ellenőrzésére:

Terminal window
$ probavi run --config drill.yaml
{"outcome":"pass","seq":42,"evidence_path":"/var/lib/probavi/evidence.jsonl","checks_passed":3,"checks_total":3,"restore_ms":252400,"total_ms":318900}
$ probavi evidence verify --log /var/lib/probavi/evidence.jsonl --key probavi.key.pub
{"status":"VALID","records":42,"damaged_lines":[],"failed_line":0,"reason":"","head":{"seq":42,"hash":"sha256:1a8f736d2f4350385693385d203799f88721db4f4fd5056d6ceb028088127268"}}

A forráskódban ott a gyorsindító, a specifikációk és a fentiek manifestje.