黄呆毛
作者黄呆毛2017-08-18 14:14
技术经理, 上海汽车

【交易技术前沿】用开源软件构建安全的可扩展的存储平台 / 朱宁

字数 12111阅读 1066评论 0赞 5

本文选自《交易技术前沿》第二十五期 (2016年12月)。
朱宁

摘 要:本文通过引用开源软件GlusterFS部署的实验过程,论述了用开源软件构建企业分布式存储平台的可能性及其特点,同时介绍了GlusterFS的安全控制机制。

关键词:分布式;GlusterFS;访问控制;Samba

一.内部数据共享和存储平台

证券行业的企事业单位内部都部署了大量业务应用,类似邮件系统、数据库系统、文件交换平台、客户资料、业务数据等都需要大规模存储空间。一般商用的NetApp,EMC等存储系统大都价格不菲,且受制于厂商的因素较多,维护成本和扩容成本都比较高。特别是在以虚拟化技术、大数据运用和云计算为代表的金融数据中心领域,对存储平台的灵活性和安全性的要求非常高,针对不同的业务选用不同的存储介质(参考表1),如普通机械磁盘SATA一般适合顺序访问的系统,SSD适合对时延敏感的重要系统。开源分布式存储系统通过数年的发展,目前既能满足自定义存储组合的需要,又能兼顾到数据冗余、安全管理和成本投入,并能依托于数据中心网络进行规模扩展,已被大量使用在生产环境中。

表1:访问各种存储介质的时延估算
| I/O事件 | 延时 |
| L1 缓存访问 | 0.9纳秒 |
| L2 缓存访问 | 2.8纳秒 |
| L3 缓存访问 | 12.9纳秒 |
| CPU访问内存DRAM | 120纳秒 |
| 固态硬盘SSD I/O | 50-150微妙 |
| 机械硬盘 I/O | 1-10毫秒 |

所谓分布式存储系统,就是把机房中的每台机器上的磁盘空间视为存储资源,通过网络将这些分散的存储资源虚拟成一个统一的存储设备,再将业务数据分散存储在虚拟存储设备上。传统的网络存储系统NAS采用集中的存储服务器存放数据,该服务器可能会成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式存储系统采用可扩展的系统结构,利用多台PC服务器分担存储负荷,利用位置服务器定位存储信息,不但提高了系统的可靠性、可用性和存取效率,还易于扩展。

分布式存储系统的易扩展性主要体现在能良好地支持横向扩展,因为存储系统由大量低成本的普通PC服务器通过网络连接而成,仅通过简单地增加服务器的数量就可以提升系统的整体处理能力,同时系统内部的容错和冗余技术又能保障数据存储安全。例如Google的分布式文件系统(GFS)就是利用廉价服务器搭建的大规模分布式存储平台,它以64MB大小的数据块(chunk)来划分文件,每个chunk又以64KB大小的block来划分,GFS通过Master服务器实现元数据管理、主副本管理和数据块均衡分配。

二. 开源分布式存储软件

GlusterFS是近年来兴起的一个开源分布式文件系统,与MooseFS、Ceph、Lustre一起并称为互联网四大开源分布式文件系统,适合做为企业内部或私有云的存储平台。GlusterFS最早由Gluster公司开发,具有高扩展性、高性能、高可用性、可横向扩展等特点,支持PB级的数据存储量。GlusterFS没有采用元数据的设计(元数据主要用来描述数据属性,可支持如检索文件或区块的存储位置、查找历史数据和文件记录等功能),集群中的服务器和客户端都利用弹性哈希算法对数据进行定位和计算。这个设计消除了单点故障,提高了扩展性,根据以知文件名查找文件时速度很快,但在需要列示出大批量文件或目录时,效率比元数据服务器低,给客户端带来一定的CPU计算负担。GlusterFS没有设计私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、EXT4、XFS等)来存储文件,因此数据可以使用各种标准工具进行访问。构成GlusterFS系统的PC服务器(存储单元)可以在线进行增加和移除,不会导致应用和数据读写中断。此外GlusterFS在存储节点负载均衡的设计中,会优先选择容量负载最轻的节点建立新文件,然后在用户目标存储节点上创建文件链接指向真正存储文件的节点。

