
Bir veritabanı varsa burada konuşulacak ilk üç maddeden birisi mutlaka backup restore politikalarıdır. Clickhouse datağıtık mimaride çalışmakta ve replikalar ayarlanabilmektedir, replikalar bir sunucuda gerçekleşecek donanım arızası vb. hatalara karşı datalara koruma sağlasada, insan hataları vb. durumlara koruma sağlayamazlar, dolayısıyla backup ve restore politikası replika olsada çok önemlidir.
Backup poltikası için öncelikle backup lar nereye alıncak bnunun belirlenmesi gerekmektedir, ClickHouse tarafında bu konu ile ilgili bir çok alternatif bulunmaktadır, burada biz en basitinden mount olmuş bir disk alanı için öncelikle backup ve restore durumlarını konuşuyor olacağız, sonrasında ise S3 storage alanına br backet içerisine backup nasıl alır buradan nasıl restore ederiz konularını inceleyeceğiz. Backup disk tanımı için;
Backup için bir disk label oluşturduk. (storage_configuration.xml
içerisinde), ve ayrıca bu tanımladığımız disk alanına backup alabilmemiz için backup izinlerini de tanımlamamız gerekmektedir. Burada dikkat edilmesi gereken önemli bir nokta , cluster seviyesinde database , table vb. Backup ve restore için ortak (shared storage) alan tanımlamamız gerekmektedir.
<clickhouse>
<storage_configuration>
<disks>
<dbdata>
<type>local</type>
<path>/data01/clickdata1/</path>
</dbdata>
<backup>
<type>local</type>
<path>/data01/backup/</path>
</backup>
</disks>
<policies>
<dbdata> <!-- name for new storage policy -->
<volumes>
<dbdata>
<disk>dbdata</disk>
</dbdata>
<old>
<disk>default</disk>
</old>
</volumes>
</dbdata>
</policies>
</storage_configuration>
<backups>
<allowed_disk>backup</allowed_disk>
<allowed_path>/data01/backup/</allowed_path>
</backups>
</clickhouse>
ClickHouse backupları
- Full ve Incremental alınabilir
- Backuplar database seviyesinde olabileceği gibi , tablolar Materialized View lerin, dictionary lerin backuplarıda ayıra alınabilir.
- Backuplar Sync (default) veya Async olarak alınabilmektedir.
- Backuplar sıkıştırılabilir.
- Backuplar şifreli olarak alınabilir.
Genel Backup Komutu aşağıdaki gibidir.
BACKUP|RESTORE
TABLE [db.]table_name [AS [db.]table_name_in_backup]
[PARTITION[S] partition_expr [,...]] |
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
DATABASE database_name [AS database_name_in_backup]
[EXCEPT TABLES ...] |
TEMPORARY TABLE table_name [AS table_name_in_backup] |
VIEW view_name [AS view_name_in_backup]
ALL TEMPORARY TABLES [EXCEPT ...] |
ALL DATABASES [EXCEPT ...] } [,...]
[ON CLUSTER 'cluster_name']
TO|FROM File('<path>/<filename>') | Disk('<disk_name>', '<path>/') | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')
[SETTINGS base_backup = File('<path>/<filename>') | Disk(...) | S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')]
Bir database için backup alalım, backup almadan önce tablo row-count kontrolü yapalım , sonra drop edip restore edeceğiz restore sonrası bir kontrol daha yapacağız.
SELECT count(*)
FROM test.hits_dst
Query id: 0d9ee734-4c41-4e5a-a47a-de2b0ed19550
┌──count()─┐
│ 99997497 │
└──────────┘
clickhouse-client -u clickadmin --password Parola123 --time --receive_timeout 9999 --send_timeout 9999 --query "backup DATABASE test TO Disk('backup', 'test_database.zip')"
clickhouse-client -u clickadmin --password Parola123 --time --receive_timeout 9999 --send_timeout 9999 --query "backup DATABASE hits TO Disk('backup', 'test_database.zip')"
434a4606-71f8-45bb-8293-c939252a9f00 BACKUP_CREATED
433.776
database drop yapıp ardından, Restore edelim;
clickhouse-client -u clickadmin --password Parola123 --time --receive_timeout 9999 --send_timeout 9999 --query "restore DATABASE test on cluster mycluster FROM Disk('backup', 'test_database.zip')"
b3ace8ea-1ea6-4916-9a2d-654bd683f08b RESTORED
112.291
Tablo row-count durumunu kontrol edelim;
SELECT count(*)
FROM test.hits_dst
Query id: ef89dc92-1d6c-413f-be88-d8c7579c1f6c
┌──count()─┐
│ 99997497 │
└──────────┘
Tablo backup alalım;
# clickhouse-client -u clickadmin --password Parola123 --time --receive_timeout 9999 --send_timeout 9999 --query "backup table test.hits TO Disk('backup', 'hits_node2.zip')"
7bbdbff0-8fb4-4bbe-aaad-b60024000bfb BACKUP_CREATED
456.875
Cluster üzerinde tabloyu drop edelim , sonrasında restore edelim;
DROP TABLE test.hits ON CLUSTER mycluster
Query id: e1a3c317-9d5d-4fe5-b3b5-f65600d24ad4
┌─host─────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ cliknd02 │ 9000 │ 0 │ │ 3 │ 0 │
│ cliknd01 │ 9000 │ 0 │ │ 2 │ 0 │
│ cliknd04 │ 9000 │ 0 │ │ 1 │ 0 │
│ cliknd03 │ 9000 │ 0 │ │ 0 │ 0 │
└──────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
4 rows in set. Elapsed: 0.124 sec.
Restore edelim;
clickhouse-client -u clickadmin --password Parola123 --time --receive_timeout 9999 --send_timeout 9999 --query "restore table test.hits on cluster mycluster FROM Disk('backup', 'hits_node2.zip')"
127f5739-5242-41f2-99cb-cf5b40b4d2ba RESTORED
113.887
Kontrol yapalım;
SELECT count(*)
FROM test.hits
Query id: 975d5858-b576-44da-a6dc-569650f391d1
┌──count()─┐
│ 99997497 │
└──────────┘
1 row in set. Elapsed: 0.002 sec.
S3 Storage Backup
s3 oratamına backup alabilmek için öncelikle s3 tarafında bucket oluşturma s3 client tarafında konfigürasyonlara bir göz ataralım. Öncelikle Linux için s3cmd rpm lerini yüklememiz gerekmektedir.
# dnf install s3cmd
Sonrasında s3cmd komutlarını çalıştıracağımız yerde bir .s3cfg dosyamız olmalı burada s3 storage bağlantı yapacağımız access key, secret key gibi bilgilerin bulunduğu bir config dosyası hazırlamalıyız.Örnek bir config dosyası aşağıda verilmiştir.
[default]
access_key = 7D1DJKXXXXXXXXXXXX
access_token =
add_encoding_exts =
add_headers =
bucket_location = US
ca_certs_file =
cache_file =
check_ssl_certificate = True
check_ssl_hostname = True
cloudfront_host = cloudfront.amazonaws.com
connection_max_age = 5
connection_pooling = True
content_disposition =
content_type =
default_mime_type = binary/octet-stream
delay_updates = False
delete_after = False
delete_after_fetch = False
delete_removed = False
dry_run = False
enable_multipart = True
encoding = UTF-8
encrypt = False
expiry_date =
expiry_days =
expiry_prefix =
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase = Pass_971
guess_mime_type = True
host_base = s3storage.farukcevik.com.tr
host_bucket = %(bucket).s3storage.farukcevik.com.tr
human_readable_sizes = False
invalidate_default_index_on_cf = False
invalidate_default_index_root_on_cf = True
invalidate_on_cf = False
kms_key =
limit = -1
limitrate = 0
list_allow_unordered = False
list_md5 = False
log_target_prefix =
long_listing = False
max_delete = -1
mime_type =
multipart_chunk_size_mb = 15
multipart_copy_chunk_size_mb = 1024
multipart_max_chunks = 10000
preserve_attrs = True
progress_meter = True
proxy_host =
proxy_port = 0
public_url_use_https = False
put_continue = False
recursive = False
recv_chunk = 65536
reduced_redundancy = False
requester_pays = False
restore_days = 1
restore_priority = Standard
secret_key = CXPcsf0saDDsNdb39q5Orb1FJEiAAzA7baGB5kUqf
send_chunk = 65536
server_side_encryption = False
signature_v2 = False
signurl_use_https = False
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 300
ssl_client_cert_file =
ssl_client_key_file =
stats = False
stop_on_error = False
storage_class =
throttle_max = 100
upload_id =
urlencoding_mode = normal
use_http_expect = False
use_https = True
use_mime_magic = True
verbosity = WARNING
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
website_error =
website_index = index.html
Şimdi bir bucket olulralım;
$ s3cmd mb s3://backuppirise
$ s3cmd ls
2024-01-08 11:16 s3://backuppirise
Şimdi s3 storage da oluşturduğumuz bu bucket içerisine clickhouse backuplarını alalım; backup için doğrudan access ve secret key leri komut içerisinde vererek backup komutunu verebiliriz;
BACKUP ..... data TO S3('<S3 endpoint>/<directory>', '<Access key ID>', '<Secret access key>)
Ayrıca s3 disk alanını local disk gibi clickhose içerisinde tanımlayabiliriz, bunun için storage_configuration.xml
içerisinde S3 configuration tanımlanması gerekmektedir.
storage_configuration.xml
<clickhouse>
<storage_configuration>
<disks>
<s3_plain>
<type>s3_plain</type>
<endpoint>https://XXXXXXX/bucket/folder</endpoint>
<access_key_id>XXXXXX</access_key_id>
<secret_access_key>XXXXX</secret_access_key>
</s3_plain>
<dbdata>
<type>local</type>
<path>/data01/clickdata1/</path>
</dbdata>
<backup>
<type>local</type>
<path>/chbackup/backup/</path>
</backup>
</disks>
<policies>
<s3>
<volumes>
<main>
<disk>s3_plain</disk>
</main>
</volumes>
</s3>
<dbdata> <!-- name for new storage policy -->
<volumes>
<dbdata>
<disk>dbdata</disk>
</dbdata>
<old>
<disk>default</disk>
</old>
</volumes>
</dbdata>
</policies>
</storage_configuration>
<backups>
<allowed_disk>s3_plain</allowed_disk>
<allowed_disk>backup</allowed_disk>
<allowed_path>/chbackup/backup/</allowed_path>
</backups>
Yukarıdaki xml örneğinde 3 adet disk tanımlanmış bunlardan biride görülecei üzere S3 Storage alanıdır, bu alanıda normal disk tanımlar gibi tanımladık ve artık clickhouse içerisinde kullanabiliriz. cliclhouse disklerini listeleyelim ve kontrol edelim
$ clickhouse-disks list-disks
backup
dbdata
default
s3_plain
Şimdi her iki şekildede bakup alıp sonra restore edelim ve sonuçları görelim. Backup alacağımız tablo clickhouse hits tablosudur, yaklaşık 100 milyon satır veri içermektedir, sıkıştırılmamış hali 60 GB kadar yer tutumakta, clickhouse içerisinde sıkıştırılmış hali ise yaklaışk 13 GB yer tutumaktadır. Bu tabloyu ve yanlızca bu tabloyu ve başka bir kaç obje içeren bir database yedeğini alıp , sonra bunlalrı restore edeceğiz.
clickhouse :) BACKUP TABLE test.hits TO S3('https://my_s3_url/pirisebck/hits', 'XXXXAccessKeyZZZZ', 'XXXXSecretKeyZZZ')
1 row in set. Elapsed: 32.135 sec.
Backup oldukça tatminkar sürede bitti 32 sn Şimdi Restore edelim;
clickhouse :) RESTORE TABLE test.hits on cluster mycluster FROM S3('https://my_s3_url/pirisebck/hits', 'XXXXAccessKeyZZZZ', 'XXXXSecretKeyZZZ')
RESTORE TABLE test.hits ON CLUSTER mycluster FROM S3('https:///my_s3_url/pirisebck/hits', 'XXXXAccessKeyZZZZ', 'XXXXSecretKeyZZZ');
Query id: 79d16a4f-fbd6-4cdd-899a-394414eb0cd0
2. backup Restore yöntemi olarak storage_configuration.xml
içerisine s3 diski local bir disk gibi tanımlamıştık , şimdi bu disk alias ı kullanarak tıpkı local diske backup alır ve oradan restore yapar gibi komutlarımızı verebiliriz.
$ clickhouse-disks list-disks
backup
dbdata
default
s3_plain
s3_plain diske backup alıp restore yapalım;
clickhouse :) BACKUP TABLE test.hits TO Disk('s3_plain', 'hits_backup')
BACKUP TABLE test.hits TO Disk('s3_plain', 'hits_backup')
Query id: 49617081-c560-4a89-bb04-92583e776acb
Restore Yapalım;
clickhouse :) RESTORE TABLE test.hits on cluster mycluster FROM Disk('s3_plain', 'hits_backup')
RESTORE TABLE test.hits ON CLUSTER mycluster FROM Disk('s3_plain', 'hits_backup')
Query id: 2382391d-1e18-4132-b7d1-57206e43341f
Bir yanıt yazın