高级数据保护方法
远程文件复制
这种方案,即把备份的文件,通过网络传输到异地容灾站点。典型的代表是rsync异步远程文件同步软件。这是一个运行在linux下的文件远程同步软件。他监视文件系统的动作,将文件的变化,通过网络,同步到异地的站点。他可以只复制一个文件中变化过的内容,而不必整个文件都复制,这在同步大文件的时候非常管用。
远程磁盘镜像
这是基于块的远程备份。即通过网络,将备份的数据传输到异地站点。有可以分为同步复制,和异步复制。同步复制,即主站点接受的上层IO数据,必须等待传输到异地站点之后,才通报上层IO成功消息。异步复制,就是上层IO,主站点写入成功,即向上层通报成功,然后后台将数据通过网络传输到异地。前者能保证两地数据的一致性,但是对上层响应较慢。而后者不能实时保证两地数据的一致性,但是对上层响应很快。
所有基于块的备份措施,一般都是在底层设备上进行,而不耗费主机资源。
盘阵厂家的中高端产品,都提供远程镜像服务,比如IBM的PPRC,EMC的SRDF,HDS的Truecopy等等。
照数据保护
远程镜像,或者本地镜像,确实是对生产卷数据的一种很好的保护,一旦生产卷故障,可以立即切换到镜像卷。但是这个镜像卷,一定要保持一直在线状态,主卷有写IO操作,那么镜像卷也逃不掉。如果此时想某一时刻的整个系统,进行备份,在镜像的环境中,就只能停止应用,使应用不再对卷产生IO操作,然后将镜像关系分离,称作拆分镜像,拆分之后,可以恢复上层的IO。此时的镜像卷,就是主机停止IO那一刻的数据完整镜像,此时可以用备份软件,将镜像卷上的数据,备份到其他介质。拆分镜像,是为了让镜像卷可以被备份软件操作。拆分之后,主卷所做的所有写IO,会以bitmap的方式记录下来(bitmap的概念,请参考《存储秘史》文件系统相关知识),待备份完成之后,可以将镜像关系恢复,此时主卷和镜像卷上的数据是不一致的,需要重新做同步。
可以看到,以上的过程是十分复杂繁琐的,而且需要占用一块和主卷相同容量大小的卷。关键是需要停掉主机IO,这对应用会产生影响。为了解决这个难题,一种解决方案出现了,这就是快照技术。快照的基本思想是,抓取某一时间点,磁盘的所有数据,就像急冻一样,但是还不能真正冻住,主机的IO需要正常执行。这怎么可能呢?快照就将其变成了可能。快照是这样实现的,即先在某一时间点,对于这个时间点之后的所有上层的写IO,先将这个IO对应的块上的数据复制到一个新的卷中存放,并做好原卷中的这个块和新卷中块的对应关系记录,然后才进行上层IO的写入。这样,这一时间点上磁盘的数据,便被保存下来,就像做了急冻一样。这种方法也叫做copy on write,也就是在发生IO写之前,先将待更新块中原来的数据复制出来保存,然后再做新数据的写入,即写时复制。还有一种实现块快照的方法,叫做write redirect,当写IO到来的时候,将这个IO重定向到一个新的卷,而不是写原来的卷,并做好新卷上的块和原来卷所应该被写入块的映射记录。这样也同样保存下了这个时刻原来卷上的所有数据,同时不影响后续读写IO操作,因为保持了块映射关系。
在“照”下了这一时刻卷上的数据之后,为了保险起见,最好对那个时刻的数据做一个备份,也就是将这些数据在复制到另外的磁盘或者磁带中。但是也可以不复制,而那时的数据依然会存在,直到手动删除这个快照。如果不对快照做备份,那么一旦此时卷数据失败,快照的数据也不复存在。
不管是copy on write还是write redirect,只要上层有写IO,这个IO块就要占用新卷上的一个块(因为要保留原块的内容,不能被覆盖),如果上层将原卷上的所有数据块都写更新了,那么新卷的容量就需要和原卷的数据量同样大,甚至还大(预防新增数据写入),才可以。但是通常应用不会写覆盖面百分之百,做快照的时候,新卷的容量一般设置成原卷容量的30%就可以。
实际中一般都是用copy on write的方式做快照,因为write redirect方式,每次写IO都需要查一遍快映射表,速度慢,耗费资源大。
值得说明的是,快照所冻结下来的卷数据,无异于一次意外掉电之后卷上的数据。为什么这么说呢?我们可以比较一下,意外断电同样是保持了断电那个时间点上的卷数据状态。我们知道,不管是上层应用,还是文件系统,都有自己的缓存,文件系统缓存的是文件系统元数据。并不是每次数据的交互,都保存在磁盘上,它们可以暂时保存在内存中,然后每隔一段时间(linux系统通常为30秒),批量flush到磁盘上。当然编程的时候也可以将每次对内存的写,都flush到磁盘,但是这样做效率和速度打了折扣。而且当flush到磁盘的时候,并不是只做一次IO,如果数据量大,会对磁盘做多次IO,如果快照生成的时间恰恰在这连续的IO之间生成,那么此时卷上的数据,实际上是有可能不一致的。磁盘IO是原子操作(atomic operation),而上层的一次事物操作,可以对应底层的多次原子操作,这其中的一次原子操作,没有业务意义,只有上层的一次完整的事物操作,才有意义。所以如果恰好在一个事物操作对应的多个原子操作的中间,生成快照,那么此时的快照数据,就是不完整的,不一致的。文件系统的机制是这样的,它总是先写入文件的实体数据到磁盘,而文件的元数据,暂不写到磁盘,而是先写入缓存中。这种机制是有他的考虑的,我们想一拢?如果FS先把元数据写入磁盘,而在准备写入文件实体数据的时候,突然断电了,那么此时磁盘上的数据是这么一个状态:FS元数据中有这个文件的信息,但是实体数据并没有被写入对应的扇区,那么这些对应的扇区上原来的数据,便会被认为就是这个文件的数据,这显然后果不堪设想。所以FS一定是先写入文件实体数据,完成之后再批量将元数据从缓存中flush到磁盘,如果在实体数据写入磁盘,而元数据还没有写入磁盘之前,断电,那么虽然此时文件实体数据在磁盘上,但是元数据没有在磁盘上,也就是说虽然有你这个人存在,但是你没有身份证,那么你就不能公开的进行社会活动,因为你不是这个国家的公民。虽然文件系统这么做,会丢失数据,但是总比向应用提交错误的数据强!大家可以做一个实验,就拿Windows来说,你创建一个文件,创建好之后,立即断电,重启之后,会发现刚才创建的文件没了,或者你复制一个小文件,完成后立即断电,重启之后也会发现,复制的文件不见了,为什么?明明创建好的,文件也复制好的,为什么断电重启就没了呢?原因很简单,因为你断电的时候,FS还没有把元数据flush到磁盘上,你就给断电了,此时文件实体数据虽然还在,但是元数据中没有,那么当然看不到它了。
总之,快照极有可能生成一份存在不一致的卷数据。这也没有办法,如果用这份数据做恢复,那么就必须承担数据不一致的风险。最保险的备份,就是将主机停机,此时存储上的数据,一定是一致的。但是谁能忍受停机所带来的损失?所以只能在停机和一致性之间找一个平衡点。而快照是最方便的。
有些快照解决方案,会在主机上安装一个代理软件,当执行快照之前,代理会通知应用或者文件系统将缓存中的数据全部flush到磁盘,然后立即生成快照,这样,一致性就得到了保护。不过相应的也耗费了一定的主机资源和网络资源。
信息哲学 从信息到数据存储再到数据保护
0
相关文章