Backup

共 16 篇文章。

数据的长期保存

• Data Management

我们每个人每天都在产生各种数据。包括个人笔记、照片等等在内的许多数据,许多可能不太容易再次获得或制造。今年夏天,我整理了一些自己二十年前刻录的光盘,这里记录一下长期保存数据的一些原则、需要避免的陷阱,以及确保数据在数十年后仍然可用的最佳实践。

阅读全文… ( 本文约 1586 字,阅读大致需要 4 分钟 )

备份小故事一则

• Shared Chaos

原载于 Telegram 频道。

今天来讲个关于备份的小故事。

以前有个同事之前在某使用UNIX的传统行业干了多年,他们的系统可用性要求不算高,但数据非常重要,所以备份自然也是必不可少的。为了确保备份的安全性,他们还雇了一家专门的保全公司定期把备份磁带从办公室拿走到该保全公司的仓库。

阅读全文… ( 本文约 491 字,阅读大致需要 1 分钟 )

备份和代码审计

• Security

这次回北京之前的周末,FreeBSD安全团队发表了内部通知,发现 FreeBSD.org 有些机器被入侵,最近终于做了全面披露了。目前,基本的代码审计和攻击检查已经做完,部分机器还在重装的过程中。

对 FreeBSD 这样的开源项目来说,在基础设施遭到攻击之后,首先必须被怀疑的便是有可能有人在代码库中植入了新的后门。由于代码量十分巨大,逐行审计是非常不现实的。由于 FreeBSD 在 BSD 时代即采用了版本控制系统(最早 BSD 时代是 SCCS,FreeBSD早期是CVS,现在是 subversion),因此,每一行代码的来源,包括作者、具体的修改时间,以及为什么那样修改等等,都可以很容易地查找到。

阅读全文… ( 本文约 795 字,阅读大致需要 2 分钟 )

tarsnap修正了一个重大安全漏洞

• Security

今天 Colin 在blog上介绍说 他刚刚修正了一个 TarSnap 重大安全漏洞。简单地说,用来加密密钥文件的AES-CTR实现时,计数器没有增加(正确的实现中计数器应该每次递增),导致在已知明文时能够通过加密块推算出一块数据使用的密钥,并用它来解密余下的数据。

阅读全文… ( 本文约 272 字,阅读大致需要 1 分钟 )

ZFS的自动化备份

• Data Management

主任说:

冗余不做,日子甭过;备份不做,十恶不赦。

以前一直是每天手动给自己的新服务器做备份,最近找时间写了一套脚本来自动完成这个事情。

脚本没啥复杂的,大体的思路是这样:

  1. 在源上根据日期命名生成一份新的快照;
  2. 将上次备份机器收到的快照和新快照之间的差异 pipe 给 xz,然后再把结果pipe给ssh(使用key验证),传到备份机上;
  3. 备份机解压缩、zfs receive之后,如果成功,ssh到源系统上记录自己拿到的那个新的快照日期;

由于是通过 Internet (从AS6939送到AS33651)传递快照,所以使用了压缩。用ssh来完成传输的考虑主要是因为它能够做到互相验证身份。

阅读全文… ( 本文约 704 字,阅读大致需要 2 分钟 )

关于备份

• Security

指望硬盘不挂掉是 很拼人品的事情(附带说一句,从某种意义上说,21世纪的硬盘质量并没有下降,只是单位容量出现故障的概率没有显著提高,而硬盘容量的扩大使得单块硬盘的故障率看起来提高了,但是如果我们从单位容量的故障率来看,坏损率并没有非常显著的增长)。所以想要长久地保存数据,就必须采用各式各样的冗余和备份手段。冗余和备份是不一样的,前者往往会采用同样的访问控制逻辑,提供在线或近线的数据存储,强调的是数据访问的及时性;而后者则强调的是数据的可恢复性。

关于访问控制

一般来说,不希望备份与原始数据采取相同的访问控制机制。例如,对网站来说,可以读写数据库的那个 Web 访客的数据库账户,很可能并不能直接读写网站的备份数据。有时,备份甚至是以一种"外科手术"的方式进行的:对文件系统做快照,然后将快照打包发到异地的另一套系统。

阅读全文… ( 本文约 1155 字,阅读大致需要 3 分钟 )

OpenLDAP断电导致故障修复一例

• Postmortem

📜 历史文件已不具备现实意义

OpenLDAP 现已转为使用 lmdb。

今天帮陈总研究一个奇怪的问题的时候误操作导致机器停止ssh响应,遂请机房重启。由于机房做的是power cycle,导致部分数据丢失。先前在配置OpenLDAP时,忘记在其中配置checkpoint,另外也没有对这台机器的LDAP进行备份,因此只好尝试从现有的数据库中恢复。冗余不做,日子甭过;备份不做,十恶不赦!

记录一下修复过程。

第一件事是把出问题的数据库做一份备份:rsync -av /var/db/openldap-data/ /var/db/openldap-data.old/

接着尝试slapcat。出现下面的错误:

1
2
3
4
5
6
bdb(dc=********.com): file id2entry.bdb has LSN 1/1476384, past end of log at 1/374639
bdb(dc=********.com): Commonly caused by moving a database from one database environment
bdb(dc=********.com): to another without clearing the database LSNs, or by removing all of
bdb(dc=********.com): the log files from a database environment
bdb(dc=********.com): /var/db/openldap-data/id2entry.bdb: unexpected file type or format
bdb_db_open: database "dc=********.com": db_open(/var/db/openldap-data/id2entry.bdb) failed: Invalid argument (22).