Ceph最初是一项关于存储系统的PhD研究项目,由Sage Weil在University of California, SantaCruz(UCSC)实施,是一项致力于开发下一代高性能分布式文件系统的项目,现在Ceph成为了开源社区众人皆知的明星项目,目前的长期稳定版本(LTS)是Hammer。Ceph通过软件定义存储的方式,用优异的性能去处理大批量数据,并为块存储、文件存储和对象存储提供了丰富统一的接口。当Ceph做为块存储和对象存储时,也不再需要元数据处理,它用CRUSH算法计算系统中数据应该被写入或读取的位置。CRUSH保存数据的多个副本,使Ceph能实现自我管理和自我修复。当部署Ceph做为CephFS文件系统(CephFS是Ceph面向文件存储的接口)时,需要元数据服务器MDS,MDS跟踪文件层次结构和存储元数据,易于实现分块、去重(又称重复数据删除,是指在一个数字文件集合中,找出重复的数据并将其删除,只保存唯一的数据单元,好处在于节省硬盘存储空间和网络传输带宽)等功能,但Ceph的MDS不直接提供数据给客户端。

GlusterFS和Ceph都适合用来做OpenStack的后端存储平台,相对而言,Ceph是目前OpenStack生态系统中呼声最高的开源存储解决方案。今年10月在巴塞罗那举办的OpenStack峰会上就有好几个Ceph和OpenStack融合的议题。Ceph的优势在于块存储和对象存储,并且在小文件的处理上比GlusterFS效率高,但GlusterFS做为集群文件系统处理文件存储时表现比较稳定,而CephFS还在完善中。基于对这两个开源平台的远景看好,RedHat红帽公司通过收购整合和定制开发,分别推出了商业版的红帽Gluster存储和红帽Ceph存储,RedHat对Gluster存储的定位是专为现代企业工作负载构建的可横向扩展的NAS存储,对Ceph存储的定位是适用于云计算PB级数据存储的下一代平台。

金融企业内部的数据存管一般主要以文件存储和文件共享为主,可以选用安装步骤简单、对系统硬件要求不高的GlusterFS做为底层平台。

三. 部署GlusterFS的安全考虑点

(1) 数据存储的安全

GlusterFS可定义6种卷的类型:Distributed Volume(分布卷)、Replicated Volume(复制卷)、Distributed Replicated Volume(分布式复制卷)、Striped Volume(条带卷)和Distributed Striped Volume(分布式条带卷)、Striped Replicated Volume(条带复制卷)。

条带就是把文件分割成多个块存放在多个磁盘上,当客户端读取文件时,多个服务器一起提供数据,性能良好。而且将文件条带化后可降低磁盘故障带来的损失。复制卷类似于Raid1,任何一块硬盘的损坏都不影响系统的正常运行。把条带卷和复制卷结合在一起就是条带复制卷,在不影响读写性能的情况下增强了数据存储安全。详见示意图。
微信图片_20170818134616.jpg

微信图片_20170818134616.jpg

图1:复制卷示意图 图2:条带卷示意图
微信图片_20170818134645.jpg
微信图片_20170818134645.jpg

图3:条带复制卷示意图

如果要求把一个文件分为4个数据块,每个数据块要有一个备份,按照条带复制卷模式就需要4个brick,为方便理解可把1个brick想象为1块磁盘。

(2) 用户安全管理

1、GlusterFS支持Linux系统原生的POSIX Access Control Lists(ACLs),可对存储的数据文件进行安全细粒度控制,管理用户和组对每一个文件的访问权限。
2、通过Samba访问存储卷时,可利用Samba自身的用户安全认证机制对存储卷予以保护。
3、数字列表项目关闭组成存储卷的PC服务器上闲置的应用和进程,强化服务器的系统和账户管理,对NTP服务启用安全措施,视需求调整服务器的iptables防火墙。

