当前位置: 首页 > 工具软件 > Priam > 使用案例 >

使用sstableloader恢复Cassandra Priam备份

柴瀚昂
2023-12-01

之前,我曾写过关于设置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

 类似资料: