分佈式系統沒有統一的定義,各說紛紜。node
從服務器角度來講具備如下特色:mysql
一、系統中的各個組件分佈於網路上的多個計算機;linux
二、各個組件彼此之間經過消息傳遞來通訊並協調行動。nginx
可是從客戶端來講,看不出這些特性,不影響用戶體驗。sql
一、向上擴展的性價比愈來愈低;數據庫
二、單機擴展存在臨界點;bash
三、從穩定性和可用性考慮,單機會存在多方面問題。服務器
三、分佈式文件系統架構
常見的數據的種類有結構化、半結構化、非結構化數據。分佈式存儲是利用分佈式系統來存儲這些數據,最終實現這些數據存儲的文件系統稱之爲分佈式文件系統。dom
分佈式文件系統要實現的功能有:節點之間的通訊、數據存儲、文件系統的支持 。
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
由LiveJournal旗下:Danga Interactive研發的,該公司著名的項目:memcached MoglieFS Perlbal(同Nginx)。
一、工做於應用層(用戶空間文件系統)
二、無單點失敗
三、自動文件複製
四、比「RAID」好
五、傳輸中立 無特殊協議
六、密命名空間簡單 每一個文件名稱對應一個key。使用全局文件結構。可使用domain來模擬實現目錄的做用。
七、不依賴於如何共享設備
試驗原理圖以下:
### 一、安裝配置mysql yum install mysql-server -y service 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; ### 二、安裝配置 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 ### 三、初始化,主要是建立數據庫和表信息 mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \ --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb ### 四、配置 tracker端(mogilefsd) ### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置選項以下: daemonize = 1 pidfile = /var/run/mogilefsd/mogilefsd.pid db_dsn = DBI:mysql:mogdb:host=172.16.10.77 db_user = moguser db_pass = mogpass listen = 172.16.10.77:7001 conf_port = 7001 query_jobs = 10 delete_jobs = 1 replicate_jobs = 5 reaper_jobs = 1 ################### service mogilefsd start ### 五、配置mogstared ### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置選項以下: maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogdata/data ################### mkdir -p /mogdata/data chown mogilefs.mogilefs /mogdata/data/ -R service mogstored start
### 一、安裝配置 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 ### 二、配置mogstared ### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置選項以下: maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogdata/data ################### mkdir -p /mogdata/data chown mogilefs.mogilefs /mogdata/data/ -R service mogstored start
安裝配置,到此基本完成。注意,以上安裝的軟件都是perl語言的模塊。可使用cpan命令在線安裝。
## 配置時,須要安裝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 一、向tracker添加各mogstored主機 mogadm --trackers=172.16.10.77:7001 host add node1 --ip=172.16.10.51 --status=alive mogadm --trackers=172.16.10.77:7001 host add node2 --ip=172.16.10.77 --status=alive 二、向tracker添加各設備 mogadm --trackers=172.16.10.77:7001 device add node1 1 --status=alive mogadm --trackers=172.16.10.77:7001 device add node2 2 --status=alive 在172.16.10.51: mkdir /mogdata/data/dev1 chown -R mogilefs.mogilefs /mogdata/data 在172.16.10.77: mkdir /mogdata/data/dev2 chown -R mogilefs.mogilefs /mogdata/data 三、爲tracker定義名稱空間domain mogadm --trackers=172.16.10.77:7001 domain add p_w_picpaths mogadm --trackers=172.16.10.77:7001 domain add files 四、爲domain添加一個或多個class # 非必需的 mogadm --trackers=TRACKER_NODE class add 可同時副本的最少個數;
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'
實驗原理圖以下:
在192.16.10.9上安裝配置 Tracker和Storaged:
在以上配置的基礎上,繼續配置: ### 一、安裝配置 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 ### 二、初始化,主要是建立數據庫和表信息 mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \ --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb ### 三、配置 tracker端(mogilefsd) ### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置選項以下: daemonize = 1 pidfile = /var/run/mogilefsd/mogilefsd.pid db_dsn = DBI:mysql:mogdb:host=172.16.10.77 db_user = moguser db_pass = mogpass listen = 172.16.10.9:7001 conf_port = 7001 query_jobs = 10 delete_jobs = 1 replicate_jobs = 5 reaper_jobs = 1 ################### service mogilefsd start ### 四、配置mogstared ### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置選項以下: maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogdata/data ################### mkdir -p /mogdata/data chown mogilefs.mogilefs /mogdata/data/ -R service mogstored start ## 在172.16.10.77上進行配置: 一、向tracker添加各mogstored主機 mogadm --trackers=172.16.10.77:7001 host add \ node3 --ip=172.16.10.9 --status=alive 二、向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
在172.16.10.51:
## 編譯安裝nginx,編譯時要編譯 nginx-mogilefs模塊 ## ngnix和nginx-mogilefs模塊在nginx的官網 nginx.org上,就能夠下載到 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 ## 添加服務腳本: #!/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/functions if [ -L $0 ]; then initscript=`/bin/readlink -f $0` else initscript=$0 fi sysconfig=`/bin/basename $initscript` if [ -f /etc/sysconfig/$sysconfig ]; then . /etc/sysconfig/$sysconfig fi nginx=${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=0 start() { 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=2 esac exit $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
能夠實現文件的瀏覽功能,真正的上傳功能,每一個公司都有本身開發的上傳工具。