基于海量存储的监控系统

luckone

发布日期: 2021-05-04 09:55:41 浏览量: 512
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

随着人们对于海量数据的挖掘与应用技术的迅速发展,势必会引出海量数据如何存储的难题。如何存储海量数据,以及安全高效的控制存储环境,已经成为人们关注的主要问题之一。目前,有多种开源集群文件系统可以提供海量数据存储服务,性能上也各有千秋。此外,大部分开源集群文件系统基于Linux系统并且没有图形化界面,对于不熟悉Linux系统的用户来说,不仅不方便更加不安全,即使对于熟悉Linux系统的用户来说,也显得不友好。

本课题主要研究了在开源集群文件系统基础上,搭建海量数据存储的监控系统的方法。阐述了采集,分析由文件系统和Linux系统等服务产生的数据并呈现给用户的方法。使得用户能够通过监控平台来操作海量存储系统,简化用户对于海量数据存储系统的使用,并且提高安全性。

关键词: 海量数据存储,监控平台,集群文件系统

Abstract

With the rapid development of mass data mining and applying technology, it will inevitably lead to the problem of mass data storage.How to store huge amounts of data,And the secure and efficient control of the storage environment,has become one of the main issues of concern.Currently,There are many open source clustered file system can provide mass data storage services,and their performance is different.Besides,Most of those open source clustered file system based on Linux system and without Graphical User Interface.It’s neither convenient nor secure for those users who are unfamiliar with Linux system.Even for those users who are familiar withLinux system will find it Unfriendly.

In this paper we focus on the method of building mass data storage monitoring system based on open source clustered file system.How to capture and analyze the data provided by file system or Linux system then presented to users.User can operate massive data storage system via this monitoring system.Simplify the use of massive data storage system,And improved security.

Keywords: Mass data storage, Monitoring platform, Clustered file system

1 绪论

随着海量数据挖掘与应用技术的发展,越来越多的场景需要用到海量数据存储技术。方便,高效的海量数据存储平台成为人们的关注方向。本章首先对课题研究的背景及意义进行简略介绍,并且简要介绍一下现在流行的的一些支持海量数据存储的分布式文件系统以及本课题研究所选取的文件系统,最后介绍一下监控系统的作用。

1.1 研究背景及意义

当前,由于图像高清、网络传输、云化存储,智能应用平台等技术的使用,数据呈现出越来越“大”的趋势,普通的文件系统已经无法满足市场需求,于是一批相应的分布式文件系统由此产生。由于要适用于海量数据存储,普通分布式文件系统显然达不到这个要求,这批新产生的分布式文件系统因为能协同多个节点工作以提供更高的性能、更高的可用性以及实现均衡负载的文件系统的特性而被称为集群文件系统。如今海量存储方面比较著名的集群文件系统有适用于大文件存储的GlusterFS,Lustre;适用于小文件的Ceph;以及Google File System、蓝鲸集群文件系统等。其中由于GlusterFS在大文件存储性能上的优势而广泛应用于监控视存储频等大文件存储领域。

1.2 GlusterFS的简介

GlusterFS(Gluster File System)是一个可以扩展到PB级别的开放源代码的分布式集群文件系统。(实际上可扩展到72BB)能够处理数以千计的存储节点。GlusterFS所形成的集群可以通过RDMA(由infiniband技术支持) 或者TCP/IP互联存储构建块,将磁盘和内存资源聚集在一个单一的命名空间下以管理数据。GlusterFS是基于用户空间可以堆叠设计的,在不同的工作负载下均可以表现出出色的性能。GlusterFS可以简单搭建成一个集群,将集群中所有机器的存储资源集中起来供用户使用,对于用户来说集群是透明的,用户不需要关心自己的文件具体存储在哪台机器上。此外GlusterFS提供建立复制卷的方法,可实现数据的冗余备份,保证了用户数据的安全性。现在,已经有不少公司开始使用GlusterFS,建立具有自己的特色的海量存储服务。

1.3 GlusterFS的原理以及特性

在文件系统中有元数据,用户通过获取元数据来对特定的文件进行编辑,以定位文件在文件系统中的位置,获取文件的相关属性等。而gluster采取根据文件路径和文件名字的弹性哈希算法动态生成类似元数据的信息,比从任何地方获取元数据的方法要快,并能真正的实现线性拓展,并且避免了同步元数据信息所带来的各种风险。此外,当文件数目较多时,hash算法能一定程度上保证文件分布的均衡性,减轻单一服务器的读写压力,实现负载均衡。

Gluster的弹性哈希算法使用的是基于Des的名为Davies-Meyer的算法,对于保证数据平均分布有良好的效果。

1.4 本课题目标

GlusterFS是一个运行在Linux操作系统之上的分布式集群文件系统,通过命令来实现配置使用,对于非Linux用户来说,使用起来十分的不方便。由于GlusterFS的使用需要Linux的root权限,对于不了解Linux以及GlusterFS的人来说随意使用也是危险的。此外,GlusterFS不可以直接应用于windows环境,应用遭到了极大的限制。另外,它本身提供的集群运行信息十分的有限,需要从其他渠道获取集群运行信息以监控存储集群的运行。为了解决上面提到的三个问题,首先需要在Linux系统与用户之间建立一层图形化用户界面,也就是监控系统,来实现对于GlusterFS的使用与监测。其次利用基于Linux操作系统下的软件Samba所提供的文件共享服务,可以将GlusterFS集群构筑的海量存储服务提供给windows和Linux用户。

2 海量存储服务

GlusterFS作为一种Linux集群文件系统,能够部署在多台基于Linux系统的机器中,通过 RDMA通信技术 或者 TCP/IP通信技术互联形成一个存储集群。集群中的每台机器的地位都是对等的,并没有主从之分,每台机器均可以对外提供存储服务。监控平台可单独架设在集群之外,通过部署在每个节点上的程序,收集集群各个节点的信息,以及一些操控功能,以维护海量存储系统。

2.1 海量存储服务整体架构

监控系统平台单独用一台机器发布,提供给管理者观察海量存储服务的运行情况,剩余空间,服务状态等信息,用户通过监控系统平台远程调用存储节点的Shell脚本以完成任务。存储节点可以通过Infiniband或者以太网互联,Infiniband有自己的一套技术,需要相应的网卡、交换机、网线和驱动,实现海量存储节点之间的备份冗余,传递信息等。节点机器至少使用三块网卡,使得其有三个地址,一个地址供监控系统平台与存储节点进行通信,一个地址供存储节点之间进行数据同步或者备份冗余等等,此部分通讯为GlusterFS文件系统自己的功能,走Infiniband或者以太网,监控平台不共享这条线路。第三个地址提供给用户访问海量存储空间使用。具体架构可参考图2.1所示。

2.2 部署环境

从官网上下载GlusterFS的源代码进行编译安装,本文使用的版本是3.2.7。在解压后的源码文件夹下有一个configure文件,可以运行该文件可以检查本机没有安装而GlusterFS需要的软件,根据提示安装好需要的软件后,通过make命令完成编译安装,注意每个存储节点都需要安装GlusterFS。此外,为了将文件服务提供给windows用户,可以选择几台或者全部存储节点安装Samba,Samba的安装较为简单故略去,部分linux系统的发行版本可能默认配置中已经安装好了Samba(如Ubuntu12.04)。安装好后可以通过配置Samba的smb.conf文件从而将挂载出来的Gluster文件服务提供给windows用户使用。

