Incidentu reaģēšana

ClickHouse rezerves kopijas un atjaunošana: BACKUP, inkrementālās kopijas un S3 praksē

Replikas pasargā no bojāta diska, nevis no DROP TABLE, kas dažās sekundēs sasniedz visas replikas. Lūk, kā iestatīt ClickHouse rezerves kopijas, kuras patiešām var atjaunot, arī daudzterabaitu klasteros.

· 11 min lasīšanai · AG Data komanda

Strādājoša ClickHouse rezerves kopija ir tāda, kuru esat vismaz reizi atjaunojuši. ClickHouse ir iebūvētas BACKUP un RESTORE komandas, kas raksta uz lokālu disku, S3 vai Azure, atbalsta inkrementālās kopijas un darbojas fonā. Sākt ir vienkārši, un lielākā daļa īstā darba ir detaļās: kur kopijas glabājas, cik gara kļūst inkrementālo kopiju ķēde un vai atjaunošana iekļaujas jūsu atjaunošanas logā.

Pirmo punktu komandas izlaiž visbiežāk. ClickHouse dokumentācijā tas pateikts tieši: replikācija pasargā no aparatūras kļūmēm, bet nepasargā no cilvēku kļūdām, un daudzos gadījumos šādas kļūdas skar visas replikas. Nepareizs ALTER ... DELETE, DROP nepareizajā klasterī vai slikta migrācija tiek replicēta tikpat uzticami kā labs ieraksts.

1. solis: dodiet ClickHouse vietu, kur rakstīt kopijas

Lokālam vai piemontētam mērķim definējiet disku un atļaujiet to rezerves kopijām. Šī ir konfigurācija no oficiālā ceļveža, un tai vajadzīgs servera restarts:

<!-- /etc/clickhouse-server/config.d/backup_disk.xml, pēc tam restarts -->
<clickhouse>
    <storage_configuration>
        <disks>
            <backups>
                <type>local</type>
                <path>/backups/</path>
            </backups>
        </disks>
    </storage_configuration>
    <backups>
        <allowed_disk>backups</allowed_disk>
        <allowed_path>/backups/</allowed_path>
    </backups>
</clickhouse>

S3 gadījumā disks vispār nav vajadzīgs: S3() mērķis pieņem galapunktu un ceļu, piekļuves atslēgu un noslēpumu tieši komandā. Azure Blob Storage darbojas tāpat ar AzureBlobStorage(). Lokāls disks tajā pašā serverī ir tikai starpposms; kopija, kas atrodas uz tās pašas mašīnas, kuru tā aizsargā, nav rezerves kopija.

2. solis: izveidojiet pilnu kopiju un sekojiet tai

-- pilna vienas datubāzes rezerves kopija fonā
BACKUP DATABASE analytics
TO S3('https://s3.eu-central-1.amazonaws.com/acme-ch-backups/analytics/2026-11-12-full',
      '<key id>', '<secret>')
ASYNC;

-- atgriež id; sekojiet tam
SELECT id, name, status, num_files, uncompressed_size, compressed_size, error
FROM system.backups
ORDER BY start_time DESC
LIMIT 5;

Bez ASYNC komanda bloķējas, līdz kopija ir pabeigta, kas lielā datubāzē nozīmē klienta sesiju, kurai jāpaliek atvērtai stundām. Ar ASYNC tā uzreiz atgriež id. Tabulā system.backups statuss mainās no CREATING_BACKUP uz BACKUP_CREATED vai uz BACKUP_FAILED ar iemeslu kolonnā error. Atjaunošana ziņo RESTORING, RESTORED vai RESTORE_FAILED. Katra operācija tiek ierakstīta arī system.backup_log, un uz to jāreaģē jūsu monitoringam.

Var dublēt vienu tabulu, datubāzi vai ALL ar izņēmumiem, un sintakse atbalsta EXCEPT TABLES un EXCEPT DATA FROM TABLES, lai saglabātu definīciju bez rindām, piemēram, lielām starptabulām, kuras var izveidot no jauna.

3. solis: inkrementālās kopijas ar base_backup

Daudzterabaitu datubāzes pilna kopija prasa laiku un vietu, tāpēc parasti izmanto periodisku pilnu kopiju un inkrementālās kopijas. Inkrementālā kopija glabā tikai to, kas mainījies kopš kopijas, kas norādīta base_backup:

BACKUP DATABASE analytics
TO S3('https://s3.../analytics/2026-11-13-incr', '<key id>', '<secret>')
SETTINGS base_backup = S3('https://s3.../analytics/2026-11-12-full',
                          '<key id>', '<secret>')
ASYNC;

Āķis ir dokumentācijā: lai atjaunotu inkrementālo kopiju, vajadzīgas visas kopijas, uz kurām tā balstās. Ja kāds pievieno S3 dzīves cikla noteikumu, kas pēc 30 dienām dzēš pilno kopiju, katra uz to balstītā inkrementālā kopija kļūst nelietojama. Turiet ķēdi īsu, regulāri sāciet jaunu pilnu kopiju un ļaujiet glabāšanas politikai dzēst veselas ķēdes, nekad atsevišķus posmus.

Atjaunojiet blakus datiem, nevis pāri tiem. RESTORE atsakās rakstīt tabulā, kurā jau ir rindas. Iestatījums allow_non_empty_tables noņem šo pārbaudi, bet dokumentācija brīdina, ka tas var dublēt datus. Atjaunojiet ar jaunu nosaukumu, izmantojot AS, salīdziniet un tad apmainiet vai pārkopējiet vajadzīgo.

4. solis: atjaunošana, kas ir galvenais

-- atjaunojiet blakus oriģinālam, nekad pāri tam
RESTORE TABLE analytics.events AS analytics.events_restored
FROM S3('https://s3.../analytics/2026-11-13-incr', '<key id>', '<secret>');

-- tikai shēma, piem., lai atjaunotu tukšu struktūru
RESTORE DATABASE analytics FROM Disk('backups', 'analytics-full.zip')
SETTINGS structure_only = 1;

Atjaunošana ar jaunu nosaukumu ļauj pēc sliktas dzēšanas atgūt dažas partīcijas, neaiztiekot dzīvo tabulu. Ja atgūstaties pēc nejaušas masveida dzēšanas, mūsu piezīmes par rindu dzēšanu ClickHouse paskaidro, kāpēc vieglā dzēšana un mutāciju dzēšana uzvedas atšķirīgi, un tas ir svarīgi, izlemjot, ko kopēt atpakaļ. Iestatījumi, piemēram, restore_table_data un restore_access_entities, nosaka, ko atjaunošana atgriež; lietotāji, lomas un kvotas tiek iekļauti tikai tad, ja tie izveidoti ar SQL, nevis definēti users.xml.

Klasteri, vienlaicīgums un alternatīvas

Kas mainās daudzterabaitu datiem

Galvenās atziņas

ClickHouse Rezerves kopijas S3 Avārijas atjaunošana
Sadarbība ar mums

Neesat pārliecināti, ka ClickHouse kopijas atjaunosies?

Mēs projektējam un testējam ClickHouse rezerves kopijas un atjaunošanu produkcijas klasteriem, no S3 inkrementālajām kopijām līdz pilniem atjaunošanas mēģinājumiem ar izmērītu atjaunošanas laiku.

Sazināties Vairāk no emuāra