在去中心化存储这个概念被提及之后,很多人都担心去中心化存储的数据丢失问题。
他们认为:当我在去中心存储里面存放了数据之后,虽然它有更便宜,更快,更隐私等特点,但是数据毕竟存在于矿工的矿机上,由于矿工的不稳定性,可能导致文件的丢失。就像滴滴的司机一样,大部分时间是靠谱的,偶尔不靠谱,不靠谱的时候,体验非常差,这样的产品怎么能让人放心使用呢。
另一方面,反观大公司提供的存储服务,比如:亚马逊AWS S3是专业机房,专业机器,专业硬盘,能保证数据不丢失。
其实不是这样的,总架构师在设计PPIO的时候,早就考虑到这个问题,这篇文章就来解释下大家的疑惑。
首先,需要纠正几个认知误区:
- AWS S3等大公司能 100 100% 100保证存储文件不丢失吗?
其实是不能的,他们只能 99.999999999 99.999999999% 99.999999999保证存储文件不丢,专业术语称为: 11 个 9 11个9 11个9的保证存储文件不丢。存储行业称 99.999999999 99.999999999% 99.999999999这个服务质量指标(QoS)为耐用率。
- 矿工可能不稳定。
P2P(点对点)的技术核心,就是在多个不稳定的节点上,实现稳定的服务。熟悉PPTV的朋友应该知道,使用的就是P2P直播,正是在多个不稳定的节点上完成了稳定的服务。
下面来详细解释:为何PPIO也能像大型公司一样靠谱,以及是如何把这个耐用率(QoS)做到像大型公司一样高的。
PPIO的2种冗余模式
总架构师在设计PPIO的时候,设计了2种冗余模式:
全副本模式
全副本模式就是把文件,完整地拷贝,新文件和老文件一模一样,这样做并不节约空间,但是P2P能多点下载数据,速度更快,同时可以保证用户下载体验。
纠删副本模式
纠删副本模式就是通过纠删技术来做冗余。简单地说就是,数据分成碎片并编码,使用可配置数量的冗余分片,将所有文件分片存储在不同矿工上。这样做虽然不利于P2P多点传输,但是可以大大节约冗余空间。
PPIO就是通过将以上两种方式进行结合,以应对不同使用场景。
下面简单说一下纠删技术产生的数学特征:
不妨用 ( k , n ) (k,n) (k,n) 纠删码来编码数据,其中:
n n n表示总共有 n n n个纠删片段
k k k表示在 n n n个纠删片段中,任何 k k k个纠删片段就能完全恢复原始数据。
如果数据大小是 s s s字节,则每个纠删片段的大小大约是 s / k s/k s/k 字节。
如果 k = 1 k = 1 k=1时,就相当于复制一个全副本。
例如,1MB数据, 如果采用(10,16)纠删码,并且每个纠删片段大小是0.1M,则总存储数据大小就是1.6M。它实际总共用了1.6倍的数据空间大小。
PPIO的假设和计算
做如下假设:
令t为单位假设时间,这里先假设 t = 24 小 时 t=24小时 t=24小时
P t Pt Pt代表矿工的日掉线率,这里假设 P t = 5 Pt=5% Pt=5
τ为副本丢失后的修复时间,也就是如果副本丢失了,多少时间能够修复。假设 τ = 2 小 时 τ=2小时 τ=2小时。
在可以修复的前提下,将以上数值带入下面的公式,算得单副本丢失每天丢失的概率是:
p = 1 – ( 1 − P t ) t τ = 0.4265318778 p = 1 – (1-Pt)^{\frac{t}{τ}} = 0.4265318778% p=1–(1−Pt)τt=0.4265318778
PPIO设计的默认全副本数冗余是2倍,纠删副本冗余是1.5倍。
下面来看全副本模式
由于全副本是完全复制,也就是2倍的冗余,即有2个副本,称为 N = 2 N=2 N=2。
修复时间内的耐用率:
P a = 1 − p 2 = 99.9981807056 P_a = 1- p^2 = 99.9981807056% Pa=1−p2=99.9981807056
全年耐用率:
P y a = P a ( 365 ∗ t / τ ) = 92.3406415922 P_{ya} = Pa^{(365*t/τ)} = 92.3406415922% Pya=Pa(365∗t/τ)=92.3406415922
再看纠删模式
假设采用的纠删算法是 ( k , n ) = ( 6 , 9 ) (k,n)= (6,9)