(3) 存储平台内部安全措施

GlusterFS内置了一些安全控制功能:

  1. 限制可以访问存储卷的IP地址,例如允许IP地址为192.168.1.1的设备mount卷:
    # gluster volume set volume_name auth.allow 192.168.1.1
  2. 限制可以访问存储卷的用户和组,例如允许uid为102的用户能访问卷:
    # gluster volume set volume_name storage.owner-uid=102
  3. 设置目录存储限额,例如设置目录/user01的存储限额为10GB:
    # gluster volume quota volume_name enable
       # gluster volume quota volume_name limit-usage /user01 10GB
  4. GlusterFS支持原生客户端(Native模式)和存储卷之间的SSL/TLS认证加密通讯,该项功能依托于OpenSSL库。利用NFS或Samba模式访问卷的话,还未实现认证加密通讯。

四. 用树莓派搭建分布式存储模型

目标:搭建企业网盘,把分布在不同机器上的存储资源整合成一个存储卷,用户在存储卷中有独立的工作目录,且只能访问自己的工作目录。用户的每个文件都会自动生成一个复本。

树莓派(Raspberry Pi)是一个开源的硬件平台,底层是完整的Linux操作系统,由于其体积小,扩展性强且价格便宜,所以被大量使用在硬件开发,系统测试等方面。详见图4。

用三台树莓派做GlusterFS存储平台的底层节点,分别命名为Node1,Node2,Node3,选用的树莓派型号为Raspberry Pi 3 Model B,它的CPU为4核1.2GHzBroadcom BCM2837,带4个USB2.0接口,1块百兆网卡,1个SD卡接口和1个HDMI接口。详见表2和图4。

表2:三台树莓派的硬件配置
| 节点名称和IP地址 | 内存和系统版本 | 提供服务的存储设备 |
| Node1:192.168.0.1 | 1G,Raspbian Jessie | 2块Kinston 16G U盘 |
| Node2:192.168.0.2 | 1G,Raspbian Jessie | 1块Kinston 16G U盘 |
| Node3:192.168.0.3 | 1G,Raspbian Jessie | 1块Kinston 16G U盘 |

微信图片_20170818135542.jpg

微信图片_20170818135542.jpg

图4:树莓派3代示意图

Raspbian Jessie是树莓派官网推荐的最新的操作系统版本,基于Debian的 Jessie版本。把Raspbian安装在树莓派的SD卡上(SD卡做为存储节点的系统盘)。在每台Node上插入16G的U盘做为GlusterFS的brick,后续将在这些U盘上建立存储卷。

详细步骤如下:

(1) 环境准备

编辑每台Node的/etc/network/interfaces文件,设置Node eth0网卡的IP地址。编辑/etc/hosts文件,添加三台Node的地址信息,编辑完成后,用ping Node1/Node2/Node3检查连通性。参考设备连接示意图。
微信图片_20170818135713.jpg

微信图片_20170818135713.jpg

微信图片_20170818135646.jpg

微信图片_20170818135646.jpg

图5:设备连接示意图

分布式系统健康运行的一个关键点是保持时钟同步,特别在这类规模庞大的分布式存储平台上,时钟的一点偏差可能会导致系统存取不到正确的数据段,影响到系统的自我修复效果,甚至会导致集群状态异常。在这个模型中,编辑三台Node的/etc/ntp.conf,把Node1做为时钟源,Node2/Node3向Node1取时钟进行同步。

 pi@node1:/etc $ntpq -p(略)
       remote refid st t when poll reach delay offset
       ======================================================================
       1.debian.pool.n .INIT. 16 u - 512 0 0.000 0.000
       *LOCAL(0) .LOCL. 10 l 16 64 377 0.000 0.000
       pi@node2:/etc $ntpq -p(略)
       remote refid st t when poll reach delay offset
       ======================================================================
       *node1 LOCAL(0) 11 u 11 64 3 0.213 -5.355

