关于分布式存储
在一个信息爆炸的时代,信息数据的存储是至关重要的,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 #
# 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 = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /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
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
/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://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不能重名,所以需要变成一个随机字符串。