分布式存储mogilefs

来源:互联网 发布:js缺少对象 编辑:程序博客网 时间:2024/06/11 13:10

关于分布式存储

       在一个信息爆炸的时代,信息数据的存储是至关重要的,QQ空间,微信朋友圈,服务器上每天都要上传数以千万的图片。这样的压力之下使得人们需要重新审视有关大数据的挑战。例如:数据采集,数据存储,数据搜索,数据共享,数据传输,数据分析,数据可视化等等。

     数据存储的趋势是快速数据增长的。据说全球数据也遵循摩尔定律了,全球的数据量每18个月翻上一倍。这就类似那个,和国王下棋,赢了之后棋盘上放一粒米,在下格翻倍。。。。之后,全国的米加起来都不够赔的那个故事一样。
     
     那么就需要分布式存储了。当然,想要实现分布式存储。需要解决的就是1.节点间通信 。2.数据的存储  3.数据空间的平衡。 4.容错  5.文件系统的支持。

    一个分布式文件系统会有一个元数据节点,和N个数据存储节点。元数据节点就好像是文件系统中的inode块一样的功能。如果来了一个数据存储请求。元数据节点会将数据分割成小份,然后发往一些数据存储节点,顺带做一下冗余工作。
    分布式分为两类
         文件系统:有文件系统接口,常见的有GFS(Google file system),TFS(Taobao file system)。
         存储:只是简单的存储

TFS:将元数据存储于关系型数据库或其他高性能存储中,从而能维护海量的文件元数据。
HDFS:数据不太多的大文件。
GlusterFS:去中心化设计。
ceph:Linux内核级的实现的文件系统,已经被收录进Linux内核。     
Mogilefs:适合海量小文件。

关于Mogilefs

    

客户端自行去找存储节点。橙色虚线表示元数据存储线路,绿色虚线表示客户端请求数据(包括向元数据节点和数据节点去请求)。蓝色虚线表示节点之间的通信(为了冗余之类的事情)

其中mogilefs包括以下特性:
1.应用层:无需特殊核心组件
2.无单点失败
3.自动文件复制
4.传输中立,无特殊协议
5.Shared-Nothing
6.non-RAID
7.不能追加写,随机写。
8.Tracker Client传输(mogilefsd)管理数据复制,删除,查询,修复及监控。
9.数据通过HTTP协议/WebDAV服务上传到Storage node(mogstored)
10.MySQL存储Mogilefs元数据(命名空间,位置)

其架构如下。因为采用的是HTTP协议。所以可以利用Nginx反向代理。

可以在三个节点都运行tracker节点和storage节点。并且利用nginx对每个节点的tracker做反向代理,健康检查和负载均衡。

加上Nginx本来是,客户端去请求的是元数据。而真实的存储还是存储在storage节点上。客户端还需要去请求storage节点。

那么就需要把Nginx扩展一下。客户端通过Nignx请求数据,元数据被Nginx请求到后,Nginx再去代替客户端去请求storage节点。

Mogilefs的组成

     Mogilefs由tracker节点和storage节点组成。

      tracker节点:借助数据库保存各个节点文件的元数据信息。还有存储的分布位置。同时方便的检索和监控各个节点。告诉客户端存储区的位置,并且指挥storage节点复制数据副本。进程名字为mogilefsd(7001)

      storage节点:将域(Domain)中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值。storage节点自动维护值的对应关系。storage节点使用http协议进行数据传输。所以依赖于perbal。storage节点前端可以使用nginx进行反向代理。但需要安装nginx-mogilefs-module-master模块进行名称转换。进程名mogistored(7501),perbal(7500)


Mogilefs的存储方式

   Domain:一个Mogilefs可以有多个Domain。比如手机移动站,我们可以设置一个Domain。PC站,我们也设置一个Domain。两者区分开来,用来存放不同的文件,但是同一个Domain内,Key必须唯一。不同Domain内,Key可以相同。一个Domain就是一个目录。但不推荐Domain嵌套

   Class:Domain内的Class。文件属性的管理。定义文件存储在不同设备上的份数。也是复制的最小单位。
 
   Domain+Fid(Key) 定位文件。

安装mogilefs

   首先把所需要的mogilefs的rpm安装包提供给大家 http://pan.baidu.com/s/1jH6nitw

环境centos7.3:

配置epel源(方法略)

###-- 首先配置perl环境 --###
# yum -y install perl-Sys-Syslog perl-Net-Netmask perl-IO-AIO

##-- 安装mogilefs --##
# yum -y install MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm \> perl-MogileFS-Client-1.14-1.el6.noarch.rpm \> MogileFS-Server-2.46-2.el6.noarch.rpm \> MogileFS-Utils-2.19-1.el6.noarch.rpm \> perl-Perlbal-1.78-1.el6.noarch.rpm \> MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm \> perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm 

##-- 安装MariaDB数据库 --## (如果不高可用,只装一个就可以)
安装jemalloc优化后的数据库  安装参考 http://www.cnblogs.com/hukey/p/6654285.html

安装好了之后使用授权
MariaDB [(none)]> CREATE DATABASE mogilefs;MariaDB [(none)]> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.%.%' IDENTIFIED BY 'mogpass';MariaDB [(none)]> FLUSH PRIVILEGES;


##-- 设定数据库 --##
[root@node1 etc]# mogdbsetup --dbhost=192.168.30.128 --dbport=3306 --dbname='mogilefs' \> --dbrootuser='root' --dbuser='moguser' --dbpass='mogpass'This will attempt to setup or upgrade your MogileFS database.It won't destroy existing data.Run with --help for more information.  Run with --yes to shut up these prompts.Continue? [N/y]: y


##--  修改tracker节点 --##
# vim /etc/mogilefs/mogilefsd.conf 

