分布式对象存储学习笔记(四)——元数据服务

分布式对象存储——原理、架构及Go语言实现 胡世杰

为了记录对象版本以及其他一些元数据,我们需要将一个新的组件加入我们的架构:元数据服务

什么是元数据

系统定义的元数据

元数据服务就是提供对元数据的存取功能的服务。元数据指的是对象的描述信息对象的名字、版本、大小以及散列值等。 这些都是系统定义的元数据,因为它们的存在对一个对象存储系统有实际意义,比如说客户端和接口服务之间根据对象的名字来引用一个对象;一个对象可以有多个版本,除了删除标记外,每个版本实际都指向数据服务节点上的一份数据存储。

用户自定义的元数据

自定义的元数据通常是以键值对形式保存的任意描述信息,比如一张照片的拍摄时间和拍摄地点,一首歌的作者和演唱者等。对象存储系统不关心这些元数据,但是用户需要将它们添加到对象存储系统中,作为该对象的元数据进行保存。

散列值和散列函数

对象的散列值是一种非常特殊的元数据,因为对象存储通常将对象的散列值作为其全局唯一的标识符。

在此前,数据服务节点上的对象都是用名字来引用的,如果两个对象名字不同,那么我们无法知道它们的内容是否相同。这让我们无法实现针对不同对象的去重。

以对象的散列值作为标识符,我可以将接口服务层访问的对象和数据服务存取的对象数据解耦合。

客户端和接口服务通过对象的名字来引用一个对象,而实际则是通过其散列值来引用存储在数据节点上的对象数据,只要散列值相同则可以认为对象的数据相同,这样就可以实现名字不同但数据相同的对象之间的去重。

对象的散列值是通过散列函数计算出来的,散列函数会将对象的数据进行重复多轮的数学运算,这些运算操作包括按位与、按位或、按位异或等,最后计算出来一个长度固定的数字,作为对象的散列值。一个理想的散列函数具有以下 5 个特征。

  1. 操作具有决定性,同样的数据必定计算出同样的散列值。
  2. 无论计算任何数据都很快。
  3. 无法根据散列值倒推数据,只能遍历尝试所有可能的数据。
  4. 数据上微小的变化就会导致散列值的巨大改变,新散列值和旧散列值不具有相关性。
  5. 无法找到两个能产生相同散列值的不同数据。

在现实世界,一个散列函数hash的安全级别根据以下3种属性决定

  1. 抗原像攻击:给定一个散列值 h,难以找到一个数据m令h=hash(m)。这个属性称为函数的单向性。
  2. 抗第二原像击:给定一个数据 m1,难以找到第二个数据 m2令 hash(m1)=hash(m2)。
  3. 抗碰撞性:难以找到两个不同的数据m1和m2令hash(m1)=hash(m2)。这样的一对数据被称为散列碰撞。

我们使用的散列函数是 SHA-256,该函数使用64轮的数学运算,产生一个长度为256位的二进制数字作为散列值,目前在全世界还没有报告过一起散列碰撞事件。

对安全性有特殊要求可以选用SHA-512 或其他更高位数的散列函数。

我们实现的元数据服务较为简单,它将只保存系统定义的元数据,也就是对象的名字、版本、大小和散列值,因为这些直接影响到我们的存储功能。用户自定义的元数据对我们没有直接影响,所以没有实现。不过一个成熟的对象存储系统通常都会支持对用户自定义元数据的高级搜索功能,可以自行实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值