溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Nginx反代Mogilefs分布式儲存示例詳解

發(fā)布時間:2020-10-01 05:33:49 來源:腳本之家 閱讀:212 作者:readygood 欄目:服務(wù)器

一、分布式存儲系統(tǒng)簡介

隨著信息技術(shù)不斷的發(fā)展,給我們帶來便利的同時,不斷增加的數(shù)據(jù)量級、信息之間的連接關(guān)聯(lián)越來越復(fù)雜、數(shù)據(jù)訪問的并發(fā)量日益增加對I/O的要求越來越高、數(shù)據(jù)類型越來越復(fù)雜等難題也成為信息技術(shù)繼續(xù)高速發(fā)展亟需解決的難題。分布式存儲系統(tǒng)的出現(xiàn)在很大程度上解決了以上大部分難題。

分布式存儲系統(tǒng),是將數(shù)據(jù)分散存儲在多臺獨(dú)立的設(shè)備上。傳統(tǒng)的網(wǎng)絡(luò)存儲系統(tǒng)采用集中的存儲服務(wù)器存放所有數(shù)據(jù),存儲服務(wù)器成為系統(tǒng)性能的瓶頸,也是可靠性和安全性的焦點(diǎn),不能滿足大規(guī)模存儲應(yīng)用的需要。分布式存儲系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺存儲服務(wù)器分擔(dān)存儲負(fù)荷,利用位置服務(wù)器定位存儲信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。

分布式存儲系統(tǒng)在接口類型上可分為通用分布式儲存和專用分布式儲存。通用分布式儲存是指沒有文件系統(tǒng)接口,需要通過API接口進(jìn)行訪問;專用分布式儲存也稱為分布式文件系統(tǒng),它們一般都會有文件系統(tǒng)接口,可以直接掛載。通用分布式儲存有mogilefs、fastdfs等,專用分布式儲存系統(tǒng)有moosefs等。

二、Mogilefs

MogileFS是一個開源的分布式文件存儲系統(tǒng),MogileFS適用于存儲海量小文件的工作場景,由LiveJournal旗下的Danga Interactive公司開發(fā),該團(tuán)隊開發(fā)了包括 Memcached、MogileFS、Perlbal 等多個知名的開源項目。

1.Mogilefs架構(gòu)圖:

Nginx反代Mogilefs分布式儲存示例詳解

2.組成Mogliefs的組件:

1.Trackers(mogilefsd):Mogliefs的核心組件,主要功能是(Replication)節(jié)點(diǎn)文件復(fù)制、(Deletion)文件刪除、(Query)元數(shù)據(jù)查詢、(Monitor)健康監(jiān)測、(Reaper)儲存失敗重置等等。它通常稱為元數(shù)據(jù)服務(wù)器,但它不會去儲存元數(shù)據(jù),而是將元數(shù)據(jù)儲存在如MySQL這一類的數(shù)據(jù)庫中。為保證架構(gòu)的可靠性,Trackers一般有多個。Trackers可看作是一個旁掛式代理,只負(fù)責(zé)處理元數(shù)據(jù)信息。

2.數(shù)據(jù)庫:數(shù)據(jù)庫用來存放Mogliefs的元數(shù)據(jù),而由Trackers來管理數(shù)據(jù)。因此通常建議做HA。

3.mogstored(儲存節(jié)點(diǎn)):實際文件存放的地方。通常會將實際文件保存至少兩份副本。

3.示例演示拓?fù)鋱D

在三個節(jié)點(diǎn)同時安裝Trackers和mogstored,選擇其中一個節(jié)點(diǎn)安裝MySQL。在生產(chǎn)環(huán)境最好是能單獨(dú)將MySQL部署并且做主從復(fù)制。Trackers和mogstored也可以分開部署在不同節(jié)點(diǎn)上,這些都需要根據(jù)實際的生產(chǎn)環(huán)境來決定。這里主要是演示mogilefs,不做MySQL主從復(fù)制演示。若想要Mogilefs能掛載,可以用FUSE來實現(xiàn)。