(2)存储设施准备

对U盘做格式化,转为ext3类型,U盘在Node的设备文件为/dev/sda1:

 pi@node1:/sbin $sudo mkfs.ext3 /dev/sda1
       /dev/sda1: UUID=“bf41e5d3-c5b9-44ea-87b3-3cb8ee5f8386” SEC_TYPE=“ext2” TYPE=“ext3” PARTUUID=“12af6bc2-01”

(3)建立存储路径

在每一台Node上建立/mnt/gv0目录,该目录做为GlusterFS的brick path,把U盘mount到/mnt/gv0。GlusterFS将用户数据保存在称为“brick”的设备中。一个brick是一个系统目录,GlusterFS把这些brick组合成一个存储卷,供客户端使用。Node1有2块U盘,所以分别mount到/mnt/gv0和/mnt/gv1。

pi@node1:/sbin $sudo mount /dev/sda1 /mnt/gv0
       pi@node1:/sbin $df -m | grep sda1
       /dev/sda1 14423 37 13647 1% /mnt/gv0

(4)在三台Node上安装glusterfs-server软件包:

$ sudo apt-get install glusterfs-server

目前安装的是GlusterFS 3.5版本,最新版本已到3.8.4。

(5)配置GlusterFS

以Node1做为主设备master,通过Node1进行GlusterFS集群的配置。首先建立信任关系,将Node2/Node3加入到集群中。

pi@node1:~ $sudo gluster peer probe node2 
       peer probe: success. 
       pi@node1:~ $sudo gluster peer probe node3 
       peer probe: success.
       pi@node1:~ $sudo gluster peer status 
       Number of Peers: 2 
       Hostname: node2
       Uuid: 59e1c477-6682-4f8a-8b10-cb14589882e0
       State: Peer in Cluster (Connected)
       Hostname: node3
       Uuid: f96b92d9-86c1-4c1c-a64a-4c1faa49f9cd
       State: Peer in Cluster (Connected)

(6)配置存储卷

目前在集群模型中有4个存储设备(U盘),相当于4个brick,通过GlusterFS把这些brick组合成单一的存储卷供用户使用。

pi@node1:~ $sudo gluster volume create gv0 replica 2 192.168.0.1:/mnt/gv0 192.168.0.2:/mnt/gv0 
       192.168.0.3:/mnt/gv0 192.168.0.1:/mnt/gv1 force 
       volume create: gv0: success: please start the volume to access data

“replica 2”表示存储在卷上的数据会在两个brick之间作镜像,类似于传统的Raid1。

检查卷的状态:

pi@node1:~ $sudo gluster volume info
       Volume Name: gv0
       Type: Distributed-Replicate
       Volume ID: feeb9253-c914-4720-b049-3f161e2e9fb9
       Status: Created
       Number of Bricks: 2 x 2 = 4
       Transport-type: tcp
       Bricks:
       Brick1: 192.168.0.1:/mnt/gv0
       Brick2: 192.168.0.2:/mnt/gv0
       Brick3: 192.168.0.3:/mnt/gv0
       Brick4: 192.168.0.1:/mnt/gv1

然后启动卷:

       pi@node1:~ $sudo gluster volume start gv0 
       volume start: gv0: success 
       pi@node1:~ $sudo gluster volume status 
       Status of volume: gv0
       Gluster process  Port    Online Pid
       ——————————————————————-
       Brick 192.168.0.1:/mnt/gv0   49155   Y   1782
       Brick 192.168.0.2:/mnt/gv0   49154   Y   1705
       Brick 192.168.0.3:/mnt/gv0   49154   Y   1744
       Brick 192.168.0.1:/mnt/gv1   49156   Y   1793
       NFS Server on localhost  2049    Y   1807
       Self-heal Daemon on localhost    N/A Y   1811
       NFS Server on node3  2049    Y   1758
       Self-heal Daemon on node3    N/A Y   1762
       NFS Server on node2  2049    Y   1719
       Self-heal Daemon on node2    N/A Y   1724
       Task Status of Volume gv0
       ——————————————————————-
       There are no active volume tasks