先修改数据库和监听端口相关。5-10行
  5 # Database connection information  6 db_dsn = DBI:mysql:mogilefs:host=192.168.30.128  7 db_user = moguser  8 db_pass = mogpass  9 # IP:PORT to listen on for mogilefs client requests 10 listen = 0.0.0.0:7001

讲解:
 14 query_jobs = 10  #查询线程数量 15 # Number of delete workers to start by default.  16 delete_jobs = 1  #删除线程 17 # Number of replicate workers to start by default. 18 replicate_jobs = 5 #复制线程 19 # Number of reaper workers to start by default. 20 # (you don't usually need to increase this) 21 reaper_jobs = 1 #


##-- 启动mogilefs --##

# service mogilefsd start


##-- 配置存储节点 --##(该节点可以配置在很多台主机上)
配置文件中最后的那个dev必须起名devn。而且第一台主机的叫dev1,第二台主机上的叫dev2。。。

# mkdir -pv /data/mogilefs/dev1# chown -R  mogilefs.mogilefs  /data/mogilefs/dev1# vim /etc/mogilefs/mogstored.conf maxconns = 10000httplisten = 0.0.0.0:7500mgmtlisten = 0.0.0.0:7501docroot = /data/mogilefs


更改一下启动脚本(/etc/init.d/mogstored).该文件没有对pid文件做处理。所以
更改如下(只改了mogilefsd的,mogstored省略)
 15 lockfile=${LOCKFILE-/var/lock/subsys/mogilefsd} 16 pidfile=${/var/run/mogilefsd/mogilefsd.pid}   ##添加的pid文件路径 17 RETVAL=0 26         [ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogilefsd) > ${pidfile}|| failure 35         [ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile}|| failure


使用mogilefs

先看一下目前的配置情况
tracker节点: 192.168.30.128
storage节点:
192.168.30.128  dev1
192.168.30.129  dev2
192.168.30.130  dev3                        
database节点:192.168.30.128

## -- tracker节点去添加storage节点和一些其他的常用命令
mogadm check       #检测节点
mogadm host list    #每个存储节点称为一个host
mogadm host add  192.168.30.128 --ip=192.168.30.128 --status=alive  #添加存储节点
mogadm device add 192.168.30.128 1    #添加第一个设备,且设备号唯一不能重名
mogadm deviec add 192.168.30.129 2    #添加第二个设备
mogadm check  #可以检查状态
mogadm domain add files        #创建文件存储域
mogadm domain add images   #创建图片存储域
mogadm domain list   #查看所有域
mogadm class add (domain-name) (class-name) --mindevcount=1   #存储节点为1个
mogadm class add (domain-name) (class-name) --replpolicy="MultipeHosts(3)"  #复制三份
mogupload  --trackers=192.168.30.128 --domain=files  --keys='/fstab'  --file='/etc/fstab'    #上传fstab文件,key为'/fstab'
mogfileinfo --trakers=192.168.30.128 --domain=files --key='/fstab'   #根据key去查看文件存放的信息


##-- mogilefs的其他工具 --##
# mog
mogadm        mogdbsetup    mogfetch      mogfileinfo   moglistfids   mogrename     mogstored     mogupload     
mogautomount  mogdelete     mogfiledebug  mogilefsd     moglistkeys   mogstats      mogtool       

首先上传一个文件个这个分布式文件系统。
# mogupload --trackers=192.168.30.128 --domain=images \--key='/favicon.png.bak' --file='/etc/favicon.png' --class=png


检查这个文件的信息。
# mogfileinfo --trackers=192.168.30.128 --domain=images  --key='/favicon.png.bak'- file: /favicon.png.bak     class:                  png  devcount:                    1    domain:               images       fid:                    8       key:     /favicon.png.bak    length:                 1079 - http://192.168.30.129:7500/dev2/0/000/000/0000000008.fid

下面的那个url路径是可以直接再浏览器中访问的。(就是那个centos的小图标)


还可以列出指定域下的都有哪些可以可以使用。
# moglistkeys --trackers=192.168.30.128 --domain=images
/favicon.png.bak

删除一个域中的文件
# mogdelete --trackers=192.168.30.128 --domain=images --key='/favicon.png.bak'

删除class
# mogadm class delete images gif

删除域
# mogadm domain delete files


使用Nginx反向代理mogilefs的元数据请求

由于我的服务器上已经安装了nginx,所以我需要添加模块进nginx

首先得到nginx-mogilefs的模块。这个第三方模块在github上有。
# git clone https://github.com/vkholodkov/nginx-mogilefs-module.git

新安装nginx请参考  http://blog.csdn.net/ghost_leader/article/details/62223882
已经安装nginx,想添加这个模块的参考 http://www.cnblogs.com/lixigang/articles/5130052.html


如果在make时,遇见如下报错,意思是request,pclcf这两变量声明了没用。


可以修改源码包中的objs/Makefile .删去第二行中CFLAGS那行中的 -Werror 就好。


安装完成之后可以修改配置文件。因为刚刚我已经配置了images这个域。所以配置如下。
配置文件路径( /etc/nginx/nginx.conf )
        location /images {                mogilefs_tracker 192.168.30.128:7001;                mogilefs_domain images;                mogilefs_methods GET;                mogilefs_noverify on;                mogilefs_pass {                        proxy_pass $mogilefs_path;                        proxy_hide_header Content-Type;                        proxy_buffering off;                }        }

浏览器访问 192.168.30.128/images/pictures.jpg 。就可以访问。
其中 mogilefs_tracker 后面可以跟一个upstream。

还有就是。比如下载百度图片是。图片的名称经常是一个特别长的字母数字.png  比如 53ddw9jk2n1n2nmkkda3.jpg
其实就是因为mogilefs中key不能重名,所以需要变成一个随机字符串。