需要注意的是:mogilefs存儲的文件URL很特殊(后面會解釋mogilefs文件名生產(chǎn)的過程),如存儲一張圖片時文件URL可能會是類似6060/0000/0000/0000/00000021.jpg這樣的格式,對用戶來講就不太友好,用戶可能需要直觀的類似image.hello.com/21.jpg這樣的URL。所以通常會使用Nginx來反代Mogilefs。

Nginx反代Mogilefs分布式儲存示例詳解

4.系統(tǒng)環(huán)境與安裝

Mogilefs是一個相對較年代較久但成熟的分布式儲存,考慮到可能在Centos7上會出現(xiàn)兼容問題,這里Centos6來演示。

操作系統(tǒng):CentOS release 6.6

Mogilefs:2.46

nginx:1.10

mysql:5.1

IP分配:

n1:192.168.29.111,n2:192.168.29.112,n3:192.168.29.113,n4:192.168.29.114

結(jié)構(gòu)如上圖所示。

1.在n1節(jié)點(diǎn)上安裝MySQL、mogilefsd、mogstored,并將n1配置為Trackers、Storage Node

MySQL直接用yum安裝。

~]# yum install -y mysql mysql-server

安裝Mogilefs的Trackers和Storage Node組件,安裝時一定要安裝Perl相關(guān)的依賴包,依賴包有:

perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
perl-IO-stringy-2.110-1.2.el6.rfx.noarch.rpmperl-Net-Netmask-1.9015-8.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpmperl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-doc-1.78-1.el6.noarch.rpmperl-IO-AIO-3.71-2.el6.x86_64.rpm

上述依賴包一定要安裝后才能安裝Mogilefs。安裝組件:

yum install -y MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-2.46-2.el6.noarch.rpm

配置MogileFS-Server-mogilefsd:

~]# vim /etc/mogilefs/mogilefsd.conf #Mogilfs Trackers的主配置文件
# Enable daemon mode to work in background and use syslog
daemonize = 1 #是否以守護(hù)進(jìn)程的方式運(yùn)行。
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid #pid文件路徑
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.29.111 #數(shù)據(jù)庫的地址
db_user = moguser #配置數(shù)據(jù)庫的用戶名及密碼
db_pass = 123456
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001 #監(jiān)聽的地址與端口
# Optional, if you don't define the port above.
conf_port = 7001 #默認(rèn)端口
# Number of query workers to start by default.
query_jobs = 10 #查詢進(jìn)程數(shù)量
# Number of delete workers to start by default.
delete_jobs = 1 
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1

修改完配置后,進(jìn)入數(shù)據(jù)庫創(chuàng)建一個可以遠(yuǎn)程連接的root用戶,或者使用mogdbsetup初始化數(shù)據(jù)庫:

mysql> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.29.%' IDENTIFIED BY '123456'; #創(chuàng)建用戶moguser,擁有管理mogilefs庫的所有權(quán)限,并允許192.168.29.*的用戶遠(yuǎn)程連接。
mysql> FLUSH PRIVILEGES;
mysql> quit
~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=123456

初始化完成后可以在MySQL中看到創(chuàng)建好的mogilefs庫以及里面的表:

Nginx反代Mogilefs分布式儲存示例詳解

啟動mogilefs并確認(rèn)7001端口處于監(jiān)聽狀態(tài):

~]# service mogilefsd start
Starting mogilefsd      [ OK ]
~]# ss -lnt

注:可以在n2、n3節(jié)點(diǎn)都安裝Trackers服務(wù),從而消除單點(diǎn)故障風(fēng)險也能平均I/O壓力。

3.在n1上配置Storage Node

Storage Node配置文件路徑為/etc/mogilefs/mogstored.conf:

