分布式文件系統MogileFS

1、分布式系統的目標:加強A、P,在C上進行妥協 ? ? BASE模型

CAP理論:

C:Consistency(一致性)? 任何一個讀操作總是能夠讀取之前完成的寫操作。

A:Availability(可用性) 每一次操作總是能夠在確定的時間返回。

P: Partition Tolerance ( 分區容錯性 )?? 在出現網絡分區的情況下,仍然能夠滿足一致性和可用性。

BASE模型

BA:基本可用  ?。樱航邮芤欢螘r間內不一致  ?。牛鹤罱K一致性

N節點個數   ?。讓懙墓濣c數  ?。易x的節點數

W + R > N? —->? 強一致性(通常N=3,W=R=2)

W=N,R=1?? —->? 最佳讀

W=1,R=N?? —->? 最佳寫

W + R <= N —->? 弱一致性

強一致性(ACID)? :?? 在單機環境中,強一致性可以由數據庫的事務來保證;在分布式環境中,強一致性很難做到,即便是做到也會因為分布式事物所帶來的性能低下,不適合在互聯網的環境中應用。

弱一致性(包括最終一致性)? :? 系統不能保證后續訪問返回最新的值,在訪問到最新值之前這段時間稱之為 不一致窗口?? 。

最終一致性? :是弱一致性的一種特例,存儲系統保證如果對象有多次更新,在渡過 不一致窗口?? 之后必將放回最后更新的值。

服務器的一致性? :? N? 代表節點的個數;? W? 代表更新的時候需要確認已經被更新的節點個數; R? 代表讀取數據需要的節點數量。

2、分布式存儲或分布式文件系統

1) 集中式:
共享存儲:NAS、SAN
2) 分布式存儲:
有專用的元數據節點:集中元數據存儲,數據節點只負責存儲數據
無專用元數據幾點:所有數據節點均完整存儲元數據,存儲了部分數據
分布式:
文件系統:有文件系統接口:一般掛載使用
存儲:無文件系統接口,通過API訪問

常見的分布式文件系統:
GFS:Google File System GFS擅長處理單個大文件?。
HDFS:Hadoop Distributed File System??根據GFS思想開發的,擅長處理單個大文件?,使用場景,數據不太多的大文件。
TFS:Taobao File System 淘寶開源的文件系統,擅長處理海量小文件,適用于大規模場景。將元數據存儲于關系型數據庫或其他高性能存儲中,從而能維護海量文件元數據。
GlusterFS:去中心化設計,無專用數據節點,擅長處理單個大文件
ceph:整合到linux內核實現的文件系統,已經被收錄在內核,是一個 Linux PB級別的分布式文件統。

MogilesFS:MogileFS是一個開源的分布式文件系統,用于組建分布式文件集群

3、MogileFS

MogileFS特性:

1) 應用層提供服務,不需要使用核心組件

2)無單點失敗,主要有三個組件組成,分為tracker(跟蹤節點)、mogstore(存儲節點)、database(數據庫節點)

3)自動復制文件,復制文件的最小單位不是文件,而是class

4)傳輸中立,無特殊協議,可以通過NFS或HTTP實現通信

5)簡單的命名空間:沒有目錄,直接存在與存儲空間上,通過域來實現

6)不用共享任何數據

MogileFS的組成:
1) server:主要包括mogilefsd和mogstored兩個應用程序。mogilefsd實現的是tracker,它通過數據庫來保存元數據信息,包括站點domain、class、 host等;mogstored是存儲節點(store node),它其實是個WebDAV服務,默認監聽在7500端口,接受客戶端的文件存儲請求。在MogileFS安裝完后,要運行mogadm工具將所有的store node注冊到mogilefsd的數據庫里,mogilefsd會對這些節點進行管理和監控。

2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。

3) 客戶端API:MogileFS的客戶端API很多,例如Perl、PHP、Java、Python等,用這個模塊可以編寫客戶端程序,實現文件的備份管理功能等。

配置MogileFS

環境:

node1:192.168.1.32 ? ? ?nginx反代,支持MogileFS模塊

node2:192.168.1.33 ? ? ? traceker+mogstored+database節點

node3:192.168.1.35 ? ? ? traceker+mogstored節點

