免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5901 | 回复: 9

[容灾] TRUE CDP、固态盘、掉电保护、网络存储一炮解决的想法 [复制链接]

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-08-10 13:02 |显示全部楼层
琢磨对一个开源项目NDB做个改进。
NBD面向用户的一端使用逻辑块,每次对同一个逻辑块的写入,就找一个空闲物理块进行写入,每个逻辑块分配一个链表,用来存储写入时间和对应的物理块。当然,链表的长度不是无限的,链表中指向指定时间以前的写入视为无效,对应的物理块被释放,加入空闲物理块链表。

这种做法会“浪费”一部分存储空间用于存储写入链表,但这个浪费不会是无限的,可以控制在指定的百分比之内。它的主要好处是可以做微秒级的CDP,同时也能防止固态盘特定物理块损坏。这个办法可以直接用在固态存储卡上,说不定以后的CDP就是基于特定存储卡的了,技术环境总是在变的。

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-08-10 14:48 |显示全部楼层
本帖最后由 bbjmmj 于 2014-08-11 11:02 编辑

我想复杂了,可以简化一下算法。
刚才下了NBD3.8的源码,看了看,vi nbd-server.c,里面有个rawexpwrite函数,只要在这里记录一下写入就可以实现TRUE CDP,方法是先把要写入的部分记录下来,然后再写入相应的buf内容,同时记录写入时间,因为记录是顺序的,恢复的时候算法会比较简单。
记录日志需要copy on write,这是一个较长时间的原子操作,要先对LUN文件和日志文件上锁,然后再拷贝,然后写入拷贝,最后写入日志,最后释放锁。
日志文件不是LUN文件,而是另一个大文件,尺寸可以不固定,考虑到并发写入情况,写之前先link,获取写入锁之后再写入数据,之后再unlink释放锁,锁文件放在tmpfs上。每次启动nbd的时候,日志文件被重建,重建之前可保留旧的日志文件,相当于留下了一个快照。
nbd的块是存在server文件系统上的一个大文件,如果在机械硬盘上做这个服务,性能会比较差,但在SSD上,性能问题就可以忽略了,反正就是用它给主存储上的机械硬盘做镜像,性能上不会有多大障碍,连续大块写入的数据不会太多。

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-08-10 16:24 |显示全部楼层
记录写入需要一个单独的用于存储日志的存储空间,对应的就是OS文件系统上一个大文件,考虑到并发应用环境,写日志的时候得先用link锁文件,写完了再unlink,link锁文件放在tmpfs上就不会影响性能了,这么做代码比较简单。
山寨TRUE CDP不是目的,改源码的目的是评估TRUE CDP效能。
需要一块固态盘,好几百块,为了工作,自己花钱买,有点儿心不甜~

论坛徽章:
5
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
发表于 2014-08-11 15:00 |显示全部楼层
大神一如既往的高大上。

啥是CDP啊?

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-08-11 15:02 |显示全部楼层
回复 4# tangye


    连续数据保护。

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-08-17 14:11 |显示全部楼层
改造IET,让它支持TRUE CDP,vi kernel/file-io.c,找到static int fileio_make_request(struct iet_volume *lu, struct tio *tio, int rw),里面有个代码段是用来写IO的:

if (rw == READ)
                        ret = vfs_read(filp, buf, count, &ppos);
                else
                        ret = vfs_write(filp, buf, count, &ppos); <--------------------这里改成:加锁;ret = vfs_read(filp, buf1, count, &ppos); ret = vfs_read(filp, buf, count, &ppos);解锁;保存buf1;

论坛徽章:
0
发表于 2014-08-17 15:55 |显示全部楼层
好高端的~

