cassandra 备份_使用sstableloader恢复Cassandra Priam备份

本文介绍了如何使用sstableloader工具从Priam备份中恢复Cassandra数据。在某些情况下,直接复制和加载Priam备份文件可能无法工作,因为它们被Snappy压缩。通过编写Python脚本解压文件后,可以使用sstableloader进行还原。然而,这个过程可能遇到问题,如丢失列导致恢复失败,或者需要使用Java工具将sstables转储为JSON并手动转换为CQL。强调了备份恢复的重要性,建议在活跃的测试环境中验证恢复过程。
摘要由CSDN通过智能技术生成

cassandra 备份

我之前曾写过关于设置Cassandra和Priam进行备份和集群管理的文章。 但是,我在此处提供的用于备份还原的示例并不适用于所有情况,例如,它可能不适用于完全独立的群集。 或者在部分还原到一个表而不是整个数据库的情况下。

在这种情况下,您可以选择使用sstableloader实用程序进行还原。 它具有简单明了的语法:

 sudo sstableloader -d 172.35.1.2,172.35.1.3 -ts /etc/cassandra/conf/truststore .jks \ 
    -ks /etc/cassandra/conf/node .jks -f /etc/cassandra/conf/cassandra .yaml \ 
     ~ /keyspacename/table-0edcc420c19011e7a8c37656dd492a94 

如果您查看Priam生成的备份,则看起来您可以只复制特定表的文件(例如,通过AWS上的s3 aws cp),然后sstableloader导入它们。 但是有一个陷阱。 为了节省空间,Priam使用Snappy压缩所有文件。 因此,如果您尝试将它们提供给任何Cassandra实用程序,它将抱怨它们已损坏。

因此,在使用sstableloader或其他任何工具之前,您必须解压缩它们。 但是如何? 好吧,Priam为此提供了一项服务-您通过将绝对路径传递到压缩文件,并将绝对路径传递到应放置未压缩文件的绝对路径来进行调用,并且可以轻松完成通过解压缩器传输原始文件的工作。 为了解压缩整个备份,我编写了一个python脚本。 它采用某种结构,但是您可以对其进行参数化以使其更加灵活。 这是代码(对不起我的非惯用Python,我仅将其用于简单的脚本编写):

 #! /usr/bin/env python  # python script used to pass each backup file through the decompression facility of Priam (using Snappy)  # so that it can be used with sstableloader for restore  import os  import requests  rootdir = '/home/ec2-user/backup'  target = '/home/ec2-user/keyspace'  for subdir, dirs, files in os.walk(rootdir): 
     for file in files: 
         fullpath = os.path.join(subdir, file) 
         parent = os.path.join(fullpath, os.pardir) 
         table = os.path.basename(os.path.abspath(parent)) 
         targetdir = target + "/" + table + "/" 
         if not os.path.exists(targetdir): 
             os.makedirs(targetdir) 
         url = ' http://localhost:8080/Priam/REST/v1/cassadmin/decompress?in= ' + fullpath + '&out=' + target + "/" + table + "/" + file 
         print(url) 
         requests.get(url) 

现在,您已解压缩了备份文件,可以使用sstableloader对其进行还原。 如果您有大量数据,可能会花费一些时间,并且不应在执行快照备份的同时运行还原,因为还原可能会失败(由文档警告)。

然后,如果幸运的话,一切都会过去。 不幸的是,有时候情况并非如此。 该工具远非完美,因此例如,如果您删除了一个列,则恢复旧的sstable将失败,因为它将尝试插入丢失的列中。 对于实际的生产系统,这听起来像是一个大问题, 并且已经有报道,但尚未解决 。 有时,表可能由于未知原因而无法恢复(流式传输失败,所谓的损坏数据)。 在这些情况下,您可能想使用sstabledump将sstables转储为JSON,然后将JSON转换为CQL以插入它。 当然,没有工具可以做到这一点,所以这里是用Java编写的工具 。 它不是完美的,并且不支持用户定义的类型,集合和映射。 请注意,对于大型表,这可能不是一个好主意,仅对于较小的表。

作为总结,在这里,备份非常重要,但是从备份中恢复则更为重要。 如果没有还原过程,则备份无用。 仅仅拥有可用的工具(例如Priam)并不意味着您可以准备执行还原过程。 您应该对活动登台数据进行测试还原,以及在空的,新形成的群集上进行完整还原,因为存在不同的还原方案。

翻译自: https://www.javacodegeeks.com/2019/11/restoring-cassandra-priam-backup-with-sstableloader.html

cassandra 备份

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值