2.3 监控体系与存储体系的整合

按照上述方法搭建好Gluster集群后,就可以将监控系统与Gluster集群进行整合了,通过在存储节点上安装部署程序,监测并且控制存储节点。部署程序由两个java程序组成和一些shell脚本组成,分别命名为logcollector.jar(日志收集器)、probe.jar(探针)。Shell脚本中的日志组件每过5s收集包括内存使用率,cpu使用率,网卡流量,Inifiniband流量等信息,以固定格式添加至按照日期命名的.stat文件中,日志收集器通过读取.stat文件,将格式化的信息存储到远程数据库中供监控平台使用。探针通过调用shell脚本的方式获取存储节点的信息以及控制存储节点的状态,探针以web service接口的形式将内容发布出去,供监控平台远程调用获取。具体架构可参考图2.2。

3 海量数据存储相关概念说明

海量数据数据存储涉及文件系统、传输协议以及物理链路等等概念,为了更好的说明海量数据存储的以及监控平台的工作行为,以下对涉及到的相关名词的解释。

3.1 RDMA(远程直接数据存取)

GlusterFS除了支持传统的TCP/IP传输外,也可以支持RDMA传输方式。RDMA的诞生是为了减小网络传输中服务器端数据处理的延迟。RDMA可以在减少cpu开销的情况下通过网络把传输内容直接传入计算机的存储区域,从而快速的把传输内容从一个系统快速移动到远程系统的存储器中,这样对于计算机的处理性能的要求就下降了。它几乎不需要进行外部存储器复制和文本交换操作,从而优化内存带宽的使用率和减少CPU使用周期,用于改善应用系统性能。如果试图在GlusterFS中使用RDMA传输技术,物理层链路层必须使用Infiniband架构技术作为支撑。

3.2 Infiniband

InfiniBand架构是一种可以支持多并发链接的网络传输技术,这种技术可以提供高可用,低时延的网络传输。InfiniBand的应用针对服务器端的连接以及传输有非常好的效果。因此,InfiniBand技术大部分应用于服务器与服务器之间,服务器和存储设备之间以及服务器和网络之间的通信。Infiniband工作依赖于专门的网卡、交换机、网线以及配套的驱动程序才能正常工作。相比于一般的以太网,具有更好的传输性能。

3.3 Samba

用来让由UNIX系列演化而来的操作系统与微软Windows操作系统的进行文件共享的的软件。此软件在Windows系列与UNIX系列的操作系统之间构筑了一条通道,让两者的文件资源可以通过共同的协议互相访问读写。因为GlusterFS是基于Linux操作系统的文件系统,本身并不能被windows所直接访问,需要Samba软件将文件服务发布出去。这样不仅是Linux系统,windows用户也能也能通过网络访问Linux操作系统所提供的海量存储服务了。

3.4 GlusterFS相关术语

3.4.1 Subvolume(子卷)

至少被一个翻译器处理过的一个块。

3.4.2 Translator(翻译器)

翻译器连接一个或多个子卷,处理子卷,并且提供子卷间的连接。

3.4.3 Volume(卷)

通过所有翻译器的最后分享出来的东西。

3.4.4 Brick(块)

被分配到卷的存储文件系统。

3.4.5 Client(客户端)

挂载卷的机器。(也可以是服务器)

3.4.6 Server(服务器)

承载数据存储的实际文件系统的机器。(可以是虚拟机或实机)

3.5 三种卷类型

Volume(卷)提供三种类型供使用者创建,每种类型均有自己独特的功用,用户可以根据实际情况选择创建卷。

3.5.1 Distribute(分布卷)

分布卷由一组子卷组成并且在他们之中分配文件,有效的由一系列子卷组成一个大的存储卷。使用分布卷,用户文件的实际存放在哪台服务器上是根据文件名散列之后得到的,如果文件名字发生变化,存储位置会经由文件名重新散列,决定实际存放在哪台服务器上。在这种卷存储下,存在三个缺点:1.一台存储服务器的失效,会导致存储在这台存储服务器上的文件无法访问。2.如果你的文件比子卷要大,那么写入会失败。3.如果文件不在散列码计算出来的位置,必须要有额外的查询,会导致略微增加了等待时间。但是随着存储服务器的添加,会得到更好的随机文件访问性能,只要用户不是检索同一文件,他们的访问应该会被非常均匀的分布在所有服务器,并且可以通过添加服务器增加卷,添加服务器是即时的,存储模式如图3.1所示。

3.5.2 Replicate(复制卷)

复制卷是用来为存储和常规访问提供冗余访问,复制的份数与块包含的存储服务器个数一致,复制卷的文件安全性得到了保证,但是牺牲了存储空间,几台服务器所构成的卷的存储大小为服务器存储空间最小的那个,存储模式如图3.2所示。

3.5.3 Stripe(条带卷)

文件被分成数据块以轮叫调度算法的模式存储在数据块中,官方建议在高并发访问大数据的环境中使用此卷类型,其中条带数需要等于服务器数,但效果不太好,一般不建议使用,存储模式如图3.3所示

4 基于Webservice的监控体系架构

海量存储监控体系主要由三层结构组成,分别是服务组件,服务层和表示层。服务组件封装了用户与操作系统以及Gluster文件服务的一系列操作,提供核心功能。服务层将这些功能进一步封装,作为可供远程调用的功能,保障远程监控系统对存储节点的通信内容与形式,从而实现远程操作与监控。表示层负责将可以远程调用的功能以用户界面的形式展示出来,其架构如图4.1所示

5 服务组件

服务组件是与基于Linux内核的操作系统直接交互的一些软件,在本监控系统中,这部分服务组件是由Shell脚本语言编写的。Linux系统支持预先将写好的Linux命令存放到Shell脚本文件中,然后一次执行。因为GlusterFS是基于Linux的文件系统,所以他的使用都基于命令调用。此外,为了获得存储节点的运行信息,庞大而丰富的Linux命令也为我们提供了方便。监控系统通过Webservice接口来调用服务组件,从而获取信息和操控文件系统,这部分服务组件就是由Shell脚本文件实现的。服务组件主要由三部分组件构成,分别是监测组件,日志组件,以及控制组件。

5.1 监测组件

监测组件主要由一组获取Linux系统信息和gluster文件信息的shell脚本组成,主要负责对系统产生的信息,利用文本工具进行处理。

5.1.1 获取集群卷信息脚本

集群的最后分享出来的东西,就是卷,GlusterFS提供查询卷信息的语句,GlusterFS提供查看卷信息的命令。

  1. gluster volume info

其显示的结果如下所示:

  1. Volume Name: myvol
  2. Type: Distributed-Replicate
  3. Status: Started
  4. Number of Bricks: 2 x 2 = 4
  5. Transport-type: tcp
  6. Bricks:
  7. Brick1: dash-Aspire-4741:/home/dash/glusterspace/replicate
  8. Brick2: dash-Aspire-4741:/home/dash/glusterspace/distribute
  9. Brick3: dash-Aspire-4741:/home/dash/glusterspace/stripe
  10. Brick4: dash-Aspire-4741:/home/dash/glusterspace/tcprepvol

