分布式存储集群MogileFS的详细部署
一、常见的分布式存储系统目前我们使用的分布式存储方面的应用均是有google的几篇论文演化出来的,下面就是这几篇论文所出现的架构:
Google File System(大规模分散文件系统) :用于分布式存储
MapReduce (大规模分散FrameWork) :用于分布式计算
BigTable(大规模分散数据库) :用于列式数据库
Chubby(分散锁服务)
1、GFS(Google File System)
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。 下面分布式文件系统都是类 GFS的产品。
2、HDFS
Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。
3、Ceph
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。 说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。 可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。
4、Lustre
Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由甲骨文公司开发和维护的。 该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。 目前Lustre已经运用在一些领域,例如HP SFS产品等。
5、MogileFS
由memcahed的开发公司danga一款perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等。 MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。
MogileFS由3个部分组成:
第1个部分是server端,包括mogilefsd和mogstored两个程序。前者即是 mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
第2个部分是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
第3个部分是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能。
6、MooseFS
支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多。
7、FastDFS
是一款类似Google FS的开源分布式文件系统,是纯C语言开发的。 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
8、TFS
TFS(Taobao !FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化 了文件的访问流程,一定程度上为TFS提供了良好的读写性能。
9、GridFS文件系统
MongoDB是一种知名的NoSql数据库,GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储。文件在GridFS中会按4MB为单位进行分块存储。
二、MogileFS
1、MogileFS的特性
应用层提供服务,不需要使用核心组件
无单点(tracker(跟踪点)mogstore(存储节点)database(MySQL))
自动文件复制:复制的最小单位不是文件,而是class
传输中立:无特殊协议,可以通过NFS或HTTP实现通信
简单的命名空间:没有目录,直接存在存储空间上,通过域来实现
不共享任何数据:
2、Mogilefs基本原理
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。其主要特性包括:应用层的组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID支持等……核心角色如下:
Tracker节点:借助数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。
Database节点:数据库用来存放MogileFS的元数据 (命名空间, 和文件在哪里). 这应该设置一个高可用性(HA)的环境以防止单点失败。
Storage节点:实际文件存放的地方. 存储节点是一个HTTP服务器,用来做 删除,存放等事情,任何WebDAV服务器都可以,将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)。
Domain:一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。
Host:每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。
Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。
三、集群部署
1、集群架构
http://s5.运维网.com/wyfs02/M02/76/75/wKiom1ZT9Z7yuWzhAADcOGSD1Vk679.jpg
2、服务器IP配置情况
名称
hostnameIP安装软件
系统反向代理nginx192.168.0.9nginxCentOS 6.4 X86tracker/storage节点node1192.168.0.10mogilefs
CentOS 6.4 X86tracker/storage节点node2192.168.0.11mogilefsCentOS 6.4 X86tracker/storage节点node3192.168.0.12mogilefsCentOS 6.4 X86database节点
mysql192.168.0.13mysqlCentOS 6.4 X86 四、集群软件安装
1、数据库授权
mysql-server的安装我这里不再介绍,我这里是使用的Yum进行安装的。
mysql> grant all privileges on *.* to 'root'@'192.168.%.%';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on mogilefs.* to 'moguser'@'192.168.%.%' identified by 'mogpass';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec) 2、node1节点安装mogilefs
正常情况下我们可以通过perl进行安装,这里我们为了简便准备了rpm包,大家可以通过附件下载我准备好的rpm安装包。
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-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpmyum install *.rpm perl-IO-AIO -y 3、数据库初始化
可以通过mogdbsetup -h查看使用帮助,默认选项的可以不用填写
mogdbsetup --dbhost=192.168.0.13 --dbuser=moguser --dbpass=mogpass --yes 初始化成功之后,可以登陆数据库查看是否生成了表格
mysql> use mogilefs
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| checksum |
| class |
| device |
| domain |
| file |
| file_on |
| file_on_corrupt |
| file_to_delete |
| file_to_delete2 |
| file_to_delete_later |
| file_to_queue |
| file_to_replicate |
| fsck_log |
| host |
| server_settings |
| tempfile |
| unreachable_fids |
+----------------------+
17 rows in set (0.00 sec) 4、配置teacker服务
# cat /etc/mogilefs/mogilefsd.conf
daemonize = 1 #是否以守护进程运行
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.0.13#定义数据库名及主机
db_user = moguser #数据库用户名
db_pass = mogpass #数据库用户密码
listen = 0.0.0.0:7001 #监听地址
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1 到目前为止,tracker服务配置就算完成了,现在就可以启动tracker服务了,下面我们配置存储服务。
5、mogstored配置
# cat /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501 #管理接口,和tracker交互
docroot = /mogdata #数据存放目录,一般是新磁盘挂在目录 创建好/mogdata目录,并设定好权限,就可以启动mogstored服务了。
6、node2、node3的配置
在这里我就不写代码了,node2、node3的配置和node1的配置一模一样,只是不要对数据库进行初始化了,只需安装并且配置tracker和storge就可以了。
然后启动服务
service mogstored start
service mogilefsd start 所有配置好之后要通过netstat -tlnp查看一下服务是否正确启动起来了。
7、增加节点
我们可以通过命令mogadm -h查看命令的帮助,可以随便选择一个tracker上面进行操作,因为所以的tracker连接的数据库都是一个,所以哪个上面操作效果都是一样的,我们选择node1节点进行操作。
mogadm --trackers=192.168.0.10:7001 host add node1 --ip=192.168.0.10 --status=alive
mogadm --trackers=192.168.0.11:7001 host add node2 --ip=192.168.0.11 --status=alive
mogadm --trackers=192.168.0.12:7001 host add node3 --ip=192.168.0.12 --status=alive 查看添加的host
# mogadm --trackers=192.168.0.10:7001 host list
node1 : alive
IP: 192.168.0.10:7500
node2 : alive
IP: 192.168.0.11:7500
node3 : alive
IP: 192.168.0.12:7500 可以看到我们都已经添加上了。
8、添加设备
mogadm --trackers=192.168.0.10:7001 device add node1 1
mogadm --trackers=192.168.0.10:7001 device add node2 2
mogadm --trackers=192.168.0.10:7001 device add node3 3 添加设备时所使用的设备ID号必须要/mogdata中的dev编号一致查看添加的设备
# mogadm --trackers=192.168.0.10:7001 device list
node1 : alive
used(G) free(G) total(G)weight(%)
dev1: alive 0.000 0.000 0.000 100
node2 : alive
used(G) free(G) total(G)weight(%)
dev2: alive 0.000 0.000 0.000 100
node3 : alive
used(G) free(G) total(G)weight(%)
dev3: alive 0.000 0.000 0.000 100 我们可以看到dev1、dev2、dev3的可以空间都为0,那是因为我们还有没有创建,下面我们分别在node1、node2、node3节点的存储目录/mogdata下面创建dev1、dev2、dev3,并设定好属主属组权限,然后重启modstored服务,然后我们在查看添加的设备情况。
node1 : alive
used(G) free(G) total(G)weight(%)
dev1: alive 1.079 15.307 16.386 100
node2 : alive
used(G) free(G) total(G)weight(%)
dev2: alive 0.800 15.586 16.386 100
node3 : alive
used(G) free(G) total(G)weight(%)
dev3: alive 0.804 15.582 16.386 100 状态检查
# mogadm --trackers=192.168.0.10:7001 check
Checking trackers...
192.168.0.10:7001 ... OK
Checking hosts...
[ 1] node1 ... OK
[ 2] node2 ... OK
[ 3] node3 ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1 16.387 1.079 15.307 6.59%writeable N/A
[ 2] dev2 16.387 0.801 15.586 4.89%writeable N/A
[ 3] dev3 16.387 0.804 15.582 4.91%writeable N/A
---- ------------ ---------- ---------- ---------- ------
total: 49.160 2.685 46.475 5.46% 9、添加domain
mogadm --trackers=192.168.0.11:7001 domain add files
mogadm --trackers=192.168.0.11:7001 domain add images
mogadm --trackers=192.168.0.11:7001 domain add html 查看domain信息
# mogadm --trackers=192.168.0.11:7001 domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default 2 MultipleHosts() NONE
html default 2 MultipleHosts() NONE
images default 2 MultipleHosts() NONE 10、上传文件
mogupload --trackers=192.168.0.11:7001 --domain=html --key='issue.html' --file='/etc/issue'
mogupload --trackers=192.168.0.11:7001 --domain=files --key='fstab' --file='/etc/fstab'
mogupload --trackers=192.168.0.11:7001 --domain=images --key='pass.jpg' --file='/etc/passwd' 查看是否上传成功
# mogfileinfo --trackers=192.168.0.11:7001 --domain=html --key='issue.html'
- file: issue.html
class: default
devcount: 2
domain: html
fid: 7
key: issue.html
length: 47
- http://192.168.0.11:7500/dev2/0/000/000/0000000007.fid
- http://192.168.0.10:7500/dev1/0/000/000/0000000007.fid mogfileinfo --trackers=192.168.0.11:7001 --domain=images --key='pass.jpg'
- file: pass.jpg
class: default
devcount: 2
domain: images
fid: 9
key: pass.jpg
length: 901
- http://192.168.0.12:7500/dev3/0/000/000/0000000009.fid
- http://192.168.0.11:7500/dev2/0/000/000/0000000009.fid 查看存储结果
# mogstats --config=/etc/mogilefs/mogilefsd.conf
http://s3.运维网.com/wyfs02/M02/76/84/wKiom1ZVVXvwzxRHAAEhnZu-Frc515.jpg
验证结果
http://s2.运维网.com/wyfs02/M00/76/80/wKioL1ZVJCSSJSijAAEZ6qRvn4o023.jpg这里只展示了文件的演示,图片等其他都是可以显示的,我这里不再贴图,下面查看一下我们的存储目录是什么结构
http://s3.运维网.com/wyfs02/M01/76/81/wKiom1ZVJeKQ_607AACqfVf_XhM418.jpg
http://s1.运维网.com/wyfs02/M02/76/81/wKiom1ZVJmCy5vatAACdhTTRXJo655.jpg
http://s3.运维网.com/wyfs02/M00/76/81/wKiom1ZVJm_RdEoMAACLdZY6vNU769.jpg
五、配置nginx反向代理
1、安装nginx
groupadd -r nginx
useradd -r -g nginx nginx
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar xf nginx-1.8.0.tar.gz
wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.zip
unzip nginx_mogilefs_module-1.0.4.zip
cd nginx-1.8.0./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=/root/nginx_mogilefs_module-1.0.4make
make install 2、提供启动脚本
#!/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|reload|configtest}"
exit 2
esacchmod +x /etc/init.d/nginx
chkconfig nginx on 3、配置nginx
具体配置参数可以查找官方文档,我这里只是贴出一个事例
文档地址:http://www.grid.net.ru/nginx/mogilefs.en.html
# cat /etc/nginx/nginx.conf
worker_processes1;
events {
worker_connections1024;
}
http {
include mime.types;
default_typeapplication/octet-stream;
sendfile on;
keepalive_timeout65;
upstream trackers {
server 192.168.0.10:7001;
server 192.168.0.11:7001;
server 192.168.0.12:7001;
}
server {
listen 80;
location ~* /images/{
mogilefs_tracker trackers;
mogilefs_domain images;
mogilefs_pass{
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
location ~* /html/ {
mogilefs_tracker trackers;
mogilefs_domain html;
mogilefs_pass{
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
location ~* /files/ {
mogilefs_tracker trackers;
mogilefs_domain files;
mogilefs_methods GET PUT DELETE; #可以设定对文件的操作方法
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
}
} 然后测试我们前面上传的三个文件,
http://s5.运维网.com/wyfs02/M01/76/83/wKioL1ZVUK3CUU0aAAAy4VcOgac706.jpg
http://s3.运维网.com/wyfs02/M02/76/83/wKioL1ZVUK7h12tAAAEV-mcxVHU876.jpg
http://s2.运维网.com/wyfs02/M00/76/84/wKiom1ZVUFKy_JtHAACsaMBhreg688.jpg
到此之后呢,我们可以开发上传文件的程序,和tracker的API进行对接。
附录
我们知道在每个domain下面都会有一个class,不特定设置的话都是默认的,如下
# mogadm class list
http://s4.运维网.com/wyfs02/M01/76/84/wKiom1ZVWCbjPWaDAAB-HDTYZuQ908.jpg
可以看到files和html都是使用的默认的类,每个文件保存两份(mindevcount),images的类是我后来添加的,添加方法可以查看# mogadm class add -h,我添加命令如下
mogadm --trackers=192.168.0.10:7001 class add images class0 --mindevcount=4
mogadm --trackers=192.168.0.10:7001 class add images class1 --mindevcount=4
mogadm --trackers=192.168.0.10:7001 class add images class2 --mindevcount=4
mogadm --trackers=192.168.0.10:7001 class add images class3 --mindevcount=4 具体文件上传的时候可以在原有的基础上面添加--class来说明放到哪个class下面
附件:http://down.运维网.com/data/2367140
页:
[1]