前言
目前主流的数据库、文件系统等会存储上百G、上T甚至PT级别的数据。为了保证数据的可靠性,会做数据的容灾,即数据会备份到一台或者多台机器上,以保证避免单点,那海量的数据该如何选择备份呢?期待菠菜能为你解答。
分类
菠菜将数据备份分为两种,一种是基于操作的,一种是基于文件的。
基于操作,就是将对数据的每次操作记录下来,然后同步到备份服务器,备份服务通过记录再做一遍相同的操作,这样可以保证两边的数据一致(mysql的master、slave就采用此方法)。这样优点是同步效率高,每次同步的数据量小,但缺点是恢复数据效率低,需要从出异常的点开始把所有操作全部执行一遍。
基于文件,是以文件为目标,对文件进行备份。而对文件进行备份方式很多,而优缺点也不同,所以本文会着重讲解这部分。
基于文件备份方案
基于文件备份的方案主要分为两种,一种是全量备份,一种是利用纠删码备份。
全量备份
全量备份其实比较容易理解,即将文件整体拷贝到备份服务器上,以达到容灾的目的,这种方案的优缺点是:
备份效率高,不需要计算,仅仅拷贝即可
恢复效率高,如果线上服务器宕机,可以直接将流量切到备份服务器上
占用空间大
纠删码备份
纠删码是一个非常有创意的想法,但菠菜先不介绍纠删码,先来个比较容易理解的备份方式,了解磁盘阵列的小伙伴一定会听说过:Raid0、Raid1以及Raid5。
其中Raid5的方式挺有意思的,兼顾了性能以及数据安全,拿最小的Raid5来说,需要3块容量相同的硬盘,2块存储数据,1块做备份。那你可能会有疑惑了,1块硬盘如何备份2块硬盘的数据呢?明显存不开啊?!这里就用到了一个有意思的操作,叫做“异或”。对,就是位操作符异或。我们知道异或是相同为0不同为1。如 1 ^ 1 = 0,1 ^ 0 =1。
Raid5具体的备份的方案是,存储一个文件先将文件分成两份a、b,然后将这两份再做“异或”操作,即a ^ b = c(文件存储到最后也是二进制哦),得到一个新备份文件c,那如果丢失了b,可以利用a ^ c来恢复,同理,如果丢失了a可以用b ^ c来恢复,是不是挺好玩哒?
而纠删码与该方式类似,但是会更加复杂,纠删码用到的是矩阵计算。首先需要将文件分成n份,然后通过计算得到m块冗余块,这样,当丢失的数据块小于m的时候,都可以通过纠删码而恢复。由于矩阵计算比较复杂,这里就不做过多的赘述了。
那纠删码的优缺点:
1. 备份效率低
2. 恢复效率低,需要计算得到
3. 占用空间较少,取决于m定义多少份
如何选择
如果我们需要频繁的访问文件,并且对于延迟有超高的要求并且不care硬件成本,建议使用简单点的全量备份。如果需要存储海量数据,而且重点是保证数据不丢,并且要考虑成本的话,可以尝试用纠删码。
最后
大文件该如何备份呢?其实像网盘等存储大文件的时候,是会将大文件切割成不同的切片来存储,正所谓大化小,而备份也是基于切片来分别备份的。
期待大家多多与菠菜互动并且关注菠菜的公众账号!
领取专属 10元无门槛券
私享最新 技术干货