此内容过于冗余,不利于b/s页面的显示,所以我们可以使用shell脚本程序对内容进行处理,获取我们需要的内容。

我们规定获取的格式为:

卷名,传输模式[tcp|rdma],卷类型[distributed|Replicate],卷状态,卷总数,复制因子,brick列表如下所示。

  1. myvol,Distributed-Replicate,tcp,Started,4,2,dash-Aspire-4741:/home/ dash/glusterspace/replicate#dash-Aspire-4741:/home/dash/glusterspace/distribute#dash-Aspire- 4741:/home/dash/glusterspace/stripe#dash-Aspire-4741:/home/dash/glusterspace/tcprepvol

为了获取如图所示的讯息,我们需要利用Linux下的文本工具sed,awk以及grep等,sed可对目标文本进行正则匹配并且替换掉目标文字,例如给定文本test,执行cat test命令后可以得到:

  1. hello world
  2. hello dash

我们运行:

  1. cat test|sed 's/world//'

可以得到:

  1. hello
  2. hello dash

如上例所示,我们可以利用sed文本工具轻松的编辑原文本以获取我们所需要的讯息,而awk命令则可以自定义分界符,获取相关的元素。比如在上述test的例子中,我们执行:

  1. cat test|awk '{print$2}'

可以得到:

  1. world
  2. dash

由于默认的分界符是空格,所以上述命令的意思是以空格为分界符,选取第二个元素,grep可以通过正则表达式提取相关行,我们执行:

  1. cat test|grep dash

可以得到:

  1. hello dash

监控系统主要依靠这三个文本工具实现内容的获取,对于集群卷信息,监控系统依靠get_vol_info脚本来得到,内容如下图所示。

  1. sudo gluster volume info>../tmp/gluster.vol.info for i in `cat /opt/yunqiao/tmp/gluster.vol.info|sed 's/^[ ]*//'|awk -v RS="" '{print NR}'` do

首先将gluster volume info的内容输出重定向到../tmp/gluster.vol.info,然后通过sed命令去除前缀空格,并且按照换行符分界得到行号,即为每一个卷的信息内容,然后继续处理每个卷的信息提取出来,如下所示。

  1. volume_name=`cat ../tmp/gluster.vol.info|sed 's/^[ ]*//'|awk -v RS="" 'NR==num' num=$i|awk '/Volume Name/ {print $3}'`

首先取出第i个卷的讯息,然后依照“Volume Name”,取出那一行按照空格为分界符的第三个元素,根据上述例子就是myvol,其余的讯息可以通过类似的方法获取,注意的一点是Distribute卷没有复制因子,所以只要是分布卷之复制因子恒为1,最后删去gluster.vol.info文件。

5.1.2 查看集群卷状态脚本

Linux提供查看用户挂载信息的命令:

  1. df -h

可以得到文件挂载信息,如下所示:

  1. Filesystem Size Used Avail Use% Mounted on
  2. /dev/sda9 24G 14G 8.4G 63% /
  3. udev 956M 12K 956M 1% /dev
  4. tmpfs 193M 1.4M 192M 1% /run
  5. none 5.0M 0 5.0M 0% /run/lock
  6. none 965M 744K 964M 1% /run/shm
  7. dash-Aspire-4741:myvol 47G 28G 17G 63% /gluster/myvol

如上图所示,df 命令列出了本机所有挂载信息,我们只需要提取gluster挂载出来的相关文件系统就可以了,格式形如:

  1. 卷名 卷已用容量 卷剩余容量 挂载点

例如:

  1. myvol 28G 17G /gluster/myvol

可以通过执行脚本get_vol_stat获得,如下所示。

  1. df -h|awk '$0~hostname && $0~/:/' hostname=`hostname`|awk -F: '{print $2}'|awk '{print $1" "$3" "$4" "$6}'

如代码所示,因为挂载的卷必然含有主机名称(dash-Aspire-4741),可以根据awk的近似匹配找出相关行,然后提取对应列的信息。

5.1.3 获取节点状态信息脚本

gluster提供命令查看各个节点的状态信息,命令为:

  1. gluster peer status

得到的信息如下所示。

  1. Number of Peers: 1
  2. Hostname: 192.168.110.208
  3. Uuid: 63acb4d0-6354-4d46-b21a-a922b205d269
  4. State: Peer in Cluster (Disconnected)

同样,我们可以对这个节点信息进行处理,我们规定的格式为:

  1. 节点名 连接状态 IP地址

例如:

  1. dash-Aspire-4741 Offline 127.0.0.1

通过调用shell脚本get_peer_status获得,如下所示:

  1. testparm=`sudo gluster peer status 2>/dev/null|grep Connected`
  2. if [ -n "$testparm" ];then
  3. node_stat="Connected"
  4. else
  5. node_stat="Offline"
  6. Fi

正常情况下,集群间互相连接,为connected,如果没有任何为connectd的节点,认为本节点下线。

  1. peer_stat()
  2. {
  3. sudo gluster peer status|grep -v Number|sed 's/.*(\(.*\)).*/\1/'g|awk -v RS="" '{print $2" "$5}'
  4. }

过滤掉多余信息,得到其他节点名称和连接状态讯息,如图5-9所示,结果为:

  1. 192.168.110.208 Disconnected

