文件服务迁移重构之分布式文件系统迁移和选型思路

近期困扰公司招投标系统项目多年的文件存储量日益增大的问题又爆发了,由于法律的规定,这些文件必须长期保存10年以上。现有的服务器是基于windows server 2008R2的老系统,由于之前的规划问题,分区都已经接近满或者剩余的空间也无法放下足够的文件,存储的挂载也不是很合理。由于windows系统在这方面确实不行,因此思考后决定采用Linux去解决问题。原本仅仅想简单的将其中一台服务器重装操作系统为centos系统,然后利用lvm将其中原有的两个硬盘合并为一个逻辑驱动器通过nfs挂载到windows系统下,这是由于系统是基于.net framework运行的成熟业务系统,不可能去全面的换成Linux系统去实现。但是发现即使这样做,也只是解决了眼前的磁盘容量问题,其实大量的磁盘空间被闲置在另外几台服务器上长远来看是不解决问题的,因此只有采用分布式文件系统才能解决这些问题。但是面临如下问题需要解决。

  1. 如何保留现有的Windows服务器,不改造应用本身实现可靠的分布式文件系统?

    解决这问题的主要方法无法是两种,一是寻找windows下成熟方案的分布式文件系统最好是夸平台的实现,二就是就是虚拟化技术或者容器方案。

    对于方法一进过调研主流分布式文件系统的方案基本上都是基于Linux的并不存在夸平台的方案的。于是也只有利用虚拟化或者容器方案去实现一种方式。由于操作系统是windows的关系,容器化其实就是基于虚拟化的实现。原本想简单的使用Docker的widows版本去实现,但是由于操作系统比较老,Docker for windows是不支持Windows Server,而使用了下Docker tool box实际的体验并不是太好,因此还是决定使用Windows Server 2008R2 自带的Hyper-v技术来实现真正的虚拟化,在现有windows系统内虚拟出完整的Linux操作,去实现分布式文件系统。这个方案的难点显而易见是磁盘本身的问题。

    使用过虚拟化的话都知道windows下hyper-v会将虚拟机的磁盘虚拟化为vhd文件,似乎也只能附加vhd文件,这就带来问题是不能独立的使用磁盘空间,而且性能上也带来一定的问题,踌躇之际,而然发现hyper-v第一代是可以挂载本机硬盘到一个虚拟机内的,这里简单说下做法:
    1)新建一个虚拟机如下图:

    命名虚拟机:

    分配内存:

    配置网络:

    选择或者创建磁盘镜像文件:

    这里就是之前认为windows下hyper-v不能挂本地磁盘的原因,因为并没有相关的选项。主要看后面。
    安装选项:

    汇总:

    结束后请不要启动虚拟机,挂载分区是要再关闭虚拟机的状态下进行的:右击已经创建的虚拟机选择setting

    选择IDE Controler 点击Add Hard Diver

    可见:

    Physcial hard disk:就是需要挂载的磁盘。但是默认情况下这是选项是不能选择的并且是灰色的,如何能做到可以选择?
    提示上说磁盘必须是脱机的,也就是这个磁盘必须被虚拟机独占。看下磁盘管理:

    实际操作中其实这个磁盘光脱机也是不行的,必须没有任何已经分区的磁盘如果有请删除所有的分区。
    挂载完成后安装centos操作系统,就可以在系统内看到这个挂载的磁盘。下面将其做成lvm分区就可以了。

    lvm的创建:

       pvcreate /dev/sdb
       vgcreate vg_data /dev/sdb
       lvcreate -L 931G vg_data -n lv_data
  2. 如何在Windows下C#程序中读写分布式文件系统中的文件而不涉及较大的改造?
    一般来说读写分布式文件系统内的文件有几种方式
    1)通过该分布式文件系统的客户端API进行读写
    2)通过fuse将分布式文件系统挂载到用户空间下的普通目录去做
    3)通过nfs映射出来,然后mount
    这三个方案的选择很明显是第三种,第一种因为需要对API进行重大改造而且客户端API的耦合性很大,为今后其他操作埋下隐患。第二种方案如果客户端是Linux比较容易实现并且需要该分布式文件系统支持fuse,windows下当然也有fuse的实现,比如:
    winfsp:https://github.com/billziss-gh/winfsp
    但是可能需要c++的一些自实现,其实不方便。
    那选项只要有nfs这种方式了。通过nfs将文件隐射出来。并支持各版本的nfs协议 https://github.com/nfs-ganesha/nfs-ganesha
    nfs-ganesha是一个可行的开源解决方案 利用FSL的方式代理出来,目前支持glusterfs、ceph等主流分布式文件系统。
  3. 文件如何迁移

文件迁移主要通过C#写程序去,这次做迁移另外一个目的是为了将直接保存在数据库中的采用Sql Server file stream保存的文件迁移到Linux下分布式文件系统内。通过在windows系统上映射nfs为一个磁盘盘符来做到。细节部分另问介绍。

  1. 分布式文件系统的选型

主流分布式文件系统如下:

1)mogileFS:Key-Value型元文件系统,不支持FUSE,应用程序访问它时需要API,主要用在web领域处理海量小图片,效率相比mooseFS高很多。

2)fastDFS:国人在mogileFS的基础上进行改进的key-value型文件系统,同样不支持FUSE,提供比mogileFS更好的性能。

3)mooseFS:支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多

4)glusterFS:支持FUSE,比mooseFS庞大

5)ceph:支持FUSE,客户端已经进入了linux-2.6.34内核,也就是说可以像ext3/rasierFS一样,选择ceph为文件系统。彻底的分布式,没有单点依赖,用C编写,性能较好。基于不成熟的btrfs,其本身也非常不成熟。

6)lustre:Oracle公司的企业级产品,非常庞大,对内核和ext3深度依赖

7)HDFS:hadhoop文件系统,适合大文件存储,支持fuse,基于java编写
7种分布式文件系统中,第六种是商业话的不选用,所有不支持fuse也不是选择目标,支持 nfs-ganesha的只有ceph和glusterfs两种因此这两种是一个选型目标。ceph其实进入生产环境准备并不是太久,虽然没有单点依赖,但是本身不够成熟还需时日,因此glusterfs是唯一的选择。glusterfs作为redhat在主流维护的社区项目,相信他的稳定性之类的都没有什么问题。

最后给出迁移后的结构图:

下篇将详细描述有关glusterfs和nfs-ganesha的配置。

Lokie博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com