node4:192.168.1.47 ? ? ? traceker+mogstored節點

【node2&3&4】

安裝mogileFS

# yum install perl-Sys-Syslog perl-Net-Netmask perl-IO-AIO
# 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-Danga-Socket-1.61-1.el6.rf.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm –y

【node2】

Database節點:安裝mariadb

# vim /etc/my.cnf

innodb_file_per_table=ON
skip_name_resolve=ON

# systemctl start mariadb.service

# mysql

    > GRANT ALL ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'queen';

    > CREATE DATABASE mogilefs;

    > GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.1.%' IDENTIFIED BY 'mogpass';

# mogdbsetup --dbhost=192.168.1.32? --dbrootpass='queen' --dbuser='moguser' --dbpass='mogpass'

# mysql

MariaDB [mogilefs]> use mogilefs;

Database changed

MariaDB [mogilefs]> 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)

設置Tracker節點

# vim /etc/mogilefs/mogilefsd.conf

     daemonize = 1
     pidfile = /var/run/mogilefsd/mogilefsd.pid
     db_dsn = DBI:mysql:mogilefs:host=192.168.1.32
     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

# systemctl start mogilefsd.service

# ss -tnl

State????? Recv-Q Send-Q Local Address:Port ??????????????Peer Address:Port?????????????

LISTEN???? 0????? 128?????????? *:7001????????????????????? *:*?????????????????

【node2&3&4】

storage節點:mogstored

# mkdir -pv /data/mogilefs/dev1

# chown -R mogilefs.mogilefs /data/mogilefs/

# vim /etc/mogilefs/mogstored.conf

docroot = /data/mogilefs

# vim /etc/rc.d/init.d/mogstored

pidfile=/var/run/mogilefsa/mogstored.pid

?[ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile}? || failure??????

