看视频 盘古:阿里云飞天分布式存储系统实践 过程中记的乱七八糟的东西。仅是个人笔记供以后查阅,没有参考价值,各位看官还是各自散去~
分布式和集群的区别:
分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
块存储,典型设备:磁盘阵列,硬盘,虚拟硬盘。这种接口需要实现Linux的Block Device的接口。
文件存储,典型设备:FTP、NFS服务器,SamBa。通常意义是支持POSIX接口,它跟传统的文件系统如Ext4是一个类型的。
对象存储,典型设备:内置大容量硬盘的分布式服务器。也就是通常意义的键值存储。
分布式系统下的纠删码技术 – Erasure Code (EC)
为了数据丢失后能恢复,除了存放几份副本,还有另一种做法,就是利用纠删码把丢失的数据计算出来。与副本相比,纠删码的优点在于节省存储空间,缺点在于有计算开销而且修复需要一定时间。
例如,有k个数据块,则如果用副本的方式,至少就需要保存2k个数据块。而使用纠错码的方式,由于k元多项式需要k个方程就能解出来,因此只需要最少k+1个数据块(当然还需要用于计算的编码矩阵)。
现有的EC库:Jerasure库、Intel EC库、Hadoop 3.0的EC编码。其中Jerasure库是线程不安全的。
http://blog.youkuaiyun.com/u011026968/article/details/52295666 中关于求出丢失数据和code的例子(矩阵乘法、逆矩阵)。
定义:erasure code是一种技术,它可以将n份原始数据,增加m份数据(用来存储erasure编码),并能通过n+m份中的任意n份数据,还原为原始数据。
RAID,为Redundant Arrays of Independent Disks的简称,中文为廉价冗余磁盘阵列。RAID阵列技术允许将一系列磁盘分组,以实现为数据保护而必需的数据冗余,以及为提高读写性能而形成的数据条带分布。
一共有0~6一共7种,这其中RAID 0、RAID1、RAID 5和RAID 6比较常用。由于RAID0完全没有数据安全保障(只加快读写性能,把数据分布在多个盘上,在读写时是以并行的方式对各硬盘同时进行操作),RAID1存储效率低(50%),而RAID5/RAID6也就分别支持最多1块和2块磁盘失效。因此还是使用EC纠错码比较高效可用。
而RAID 5/6由于复杂的算法,读取和写入速度测试时,表现会比其他RAID要差。
打开文件的O_APPEND标记:
fd = open(“./test.c”, O_WRONLY | O_APPEND);
在写文件时,无论先lseek到哪里,write的时候都是在文件结尾append内容。
在读文件时,lseek仍然有效果。因此对于刚打开的文件,seek到SEEK_CUR其实是0位置,而不是文件结尾。
实现apend only还可以用模拟fifo的方式。
常见的apend only的例子是syslog。
aka: also known as
写入存储时,根据是否有IO缓存,分两种方式:
Write-through(直写模式)在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。
Write-back(回写模式)在数据更新时只写入缓存Cache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。
Write-through方式,在读的时候不用检查缓存是否dirty,命中后可直接读。
Write-back方式,在读的时候要判断是否dirty。另外读和写结束后还要判断是否需要更新脏位标记(例如读后要标记非脏,写后要标记脏了来通知回写)。
具体流程参考