序言
可靠性,你有多可靠?
在进行数据存储的时候,最担心的莫过于数据丢失了,而数据丢失可以从很多层面来进行保障,但是最终数据都是存储在磁盘当中。
SATA,便宜,容量大,7200转,写入速度慢;SAS,相对便宜,容量大,用的少,10000转,写入速度一般;SSD,贵,容量小,主要负责热点数据,随机读速度很快,15000转。。。这种东西无意义,除非你要采购。。。so boring。。。
如何保障数据可靠性
有的时候使用文件来保存数据,有的时候使用内存来保存数据,有的时候使用磁盘来保存数据,持久化,也就是将数据转换成字节流,然后把01010010写入到磁盘的扇区当中。
在存储数据的时候,是否需要做RAID?
在分布式存储中,基本上是不做RAID的,因为需要保存大量的数据,使用什么类型的磁盘来存储数据?是SATA?还是SAS?还是SSD呢?
分布式存储,追求的是容量,从而基本上是使用SATA存储,一个盘多大?8T。。。一个服务器总共12块硬盘,那就是存储容量为96T,在做一个分布式系统的集群的时候,一般服务器本身的操作系统盘也是占据部分空间,再加上分区的时候,保留的空间,大量的元数据占用的空间,其实真正的空间也就80多个T。
分布式存储,不需要太多的核心的数,56core就够了,那么内存多大,一般使用的也就是128G内存,那么网卡都是万兆网卡。
在分布式存储中,由于没有从底层的硬件做RAID,那么在各种硬盘损坏之后,基本上就是数据丢失,那么需要重新将副本数据迁移到好的机器当中,从而在分布式存储中,分片是保证数据可靠性的唯一手段,这也就是为什么在使用分布式存储的时候,一般都设置分片数为3,为什么是奇数?因为可能这个分布式存储需要选主对外提供服务,奇数只是为了保证不脑裂而已。
那么如果在写入数据的时候,需要缓存怎么办?可以使用PCI-E扩展接口,然后外接两个SSD磁盘,专门用来做缓存,毕竟SSD是适合于随机读写的。。。
当不是使用分布式存储的时候,那么如何来保证数据的可靠性,靠的就是RAID,其实使用RAID更加简单,在服务器级别,一般使用RAID10来进行存储,使用四快盘,从而可以冗余一块盘,硬盘坏了一块怎么办,直接替换就好了,在硬件级别会自动进行数据同步,当你替换硬盘后,会发现磁盘灯哗啦哗啦的转个半小时,然后就好了。
服务器掉电怎么办?分布式存储是在应用层进行冗余,而其他的则是在硬件层冗余,当使用RAID的时候,都会有掉电机制,也就是即使服务器掉电了,数据也会可靠的写入到磁盘当中。
IO链路
有了RAID的机制,是不是就高枕无忧?有了分布式存储,是不是就是普天大吉?
数据存储,有些人写入数据的时候调用一个方法,write就写入了,返回成功就是成功了,返回失败就认为失败了。。。。真的是这样吗?
调用写入的方法,分为两种,一种是同步写入,一种是异步写入,同步写入的时候,是将数据写入到磁盘,然后应用到内存,返回客户端成功;而大部分的操作系统自带缓存,也就是在使用命令free的时候看到的buffer,这个里面存储的就是你要写入的数据,也就是传言中的脏数据。。。why call it dirty?异步,就是将数据写入到buffer中,就返回客户端成功,其实这个时候,并没有真正将数据持久化到磁盘上,服务器后端有进程叫啥flush会定时的将脏数据写入到磁盘中,为了最大化的性能,一般都是批量写入,例如大小512K的时候,写入磁盘,或者指定时间,10ms写入一次。。。这个时候掉电。。。哼哼。。。你认为成功了的操作,其实并没有写入成功。。
掉电可能会丢失数据,看你运气的好坏咯。。。
数据强一致性,你可以禁用缓存,使用同步写入,但是如果一旦有故障,那么会阻塞写操作,最终超时报错,可用性和一致性之间一直是一种权衡的关系。。。毕竟有CAP理论撑腰。。。
写入数据?当写入数据的时候,其实又分为两个部分,一个部分是元数据,一个部分才是真正的数据,如果block数据写入了,而metadata没有写入,从客户端看起来还是丢失数据,虽然磁盘上存了真正的内容,但是元数据没有,客户端是读取不到的,相当于你删除了你电脑上的小电影,其实内容依旧在电脑上,只不过将元数据进行删除,就找不到了,但是依旧是可以恢复的。。。