[ceph学习-4]数据的可靠性,一致性

数据保存在一块盘中是无法保障数据可靠性,通常采用多副本的方法,副本越多,越可靠。在确定副本数下,副本丢失后的恢复速度,是可靠性的关键因素。如果数据修复的速度够快,可以抢在另一块盘损坏之前,修复丢失后数据。
一致性hash方案中,如果将一块磁盘同一个hash区间一一绑定,因此数据恢复时,只能先更坏坏盘,然后从其他副本处读数据,写入新磁盘,时间尺度交大。

如果方案中,让节点同hash区间一一对应,在节点内部,在将数据分散存储到一块磁盘中,那么当需要恢复副本时,节点将损坏的磁盘的数据对象分散存放到其他磁盘上。这样可以先发起修复,从其他副本那里获得数据,并发的向多个磁盘恢复数据,磁盘的吞吐会得到缓解,但网络将会成为瓶颈。千兆网络最大支持120MBps,比磁盘快一倍。另一个问题是,数据在节点内部任意分散到各磁盘上,那么节点就需要维护一个key->磁盘的映射。也就是节点内的局部元数据。这个元数据需要服务器自己维护,由于单台服务器资源有限,元数据的可靠性、可用性和一致性的维持非常麻烦。一旦这个元数据丢失了,这个节点上的所有数据都找不到,需要从其他副本那里恢复丢失的数据,但恢复起来更困难。更现实的做法是直接扫描各磁盘,逆向的重建元数据。

副本恢复最快,影响最小的方法,不让数据对象绑死在一台节点上,只要数据对象可以存放到任意一台节点,那么便可以在节点之间多对多的数据副本恢复。集群规模越大,速度越快。基于元数据的方案,每个对象同节点,乃至硬盘的映射是任意的。

有一些基于混合方案的衍生方案可以解决hash在副本修复速度问题:将hash环划分成若干slot(bucket),数量远远大于将来集群可能拥有的节点数、或磁盘数。如2^32。slot到节点或磁盘的映射通过一个映射表维护,各副本集群中的slot分布互不相同,当一个磁盘损坏时,找出所包含的slot,将这些slot分散到其他节点和磁盘上。这样便可以并发的从其他节点上以slot为单位进行副本恢复,在磁盘更换后,再将一些slot,可以是原来的,也可以是随机的迁移到磁盘,以达到数据平衡。

确保数据对象一致性最实用的方法是W+R>N。即N个副本中,一个版本写入确保W个成功,而读取时确保R个成功,只要满足W+R>N的情况,便可以保证始终可以读到最后写入成功的版本。元数据在节点下线时可以采用另外挑选一台合适的节点,写入副本,更新相应元数据操作。一致性hash方案,无法随意的将副本写入到其他节点上,有2中方法,1是将副本或者key写入一个队列,等节点恢复后,发起修复操作,从其他副本获取数据,补上缺失副本。这个队列必须足够可靠,否则等到一致性检查时才能修复。2是按照一定规则写入其他节点,等回复后原样迁回,但调度会比较复杂。

发表评论

您的电子邮箱地址不会被公开。