尝试使用BerkeleyDB的修复工具修复:

1
2
3
4
5
# db_recover-4.6 -vvf
Finding last valid log LSN: file: 1 offset 374639
recovery 0% completeRecovery starting from [1][374527]
recovery 67% completeRecovery complete at Tue Jul 13 16:41:59 2010
Maximum transaction ID 800000c0 Recovery checkpoint [1][374639]

slapcat发现问题依旧。搜索Google发现答案基本上都是从备份中恢复,看了一下Oracle的网站,关于这类问题也没有很好的办法。尝试将bdb文件dump出来再load回去:

1
2
3
4
5
db_recover-4.6 -vvf
db_dump-4.6 id2entry.bdb > /tmp/id2entry.dump
rm id2entry.bdb
db_load-4.6 id2entry.bdb < ~/id2entry.dump
db_recover-4.6 -vvf

再次slapcat,发现对另一文件报错,用类似的方法修补之后,slapcat成功。

将slapcat的输出导出到一个文件中: slapcat > /tmp/my.ldif

然后,删除OpenLDAP数据目录:rm /var/db/openldap-data/_* /var/db/openldap-data/[a-z]*

最后,重新使用导出的ldif文件恢复:slapadd -l /tmp/my.ldif。

至此,恢复完成。

阅读全文… ( 本文约 1071 字,阅读大致需要 3 分钟 )

ZFS时代FreeBSD系统的数据冗余策略

• Data Management

2008硬盘磨损年!

我相信很多人都遇到过硬盘卡壳、掉链子的情况。当然,这篇文档的主旨不是告诉你怎么样可以绕过那些老爷子写的课本上说的金科玉律──重要的数据都应该有备份──如果你的数据最终丢失了,那么我的问题是:你的备份呢?

但是,即使你有经常备份的习惯,有些数据还是会难免出现一些没有及时备份而导致丢失的情况。我的观点是,没有备份计划的数据都不是重要数据,不要等到数据丢失了再去后悔,但是我们显然应该采取各种各样的手段来阻止没有及时备份的那一小部分数据的丢失。

硬盘

大家一起默念:它很便宜!它会坏掉!

是的,实战经验会告诉你,它很便宜!它也会坏掉!不管这个硬盘是来自什么厂商,也不管它是SATA、SCSI、SAS或者是传统的ATA接口,它出现故障只是时间早晚的问题。

为了解决这个问题,人们提出了廉价磁盘冗余阵列(RAID)的概念。例如,使用两块相同容量的磁盘组成 RAID-1 (MIRROR) 阵列,可以在其中任意一块出现问题时,从另一块中取出数据。而如果有至少3块硬盘,便可以组成 RAID-5 (注:还有其他RAID级别可以用3块硬盘组成冗余结构),只损失 1/n 的容量(n为硬盘数量)来得到带冗余的存储,使得存储可靠性得以提高。

除了改善可靠性之外,RAID还可以用来改善读写性能。例如用多块硬盘组成 RAID-0 阵列,可以将读写性能提高 n 倍,等等。我们并不讨论这些RAID级别。

不幸会发生

和很多人已经想到的一样──不要高兴的太早……

带数据冗余的 RAID 的一个基本假设是,磁盘是不骗人的,它有两种状态:好、坏,并且,主机(或RAID控制器)能够可靠地识别这种状态。

很不幸,这句话只对了一半。一块磁盘要么是好的、要么是坏的(这里,“坏的"的定义是读写时会发生任何错误),但是主机未必能够识别这种状态。

更为严重的是,有些时候主机甚至连读出来的数据是否是正确的这件事都不知道!当你发现自己的程序在其它机器上都很正常,但是在某台机器上总是神秘的崩溃的时候,你就要看看是不是那台机器的内存或者其他存储器出现问题了。

阅读全文… ( 本文约 3066 字,阅读大致需要 7 分钟 )

FreeBSD的坏损硬盘修复工具──recoverdisk(1)

• Data Management

2008硬盘磨损年,你需要这个工具,是的,即使你有备份,只要那备份不是实时的,你还是会需要这个工具。

recoverdisk(1)是FreeBSD 7.0新引入基本系统(/sbin!)的磁盘复制工具,这个工具对于修复硬盘、光盘、存在坏盘上的文件等各种情形都能非常有效地进行迅速修复:它首先尝试以1MB的块尺寸读取和写入数据,随后是64K和512字节(1扇区),遇到错误时会自动跳过,从而最大限度地从损坏的磁盘上恢复数据(如果是用 dd(1) 来恢复数据,通常在遇到坏区时会丢掉整个block,而recoverdisk则是先跳过,然后回过头来用较小的块尺寸重新读取直到失败,而此时主要的数据都已经恢复了)。

参与评论

备份的苦恼

• Development

备份在最近成为了一件越来越让人头疼的事情。我过去采取的做法是把数据刻录成光盘,寄给若干个分布在不同地区的几个朋友,但这种做法正在变得越来越不现实,因为数据的产生速度变得越来越快,而整理和加密其中需要保密的部分所需的时间也越来越长。

阅读全文… ( 本文约 284 字,阅读大致需要 1 分钟 )