因为gluster3.2.7有一个bug,集群添加一个节点的时候,即使/etc/hosts文件中有对应主机名与ip,在gluster peer status中依然显示的是ip,只有两个节点互相添加之后,节点名才会显示正常,所以利用shell脚本,在节点不正确的情况下利用/etc/hosts中的文件的得到正确节点名,如代码shell脚本如下所示。

  1. if [ -z "`echo $line|awk '{print $1}'|grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"`" ];then
  2. peer_name=`echo $line|awk '{print $1}'`
  3. peer_ip=`cat /etc/hosts|awk '$2==peer_name {print $1}' peer_name=$peer_name`
  4. peer_stat=`echo $line|awk '{print $2}'`
  5. else
  6. peer_ip=`echo $line|awk '{print $1}'`
  7. peer_name=`cat /etc/hosts|awk '$1==peer_ip {print $2}' peer_ip=$peer_ip`
  8. peer_stat=`echo $line|awk '{print $2}'`
  9. Fi

5.1.4 获取服务状态脚本

海量存储提供多种服务,我们需要知道相关服务的运行状况,以及IP的情况,如果按照论文开头所示的三张网卡架构,需要分别获取三张网卡的ip,并且规定ip的用途,有管理地址,业务地址,和ib地址三类。我们还需要获得gluster,samba以及浮动ip是否开启的状态,以判断存储服务是否正常开启。

我们规定获取的格式为:

  1. 主机名,节点在线状态,磁盘总容量,管理地址,业务地址,infiniband地址,samba服务,浮动IP状态,gluster状态

例如:

  1. dash-Aspire-4741,offline,500.1GB,192.168.110.248,192.168.110.248,none,Y,N,Y

(注意,我的笔记本不支持infiniband,也没有三张网卡,也没有开启浮动ip,所以信息如上,在完全配置好的环境下服务应当全部开启正常显示)

由于大部分数值可以直接根据Linux及其相应服务提供的命令去直接获取,不需要过多其他的操作,代码略去。

5.1.5 获取samba共享文件夹信息脚本

samba服务可以将基于Linux内核的操作系统下的的文件服务提供给windows或者Linux用户,samba服务通过配置smb.conf文件来提供服务,这种方式可以将本机挂载的海量存储卷共享给用户。为了获得samba服务的配置情况,我们需要对smb.conf文件的内容进行获取,获取的格式为:

  1. 分享文件夹名;文件路径;来宾;只读;用户组;用户

例如:

  1. testshare;/gluster/myvol;No;no;none;ly

执行Linux命令 cat /etc/samba/smb.conf,略去无关信息,可得到如下所示的信息,[]里的内容即为分享文件夹名,path即为目录,valid user即为用户,read only即为可读状况,其他信息可以通过配置的方式写入,在监控系统中并未使用,如果需要有特殊设置的也可以写入,所以一律为no,如下所示。

samba配置信息:

  1. [testshare]
  2. path = /gluster/myvol
  3. valid users = ly
  4. read only = no

获取samba共享文件夹信息:

  1. #获得文件夹名
  2. dir_name=`cat /etc/samba/smb.conf|sed '/^#.*/'d|awk -v RS="[" 'NR==num {if($0~/]/) print$1}' num=$i|sed s'/]//'`
  3. #获得文件路径
  4. path=`cat /etc/samba/smb.conf|sed '/^#.*/'d |awk -v RS="[" 'NR==num' num=$i|awk -F= '/path/ {print $2}'|sed s'/[ ][ ]*//'`
  5. #其他信息同文件路径类似

最后注意valid user 为no的不可用,略去。

  1. echo "$dir_name;$path;$guestok;$readonly;$group;$user"|awk -F";" '$6!="none" {print $0}'

5.1.6 获取samba用户脚本

samba拥有pdbedit —list命令,用户通过调用该命令查看samba用户,进行简单提取后即可,获得的信息例如:

  1. nobody
  2. dash
  3. ly

注意要过滤掉root等高级权限用户,以免系统安全收到威胁。

5.1.7 获取系统硬盘状态脚本

存储节点可以使用一整块的逻辑分区,我们可以将本地的合适的逻辑分区显示出来,供使用者查看,格式为:

  1. 节点名 盘符 盘大小 UUID 格式化类型 使用情况

例如:

  1. dash-Aspire-4741 sda9 8.4G 4ae2a5ed-0ff6-45a8-b3e8-1397d86dab12 ext4 yes

硬盘名称一般是sd[a-z],某块分区一般是sd[a-z][1-9],可以根据实际情况选择分区或者硬盘,其中df 命令可以查看挂载的分区信息,file -s命令可以查看分区的文件类型。

利用sed文本工具提取出其文件类型。通过blkid [分区名]命令可以提取出分区的uuid信息。注意根据使用的存储容器不同(硬盘或者分区),需要对shell脚本进行适当的变更,以达到目的。

5.1.8 获取主机系统配置脚本

为了便于管理,我们需要对远程主机的配置需要性能需要有一定的了解,Linux下的原生命令可以做到这一点,只需要对文本内容进行简单处理,我们规定格式为:

  1. 分发版本
  2. 处理器
  3. 内核名称
  4. 内核版本
  1. Ubuntu 12.04.4 LTS \n \l
  2. Intel(R) Core(TM) i3 CPU M 390 @ 2.67GHz
  3. Linux
  4. 3.2.0-60-generic

系统分发版本信息存放在/etc/issue中,cpu信息存放在/proc/cpuinfo中,可以通过如下命令获得:

  1. cat /proc/cpuinfo |grep model| awk -F":" '{ print $2 }' |sed -n '2p'|sed 's/^[ \t]*//g

内核名称和版本可以通过uname -s,uname -r获得

5.2 日志组件

为了分析存储节点的运行状态,需要获取系统的一些运行信息并且产生日志,这部分技术主要通过文本工具获取相应的信息,并且通过输出重定向产生相应日志。

获取CPU利用率、内存、以太网卡、ib网卡状态查询(getstatus)脚本,为了监控集群的运行状态,需要对运行状态进行实时的获取,包括内存使用率,cpu使用率,网络流量等等。获取的格式为:

  1. YYYY-MM-DD HH:MM:SS@主机名,IB地址,CPU利用率,内存总计,已用内存,NET发送流量,NET接收流量,IB发送流量,IB接收流量

例如:

  1. 2014-05-04 11:10:45@dash-Aspire-4741,none,6.20,1974428,1719516,0,0,0,0

Linux提供的date命令可以轻易的获得时间,处理之后可以得到我们需要的样式

  1. var=`date +%F" "%T`
  2. current_date=`echo $var|cut -c1-10`

主机名可以执行hostname命令获得。在centos下,配置了相应infiniband技术机器的ib地址可以通过查看相应的网卡获得,如下所示。

  1. get_ipoib_ip()
  2. {
  3. ipoib_ip=`cat /etc/sysconfig/network-scripts/ifcfg-ib0|awk -F= '$1=="IPADDR" {print $2}'`
  4. if [ -n "$ipoib_ip" ];then
  5. echo $ipoib_ip
  6. else
  7. echo none
  8. fi
  9. }

cpu利用率和内存信息存放在相应的文件之中(cpu信息在/proc/stat中,内存信息在/proc/meminfo中,可以通过shell命令获得,代码如下所示。

  1. get_cpu_stat() {
  2. awk -v total=0 '/cpu[^0-9]/ {
  3. for(i=2;i<=NF;i++){
  4. total+=$i
  5. };
  6. used=$2+$3+$4+$7+$8
  7. }END{
  8. print total,used
  9. }' /proc/stat
  10. }
  11. get_mem_stat() {
  12. awk '/MemTotal/{total=$2}/MemFree/{free=$2}/Buffers/{buffers=$2}/^Cached/{cached=$2}END{printf ("%d,%d",total,total-free-buffers-cached)}' /proc/meminfo}

在/proc/net/dev文件中有网卡的流量信息,可以通过类似以上方式计算获得瞬时流量。ib的流量信息获取方式略微不同,需要安装相应的驱动,相应的命令才能成功执行,如下所示。

  1. get_ib_flow() { sudo perfquery |sed s'/\.*//g'|awk '$0~/(PortXmitData|PortRcvData)/'|awk -F: '{print $2}' }

5.3 控制组件

为了实现监控系统对Linux操作系统的操作,需要封装一系列Linux命令,来对海量数据存储平台进行操作,为了补充gluster命令的不足和方便用户调用,需要对命令进行合理的组合,以保证系统的安全性和健壮性。

5.3.1 初始化环境脚本

通过init.sh实现,判断gluster服务是否开启,若没有开启则开启gluster服务,samba默认来说是开启的,无需另外开启,也可以随监控要求配置自己需要的自启动的服务

  1. /etc/init.d/glusterd start

5.3.2 挂载/取消挂载卷

Linux提供命令挂载文件系统,我们可以将gluster的文件系统挂载出来

  1. mount -t glusterfs "$NODE":"$VOL_NAME" "/gluster/$VOL_NAME"

其中node为主机名,VOL_NAME为所需提供的参数,统一将文件挂载到/gluster/[VOL_NAME]目录下以方便管理,如果不存在此文件夹需要创建该文件夹,否则挂载会失败。

Linux同样提供了命令取消挂载,格式为

  1. umount [路径]

考虑到可能路径正被人使用,需要强制杀掉相应进程,可通过lsof命令获取相应进程然后kill掉即可,如下所示。

  1. for i in `lsof|grep /gluster/$mounted_vol|awk '{print $2}' 2>/dev/null`
  2. do
  3. kill -9 $i
  4. Done

5.3.3 停止/启动卷

gluster提供相应命令停止或者启动卷,在创建卷后需要开启卷才能使用和挂载,删除卷前需要停止卷,否则删除会失败,如下所示。

  1. gluster volume start $VOL_NAME
  2. gluster volume stop $VOL_NAME

5.3.4 创建/删除卷

gluster 提供的相应创建卷的命令,如下所示。

  1. gluster volume create NEW-VOLNAME [stripe COUNT | replica COUNT] [transport tcp | rdma | tcp, rdma] NEW-BRICK1 NEW-BRICK2 NEW-BRICK3
  • NEW-VOLNAME:卷名

  • [stripe COUNT | replica COUNT]:可以指定为条带卷(stripe)或者复制卷(replica),个数必须能被后面的块数整除,不填写此项信息则默认为分布卷(distribute)

  • [transport tcp | rdma | tcp, rdma]:为传输类型,默认为tcp,也可以指定为rdma,rdma传输依赖infiniband技术,强行指定为rdma会产生异常

为了防止用户错误创建卷引起的各种不可控异常,本监控体系将卷的创建交给管理员,管理员通过编写固定的shell脚本交给用户去执行创建,并且可以在删除之后进行一键恢复。

gluster 提供相应的命令删除卷,删除卷前需要取消挂载,并且停止卷,否则会报错。

  1. echo y |gluster volume delete [VOL_NAME]

5.3.5 添加/删除节点

gluster 提供相应的添加删除节点的命令,需要注意在添加之前需要先能ping通对方节点并且确定对方的gluster服务正常开启,否则会产生错误,如下所示:

  1. gluster peer probe [node]
  2. gluster peer detach [node]

5.3.6 创建/删除samba文件夹

samba的配置信息存放在/etc/samba/smb.conf文件中,通过改写文件可以实现配置,添加的文件格式如下所示:

  1. [testshare]
  2. path = /gluster/myvol
  3. valid users = ly
  4. read only = no

为了方便处理,先创建一个临时文件smb.conf.tmp来存放信息,然后将内容添加哎到smb.conf中,最后修改目的路径的使用权给指定用户,以使他有读写权限,具体代码如下所示:

  1. echo"[$dir">>/opt/yunqiao/tmp/config/smb.conf.tmp
  2. If[ "$path" != "none" ];then
  3. echo" path = $path">>/opt/yunqiao/tmp/config/smb.conf.tmpfi
  4. if[ "$validusers" != "none" ];then
  5. echo" valid users = $validusers">>/opt/yunqiao/tmp/config/smb.conf.tmpfi
  6. if[ "$readonly" != "none" ];then
  7. echo" read only = no">>/opt/yunqiao/tmp/config/smb.conf.tmpfi
  8. echo y|cp /etc/samba/smb.conf /opt/yunqiao/tmp/config/smb.conf.bak sudo cat /opt/yunqiao/tmp/config/smb.conf.tmp>>/etc/samba/smb.conf sudo rm -rf /opt/yunqiao/tmp/config/smb.conf.tmp chown"$validusers""$path"

删除文件夹只要删除smb.conf中的文件夹相关信息即可,可使用sed命令进行修改。

5.3.7 添加/删除samba用户

samba用户必须是系统用户,添加samba用户首先需要使用linux的添加用户命令:

  1. useradd [user]

然后再添加到samba用户中

  1. (echo $password;echo $password)|sudo smbpasswd -s -a $user

如果需要删除用户,再将用户中samba用户列表和linux用户列表中删除即可,如下所示。

  1. smbpasswd -x $user
  2. userdel $user

5.4 组件使用总结

强大高效的shell脚本几乎能完全操控Linux系统的运作,但是部分命令需要使用root权限才能执行,所以在调用编写的shell脚本时需要切换到root用户下才能正常执行,shell不需要编译,写完之后可以直接执行,便于修改,这一特性在分发版本不同导致部分Linux信息文件位置不同或shell命令不同的Linux集群中能够大大方便开发,易于部署。

6 服务层

为了将服务组件中的日志组件提供的信息供远程监控平台使用,需要使用数据库的接口JDBC,服务层将这些内容持久化到数据库后,再供监控平台使用,服务层的程序日志收集器就是进行这一步操作的。

为了将服务组件中的控制组件和执行组件提供的服务供远程监控平台使用,需要将这些组件进行基于Webservice的封装,Web Service是一种可以提供远程服务的的技术,主从结构,以SOAP协议传输信息提供服务,不同平台的应用服务可以通过这一传输协议进行通讯从而达到远程控制的目的。 海量监控平台使用了Apache CXF框架来实现了Web Service。java中有相应的外部包来实现CXF框架。探针作为服务端,提供相应的方法来供监控平台调用,监控平台通过调用这些方法,来完成对存储节点的监控

6.1 日志收集器

服务组件中有有一个叫做getstatus的脚本,负责收集系统的cpu使用率,内存使用情况,以及流量信息等等,将内容输出到一个以年月日命名的文件之中。我们需要将这部分信息存储到一个数据库之中,便于监控程序实时获取信息。本课题所研究的监控系统所采用的数据库是mysql,通过编写了一个LogCollector(日志收集器)的java程序来智能完成从节点采集数据并通过mysql远程访问技术写入到远程数据库之中。

6.1.1 日志收集器的工作模式(同步与异步)

日志收集器提供了两种工作模式,通过修改配置文件可以实现工作模式的切换。配置文件命名为config.properties,内容形如下所示:

  1. #数据库驱动
  2. driver=com.mysql.jdbc.Driver
  3. #数据库链接字符串,根据远程数据库的ip修改localhost的值
  4. url=jdbc:mysql://localhost:3306/GlusterMonitor?useUnicode=true&characterEncoding=utf8
  5. #mysql用户名
  6. user=root
  7. #mysql密码
  8. pwd=123456
  9. #日志存放的路径
  10. logpath=/home/dash/yunqiao/tmp
  11. #getstatus脚本的路径
  12. shellpath=/home/dash/yunqiao
  13. #脚本的名字
  14. shellscript=get_status_new
  15. #同步模式,async为异步,sync为同步
  16. type=sync
  17. #主机名称,需要与对应节点的hostname对应
  18. hostname=dash-Aspire-4741
  19. #异步模式下读取的文件名称
  20. readfile=2014-04-10.stat

使用配置文件的方式能够加大程序的灵活性,同时减少修改代码重新编译的麻烦。

6.1.2 日志收集器的工作流程

日志收集器提供两种工作模式,供管理员配置,管理员可根据实际情况配置相应文件以达到要求。

6.1.3 异步模式

异步模式的工作流程较为简单,如下:

  • 根据配置文件找到路径

  • 判断文件是否存在

  • 利用java的文件读写类读取日志文件所保存的信息,结构化之后存到远程数据库之中

6.1.4 同步模式

同步模式略微复杂一点,因为getstatus脚本5s添加一条新记录,所以同步模式需要间隔5s循环执行读取,同时为了防止重复读取,需要向远程数据库索取本机当天最后一次向数据库写入记录的时间,具体步骤如下:

  • 获取当前日期

  • 根据日期获得需要读取的记录日志路径

  • 获取本机在数据库最后一次插入数据的时间,如果没有则设为00:00:00

  • 从后往前一行一行的读取文件,读到等于最后一次插入数据的时间或者文件结束停止

  • 将读取到的记录持久化到数据库中,并且更新最后插入数据时间

  • 休眠5s后从步骤4继续执行下去

6.1.5 日志收集器工作补充

如果mysql不支持远程访问,需要对mysql进行一定的配置。在ubuntu下,需要修改mysql的my.cnf文件,因为ubuntu下的mysql默认情况下只对本地进行监听,需要注释掉

  1. #bind-address = 127.0.0.1

同时对于数据库表赋予远程访问权限,可根据实际情况分配增删查改权限。日志收集器采用了log4j技术,能够产生一个程序运行的日志文件,形如下所示:

  1. INFO main log.Logfactory - 上次读取时间Thu Apr 10 00:00:00 CST 2014
  2. INFO main utilities.FileReader - 0 : 2014-04-10 10:10:45@dash-Aspire-4741,none,5.38,1974428,1578196,0,2,0,0
  3. INFO main utilities.FileReader - 1 : 2014-04-10 10:10:40@dash-Aspire-4741,none,5.91,1974428,1578092,0,0,0,0

通过该文件我们能否分析日志收集器的工作状态,便于后期维护。监控平台要获得这部分信息,通过数据库的接口JDBC外部包进行相关的操作即可。

6.2 探针

为了实现监控平台对远程存储节点的监控,我们需要在存储节点放置探针,探针是和日志收集器类似的java程序,通过利用java提供的方法调用前面编写的shell脚本,获取执行后的结果返回给监控平台,告知使用者执行情况。探针使用的是Web Service技术。

6.2.1 服务接口

服务端提供的接口如下所示:

  1. @WebService
  2. public interface Info {
  3. @WebMethod
  4. @WebResult public ArrayList<String> getInfo(@WebParam(name="name")String name);
  5. @WebMethod
  6. @WebResult public ArrayList<String> getAllKeys();
  7. @WebMethod
  8. @WebResult public ArrayList<String> executeCommand(@WebParam(name="name")ArrayList<String> name);
  9. }

如图7-1-1所示,提供的三个服务分别是getAllKeys,作用是获取探针配置文件中的所有shell脚本的名称,监控程序能够调用并显示相应的脚本信息,getInfo的作用是通过调用相应的脚本,来获取存储节点的工作信息,状态信息等。executeCommand的作用是调用需要带参数执行的shell脚本。监控程序通过这三个方法来实现对海量存储系统的操控。在Webservice的客户端,也就是监控程序的服务端,需要有一样的的接口代码,才能正确的请求服务。探针通过cxf框架发布上述三个服务,供用户远程调用,探针程序指定cxf服务发布的ip,端口和服务名。探针程序通过java.util.Properties类提供的相应方法来读取.properties配置文件,从而获得相应的信息。

6.2.2 探针的配置

探针同样通过配置文件config.properties来完成工作,配置文件的内容如下所示:

  1. #getInfo调用的shell脚本的位置
  2. shellpath=/home/dash/ubuntu_shell/search
  3. #executeCommand调用的shell脚本的位置
  4. execshellpath=/home/dash/ubuntu_shell/execute
  5. #发布服务的ip地址,一般是本地
  6. ip=localhost
  7. #发布的端口号
  8. port=8888
  9. #服务名
  10. servername=info

getInfo调用的脚本和executeCommand调用的脚本分别存放在两个位置,便于管理,剩余的三个信息是发布cxf服务所需的信息。除config.properties外,又有配置文件shellscript.properties,用来说明调用的脚本的名字和实际文件名,形如下所示:

  1. #获得卷挂载信息
  2. getvolstat=get_vol_stat
  3. #获得节点连接信息
  4. getpeerstatus=get_peer_status
  5. #获得节点状态信息
  6. getnodestat=get_node_stat
  7. #获得samba共享信息
  8. getsambainfo=get_samba_info
  9. #获得samba用户信息
  10. getsambauser=get_samba_user
  11. #获得卷状态信息
  12. getvolinfo=get_vol_info
  13. #获得系统磁盘信息
  14. displaydisk=new_display_disk
  15. #获得远程服务器信息
  16. getserverinfo=get_server_info
  17. #初始化海量存储环境
  18. init=init.sh
  19. #挂载卷,调用格式形如mount [volumename] [mount_point]
  20. mount=mount_volume
  21. #取消挂载,调用格式形如umount [mount_point]
  22. umount=umount_vol
  23. #停止运行卷,调用格式形如stopvolume [volumename]
  24. stopvolume=stop_vol
  25. #启动刚创建的卷或停止卷,调用格式形如startvolume [volumename] startvolume=start_vol
  26. #删除卷,调用格式形如deletevolume [volumename]
  27. deletevolume=delete_vol
  28. #重置卷
  29. resetvol=reset_vol
  30. #删除节点,调用格式形如delete [node]
  31. deletenode=detach_node
  32. #添加节点,调用格式形如addpeer [node]
  33. addpeer=add_peer
  34. #重置连接节点
  35. resetnode=reset_node
  36. #删除samba共享路径,调用格式形如deletesambadir [sambaname] deletesambadir=del_samba_dir
  37. #创建samba共享路径,调用格式形如createsambadir [sambaname] [path] [user] createsambadir=create_samba_dir
  38. #添加samba用户,调用格式形如addsambauser [user] [password] addsambauser=add_samba_user
  39. #删除samba用户,调用格式形如delsambauser [user]
  40. delsambauser=del_samba_user

cxf服务的getAllKeys的操作是遍历获取所有的key信息,返回给服务请求者。getInfo操作和executeCommand操作通过相应的参数找到实际的shell脚本的名字,并提供给特定脚本相应的参数,探针利用这些信息正确的调用shell脚本,并且得到操作信息,返回给服务请求者。getInfo可以执行所有配置文件中的shell脚本,当shell脚本的名字含有字符串“get”时,用户可以在监控平台调用并显示结果。

6.2.3 探针的实现细节

探针的主要功能为调用shell脚本,java提供了相应的方法支持,探针程序将相应的方法封装为一个名为Shellmachine的类,通过调用该类提供的run(String[] command, String directory)方法,提供适当的Linux命令(command)和路径(path)执行交给方法执行,并且得到返回的结果(ArrayList<String>) 。该方法主要通过构造一个java. lang. ProcessBuilder类来完成,关键代码形如下所示。

  1. //创建进程生成器
  2. ProcessBuilder builder = new ProcessBuilder(command);
  3. //指定工作路径
  4. builder.directory(new File(directory));
  5. //获得命令执行之后的结果
  6. BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
  7. //最后将BufferReader 转化为ArrayList<String>返回

command为调用的命令串,directory为工作目录,调用该方法的程序通过这两个参数来启动一个进程执行相应的shell脚本,获得相应的信息。如果调用的shell脚本为死循环或者阻塞,探针程序会因为陷入等待而阻塞。因此循环执行的脚本getstatus并未放在配置文件之中,而是单独启动。日志收集器也并未和探针整合,而是单独作为一个程序去收集getstatus脚本产生的节点运行信息,都是为了保证探针的正常运行。

7 表示层(海量存储监控平台)

表示层通过封装了服务层提供的远程调用方法,展示一个图形化用户界面给使用者,来实现用户与海量存储系统的交互。本监控平台采用j2ee架构编写,通过struts、hibernate和spring实现了MVC框架。界面显示使用了bootstrap以及jquery。旨在为不熟悉Linux系统和gluster的用户提供监控海量数据存储平台的途径,简化操作。

监控系统主要由图7.1所示的几个关键功能点构成:

7.1 Bootstrap

Bootstrap是某知名互联网公司开发的一个用于前端开发的开源网站前端界面工具包,包括众多的css和js。监控系统的众多优美的显示效果均是基于Bootstrap的css样式或者js插件,如模态框,标签页等等。Bootstrap中的js的正常运行依赖于jquery。

7.2 Jquery

jquery是一个js框架,封装了不少以前需要大量js才能写的出来的方法,如AJAX技术,大大方便了web前端开发。此外,众多的其他js框架也依赖于jquery。

7.3 ECharts

基于Canvas的一个开源工具包,纯Javascript图表库,提供了大量的的可视化图表显示技术及其相应的配套功能,监控系统的折线图均由Echarts绘制。

7.4 ssh(Struts+spring+hibernate)

在J2EE程序中,一般通过ssh框架实现MVC。MVC指的是modal、view、controller,将数据、界面和逻辑显示分离的方法组织代码。struts负责MVC的整体分离,hibernate对数据进行持久化,spring做管理。

7.5 用户管理

监控系统允许添加用户和删除用户两个功能,监控体系权限分为二级,监控系统设定只有拥有二级权限的用户才能管理用户和管理节点,通过过滤器控制访问权限。添加用户的时候需要指定用户的权限等级,名字和密码,密码经过MD5加密后存入数据库,保证用户信息的安全性。

为了在数据库无用户的情况是能够正常使用监控体系(例如数据库刚创建的时候),在监控体系中存在一个配置文件,有默认管理员的信息,拥有最高级权限,可以创建其他用户。

7.6 站点管理

监控系统允许添加和删除节点两个功能,分别填写存储节点Web service开放的地址,端口。以及存储节点的主机名,监控系统将会依据主机名称去数据库寻找对应的实时状态和历史状态等讯息。

7.7 日志管理

监控系统通过从数据库获取从存储节点的日志收集器传来的数据,显示给用户。通过分析这些数据,用户可以对存储节点的运行状态有一定的了解,效果如图7.2。

监控系统的实时日志显示采用echarts,能够绘制优美的可视化数据图表,拥有丰富的显示形式。为了实时获取数据,页面采取轮询的机制,每过5s对服务器利用jquery的post方法请求新的日志信息,利用js代码记录下最后更新时间lasttime,初始化时间为0000-00-00 00:00:00。步骤为:

  • 第一次请求本节点最后的十个时间点的的信息,并且更新lasttime

  • 利用echart提供的方法动态将获得的时间点插入到折线图中

  • 5s之后发起第二次请求,请求lasttime之后的时间点的信息

  • 跳到步骤2之后顺序执行

经过以上的步骤,折线图会动态的更新,并且通过配置echart的配置文件,来实现让用户保存,显示数据等功能。

监控系统同样提供历史数据查询功能,用户通过异步请求某个日期的日志信息,服务端返回历史记录,由于历史记录一般比较巨大,所以采取ajax异步获取,以免大量的时间用于页面刷新。

7.8 监控系统

监控系统通过对每个节点的cxf服务发出一个执行init.sh请求,来试探节点的探针是否正常开启,如果能正常开启,则会返回结果,如果抛出异常,则认为远程节点下线,无法访问。

7.9 节点管理

监控系统的大部分信息都通过远程调用存储节点的Web Service服务获得,由于是通过网络获取,根据网络情况会有各种时延的情况,为了防止过长时间的等待,较复杂较容易变化的信息都是通过ajax异步获取。提供相应的按钮供用户异步刷新。

7.10 个性信息定制

针对具体的Linux系统,可能需要获取某些其他的信息来保证海量存储系统正常良好的运行,为了提供个人定制信息的获取,需要在页面提供相应的调用脚本的方法,通过在探针的配置文件上配置写好的相应脚本信息,在监控平台上可以通过调用web service中的getInfo方法获得执行相应脚本的信息,展现给用户。这里同样是采用AJAX技术,使用Bootstrap提供的的js组件模态框显示出来,如图7.3。

此功能大大丰富了监控体系的,用户可以自定义除了标准监控方式之外的的监控方式。

7.11 监控系统对于卷的管理

监控系统通过调用配置好的shell脚本实现对海量存储系统的监控,其中对于卷的控制也采用AJAX的方式,当用户通过调用相应的shell脚本的时候,实现对卷的管理,卷有开启,停止两种状态。卷处于开启状态,才能被挂载出来供samba服务发布出去。卷处于停止状态,才能删除,为了文件安全的考虑,创建卷的方法由管理员写成reset_vol脚本,供用户调用重置卷,除此之外用户无法任意创建卷,以保证文件安全。

提示信息为shell脚本执行的结果,告诉用户操作的执行结果,供用户了解操作是否正确执行,以及自动定义出错提示,我们通过在shell脚本中控制输出的内容以提示用户执行的情况,这部分可以根据Linux系统的返回信息,经过shell脚本加工处理之后返回给使用监控平台的用户,使得用户不需要非常了解Linux以及海量存储的相关信息,也能正确的使用,如图7.4。

7.12 监控系统对于节点的管理

监控系统中的节点,对应一台海量存储服务器,理想情况下他们应当通过infiniband的链路及其配套协议互连,即gluster中卷传输类型为rdma。gluster通过ip地址添加节点,若为infiniband传输,则应该按照infiniband的ip地址添加,为了方便我们将这些主机名与ip地址的对应关系统一写入/etc/hosts,使得用户可以依照此文件中对应关系依据主机名添加节点。

在监控系统中,我们提供相应的选项,供用户自定义添加节点,因为卷分布在各个节点,如果节点被删除或者其他非法操作导致的节点故障,服务重新开启,需要重新添加相应的节点以保证卷的成功开启,所以添加了重置节点的操作,通过调用reset_node脚本实现,这个脚本和reset_vol一道需要管理员编写,如图7.5。

7.13 监控系统对于samba服务的控制

监控系统提供相应的操作供用户进行配置,将挂载的卷以Samba服务的形式发布出去,供用户访问,不被挂载的卷是无法作为Samba的文件服务访问的,因此监控系统通过调用shell脚本来实现只显示挂载出来的卷供用户选择,以免出现无效的配置。同样,Samba用户除了是在Samba本身的用户外,还需要是Linux系统的用户,享受相应系统用户的权限。监控系统同样通过调用相应的shell脚本,实现只显示符合条件的用户供监控平台的用户选择。Samba共享文件夹发布成功后,文件服务的用户可以通过操作系统提供的相应获得海量数据存储的服务。

监控系统提供对Samba用户的编辑,用户可以通过指定用户名和密码创建和删除用户,如图7.6。

8 数据库设计

数据库为关系型数据库,使用的是Mysql,一共有三张表,分别是gm_site、gn_user和gm_status,分别用来记录站点信息,用户信息和运行信息。

8.1 gm_site

如图8.1所示,保存的为存储站点信息,记录的是获取远程节点webservice服务所必须的信息,url为网址,port为端口号,description为主机名,display表示是否展示给用户,删除只是将display改为false,可以恢复。

8.2 gm_user

如图8-2-1所示,保存的是用户名、密码和级别。数据库存储密码并非明文,而是经过md5哈希算法处理后的32位密文。

8.3 gm_status

如图8-3-1所示,保存的信息由时间,主机名,infiniband地址,cpu使用率,总内存,使用内存,网卡流量,ib流量。主键是由时间和主机名所组成的复合主键,可以在海量存储系统中唯一确定一条存储节点的运行信息。

9 用户访问海量文件服务

使用海量存储监控平台将文件服务通过Samba发布出来后,windows用户和linux用户均可以通过Samba赋予该文件夹访问权限的用户的身份读写文件夹中的内容。

9.1 windows用户访问海量存储

打开我的电脑,在网络中找到发布了Samba文件服务的机器,或者在地址栏中直接输入发布Samba服务的主机的服务ip找到共享文件夹,通过输入用户密码来访问该文件夹。

9.2 Linux用户访问海量存储

安装了Samba服务的Linux系统用户可以通过samba提供的相应命令访问共享文件夹,为了方便,一般通过挂载的方式将远程文件夹直接挂载到本地,挂载命令为:

  1. mount -t cifs -o username=[username],password=[password] //[ip address]/[share folder] [mount point]

其中cifs指的是通用网络文件系统,实现了samba的服务的一种网络传输协议。

Samba提供其他的命令,供用户访问,比如列出Samba服务共享的文件夹的名字:

  1. smbclient -L [ip address] -U [username]

然后按照提示输入用户密码,即可查看Samba共享文件夹的信息。用户同样可以使用相应的命令进入Samba文件系统中进行相应的操作,命令为:

  1. smbclient //[ip address]/[folder name] -U [username]

安装了gluster客户端的Linux系统,同样可以将Gluster提供的共享卷挂载在本地。命令为:

  1. mount -t glusterfs [hostname]:[volume name] [mount point]

10 总结和展望

本文通过对基于海量存储的监控体系架构的研究,对海量存储系统相关的信息获取、通信、展示和使用过程进行了详细的描述和分析,主要分为以下几个方面:

  • 研究了Linux命令以及glusterFS命令的功能,利用shell脚本,从存储节点获取所需要的信息,进行处理,并且整理成指定的格式返回给调用方。或者采取恰当的顺序调用Linux相关命令,保证海量存储的操作正常有效的执行

  • 研究了Web service以及数据库技术,编写适当的java程序,阐述了将通过执行shell脚本获得的信息作为服务发布出去供监控平台访问的方法,以及远程写入数据库的技术

  • 研究了jquery,bootstrap,echarts等前端显示技术,阐述了通过这些页面技术如何提供了丰富好看的监控界面

  • 研究了MVC以及SSH技术,搭建结构性好,可复用性好的web应用程序

  • 研究Samba技术的使用,阐述了用户如何通过自己的机器访问海量数据存储服务

本监控系统基本实现了对于海量存储服务的监控,能够对海量存储服务的状态有较为准确的反映和控制,一定程度上满足了对于海量存储监控的需求,达到了本课题的要求,对于海量数据存储的工作有了较为深刻的理解。然而,监控系统依旧存在许多可以完善的地方,主要存在于这几个方面。

  • 第一,Gluster自身有一些不完备的地方,部分可以通过Linux命令的方式补充。部分涉及Gluster源码,比如存储性能方面的,通过研究Gluster源码,可以对源代码进行优化以改善存储性能

  • 第二,监控体系面向的对象从单个节点改为整个海量存储系统,修改成从全局上监控海量存储系统,保证本监控系统的所有存储节点的配置一致。这样有利于观察整个存储系统的情况,实现集群的一致性,卷的创建方法也能够更加多样化

  • 第三,存储的形式较为单一,可以结合NFS,FTP等文件存取服务,以满足多样化的需求,对于Samba服务,也可以发掘组管理等功能  

结论

本文讨论了建立基于GlusterFS的海量存储系统的监控系统的方法与实现,对于Linux以及Gluster命令,监控信息的获取,海量存储相关命令进行了详细的描述。通过该监控系统可以看出,对于大部分基于Linux命令来进行操作的服务,都可以可以通过以shell脚本作为服务组件的方式,通过相应的网络服务接口,构造相应的监控体系来进行监控。  

参考文献

  • [1] 佚名.gluster技术文档[EB/OL].http://www.gluster.org/about/ ,2014-06-14

  • [2] 温建伟, 管剑波, 孙志刚. InfiniBand 技术现状与发展趋势[J]. 2008 年中国高校通信类院系学术研讨会论文集 (下册), 2009.

  • [3] 陈忠平, 匡碧英. InfiniBand 通信管理的分析[J]. 高性能计算技术, 2005 (005): 25-28..

  • [4] Lokeshwari Y V, Prabavathy B, Babu C. Optimized cloud storage with high throughput deduplication approach[C]//Proceedings of the International Conference on Emerging Technology Trends (ICETT). 2011.

  • [5] 艾明. 面向海量数据的云存储系统实现与应用研究 [D]. 南京: 南京邮电大学, 2012.

  • [6] 张大洋. 基于云存储的分布式文件系统研究与优化[D]. 西安电子科技大学, 2013.

  • [7] 佚名.Bootstrap中文网[EB/OL].http://www.bootcss.com/ ,2014-06-14

  • [8] 佚名.Echarts官网[EB/OL].http://echarts.baidu.com/ ,2014-06-14

  • [9] 张根宝, 胡杰. Linux 集群环境下监控 Web 服务器的 Shell 脚本设计[J]. 化工自动化及仪表, 2011, 37(10): 99-101.

  • [10] 李胜. 使用 Linux Shell 实现主机及网站运行监控并报警[J]. 现代计算机: 中旬刊, 2013 (8): 74-76.

  • [11] 熊文, 喻之斌, 须成忠. 几个常见分布式文件系统特征分析和性能对比 (英文)[J]. 集成技术, 2012, 4: 013.

  • [12] 余秦勇, 陈林, 童斌. 一种无中心的云存储架构分析[J]. 通信技术, 2012, 45(8): 123-126.

上传的附件 cloud_download 基于海量存储的监控系统.7z ( 2.13mb, 2次下载 )
error_outline 下载需要10点积分

发送私信

生活变得再糟糕,也不妨碍你变得更好

13
文章数
16
评论数
最近文章
eject