一、分布式文件系统简介
1、分布式系统定义?
分布式系统没有统一的定义,各说纷纭。
从服务器角度来说具有以下特点:
1、系统中的各个组件分布于网路上的多个计算机;
2、各个组件彼此之间通过消息传递来通信并协调行动。
但是从客户端来说,看不出这些特性,不影响用户体验。
2、为什么要使用分布式系统?
一般使用向外扩展,来提高系统的性能,主要是解决了单机存在的故障。
1、向上扩展的性价比越来越低;
2、单机扩展存在临界点;
3、从稳定性和可用性考虑,单机会存在多方面问题。
3、分布式文件系统
常见的数据的种类有结构化、半结构化、非结构化数据。分布式存储是利用分布式系统来存储这些数据,最终实现这些数据存储的文件系统称之为分布式文件系统。
分布式文件系统要实现的功能有:节点之间的通信、数据存储、文件系统的支持 。
目前常见的分布式文件系统:
GlusterFS: 适用于存储单个(少量)大文件 。适用云环境,流媒体文件 例如:用友公司
MogileFS: 适用于存储海量小文件。将元数据存放在Mysql中,并不是内存中,对性能有影响
FastDFS: 适用于存储海量小文件。将元数据存放在内存中,使用perl语言研发
MooseFS: 适用于小文件 大文件都可以
Ceph: 内核级别 支持PB级别级别的存储
GFS(Google FS):提供了MapReduce对分布式数据的处理方式;提供bigtable对数据的存储
HDFS: MapReduce + HDFS = Hadoop(平台) ,Hadoop是一个平台,提供存储大量数据的平台;Hbase实现对数据的存储
TFS: 对HDFS改进的实现海量小文件存储
Luster: Oracle的开源分布式文件系统
比较流行的 HDFS MogileFS TFS
二、MogileFS(开源的分布式存储)
由LiveJournal旗下:Danga Interactive研发的,该公司著名的项目:memcached MoglieFS Perlbal(同Nginx)。
MogileFS特性
1、工作于应用层(用户空间文件系统)
2、无单点失败
3、自动文件复制
4、比“RAID”好
5、传输中立 无特殊协议
6、密命名空间简单 每个文件名称对应一个key。使用全局文件结构。可以使用domain来模拟实现目录的作用。
7、不依赖于如何共享设备
MogileFS的工作架构:
三、MogileFS的实现
1、手动实现MogileFS的上传和下载
试验原理图如下:
实验步骤:
在172.16.10.77:
### 1、安装配置mysqlyum install mysql-server -yservice mysqld start## 授权用户mysql> GRANT ALL ON mogdb.* TO moguser@'172.16.10.%' IDENTIFIED BY 'mogpass';mysql> GRANT ALL ON *.* TO root@'172.16.10.%' IDENTIFIED BY 'rootpass';mysql> FLUSH PRIVILEGES;### 2、安装配置 MogileFS 的tracker端## 依赖于 epel 源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 \ perl-Perlbal-1.78-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm -y### 3、初始化,主要是创建数据库和表信息mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \ --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb ### 4、配置 tracker端(mogilefsd)### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下: daemonize = 1pidfile = /var/run/mogilefsd/mogilefsd.piddb_dsn = DBI:mysql:mogdb:host=172.16.10.77db_user = moguserdb_pass = mogpasslisten = 172.16.10.77:7001conf_port = 7001query_jobs = 10delete_jobs = 1replicate_jobs = 5reaper_jobs = 1###################service mogilefsd start### 5、配置mogstared### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:maxconns = 10000httplisten = 0.0.0.0:7500mgmtlisten = 0.0.0.0:7501docroot = /mogdata/data ###################mkdir -p /mogdata/datachown mogilefs.mogilefs /mogdata/data/ -Rservice mogstored start
在172.16.10.51:
### 1、安装配置 MogileFS 的 storage 端## 依赖于 epel 源yum install MogileFS-Server-2.46-2.el6.noarch.rpm \MogileFS-Server-mogilefsd.noarch-0:2.46-2.el6 \MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm \perl-Perlbal-1.78-1.el6.noarch.rpm \perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-IO-AIO -y### 2、配置mogstared### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:maxconns = 10000httplisten = 0.0.0.0:7500mgmtlisten = 0.0.0.0:7501docroot = /mogdata/data ###################mkdir -p /mogdata/datachown mogilefs.mogilefs /mogdata/data/ -Rservice mogstored start
安装配置,到此基本完成。注意,以上安装的软件都是perl语言的模块。可以使用cpan命令在线安装。
接下来就是要配置mogielfs:
## 配置时,需要安装perl-MogileFS-Client MogileFS-Utils## 在172.16.10.77上进行配置:yum install perl-MogileFS-Client-1.14-1.el6.noarch.rpm \MogileFS-Utils-2.19-1.el6.noarch.rpm 1、向tracker添加各mogstored主机mogadm --trackers=172.16.10.77:7001 host add node1 --ip=172.16.10.51 --status=alivemogadm --trackers=172.16.10.77:7001 host add node2 --ip=172.16.10.77 --status=alive2、向tracker添加各设备mogadm --trackers=172.16.10.77:7001 device add node1 1 --status=alivemogadm --trackers=172.16.10.77:7001 device add node2 2 --status=alive在172.16.10.51:mkdir /mogdata/data/dev1chown -R mogilefs.mogilefs /mogdata/data在172.16.10.77:mkdir /mogdata/data/dev2chown -R mogilefs.mogilefs /mogdata/data3、为tracker定义名称空间domainmogadm --trackers=172.16.10.77:7001 domain add p_w_picpathsmogadm --trackers=172.16.10.77:7001 domain add files 4、为domain添加一个或多个class # 非必需的mogadm --trackers=TRACKER_NODE class add 可同时副本的最少个数;
上传文件:mogupload
mogupload --trackers=172.16.10.77:7001 --domain=files --key='/issue.file' \ --file='/etc/issue'mogupload --trackers=172.16.10.77:7001 --domain=p_w_picpaths --key='/linux.png' \ --file='/root/linux.png'
查看文件信息:mogfileinfo
列出domain中的文件:moglistkeys
文件下载:mogfetch
2、使用Nginx作为反向代理
实验原理图如下:
在192.16.10.9上安装配置 Tracker和Storaged:
在以上配置的基础上,继续配置:### 1、安装配置 MogileFS 的tracker端## 依赖于 epel 源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 \perl-Perlbal-1.78-1.el6.noarch.rpm \perl-Net-Netmask-1.9015-8.el6.noarch.rpm -y### 2、初始化,主要是创建数据库和表信息mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \ --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb ### 3、配置 tracker端(mogilefsd)### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下: daemonize = 1pidfile = /var/run/mogilefsd/mogilefsd.piddb_dsn = DBI:mysql:mogdb:host=172.16.10.77db_user = moguserdb_pass = mogpasslisten = 172.16.10.9:7001conf_port = 7001query_jobs = 10delete_jobs = 1replicate_jobs = 5reaper_jobs = 1###################service mogilefsd start### 4、配置mogstared### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:maxconns = 10000httplisten = 0.0.0.0:7500mgmtlisten = 0.0.0.0:7501docroot = /mogdata/data ###################mkdir -p /mogdata/datachown mogilefs.mogilefs /mogdata/data/ -Rservice mogstored start## 在172.16.10.77上进行配置:1、向tracker添加各mogstored主机 mogadm --trackers=172.16.10.77:7001 host add \ node3 --ip=172.16.10.9 --status=alive2、向tracker添加各设备 mogadm --trackers=172.16.10.77:7001 device add node3 3 \ --status=alive在172.16.10.9:mkdir /mogdata/data/dev3 chown -R mogilefs.mogilefs /mogdata/data
配置ngnix端:
在172.16.10.51:
## 编译安装nginx,编译时要编译 nginx-mogilefs模块## ngnix和nginx-mogilefs模块在nginx的官网 nginx.org上,就可以下载到useradd -r nginxtar xf nginx_mogilefs_module-1.0.4.tar.gztar xf nginx-1.6.2.tar.gzcd 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.4make && make install## 添加服务脚本:#!/bin/sh## nginx Startup script for nginx## chkconfig: - 85 15# processname: nginx# config: /etc/nginx/nginx.conf# config: /etc/sysconfig/nginx# pidfile: /var/run/nginx/nginx.pid# description: nginx is an HTTP and reverse proxy server#### BEGIN INIT INFO# Provides: nginx# Required-Start: $local_fs $remote_fs $network# Required-Stop: $local_fs $remote_fs $network# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: start and stop nginx### END INIT INFO# Source function library.. /etc/rc.d/init.d/functionsif [ -L $0 ]; then initscript=`/bin/readlink -f $0`else initscript=$0fisysconfig=`/bin/basename $initscript`if [ -f /etc/sysconfig/$sysconfig ]; then . /etc/sysconfig/$sysconfigfinginx=${NGINX-/usr/sbin/nginx}prog=`/bin/basename $nginx`conffile=${CONFFILE-/etc/nginx/nginx.conf}lockfile=${LOCKFILE-/var/lock/subsys/nginx}pidfile=${PIDFILE-/var/run/nginx/nginx.pid}SLEEPMSEC=${SLEEPMSEC-200000}UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS-5}RETVAL=0start() { echo -n $"Starting $prog: " daemon --pidfile=${pidfile} ${nginx} -c ${conffile} RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL}stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} ${prog} RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}}reload() { echo -n $"Reloading $prog: " killproc -p ${pidfile} ${prog} -HUP RETVAL=$? echo}upgrade() { oldbinpidfile=${pidfile}.oldbin configtest -q || return echo -n $"Starting new master $prog: " killproc -p ${pidfile} ${prog} -USR2 echo for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do /bin/usleep $SLEEPMSEC if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then echo -n $"Graceful shutdown of old $prog: " killproc -p ${oldbinpidfile} ${prog} -QUIT RETVAL=$? echo return fi done echo $"Upgrade failed!" RETVAL=1}configtest() { if [ "$#" -ne 0 ] ; then case "$1" in -q) FLAG=$1 ;; *) ;; esac shift fi ${nginx} -t -c ${conffile} $FLAG RETVAL=$? return $RETVAL}rh_status() { status -p ${pidfile} ${nginx}}# See how we were called.case "$1" in start) rh_status >/dev/null 2>&1 && exit 0 start ;; stop) stop ;; status) rh_status RETVAL=$? ;; restart) configtest -q || exit $RETVAL stop start ;; upgrade) rh_status >/dev/null 2>&1 || exit 0 upgrade ;; condrestart|try-restart) if rh_status >/dev/null 2>&1; then stop start fi ;; force-reload|reload) reload ;; configtest) configtest ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload| \ upgrade|reload|status|help|configtest}" RETVAL=2esacexit $RETVAL################# end ################mkdir /var/tmp/nginx/ -p
nginx安装、基本配置完成。接下来,配置使用 nginx-mogilefs 模块。
在/etc/ngnix/ngnix的配置文件中,添加:upstream trackers{ server 172.16.10.77:7001; server 172.16.10.9:7001;}location /upload { mogilefs_tracker trackers; mogilefs_domain p_w_picpaths; mogilefs_methods GET; mogilefs_noverify on; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; }}## 启动服务即可:service ngnix start
可以实现文件的浏览功能,真正的上传功能,每个公司都有自己开发的上传工具。