为了检查卷的可用性,在笔记本电脑上用NFS V3协议mount卷,笔记本的/mnt/storage做为挂载点:

zhuningdeMacBook-Air-2:/ zhuning$ sudo mount -t nfs -o proto=tcp,vers=3 192.168.0.1:/gv0 /mnt/storage 
       zhuningdeMacBook-Air-2:/ zhuning$ df–m(略) 
       Filesystem 1M-blocks Used Available Capacity Mounted on
       192.168.0.1:/gv0 28824 72 27274 1% /mnt/storage

可以看到已成功把GlusterFS的gv0卷mount到本地,由于建立卷使用了Replicate模式,所以可用的空间为28824个1M-blocks(2个16G的U盘)。

(7)简单测试

下面测试这个冗余文件系统是否起效,从笔记本电脑批量拷贝一些数据文件到卷中(/mnt/storage),按照Replicate原理,同一个文件应该出现在2个brick中。直接到存储节点查看:

pi@node1:/mnt/gv0 $ls
       cisco_cyber_range.zip lost+found nexus9000.pdf
       FortiGate-600D.pdf multicast.jpg
       pi@node2:/mnt/gv0 $ls
       cisco_cyber_range.zip lost+found nexus9000.pdf
       FortiGate-600D.pdf multicast.jpg

可以看到批量拷贝的文件均存在于Node1和Node2的/mnt/gv0中,符合Replicate模式。

(7)安全加固和账户安全管理

因为大部分终端操作系统是Windows平台,而Samba服务可以实现Windows主机与Linux服务器之间的文件共享,账户管理比NFS更精细更安全。Samba服务的工作原理是:客户端向Samba服务器发起请求,请求访问共享目录,Samba服务器接收请求,查询smb.conf文件,检查共享目录是否存在,以及来访者的访问权限,如果来访者具有相应的权限,则允许客户端访问。

在树莓派模型中,指定Node1做为Samba服务器,通过Samba服务把卷共享给用户。首先,配置Node1做为存储卷的客户端,以Native模式(GlusterFS原生模式)把存储卷挂载到Node1本地的/home/gluster目录(GlusterFS Native模式在卷的读写效率方面优于NFS模式),并且从安全考虑,只允许Node1可以直接访问卷:

 pi@node1:~ $sudo gluster volume set gv0 auth.allow 127.0.0.1
       pi@node1:/home/gluster $sudo mount -t glusterfs 127.0.0.1:/gv0 /home/gluster

然后建立2个系统用户user101和user102,把这2个用户添加到Samba用户表中:

pi@node1:/var/log/samba $sudo useradd -g pi user101
       pi@node1:/var/log/samba $sudo useradd -g pi user102
       pi@node1:/ $sudo smbpasswd -a user101
       pi@node1:/ $sudo smbpasswd -a user102

在/home/gluster中建立user101和user102目录,分别做为user101和user102的工作目录,只允许用户访问自己的工作目录,工作目录对其他用户不可读:

pi@node1:/home/gluster $sudo mkdir user101
       pi@node1:/home/gluster $sudo mkdir user102
       pi@node1:/home/gluster $sudo chown user101.pi user101
       pi@node1:/home/gluster $sudo chown user102.pi user102
       pi@node1:/home/gluster $sudo chmod 700 user101
       pi@node1:/home/gluster $sudo chmod 700 user102

修改smb.conf文件,定义user101和user102的profile,实现账户安全控制,并重启Samba服务:

