go分布式存储,rs纠删码

丢失的数据不能小于校验快的数据,否则没法复原数据

可用容量看,4+2纠删码的利用率是66%(4/(4+2)),但3副本只有33%(4/(4*3)),两者差了2倍,8+2纠删码的利用率更可以做到80%,由此可见纠删码的可用容量对比多副本要高很多

rs.txt 内容
AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDSDG
分片和解码
package main

// rs 纠删码
import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strconv"

	"github.com/klauspost/reedsolomon"
)

const (
	dataShards = 2 // 数据分片数
	parShards  = 1 // 校验分片数
)

func main() {
	//encoder()
	decode()
}

func encoder() {

	fname := "rs.txt"
	// Create encoding matrix.
	enc, err := reedsolomon.New(dataShards, parShards)
	checkErr(err)

	fmt.Println("Opening", fname)
	b, err := ioutil.ReadFile(fname)
	checkErr(err)

	// Split the file into equally sized shards.
	// 此时分成了3等片
	shards, err := enc.Split(b)
	checkErr(err)
	fmt.Printf("File split into %d data+parity shards with %d bytes/shard.\n", len(shards), len(shards[0]))

	// Encode parity
	// 分片 encode 下
	err = enc.Encode(shards)
	checkErr(err)

	// Write out the resulting files.
	_, file := filepath.Split(fname)
	dir := "./tmp/encoder/"
	for i, shard := range shards {
		outfn := fmt.Sprintf("%s.%d", file, i)

		fmt.Println("Writing to", outfn)
		// 分割的分片写入各个文件中
		err = ioutil.WriteFile(filepath.Join(dir, outfn), shard, os.ModePerm)
		checkErr(err)
	}
}

func checkErr(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
		os.Exit(2)
	}
}

// -------------------------  decode  -----------------------

func decode() {
	// Create matrix
	enc, err := reedsolomon.New(dataShards, parShards)
	checkErr(err)

	fname := "./tmp/encoder/rs.txt"
	// Create shards and load the data.
	shards := make([][]byte, dataShards+parShards)
	var iNum []int
	for i := range shards {
		infn := fmt.Sprintf("%s.%d", fname, i)
		fmt.Println("Opening", infn)
		shards[i], err = ioutil.ReadFile(infn)
		if err != nil {
			fmt.Println("Error reading file", err)
			shards[i] = nil
			iNum = append(iNum, i)
		}
	}

	// Verify the shards
	ok, err := enc.Verify(shards)
	if ok {
		fmt.Println("No reconstruction needed")
	} else {
		fmt.Println("Verification failed. Reconstructing data")
		// 恢复切片
		err = enc.Reconstruct(shards)
		if err != nil {
			fmt.Println("Reconstruct failed -", err)
			os.Exit(1)
		}
		// 再次验证分片
		ok, err = enc.Verify(shards)
		if !ok {
			fmt.Println("Verification failed after reconstruction, data likely corrupted.")
			os.Exit(1)
		}
		checkErr(err)
		// 丢失的分片数据恢复
		for _, i2 := range iNum {
			outfn := fname + "." + strconv.Itoa(i2)
			err = ioutil.WriteFile(outfn, shards[i2], os.ModePerm)

		}
	}

	outfn := "./tmp/decoder/rs.txt"
	fmt.Println("Writing data to", outfn)
	f, err := os.Create(outfn)
	checkErr(err)

	// We don't know the exact filesize.
	// 还原数据
	err = enc.Join(f, shards, len(shards[0])*dataShards)
	checkErr(err)
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分布式存储系统中常用的数据冗余技术包括多副本策略和码。码是一种编码技术,它可以将原始数据增加冗余数据,并能通过任意一部分数据还原出原始数据。相比多副本策略,码具有更高的磁盘利用率。在分布式存储系统中,码技术主要有三类应用:阵列码、Reed-Solomon码和LDPC低密度奇偶校验码。 阵列码(Array Code)是一种常见的码技术,例如RAID5和RAID6。它们通过将数据和校验信息分布在多个磁盘上,实现数据的冗余和容错能力。 Reed-Solomon码是一种经典的码技术,它能够容忍数据丢失,并通过冗余数据进行恢复。它在分布式存储系统中被广泛应用。 LDPC(Low-Density Parity Check)低密度奇偶校验码是一种近年来兴起的码技术,主要应用于通信、视频和音频编码等领域。 这些码技术在分布式存储系统中的应用,可以提高数据的可靠性和冗余度,从而保护数据免受丢失或损坏的影响。同时,码技术也能够提高磁盘利用率,减少存储成本。 #### 引用[.reference_title] - *1* *3* [码--分布式存储数据备份](https://blog.csdn.net/weixin_41303815/article/details/130111204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [分布式存储系统 | 码(Erasure Coding),以Reed-Solomon(RS)码为例](https://blog.csdn.net/Sbs5218/article/details/127154553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gitxuzan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值