论坛徽章:
0
发表于 2014-08-21 17:19 |显示全部楼层
跟着学学

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-09-01 10:54 |显示全部楼层
有个更好的想法,正在做。
不用NBD了,弄了个虚拟块设备驱动,用它截获实体块设备(比如LVM逻辑卷)的IO操作,虚拟块设备可以对截获的操作进行处理,比如实现SSD缓存、分级存储、TRUE CDP等功能。虚拟块设备已经搞定,已经做到打开实体块设备,接下来是对实体块设备的IO操作(主要是读写),我先琢磨一下算法,目的是既要提高并行度,又要防止多个访问之间发生冲突。
学校下学期要搞信息化,其中一个项目是视频采集,服务器要承载视频编辑和文件服务,100多个班级,近300老师,用脚后跟想也知道一台服务器绝对扛不住这么大的访问量。第一个想到的是FLASHCACHE,但是FLASHCACHE算法有缺陷,上百个硬盘块对应一个SSD块,很容易发生冲突,缓存的效率会比较低,由此带来更要命的问题是SSD磨损严重,而且据说FLASHCACHE的并行度也不够好,所以这两天正琢磨PLAN B,自己弄个缓存。
自己弄缓存的好处是可以针对特定应用对热点数据进行缓存。我琢磨的缓存算法大概是这样的:块级缓存,4K块,每个块缓存权值计算方法很简单,根据2080法则,缓存新权值 = 0.8 * 旧权值 + 0.2 *指定统计时间段内访问频率,缓存预留20%空闲块,当缓存空闲块少于20%时,释放权值较小的缓存块。如果统计时间段较长,就相当于一个分级存储。这种做法跟FLASHCACHE相比,可以大幅提高命中率和固态盘写寿命,这样可以放心使用读写缓存,效率会很高。
大家谁有兴趣可以做成产品,赚点钱。

论坛徽章:
9
技术图书徽章
日期:2014-10-14 15:48:13数据库技术版块每日发帖之星
日期:2015-06-04 22:20:00数据库技术版块每日发帖之星
日期:2015-06-10 22:20:00数据库技术版块每日发帖之星
日期:2015-06-11 22:20:00数据库技术版块每日发帖之星
日期:2015-06-13 22:20:00IT运维版块每日发帖之星
日期:2015-09-22 06:20:00IT运维版块每日发帖之星
日期:2015-12-08 06:20:00综合交流区版块每日发帖之星
日期:2016-02-02 06:20:00IT运维版块每日发帖之星
日期:2016-07-25 06:20:00
发表于 2014-09-05 07:49 |显示全部楼层
本帖最后由 bbjmmj 于 2014-09-05 07:54 编辑
bbjmmj 发表于 2014-09-01 10:54
有个更好的想法,正在做。
不用NBD了,弄了个虚拟块设备驱动,用它截获实体块设备(比如LVM逻辑卷)的IO操 ...


鼓捣了几天,又绕回NBD了,原因就一个:闪存寿命。对于文件服务器来说,如果在主机上做分级存储,闪存写入量将非常恐怖,闪存会很快坏掉,如果用PCIE SSD,需要频繁停掉主机更换存储卡,业务连续性会很成问题,所以还是得借助开源,先在NBD SERVER上实现存储分级,然后把NBD作为集群节点挂载到主机上。
按读写比例10:1计算,300用户的写入量相当于单机读量的30倍,闪存很容易写坏。考虑到闪存写入寿命,写缓存彻底放弃了。
据说FLASHCACHE3缓存命中率可达80%,即便如此,仍然会有20%的读操作落在硬盘上,速度提高最多只有5倍,恐怕很难支撑300个用户同时使用,而剩下的20%硬盘读操作大部分还得刷到缓存上,这种情况下缓存写入量仍然很高,高到足以在短时间内刷坏SSD。如果缓存命中率能提高到99%,仅有1%的读落在硬盘上,读性能足以支撑300用户使用,而这1%的读,刷缓存的数据量也会小很多,缓存可以撑很久。
如果只做读缓存的话,还有另一个更变态的方法,白天统计硬盘块访问,夜间把经常使用的数据调到缓存里,这样每天缓存只刷一次,台式机SSD足以胜任。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP