分布式文件系統MogileFS

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

CAP理論:

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

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

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

BASE模型

BA:基本可用   S:接受一段時間內不一致  ?。牛鹤罱K一致性

N節點個數    W寫的節點數  ?。易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
下一篇 2017-11-23

相關推薦

  • 8月20日軟件包管理

    軟件包管理 本章內容 軟件運行環境 軟件包基礎 Rpm包管理 yum管理 定制yum倉庫 編譯安裝 軟件運行環境 API:Application Programming Interface     POSIX:Portable OS 程序源代碼–>預處理–>編譯–>…

    Linux干貨 2016-08-21
  • 關于 建立私有CA和申請證書

                               建立私有CA和申請證書            …

    系統運維 2016-09-23
  • Linuxd的發展史

    Linux發展史 Linux誕生:   1991年的八月,一個芬蘭的名為Linus Torvalds的大學生為自己開始寫作一個類似minix,可運行在386上的操作系統尋找志同道合的合作伙伴。FREAX系統后改名Linux。  Linux是什么:   按照Linux開發者的說法,Linux是一個遵循POSIX(注一)標作系統,標…

    Linux干貨 2016-10-14
  • Linux幫助文件的使用、history變量的使用和FHS

    怎樣利用幫助文件來查詢想要了解的信息? 這里以通過查找幫助文件來修改登陸信息為例子, 登陸的時候,我們可以看到CentOS的的版本和內核信息, 當我們查看該相關文件的時候,會發現,里面的文檔和顯示的不一致,由此可以了解到,該文檔是調用某些參數來實現顯示CentOS的版本和內核信息。 這個時候,我們該怎樣去查看issue文檔的相關信息? 首先我們可以查看一下通…

    Linux干貨 2016-08-04
  • 磁盤管理和高級文件系統管理-習題

    高級文件系統管理-習題 1、 創建一個可用空間為40G 的RAID1 設備,要求其chunk大小為128k ,文件系統為ext4 ,有一個空閑盤,開機可自動掛載至/backup目錄 [root@centos7 ~]# mdadm -C /dev/md0 -c 128 -a yes -l 1 -n 2 -x 1 /dev/sdb /dev/sdc /dev/s…

    Linux干貨 2016-09-01
  • 筆記整理:權限管理2-特殊權限(sst)和隱藏屬性

    特殊權限 進程訪問文件時的權限,取決于進程的發起者和其所在的屬組。還有其他權限,包括SST(Suid【可以更改進程發起者】,Sgid【可以更改進程發起者屬組】,Sticky) 查詢SUID/SGID文件   find / -perm +6000 SUID 使用特點 SUID只能作用在二進制文件上。 執行者需要對該文件具有可執行權限 只在程序運行過程…

    Linux干貨 2016-08-05
欧美性久久久久