共计 15426 个字符,预计需要花费 39 分钟才能阅读完成。
本节我们将来认识下分布式文件系统,不过我主要讲的是关于其中的一个比较流行的 mogilefs 进行介绍,好了其他的不多说了,下面我们就开始吧。
什么是分布式文件系统?
什么是分布式文件系统(Distributed File System)?顾名思义,就是分布式 + 文件系统。它包含了 2 方面,从文件系统的客户端的角度来看,他就是一个标准的文件系统,提供了 API,由此可以进行文件的创建、删除、读写等操作;从内部来看的话,分布式文件系统则与普通的文件系统不同,它不在是本地的磁盘中,它的内容和目录都不是存储在本地磁盘中,而是通过网络传输到远程主机上,并且同一个文件存储在不只一台远程主机中,而是在一簇主机中进行分布式存储,协同提供服务。
MogileFS 设置 Memcached http://www.linuxidc.com/Linux/2012-03/56905.htm
在 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56904.htm
在开源分布式文件系统 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56573.htm
自定义 Nagios 监控 MogileFS 存储节点脚本 http://www.linuxidc.com/Linux/2011-12/49394.htm
常见的分布式文件系统
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 的特性:
1、应用层:用户空间文件系统,无须特殊的核心组件
2、无单点:(tracker, mogstore, database(MySQL))
3、自动文件复制:复制的最小单位不是文件,而 class;
4、传输中立,无特殊协议:可以通过 NFS 或 HTTP 进行通信;
5、比 RAID 好多了
6、简单的命名空间:每个文件对应一个 key:用于 domain 定义名称空间
7、不共享任何数据:
MogileFS 组件:
Tracker nodes:MogileFS 的核心,是一个调度器;服务进程为 mogilefsd; 职责:删除、复制、监控、查询等;
storge nodes:mogstored 进程: 数据存储的位置,通常是一个 HTTP(WebDAV)服务器,用来数据的创建、删除、获取;
Database nodes(MySQL): 用于为 tracker 存储元数据信息,mogileFS
实验:构建基于 Nginx+mogilefs 的分布式文件系统
实验拓扑图:
总的实验步骤如下: 由于有些步骤连在一起做,所以做的时候可能并不是完全按照以下步骤进行:
安装 tracker:
1、安装相关的包:
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
2、授权数据库用户,并初始 mysql 数据库
# mogdbsetup
3、修改配置文件
db_dsn = DBI:mysql:DBNAME:host=HOSTNAME
4、启动 mogilefsd 进程
安装 mogstord:
1、安装相关的包
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
perl-IO-AIO
2、准备存储设备
挂载至某路径下,确认此路径下存在文件 devN
此路径的属主和属组为 mogilefs.mogilefs
3、修改配置文件 /etc/mogilefs/mogstored.conf
docRoot=
前面的挂载路径;
配置 mogielfs:
1、向 tracker 添加各 mogstored 主机
mogadm –trackers=TRACKER_NODE host add
2、向 tracker 添加各设备
mogadm –trackers=TRACKER_NODE device add
3、为 tracker 定义名称空间 domain
mogadm –trackers=TRACKER_NODE domain add
4、为 domain 添加一个或多个 class
mogadm –trackers=TRACKER_NODE class add
可同时副本的最少个数;
好了下面就开始安装了。
2 个 storage 节点都装上以下几个包
[root@localhost mogilefs]# ls
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm
[root@localhost mogilefs]# yum install -y * perl-IO-AIO
各自创建存储目录(2 个节点分别为 dev{1,2})
第一个节点:
[root@www mog]# mkdir -pv /mogdata/data/dev1
mkdir: created directory `/mogdata’
mkdir: created directory `/mogdata/data’
mkdir: created directory `/mogdata/data/dev1′
第二个节点:
[root@localhost mog]# mkdir -pv /mogdata/data/dev2
mkdir: created directory `/mogdata’
mkdir: created directory `/mogdata/data’
mkdir: created directory `/mogdata/data/dev2′
修改文件夹权限
[root@www ~]# chown -R mogilefs.mogilefs /mogdata/data/
数据库授权
mysql 节点安装并启动 mysqld
[root@localhost mog]# yum install mysql mysql-server
[root@localhost mog]# service mysqld start
Please report any problems with the /usr/bin/mysqlbug script!
[OK]
Starting mysqld: [OK]
进入 mysql 进行授权
mysql> grant all on mogilefs.* to ‘moguser’@’172.16.%.%’ identified by ‘mogpass’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to ‘root’@’172.16.%.%’ identified by ‘mageedu’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
OK,下面到 storage 端进行数据库初始化
初始化完成可以在数据库中查看
修改配置文件
注意 2 个节点中都要修改
[root@www mog]# vim /etc/mogilefs/mogilefsd.conf
然后就可以启动服务了
[root@www mog]# service mogilefsd start
Starting mogilefsd [OK]
查看端口是否开启
下面修改 mogstored 的配置文件并启动服务(2 个节点都要改)
[root@localhost mog]# vim /etc/mogilefs/mogstored.conf
[root@www ~]# service mogstored start
Starting mogstored [OK]
查看端口是否启动
添加节点
[root@www ~]# mogadm –trackers=172.16.6.20:7001 host add 172.16.6.20 –ip=172.16.6.20 –status=alive
[root@www ~]# mogadm –trackers=172.16.6.20:7001 host add 172.16.6.30 –ip=172.16.6.30 –status=alive
查看是否添加成功
添加设备
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.20 1
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.30 2
查看是否添加成功
发现刚刚的文件目录的权限没给。注: 修改权限的步骤我没写在这里,我放到了上面的修改权限
修改之后就 OK:
创建 domain:实现名称空间
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 domain add files
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 domain add images
查看生成的 domain
创建 class:复制文件的最小单位
解释下这里的几个参数意思:
mindevcount: 最小复制文件的份数
replpolicy: 复制份数
hashtype: 采用的 hash 的类型
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-10/107519p2.htm
好了下面就可以上传一下文件试一下看看了
上传图片文件
[root@www ~]# mogupload –trackers=172.16.6.20:7001 –domain=images –key=’/a.jepg’ –file=’/root/75b4519340.jpg’
上传文本文件
[root@www ~]# mogupload –trackers=172.16.6.20:7001 –domain=files –key=’/init.html’ –file=’/etc/inittab’
查看文件的 fid 进行访问
[root@www ~]# mogfileinfo –trackers=172.16.6.20:7001 –domain=images –key=’/a.jepg’
– file: /a.jepg
class: default
devcount: 2
domain: images
fid: 4
key: /a.jepg
length: 432441
– http://172.16.6.30:7500/dev2/0/000/000/0000000004.fid
– http://172.16.6.20:7500/dev1/0/000/000/0000000004.fid
[root@www ~]# mogfileinfo –trackers=172.16.6.20:7001 –domain=files –key=’/init.html’
– file: /init.html
class: default
devcount: 2
domain: files
fid: 5
key: /init.html
length: 884
– http://172.16.6.20:7500/dev1/0/000/000/0000000005.fid
– http://172.16.6.30:7500/dev2/0/000/000/0000000005.fid
OK,成功了。
但是如果是通过 fid 来访问的方式实在是太过拙劣,我们能不能通过直接访问如 172.16.6.20/a.jpeg 这种方式来访问呢
没错,那这就是用 nginx 来反向代理的意义了,我们可以通过 nginx 上的 mogilefs 模块来实现这种功能,那么下面就来让我们安装配置吧
nginx 的编译安装
由于 yum 安装的 nginx 不支持 mogilefs 这个模块,因此我们只能编译安装了
编译之前确保编译环境准备就绪
# yum groupinstall “Development Tools” “Server Platform Deveopment”
# yum install openssl-devel pcre-devel
下面我们需要编译安装的包已经模块包
这里我已经下载好了
[root@localhost ~]# ls
anaconda-ks.cfg install.log install.log.syslog mogilefs nginx-1.6.1.tar.gz nginx_mogilefs_module-1.0.4.tar.gz
创建系统用户 nginx
[root@localhost nginx-1.6.1]# groupadd -r nginx
[root@localhost nginx-1.6.1]# useradd -g nginx -r nginx
2 个包都进行解压
[root@localhost ~]# tar xf nginx-1.6.1.tar.gz
[root@localhost ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz
编译安装 nginx
[root@localhost ~]# cd nginx-1.6.1
[root@localhost nginx-1.6.1]# make && make install
ok,安装完毕
修改配置文件使 nginx 进行反向代理
[root@localhost nginx-1.6.1]# vim /etc/nginx/nginx.conf
以下 yellow 字体为加入的配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream trackers {定义上流服务器集群
server 172.16.6.20:7001;
server 172.16.6.30:7001;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~* ^(/img/.*)$ {注意为了方便起见,这里我只是对图片这个区域进行了定义,
mogilefs_tracker trackers; 这里 并没有对其他区域定义,对其他区域定义的方式也一样
mogilefs_domain images; 指定区域
mogilefs_noverify on;
mogilefs_pass $1{
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
为 nginx 提供类似 service 的启动脚本
[root@localhost nginx-1.6.1]# vim /etc/init.d/nginx
#!/bin/sh
#
# nginx – this script starts and stops the nginx daemon
#
# chkconfig: – 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[“$NETWORKING” = “no”] && exit 0
nginx=”/usr/sbin/nginx”
prog=$(basename $nginx)
NGINX_CONF_FILE=”/etc/nginx/nginx.conf”
[-f /etc/sysconfig/nginx] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep “configure arguments:” | sed ‘s/[^*]*–user=\([^]*\).*/\1/g’ -`
options=`$nginx -V 2>&1 | grep ‘configure arguments:’`
for opt in $options; do
if [`echo $opt | grep ‘.*-temp-path’`]; then
value=`echo $opt | cut -d “=” -f 2`
if [! -d “$value”]; then
# echo “creating” $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[-x $nginx] || exit 5
[-f $NGINX_CONF_FILE] || exit 6
make_dirs
echo -n $”Starting $prog: ”
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[$retval -eq 0] && touch $lockfile
return $retval
}
stop() {
echo -n $”Stopping $prog: ”
killproc $prog -QUIT
retval=$?
echo
[$retval -eq 0] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $”Reloading $prog: ”
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case “$1” in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $”Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}”
exit 2
esac
给予执行权限
[root@localhost nginx-1.6.1]# chmod +x /etc/init.d/nginx
启动服务
root@localhost nginx-1.6.1]# service nginx start
Starting nginx: [OK]
OK,下面我们就可以测试下了
先传一张图片到服务器上
[root@www ~]# mogupload –trackers=172.16.6.20:7001 –domain=images –key=’/img/a.jpg’ –file=’/root/75b4519340.jpg’
OK,下面我们直接用 key 的路径进行访问
OK, 实验完成。
那么本节的内容就讲到这里,欢迎大家的批评指正,谢谢!
本节我们将来认识下分布式文件系统,不过我主要讲的是关于其中的一个比较流行的 mogilefs 进行介绍,好了其他的不多说了,下面我们就开始吧。
什么是分布式文件系统?
什么是分布式文件系统(Distributed File System)?顾名思义,就是分布式 + 文件系统。它包含了 2 方面,从文件系统的客户端的角度来看,他就是一个标准的文件系统,提供了 API,由此可以进行文件的创建、删除、读写等操作;从内部来看的话,分布式文件系统则与普通的文件系统不同,它不在是本地的磁盘中,它的内容和目录都不是存储在本地磁盘中,而是通过网络传输到远程主机上,并且同一个文件存储在不只一台远程主机中,而是在一簇主机中进行分布式存储,协同提供服务。
MogileFS 设置 Memcached http://www.linuxidc.com/Linux/2012-03/56905.htm
在 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56904.htm
在开源分布式文件系统 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56573.htm
自定义 Nagios 监控 MogileFS 存储节点脚本 http://www.linuxidc.com/Linux/2011-12/49394.htm
常见的分布式文件系统
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 的特性:
1、应用层:用户空间文件系统,无须特殊的核心组件
2、无单点:(tracker, mogstore, database(MySQL))
3、自动文件复制:复制的最小单位不是文件,而 class;
4、传输中立,无特殊协议:可以通过 NFS 或 HTTP 进行通信;
5、比 RAID 好多了
6、简单的命名空间:每个文件对应一个 key:用于 domain 定义名称空间
7、不共享任何数据:
MogileFS 组件:
Tracker nodes:MogileFS 的核心,是一个调度器;服务进程为 mogilefsd; 职责:删除、复制、监控、查询等;
storge nodes:mogstored 进程: 数据存储的位置,通常是一个 HTTP(WebDAV)服务器,用来数据的创建、删除、获取;
Database nodes(MySQL): 用于为 tracker 存储元数据信息,mogileFS
实验:构建基于 Nginx+mogilefs 的分布式文件系统
实验拓扑图:
总的实验步骤如下: 由于有些步骤连在一起做,所以做的时候可能并不是完全按照以下步骤进行:
安装 tracker:
1、安装相关的包:
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
2、授权数据库用户,并初始 mysql 数据库
# mogdbsetup
3、修改配置文件
db_dsn = DBI:mysql:DBNAME:host=HOSTNAME
4、启动 mogilefsd 进程
安装 mogstord:
1、安装相关的包
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
perl-IO-AIO
2、准备存储设备
挂载至某路径下,确认此路径下存在文件 devN
此路径的属主和属组为 mogilefs.mogilefs
3、修改配置文件 /etc/mogilefs/mogstored.conf
docRoot=
前面的挂载路径;
配置 mogielfs:
1、向 tracker 添加各 mogstored 主机
mogadm –trackers=TRACKER_NODE host add
2、向 tracker 添加各设备
mogadm –trackers=TRACKER_NODE device add
3、为 tracker 定义名称空间 domain
mogadm –trackers=TRACKER_NODE domain add
4、为 domain 添加一个或多个 class
mogadm –trackers=TRACKER_NODE class add
可同时副本的最少个数;
好了下面就开始安装了。
2 个 storage 节点都装上以下几个包
[root@localhost mogilefs]# ls
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm
[root@localhost mogilefs]# yum install -y * perl-IO-AIO
各自创建存储目录(2 个节点分别为 dev{1,2})
第一个节点:
[root@www mog]# mkdir -pv /mogdata/data/dev1
mkdir: created directory `/mogdata’
mkdir: created directory `/mogdata/data’
mkdir: created directory `/mogdata/data/dev1′
第二个节点:
[root@localhost mog]# mkdir -pv /mogdata/data/dev2
mkdir: created directory `/mogdata’
mkdir: created directory `/mogdata/data’
mkdir: created directory `/mogdata/data/dev2′
修改文件夹权限
[root@www ~]# chown -R mogilefs.mogilefs /mogdata/data/
数据库授权
mysql 节点安装并启动 mysqld
[root@localhost mog]# yum install mysql mysql-server
[root@localhost mog]# service mysqld start
Please report any problems with the /usr/bin/mysqlbug script!
[OK]
Starting mysqld: [OK]
进入 mysql 进行授权
mysql> grant all on mogilefs.* to ‘moguser’@’172.16.%.%’ identified by ‘mogpass’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to ‘root’@’172.16.%.%’ identified by ‘mageedu’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
OK,下面到 storage 端进行数据库初始化
初始化完成可以在数据库中查看
修改配置文件
注意 2 个节点中都要修改
[root@www mog]# vim /etc/mogilefs/mogilefsd.conf
然后就可以启动服务了
[root@www mog]# service mogilefsd start
Starting mogilefsd [OK]
查看端口是否开启
下面修改 mogstored 的配置文件并启动服务(2 个节点都要改)
[root@localhost mog]# vim /etc/mogilefs/mogstored.conf
[root@www ~]# service mogstored start
Starting mogstored [OK]
查看端口是否启动
添加节点
[root@www ~]# mogadm –trackers=172.16.6.20:7001 host add 172.16.6.20 –ip=172.16.6.20 –status=alive
[root@www ~]# mogadm –trackers=172.16.6.20:7001 host add 172.16.6.30 –ip=172.16.6.30 –status=alive
查看是否添加成功
添加设备
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.20 1
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.30 2
查看是否添加成功
发现刚刚的文件目录的权限没给。注: 修改权限的步骤我没写在这里,我放到了上面的修改权限
修改之后就 OK:
创建 domain:实现名称空间
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 domain add files
[root@www ~]# mogadm –trackers=172.16.6.20:7001,172.16.6.30:7001 domain add images
查看生成的 domain
创建 class:复制文件的最小单位
解释下这里的几个参数意思:
mindevcount: 最小复制文件的份数
replpolicy: 复制份数
hashtype: 采用的 hash 的类型
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-10/107519p2.htm