pi@node1:/etc/init.d $sudo vi /etc/samba/smb.conf
       [user101]
       comment = user101 profiles
       path = /home/gluster/user101
       guest ok = no
       read only = no
       writable = yes
       valid user = user101
       browseable = yes
       [user102]
       comment = user102 profiles
       path = /home/gluster/user102
       guest ok = no
       read only = no
       writable = yes
       browseable = yes
       valid user = user102
       pi@node1:/etc/init.d $sudo ./samba restart
       [ ok ] Restarting nmbd (via systemctl): nmbd.service.
       [ ok ] Restarting smbd (via systemctl): smbd.service.
       [ ok ] Restarting samba-ad-dc (via systemctl): samba-ad-dc.service.

最后从Windows客户端进行访问测试,检查账户安全是否生效(详见示意图6、7、8、9。图中的192.168.101.172是Node1对外服务的网卡地址):
微信图片_20170818140924.jpg

微信图片_20170818140924.jpg

图6:在Windows终端输入\192.168.101.172,出现所有用户目录
微信图片_20170818140943.jpg
微信图片_20170818140943.jpg

图7:以user101账户访问user101文件夹
微信图片_20170818141010.jpg
微信图片_20170818141010.jpg

图8:user101用户通过验证后能读写user101工作目录
微信图片_20170818141027.jpg
微信图片_20170818141027.jpg

图9:以user101账户访问user102工作目录,认证失败

从搭建模型的过程来看,凭借Linux和Samba的账户管理机制、分布式文件系统内置的安全特性、相对廉价的服务器硬件以及成熟的用户社区,可以方便地用GlusterFS之类的开源软件搭建金融企业内部分布式存储平台。

五. 生产环境部署的方案示例

开源分布式存储平台具有的灵活性和高性价比,使之对外可做为金融企业云计算的产品提供给合作伙伴或托管客户,企业根据客户租用的网络和存储资源进行收费;对内可用于数据集中备份、邮件系统、文件交换系统、日志数据存管、交易数据存管或大数据平台底层系统等,具有很强的适应性。有一些银行和证券的行业用户已开始在内部进行私有云的探索性部署。

方案示例:在办公环境中采用虚拟化桌面,需要在远端主服务器上挂接大容量存储设备,用GlusterFS和PC服务器替代昂贵的专业磁盘柜是个不错的选择,从数据冗余和读写效率考虑,采用分布式复制卷或条带复制卷。办公用户从终端启动虚拟桌面后,直接通过主服务器挂接云硬盘,存取权限由用户名和口令或结合RSA进行双因素认证控制,符合等保要求。详见拓扑示意图。
微信图片_20170818141104.jpg

微信图片_20170818141104.jpg

图10:生产环境拓扑示意图

每台PC服务器配置三块网卡(1块做存储通讯,1块做Failover,1块做管理端口),PC服务器之间的存储通讯网采用万兆交换机,目前GlusterFS支持服务器之间以TCP/IP或InfiniBand RDMA互联。近期Ceph社区也公布了支持RDMA的方案。考虑到并发读写多个节点会导致瞬间高流量,选用的交换机型号应搭载较大的buffer。为提高GlusterFS内部传输效率,可在网卡和交换机端口之间启用较大的MTU。另外根据用户实际使用效果,GlusterFS还有许多参数可以调整优化。以后随着办公用户数量和存储数据量的变化,可随时增减PC服务器或硬盘的数量。

参考文献

[1] GlusterFS官网
[2] Ceph中文社区
[3] 杨传辉《大规模分布式存储系统:原理解析与架构实战》机械工业出版社2013-09-01

本文转自微信公众号:上交所技术服务

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

5

添加新评论0 条评论

Ctrl+Enter 发表

关于TWT  使用指南  社区专家合作  厂商入驻社区  企业招聘  投诉建议  版权与免责声明  联系我们
© 2019  talkwithtrend — talk with trend,talk with technologist 京ICP备09031017号-30