什么是分布式文件系统?
什么是分布式文件系统(Distributed File System)?顾名思义,就是分布式+文件系统。它包含了2方面,从文件系统的客户端的角度来看,他就是一个标准的文件系统,提供了API,由此可以进行文件的创建、删除、读写等操作;从内部来看的话,分布式文件系统则与普通的文件系统不同,它不在是本地的磁盘中,它的内容和目录都不是存储在本地磁盘中,而是通过网络传输到远程主机上,并且同一个文件存储在不只一台远程主机中,而是在一簇主机中进行分布式存储,协同提供服务。
常见的分布式文件系统
GFS :Google File System
HDFS:适合存储大文件;
TFS:在名称节点上将元数据存储于关系型数据中,文件数量不再受限于名称节点的内存空间;可以存储海量小文件;
Lustre: 企业级应用,重量级;
GlusterFS: 适用于存储少量大文件 ,流媒体,云
MooseFS: 通用简便,适用于存储小文件,大文件也不错
Mogilefs: 使用Perl语言,FastDFS
FastDFS:在内存中存储
Ceph:内核级别,支持PB级别存储
MogileFS
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的DangaInteractive公司开发。Danga团队开发了包括Memcached、MogileFS、Perlbal等多个知名的开源项目。目前使用MogileFS的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。
MogileFS:3 个重要组成
tracker:追踪原数据
database :存储元单元
storage:存储数据
tracker:
tracker(跟踪器) MogileFS的核心,是一个高度器,服务进程为mogilefsd。mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好tracker,因此最好同时运行多个tracker来做负载均衡。
database :
使用mogdbsetup程序来初始化数据库。数据库保存了Mogilefs的所有元数据,因此数据库部分非常重要,如果这儿挂了,那么整个Mogilefs将处于不可用状态。所以最好是HA结构。
storage:
mogstored(进程名),一个准备停当的mogstored节点可通过mogadm命令添加到现在现在集群中,存储节点需定义“设备(dev)用做存储空间”,每个“设备”在当前集群都需要通过一个惟一的设备ID(DevID)来识别
client:客户端用与mogilefs建立通讯,完成数据存取。
特性:(1) 工作在应用层
(2)无单点故障
(3)自动完成文件复制,复制的最小单位不是文件,而class,也就是是把需要的冗余的文件组成了一块了,而这一块就是class
(4)传输无需特殊协议
(5)名称空间
(6)不共享任何数据,只通过数据副本做冗余
(7)简单的命名空间:用于domain定义名称空间(相当一个目录), 每个文件对应一个key,同一个domain内key是唯一的。
(8) 定位文件时,在domain,定位文件的id号。
-------------------------------------------------------------------------------------------------------------------------------------------
一:环境介绍:1台Trcacker,2台StoreNode.
MYSQL和Trcacker 共用一台。Tracker IP :192.168.2.20 Mysql:192.168.2.20
StoreNode: 192.168.2.35 192.168.2.36
二:Trcacker 服务 安装如下软件,建议使用elpo源解决依赖
MogileFS-Server.noarch 0:2.46-2.el6
MogileFS-Server-mogilefsd.noarch 0:2.46-2.el6
MogileFS-Server-mogstored.noarch 0:2.46-2.el6
MogileFS-Utils.noarch 0:2.19-1.el6
perl-IO-AIO.x86_64 0:3.71-2.el6
perl-MogileFS-Client.noarch 0:1.14-1.el6
perl-Net-Netmask.noarch 0:1.9015-8.el6
perl-Perlbal.noarch 0:1.78-1.el6
(2)安装mysql给root 远程授权
MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.2.%' IDENTIFIED BY '123456' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
(2):初始化mysql
# mogdbsetup --dbhost=192.168.2.20 --dbrootuser=root --dbrootpass=123456 --dbname=mogdb --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
Create/Upgrade database name 'mogdb'? [Y/n]: y
Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogdb'? [Y/n]: y
(3)配置 tracker端(mogilefsd)
配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下:
daemonize = 1
pidfile =
/var/run/mogilefsd/mogilefsd
.pid
db_dsn = DBI:mysql
:mogdb
:host=192.168.2.20
//连接数据库为moddb. 主机为192.168.2.20
db_user = moguser
//连接名为moguser
db_pass = mogpass
//连接密码为 mogpass
listen = 192.168.2.20:7001
//tracker自己监听ip为192.168.2.20
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
# service mogilefsd start //重启mogilefsd
三:配置StoreNode.2个节点,分别安装下面软件:
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-IO-AIO
(1)配置mogstared
配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot =
/mogdata/data
//文件存取目录
(2)这里假设存储数据目录是/mogdate/data下,在实际中会是单独的存储设备。
# mkdir
-p
/mogdata/data
# chown
mogilefs.mogilefs
/mogdata/data/
-R
# service mogstored start
上面步骤在192.168.2.35 192.168.2.36 分别进行相同的操作。
(3)配置 tracker端,首先查看数据源
# mogstats --db_dsn="DBI:mysql:mogdb:host=192.168.2.20" --db_user="moguser" --db_pass="mogpass" --stats="all"
(4)tracker端上用mogadm 添加主机
# mogadm --trackers=192.168.2.20:7001 host add 192.168.2.35 --ip=192.168.2.35 --status=alive
# mogadm --trackers=192.168.2.20:7001 host add 192.168.2.36 --ip=192.168.2.36 --status=alive
查看添加后的主机
# mogadm --trackers=192.168.2.20:7001 host list
(5)添加设备,并设定设备号,设备号不能重复
# mogadm --trackers=192.168.2.20:7001 device add 192.168.2.35 1
# mogadm --trackers=192.168.2.20:7001 device add 192.168.2.36 3
查看添加后的设备
# mogadm --trackers=192.168.2.20:7001 device list
分别在/mogdata/data/目录下建立dev1 和dev3,并把属主属主改成mogilefs
在192.168.2.35:
# mkdir
/mogdata/data/dev1
# chown
-R mogilefs.mogilefs
/mogdata/data
在192.168.2.36:
# mkdir
/mogdata/data/dev3
# chown
-R mogilefs.mogilefs
/mogdata/data
(6)添加域p_w_picpaths, files
# mogadm --trackers=192.168.2.20:7001 domain add p_w_picpaths
# mogadm --trackers=192.168.2.20:7001 domain add files
查看域
# mogadm --trackers=192.168.2.20:7001 domain list
(7)添加一个class (这个根据实际需要添加,在这里是非必要步骤)
# mogadm --trackers=192.168.2.20:7001 class add p_w_picpaths class1 --mindevcount=2 (2为保留2个副本)
添加后查看
# mogadm --trackers=192.168.2.20:7001 class list
四:测试:
上传文件:mogupload
# mogupload --trackers=192.168.2.20:7001 --domain=files --key='/33.jpg' --file=/root/linux.jpg
# mogupload --trackers=192.168.2.20:7001 --domain=p_w_picpaths --key='/22.jpg' --file=/root/2222.jpg
# mogupload --trackers=192.168.2.20:7001 --domain=p_w_picpaths --key='/11.jpg' --file=/root/1111.jpg
查看文件信息:mogfileinfo
# mogfileinfo --trackers=192.168.2.20:7001 --domain=files --key='/33.jpg'
# mogfileinfo --trackers=192.168.2.20:7001 --domain=p_w_picpaths --key='/11.jpg'
# mogfileinfo --trackers=192.168.2.20:7001 --domain=p_w_picpaths --key='/22.jpg'
红把部分可以用浏览器访问
下载图片:
# mogfetch --trackers=192.168.2.20:7001 --domain=p_w_picpaths --key='/11.jpg' --file='/tmp/3.jpg'
列出domain中已存文件
# moglistkeys --trackers=192.168.2.20:7001 --domain=files;
# moglistkeys --trackers=192.168.2.20:7001 --domain=p_w_picpaths;
试验2:NGINX反向代理
添加一台服务器,ip为192.168.2.30,服务器同时做为 Tracker和Storaged:
(1)安装
# yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-IO-AIO.x86_64 0:3.71-2.el6
(2)在192.168.2.30上初始化数据库
# mogdbsetup --dbhost=192.168.2.20 --dbrootuser=root --dbrootpass=123456 --dbname=mogdb --dbuser=moguser --dbpass=mogpass
(3) 配置 tracker端(mogilefsd)
配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下:
daemonize = 1
pidfile =
/var/run/mogilefsd/mogilefsd
.pid
db_dsn = DBI:mysql:mogdb:host=192.168.2.20 //连接数据库为mogdb, ip为192.168.2.20
db_user = moguser // 连接用户名为moguser
db_pass = mogpass // 连接密码为mogpass
listen = 192.168.2.30:7001 //自己监听的ip:192.168.2.30
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
###################
# service mogilefsd start //配置文件修改后重启mogilefsd
(4)下面为重启mogilefsd 后就能从192.168.2.30上查看到原已添加的主机。
(5)配置mogstared
# cat /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data/
(6) 建立目录
# mkdir -p /mogdata/data
# chown mogilefs.mogilefs /mogdata/data/ -R
# service mogstored start
(7)添加主机,因为192.168.2.30服务器同时做为 Tracker和Storaged,所以Tracker的ip为192.168.2.30,Storaged的ip 也为192.168.2.30,添加的主机名,这里用的是ip,所以也为192.168.2.30
# mogadm --trackers=192.168.2.30:7001 host add 192.168.2.30 --ip=192.168.2.30 --status=alive
添加设备为192.168.2.30,设备号为4,
# mogadm --trackers=192.168.2.30:7001 device add 192.168.2.30 4
建立dev4目录,为改变权限
# mkdir /mogdata/data/dev4
# chown -R mogilefs.mogilefs /mogdata/data
查看trackers:如下图
NGINX在编译时添加第三方模块:
useradd
-r nginx
tar
xf nginx_mogilefs_module-1.0.4.
tar
.gz
tar
xf nginx-1.6.2.
tar
.gz
cd
nginx-1.6.2
.
/configure
--prefix=
/usr
--sbin-path=
/usr/sbin/nginx
--conf-path=
/etc/nginx/nginx
.conf\
--error-log-path=
/var/log/nginx/error
.log --http-log-path=
/var/log/nginx/access
.log \
--pid-path=
/var/run/nginx/nginx
.pid --lock-path=
/var/lock/nginx
.lock --user=nginx \
--group=nginx --with-http_ssl_module --with-http_flv_module \
--with-http_stub_status_module --with-http_gzip_static_module \
--http-client-body-temp-path=
/var/tmp/nginx/client/
\
--http-proxy-temp-path=
/var/tmp/nginx/proxy/
\
--http-fastcgi-temp-path=
/var/tmp/nginx/fcgi/
\
--http-uwsgi-temp-path=
/var/tmp/nginx/uwsgi
\
--http-scgi-temp-path=
/var/tmp/nginx/scgi
--with-pcre --with-debug \
--add-module=..
/nginx_mogilefs_module-1
.0.4
make
&&
make
install
NGINX.conf 文件配置如下:
upstream trackers{
server 192.168.2.20:7001;
server 192.168.2.30:7001;
}
location /upload {
mogilefs_tracker trackers;
mogilefs_domain p_w_picpaths; //指定使用的domain,这个很关键,
mogilefs_methods GET; // GET PUT DELETE; 允许上传,删除时方法
mogilefs_noverify on;
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
访问如下:
# curl -X DELETE http://192.168.2.10/upload/66.jpg 请求方法允许删除时,可以直接删除