Сақтық көшірме және қалпына келтіру
Notarium-ның сақтық көшірмесі — сырттан файл көшіру емес, образдың кіріктірілген пәрмені. notarium backup қызмет жұмысын жалғастырып тұрған кезде логикалық ZIP жинайды: оқу үнемі қолжетімді, ал жазу небәрі екі қысқа бақылау нүктесінде ғана тежеледі. Керегі — Docker пен жұмыс істеп тұрған контейнер; қызметті тоқтатудың қажеті жоқ.
meta.db файлын көшірмеңізcp /data/meta.db — сақтық көшірме емес. Метадеректер дерекқоры WAL режимінде жұмыс істейді: коммит болған жолдар әлі meta.db-wal ішінде жатуы мүмкін, ал бір-бірлеп көшірілген файлдар бір ғана сәттің снапшоты бола алмайды. Осындай көшірмеден қалпына келтірілген дана деректерін үнсіз жоғалтады.
Сақтық көшірме алу
docker compose exec -T notarium backup > notarium-20260731.zip
Бұл — «жұмыс істей ме?» дегенді тексеру емес, толыққанды сақтық көшірме: пәрмен архивті жинайды, оны өз верификаторымен тексеріп шығады және содан кейін ғана байттарды береді. -T жалаушасы міндетті: онсыз Compose псевдотерминал бөледі, ал бинарлық ағын ол арқылы бүлінбей өте алмайды — архив ақаулы болып шығады. Жалаң docker exec әдепкіде псевдотерминал бөлмейді, сондықтан онда бұл жалаушаның қажеті жоқ. Стандартты шығыс ағыны тек ZIP байттарына арналған; барыс туралы хабарлар мен қорытынды түйіндеме stderr-ге кетеді және архивті бүлдірмейді.
Жоспарлы тапсырма үшін
> арқылы қайта бағыттаудың бір тұзағы бар: түпкілікті атауы бар файл пәрмен әлі ешқандай жұмыс істемей жатып-ақ жасалып қояды. Docker немесе сақтық көшірме жарты жолда құласа, каталогта атауы дұрыс, мазмұны шала файл қалады. Төменде — ақаулық кезінде де қауіпсіз жариялау реті: уақытша файлға жазамыз, дискіге түсіреміз және атомарлы қатты сілтемемен жариялаймыз.
backup="notarium-$(date -u +%Y%m%dT%H%M%SZ).zip"
partial="${backup}.partial.$$"
set -eu
umask 077
committed=0
cleanup() { test "$committed" -eq 1 || rm -f "$partial"; }
trap cleanup EXIT
docker compose exec -T notarium backup > "$partial"
sync -f "$partial"
sync -f "$(dirname "$backup")"
committed=1
ln "$partial" "$backup"
if sync -f "$(dirname "$backup")"; then
if rm "$partial"; then
sync -f "$(dirname "$backup")" ||
echo "backup warning: final is durable; partial cleanup fsync failed" >&2
else
echo "backup warning: final is durable; retaining recovery partial $partial" >&2
fi
else
echo "backup warning: final is visible; retaining durable recovery partial $partial" >&2
fi
trap - EXIT
Docker немесе сақтық көшірме қате қайтарса, set -e архивті жариялауға жол бермейді. Уақытша атауда PID бар, сондықтан қатар жүрген екі тапсырма бір файл үшін таласпайды. Уақытша файл да, оның каталогы да жариялау нүктесіне дейін дискіге түседі, ал жариялаудың өзі — ештеңені қайта жазбайтын атомарлы қатты сілтеме: мақсатты атауы бірдей екі тапсырма бірін-бірі баспайды.
Жариялау нүктесінен кейінгі ақаулар — жалған сәтсіздік (қатемен аяқталу) емес, ескерту: түпкілікті файл орнында, ал күмәнді жағдайларда уақытша файл қосалқы көшірме ретінде сақталады. Тіпті ln-нің екіұшты нөлдік емес коды да оны сақтап қалады: сілтеме процесс үзілер алдында жасалып үлгерген болуы мүмкін. umask 077 архивті тек иесі ғана оқитындай етеді. Уақытша файл мен түпкілікті файлды бір файлдық жүйеде ұстаңыз.
Жалаң docker run арқылы notarium атымен көтерілген контейнерде де бәрі дәл осылай — бір ғана жол өзгереді:
docker exec notarium backup > "$partial"
Жоғарыдағы орауыш stdout-транспорт файлды өзі жариялай алмайтындықтан керек. Архивтерге арналған каталог бұрыннан тіркелген болса — сақтық көшірмеге арналған желілік бөлім, NFS, түбір тек оқуға тіркелген кездегі уақытша (scratch) том, — дәл сол жұмысты backup --output /жол/архив.zip атқарады: мақсатты файлдың қасына уақытша файл жазады, дискіге түсіреді, тексереді және ештеңені қайта жазбайтын атомарлы қатты сілтемемен жариялайды, ал қате шықса мақсатты атаумен ештеңе қалдырмайды. Ондайда shell-орауыштың қажеті болмайды, ал stdout-қа бір ғана JSON-түйіндеме кетеді.
Пәрмен бөлек контейнермен емес, сервері бұрыннан жұмыс істеп тұрған контейнерде docker exec арқылы орындалады: тұтас снапшот алу үшін оған тірі қосымшамен келісіп алу қажет.
Сақтық көшірме сәтсіз болуы мүмкін жағдайлар
Сақтық көшірме тұтастығы бұзылған архивті үнсіз бермейтіндей етіп құрылған: снапшот алынбаса, пәрмен қатемен аяқталады да, ештеңе жарияламайды. Мұның екі жағдайы бар:
- Түзетулердің үзілмейтін ағыны. Архив жиналып жатқанда деректер орнында тұруға тиіс; қабаттасқан жазу қайталауды тудырады, ал түзетулер шексіз ағып жатса, пәрмен қатемен бас тартады. Іс жүзінде бұл белсенді данада кездеседі — кейінірек қайталай беріңіз.
- Ұзақ импорт немесе экспорт жүріп жатыр. Сақтық көшірмеге жазудағы екі өте қысқа үзіліс керек, ал ұзақ тапсырма оларға сыймайды. Сақтық көшірмені жаппай импортпен бір терезеге қоймаңыз.
Екі жағдайда да қызмет зардап шекпейді: жазу кезегі бірден босайды, операторлық пәрмен қосымшаны ұстап тұрмайды. Кәдімгі оқу қалай болғанда да сақтық көшірме жұмыс істеп тұрған уақыттың бәрінде қолжетімді.
Архивтің ішінде не бар
| Архивтегі жол | Бұл не |
|---|---|
data/meta.db | Есептік жазбалар, сессиялар, мүшелік, тұрақты идентификаторлар, нұсқалар тарихы және тапсырмалардың күйі. |
data/spaces/ | Markdown шындық көзі, оның ішінде агент жады мен жобалардың маркер-файлдары. |
data/jobs/ | Дайын артефактілер және импорттың тұрақты жүктеп салулары. |
manifest.json | Формат нұсқасы, уақыт белгісі, каталогтардың нақты жиынтығы, әр файлдың өлшемі, mtime және SHA-256 мәні. |
Туынды data/engine/ каталогы архивке кірмейді: индекстер қалпына келтіруден кейін файлдардан қайта құрастырылады. Аяқталмаған файлдардың ішінен тек қызметтіктері ғана өткізіліп жіберіледі — жазбаларды атомарлы жазудың уақытша файлдары, толық жүктеліп бітпеген импорт жүктеп салулары және экспорт артефактілерінің бөліктері. Атауы .part-пен аяқталатын кәдімгі пайдаланушы файлдары архивте қалады: олар заңды.
ZIP метадеректер дерекқорындағы есептік жазбаларды және сессиялардың күйін алып жүреді. Оны құпия ретінде сақтаңыз: жоғарыдағы сниппеттегі umask 077 жаңа архивті тек иесі ғана оқитындай етеді.
Тексеру
Тексеру ештеңені өзгертпейді және әр сақтық көшірме тапсырмасының бөлігі болуға тиіс:
docker compose exec -T notarium backup verify < notarium-20260722.zip
# жалаң docker run үшін:
docker exec -i notarium backup verify < notarium-20260722.zip
Сәтті өткенде пәрмен бір ғана JSON-түйіндеме басып шығарады да, нөлдік кодпен шығады. Мыналар қабылданбайды: қауіпсіз емес және қайталанатын жолдар, манифестте есепке алынбаған файлдар, каталогтардың дәл келмейтін жиынтығы, өлшемдер мен хештердің алшақтығы, уақыт метадеректерінің қателігі, лимиттерден асып кету және SQLite тұтастығын тексеруден өтпеу. Бұл кезде тірі деректер каталогы оқылмайды да, өзгермейді де.
Хештер кездейсоқ бүлінуді ұстайды, бірақ әдейі алмастырудан қорғамайды: мазмұнды да, манифестті де ауыстыра алатын адам тексеруден өтеді. Сақтық көшірмелер қоймасын қолжетімділігі шектеулі сенімді күй деп есептеңіз немесе архивті тасымалдайтын қабатқа қолтаңба не шифрлау қосыңыз.
Қалпына келтіру
Қалпына келтіру — офлайн апаттық операция. Ол тек таза, бос деректер түбірін ғана қабылдайды әрі ешқашан бар данамен бірікпейді, оны қайта жазбайды.
Жаңа том дайындаңыз да, қызметті соған іске қосардан бұрын ауыстырыңыз:
set -eu
docker compose stop notarium
# ескі томды шетке алыңыз; compose-та бос /data тіркеңіз
docker compose run --rm --no-deps -T notarium restore \
< notarium-20260722.zip
docker compose up -d --force-recreate --no-deps notarium
Одан кейін контейнерді дәл қайта жасау керек: docker compose start ескі контейнерді ескі тіркеу конфигурациясымен көтерер еді. Қалпына келтірілген дананы тексергенше ескі томды сақтап қойыңыз.
Қалпына келтіру орнатудың алдында бүкіл архивті түгел тексеріп шығады. Егер процесс орнатудың ортасында үзілсе, артында айқын маркер қалады: ондай мақсатты бір реттік деп есептеңіз де, «күшпен аяқтаудың» немесе біріктірудің орнына жаңа бос мақсатқа қалпына келтіріңіз.
Қалпына келтіргеннен кейін нені тексеру керек:
- Сақтық көшірмедегі есептік жазбамен кіру.
- Бірнеше кеңістікті ашып, адрестер мен идентификаторлардың орнында екеніне көз жеткізу.
- Түзетілген жазбаны ашып, оның тарихын қарау.
- Жүктеп салулары немесе артефактілері өзіңізге маңызды импорт және экспорт тапсырмаларын тексеру.
Қалпына келтірілетін метадеректер дерекқоры мақсатты жинақ қабылдайтын миграциялар тізілімін алып жүруге тиіс. Тізілімі жоқ бос емес дерекқор жабық күйде құлайды — қалпына келтіру оның нұсқасын болжамайды және белгіні өзі қоймайды. Дерекқор бөлімін қараңыз.
Қолданылу шекаралары
Кіріктірілген пәрмен тек каноникалық орналасуды ғана қолдайды: біртұтас деректер түбірі және SQLite файлындағы метадеректер дерекқоры. Егер META_DB_URL Postgres-ке сілтесе немесе жазбалар DATA_DIR-дан тыс жатса, пәрмен ішінара архив берудің орнына жабық күйде құлайды: мұндайда өз дерекқорыңыздың штаттық құралдарын және тіркелген каталогтардың снапшоттарын пайдаланыңыз.
Сақтық көшірме мен тексерудің аралық файлдары әдепкіде /tmp ішінде жатады. Ағындық сақтық көшірме жарияламай тұрып өзін-өзі тексереді, сол себепті оған архивке қоса жайып шығарылған екі стейджге уақытша орын қажет болуы мүмкін; жеке тексеруге — архив пен бір стейдж. Қалпына келтіру кіріс ағынын уақытша каталогта буферлейді, ал архивті тікелей жаңа деректер түбірінің өзіне жаяды. Егер контейнердің түбірі тек оқуға тіркелген болса немесе деректеріңіз көп болса, NOTARIUM_BACKUP_TMPDIR айнымалысын жазуға рұқсаты бар тіркелген каталогқа бағыттаңыз.
Сығылған және жайып шығарылған кіріс 64 ГиБ пен бір миллион элементпен шектелген; атаулар, ZIP-тің қызметтік құрылымдары және manifest.json үшін бөлек 32 МиБ жад лимиті бар. Сенімді ірі инсталляциялар NOTARIUM_BACKUP_MAX_BYTES, NOTARIUM_BACKUP_MAX_ENTRIES және NOTARIUM_BACKUP_MAX_METADATA_BYTES мәндерін көтере алады — Орта айнымалылары бетін қараңыз.
Әрі қарай
- Образ CLI — пәрмендердің, ағындардың және шығу кодтарының толық келісімі.
- Дерекқор — метадеректер дерекқоры нақты нені сақтайды және оны неге сақтық көшірмесіз қалдыруға болмайды.
- Өнімдік орта — кері прокси, «бір дана» инварианты, эксплуатация.