?[ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure

# systemctl daemon-reload

# service mogstored restart

# ss -tnl

State????? Recv-Q Send-Q Local Address:Port?????????????? Peer Address:Port?????????????

LISTEN???? 0????? 128?????????? *:7500????????????????????? *:*???????????????? ?

LISTEN???? 0????? 128?????????? *:7501????????????????????? *:*?????

【node2】
添加存儲節點:

# mogadm –trackers=192.168.1.33:7001 host add 192.168.1.33 -ip=192.168.1.33 –status=alive
# mogadm –trackers=192.168.1.33:7001 host add 192.168.1.35 -ip=192.168.1.35 –status=alive
# mogadm –trackers=192.168.1.33:7001 host add 192.168.1.47 -ip=192.168.1.47 –status=alive

添加存儲設備:
# mogadm –trackers=192.168.1.33:7001 device add 192.168.1.33 1   設備號唯一不可重名
# mogadm –trackers=192.168.1.33:7001 device add 192.168.1.35 2
# mogadm –trackers=192.168.1.33:7001 device add 192.168.1.47 3

添加域

# mogadm domain add files 
# mogadm domain add images

添加class類

# mogadm class add images png 
# mogadm class add?images jpeg
# mogadm class add files text 
# mogadm class add files html

上傳文件測試:
# mogupload –trackers=192.168.1.33:7001 –domain=files –key='fstab.txt' –file=/etc/fstab –class=text

mogilefs狀態查詢:

# mogstats –db_dsn="DBI:mysql:mogilefs:host=192.168.1.33" –db_user="moguser" –db_pass="mogpass" --verbose --stats="devices.file"

列出images域下所有key

# moglistkeys –trackers=192.168.1.33:7001 –domain=images

刪除domain流程:

# mogdelete –trackers=192.168.1.33:7001 –domain=images –key=linux.jpg

# mogadm class delete images jpeg

# domain delete images

【node1】
Nginx做MogileFS的前端客戶端

(1)編譯安裝nginx和nginx的mogilefs模塊

# yum install "開發工具“ ”服務開發平臺“ -y
# tar xf ?tengine-2.1.1.tar.gz 
# tar xf nginx_mogilefs_module-1.0.2.tar.gz
# cd tengine-2.1.1
# groupadd -r nginx? 
# useradd -r -g nginx nginx
# yum install pcre-devel openssl-devel
# ./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
–with-pcre --with-debug –add-module=../nginx_mogilefs_module-1.0.2
# make
  注意:由于不確定因素,在centos7上編譯時,可能會出現"warning:variable 'pclcf'set but not used 
[-Wunused-but-set-variable]一類的錯誤,可通過修改objs/Makefile文件,刪除-Werror來忽略此錯誤
# 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/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/local/nginx/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() {
“/etc/init.d/nginx” 126L, 2529C
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

# systemctl start nginx.service

# cd /etc/nginx

# cp nginx.cong{,.bak}

# vim nginx.conf
   location /images/ {
         mogilefs_tracker 192.168.1.33;
         mogilefs_domain images;
         mogilefs_methods GET;
         mogilefs_noverify  on;         不校驗
         mogilefs_pass  {
                proxy_pass    $mogilefs_path;
                proxy_hide_header   Content-Type;
                proxy_buffering   off;         關閉緩沖
         }
    }
# nginx -t
# systemctl reload nginx.service

測試:
# mogupload –trackers=192.168.1.33:7001 –domain=images? –key='1.jpg'? –file='/images/1.jpg' --class=jpeg

訪問192.168.1.33/images/1.jpg

 


原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/88860

(0)
nenenene
上一篇 2017-11-23 13:38
下一篇 2017-11-23 18:59

相關推薦

  • 【26期】Linux第九周學習小總結

    本周帶來的是慢慢的技術分享,有關于計劃任務的分享,涉及的知識點主要是at和cron,crontab的詳解,計劃任務可以將任何腳本、程序或文檔安排在某個最方便的時間運行,有利于我們的自動化運維,當某項任務多次重復,或者某個指定的時間點多次執行時,就可以使用計劃任務方便我們的工作。

    2017-09-09
  • linux快捷鍵

    $ 用法 $變量名 表引用變量的值 $()或(單引號) 表示引用命令執行的結果 $[] 表示運算 ${變量名} 或"$變量名" 當變量名的起止不分明時,用來劃定變量名的范圍,同時引用變量。 {} 用法 {a..z} 表示引用指定范圍的字母 {1..9999} 表示引用指定范圍的數字? {1,3,5} 表示分別引用每一個字符 TAB 用法 …

    Linux干貨 2017-07-13
  • 用戶和組管理類命令

    用戶和組管理類命令 useradd useradd命令用于Linux中創建的新的系統用戶 語法 useradd(選項)(參數) 選項 -c<備注>:加上備注文字。備注文字會保存在passwd的備注欄位中; -d<登入目錄>:指定用戶登入時的啟始目錄; -D:變更預設值; -e<有效期限>:指定帳號的有效期限; -f<…

    Linux干貨 2018-03-18
  • 第一周作業

    1、描述計算機的組成及其功能。
    2、按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別。
    3、描述Linux的哲學思想,并按照自己的理解對其進行解釋性描述。
    4、說明Linux系統上命令的使用格式;詳細介紹ifconfig、echou、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相應的示例來闡述。
    5、如何在Linux系統上獲取命令的幫助信息,請詳細列出,并描述man文檔的章節是如何劃分的。
    6、請羅列Linux發行版的基礎目錄名稱命名法則及共用規定。

    Linux干貨 2017-12-03
  • 馬哥linux 0728作業

    1,軟鏈接和硬鏈接的區別 硬鏈接有以下特性 1)文件有相同的 inode 及 data block; 2)只能對已存在的文件進行創建; 3)不能交叉文件系統進行硬鏈接的創建; 4)不能對目錄進行創建,只可對文件創建; 5)刪除一個硬鏈接文件并不影響其他有相同 inode 號的文件。 而軟鏈接有一下特性 1)軟鏈接有自己的文件屬性及權限等; 2)可對不存在的文…

    Linux干貨 2016-08-04
  • Linux系統常用命令介紹

    [root@alibaba ~]# ifconfig?#查看或者配置網絡適配器的接口信息 eth0????? Link encap:Ethernet? HWaddr 00:16:3E:0A:7B:2A inet addr:172.18.10.115? Bcast:172.18.15.255? Mask:255.255.240.0 [root@alibaba …

    Linux干貨 2018-03-04
欧美性久久久久