~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #最大并發(fā)連接數(shù)
httplisten = 0.0.0.0:7500 #Mogilefs數(shù)據(jù)的傳輸是通過http協(xié)議實現(xiàn)的,這里是監(jiān)聽的地址和端口
mgmtlisten = 0.0.0.0:7501 #健康監(jiān)測的監(jiān)聽地址和端口
docroot = /mogliefs/mogdata #數(shù)據(jù)的存儲路徑,目錄的屬組和屬主必須是mogilefs

創(chuàng)建數(shù)據(jù)存儲目錄并修改屬組和屬主為mogilefs:

~]# mkdir -pv /mogliefs/mogdata
~]# chown -R mogilefs.mogilefs /mogliefs/

啟動mogstored,查看進(jìn)程是否正常啟動端口是否監(jiān)聽:

~]# service mogstored start
~]# ss -lnt #監(jiān)聽端口為7500、7501

4.按照n1的步驟在節(jié)點(diǎn)n2、n3上安裝Mogilefs,并將n1上的配置文件復(fù)制到n2、n3。

~]# scp /etc/mogilefs/*.conf root@192.168.29.112:/etc/mogilefs/
~]# scp /etc/mogilefs/*.conf root@192.168.29.113:/etc/mogilefs/

啟動mogstored服務(wù)并確認(rèn)監(jiān)聽:

~]# service mogstored start
~]# ss -lnt #監(jiān)聽端口為7500、7501

5.用在n1上用mogadm命令將所有節(jié)點(diǎn)整合成集群。

添加存儲節(jié)點(diǎn),并檢查:

1 ~]# mogadm host add 192.168.29.111 --ip=192.168.29.111 --port=7500 --status=alive
2 ~]# mogadm host add 192.168.29.112 --ip=192.168.29.112 --port=7500 --status=alive
3 ~]# mogadm host add 192.168.29.113 --ip=192.168.29.113 --port=7500 --status=alive
~]# mogadm check

Nginx反代Mogilefs分布式儲存示例詳解

若想讓mogilefs集群中的存儲被識別成不同設(shè)備,需要在創(chuàng)建的/mogliefs/mogdata目錄下再創(chuàng)建名為dev*的目錄,使每個節(jié)點(diǎn)被當(dāng)做存儲設(shè)備使用。mogilefs是將冗余存儲在不同設(shè)備中的,每一個節(jié)點(diǎn)都應(yīng)該被識別為不同的設(shè)備。

在n1、n2、n3上的/mogliefs/mogdata/目錄下分別創(chuàng)建dev1,dev2,dev3目錄,并在Trackers上添加設(shè)備:

1 ~]# mogadm device add 192.168.29.111 1
2 ~]# mogadm device add 192.168.29.112 2
3 ~]# mogadm device add 192.168.29.113 3

Nginx反代Mogilefs分布式儲存示例詳解

6.創(chuàng)建Domain和Class

在Mogilefs中,在多個節(jié)點(diǎn)上為了方便文件副本管理,通常在設(shè)備中不會以文件為單位進(jìn)行管理,而是以class(類)做管理,復(fù)制刪除等操作都是以class為最小單位進(jìn)行的。每個class中可以放很多文件,class的容積也不是固定的。

在Mogilefs的存儲空間中,所有數(shù)據(jù)文件都在同一平面,所以不能有同名的情況發(fā)生,這樣會影響Mogilefs的靈活性,所以引入了Domain(名稱空間)的概念。Domain包含Class,在不同的Domain中可以有相同的文件名。

Nginx反代Mogilefs分布式儲存示例詳解

~]# mogadm domain add imgs #創(chuàng)建名為imgs的Domain
~]# mogadm domain add text #創(chuàng)建名為text的Domain
~]# mogadm domain list #查看Domain list

Nginx反代Mogilefs分布式儲存示例詳解

可以自定義Class的屬性,格式為:mogadm class add <domain> <class> [opts]

~]# mogadm class add imgs png --mindevcount=3 --hashtype=MD5 #在Domain imgs中定義名為png的class,在不同設(shè)備中復(fù)制3份,并用MD5做校驗
~]# mogadm class add imgs jpg --mindevcount=3 --hashtype=MD5 #在Domain imgs中定義名為jpg的class,在不同設(shè)備中復(fù)制3份,并用MD5做校驗
~]# mogadm domain list

