minio存储之纠删码(ErasureCode)
⼀般上我们如果要保证数据⾼可⽤,主流的有两种策略:
多副本
纠删码
副本(Replication)策略:
副本,实打实的复制,常见的是三副本,意味着现实世界有三份⼀样的数据。代价稍⾼,偏计算类的场景基本都会⽤该策略,⽐如虚拟机
1/n
VM、数据库。如果⼀个副本挂了,马上切到另外⼀个,漂移时间⾮常短。n副本存储效率永远是。
纠删码(Erasure Code)策略:
纠删码,会把数据进⾏切分,同时计算校验块。以常见的reedsolomon(RS)纠删码为例,在6数据块+3校验块的情景,可以允许3个块(任意数据块+校验块数量之和为3)损坏。在偏纯存储的场景会⽤到,
例如对象存储。n数据块+m校验块的纠删码配置,存储效率是
n/n+m, 但是在重构(Reconstruct)的时候,需要消耗cpu资源,⽽且有⼀定延时
golang reedsolomon
minio是⼀个对象存储服务,存储考虑的是低成本+⾼可⽤,其纠删码使⽤的是RS纠删码,对应的github仓库是
单核恢复能⼒超过1GB/s, 特定平台可以通过指令加速。
这个repo的⽂档⽐较完善,api的操作具体可以看⽂档。下⾯来做⼀个简单的验证
进⼊examples⽬录
$ go && go && rm *.go
$ ls
README.md simple-decoder simple-encoder
⾸先,以Readme.md为⽬标,执⾏encode操作,这⼀步是为了把⽂件分割成数据块+校验块
$ md5sum README.md
0076c987f6cc5e98919b0b9403b12b5f README.md
$ mkdir data && cd data
$ ../simple-encoder -out . ../README.md
Opening ../README.md
File split into 6 data+parity shards with 358 bytes/shard.
decoderWriting to README.md.0
Writing to README.md.1
Writing to README.md.2
Writing to README.md.3
Writing to README.md.4
Writing to README.md.5
$ ls
README.md.0 README.md.1 README.md.2 README.md.3 README.md.4 README.md.5
simple-encoder 使⽤的是4数据块+2校验块的配置,⼀共会⽣成6个⽂件
这个时候我们删除2个数据块,看能否恢复
$ ../simple-decoder -out ./struct README.md Opening README.md.0
Error reading file open README.md.0: no such file or directory Opening README.md.1
Error reading file open README.md.1: no such file or directory Opening README.md.2
Opening README.md.3
Opening README.md.4
Opening README.md.5
Verification failed. Reconstructing data
Writing data to ./struct
$ md5sum struct
0076c987f6cc5e98919b0b9403b12b5f strut md5sum 的结果显⽰,重构后的⽂件与源⽂件⼀致。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论