Nginx反代Mogilefs分布式儲存示例詳解

7.使用Mogilefs做上傳下載測試

Mogilefs可以用自建的API接口進(jìn)行交互,其中有很多用于管理存儲數(shù)據(jù)的命令。例如上傳數(shù)據(jù)命令為mogupload,查看數(shù)據(jù)命令為mogfileinfo等。

例:測試將文件/test/123.png上傳至Mogilefs集群(文件事先在本地準(zhǔn)備好):

~]# mogupload --trackers=192.168.29.111 --domain=imgs --class=png --key='/111.png' --file='/test/123.png' #通過IP為192.168.29.111的Trackers將123.png文件上傳,并保存至Domain為imgs,Class為png的空間中,并重命名為111.png
~]# mogfileinfo --trackers=192.168.29.111 --domain=imgs --class=png --key='/111.png' #查看Domain為imgs,Class為png中key為111.png的文件的存儲情況。

Nginx反代Mogilefs分布式儲存示例詳解

Nginx反代Mogilefs分布式儲存示例詳解

至此,Mogilefs分布式儲存集群就搭建完成了,但若想要使客戶端能與之通信,就需要在接口上進(jìn)行編程,這樣就很麻煩了,好在我們能用Nginx做反代進(jìn)行通信。下面來演示Nginx反代Mogilefs的步驟。

5.Nginx反代Mogilefs

1.打開n2,n3的mogilefsd服務(wù),將3個節(jié)點(diǎn)全部設(shè)置為Trackers(保證配置文件與n1相同):

~]# service mogilefsd start

2.在n4節(jié)點(diǎn)編譯安裝Nginx

安裝依賴包:

~]# yum install gcc gcc-c++ perl pcre-devel openssl openssl-devel

下載Nginx編譯安裝包nginx-1.10.3.tar.gz與Nginx_Mogilefs模塊nginx_mogilefs_module-1.0.4.tar.gz并展開:

~]# ls
nginx-1.10.3   nginx_mogilefs_module-1.0.4
nginx-1.10.3.tar.gz nginx_mogilefs_module-1.0.4.tar.gz
~]# cd nginx-1.10.3
./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/ #一定記得添加Mogilefs模塊所在的路徑,不可少。
~]# make & make install

  添加nginx用戶并啟動nginx:

~]# useradd -s /sbin/nologin -M nginx
~]# /usr/sbin/nginx

3.配置Nginx

單Trackers示例:

location /imgs/ {
   mogilefs_tracker 192.168.29.111:7001; #單Trackers示例
   mogilefs_domain imgs; #指定Domain
   mogilefs_class png jpg; #指定Class

   mogilefs_pass { #傳輸相關(guān)配置
    proxy_pass $mogilefs_path;
    proxy_hide_header Content-Type;
    proxy_buffering off;
   }
  }

多Trackers示例:

在nginx配置中的http配置段添加調(diào)度模塊:

1 upstream mogsvr {
2   server 192.168.29.111:7001;
3   server 192.168.29.112:7001;
4   server 192.168.29.113:7001;
5   }

在nginx配置中的server配置段添:

location /imgs/ {
    mogilefs_tracker mogsvr;
   mogilefs_domain imgs;
   mogilefs_class png jpg;

   mogilefs_pass {
    proxy_pass $mogilefs_path;
    proxy_hide_header Content-Type;
    proxy_buffering off;
   }
  }

重新啟動nginx,并通過nginx訪問之前上傳的圖片:

Nginx反代Mogilefs分布式儲存示例詳解

總結(jié):

在上傳文件時遇到一個錯誤提示MogileFS::Backend: couldn't connect to mogilefsdbackend at /usr/local/share/perl/5.8.4/Client.pm line 282,這是由于mogilefsd服務(wù)于MySQL無法連接造成的,檢查它們之間的連接情況就能發(fā)現(xiàn)錯誤所在。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI