Nginx反代Mogilefs分布式儲存的方法

一、分布式存儲系統簡介

隨著信息技術不斷的發展,給我們帶來便利的同時,不斷增加的數據量級、信息之間的連接關聯越來越復雜、數據訪問的并發量日益增加對i/o的要求越來越高、數據類型越來越復雜等難題也成為信息技術繼續高速發展亟需解決的難題。分布式存儲系統的出現在很大程度上解決了以上大部分難題。

分布式存儲系統,是將數據分散存儲在多臺獨立的設備上。傳統的網絡存儲系統采用集中的存儲服務器存放所有數據,存儲服務器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式存儲系統采用可擴展的系統結構,利用多臺存儲服務器分擔存儲負荷,利用位置服務器定位存儲信息,它不但提高了系統的可靠性、可用性和存取效率,還易于擴展。

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

二、mogilefs

mogilefs是一個開源的分布式文件存儲系統,mogilefs適用于存儲海量小文件的工作場景,由livejournal旗下的danga interactive公司開發,該團隊開發了包括 memcached、mogilefs、perlbal 等多個知名的開源項目。

1.mogilefs架構圖:

Nginx反代Mogilefs分布式儲存的方法

2.組成mogliefs的組件:

1.trackers(mogilefsd):mogliefs的核心組件,主要功能是(replication)節點文件復制、(deletion)文件刪除、(query)元數據查詢、(monitor)健康監測、(reaper)儲存失敗重置等等。它通常稱為元數據服務器,但它不會去儲存元數據,而是將元數據儲存在如mysql這一類的數據庫中。為保證架構的可靠性,trackers一般有多個。trackers可看作是一個旁掛式代理,只負責處理元數據信息。

2.數據庫:數據庫用來存放mogliefs的元數據,而由trackers來管理數據。因此通常建議做ha。

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

3.示例演示拓撲圖

在三個節點同時安裝trackers和mogstored,選擇其中一個節點安裝mysql。在生產環境最好是能單獨將mysql部署并且做主從復制。trackers和mogstored也可以分開部署在不同節點上,這些都需要根據實際的生產環境來決定。這里主要是演示mogilefs,不做mysql主從復制演示。若想要mogilefs能掛載,可以用fuse來實現。

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

Nginx反代Mogilefs分布式儲存的方法

4.系統環境與安裝

mogilefs是一個相對較年代較久但成熟的分布式儲存,考慮到可能在centos7上會出現兼容問題,這里centos6來演示。

操作系統: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

結構如上圖所示。

1.在n1節點上安裝mysql、mogilefsd、mogstored,并將n1配置為trackers、storage node

mysql直接用yum安裝。

~]#?yum?install?-y?mysql?mysql-server

安裝mogilefs的trackers和storage node組件,安裝時一定要安裝perl相關的依賴包,依賴包有:

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?#是否以守護進程的方式運行。 #?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?#數據庫的地址 db_user?=?moguser?#配置數據庫的用戶名及密碼 db_pass?=?123456 #?ip:port?to?listen?on?for?mogilefs?client?requests listen?=?0.0.0.0:7001?#監聽的地址與端口 #?optional,?if?you?don't?define?the?port?above. conf_port?=?7001?#默認端口 #?number?of?query?workers?to?start?by?default. query_jobs?=?10?#查詢進程數量 #?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

修改完配置后,進入數據庫創建一個可以遠程連接的root用戶,或者使用mogdbsetup初始化數據庫:

mysql>?grant?all?on?mogilefs.*?to?'moguser'@'192.168.29.%'?identified?by?'123456';?#創建用戶moguser,擁有管理mogilefs庫的所有權限,并允許192.168.29.*的用戶遠程連接。 mysql>?flush?privileges; mysql>?quit
~]#?mogdbsetup?--dbhost=127.0.0.1?--dbuser=moguser?--dbpass=123456

初始化完成后可以在mysql中看到創建好的mogilefs庫以及里面的表:

Nginx反代Mogilefs分布式儲存的方法

啟動mogilefs并確認7001端口處于監聽狀態:

~]#?service?mogilefsd?start starting?mogilefsd??????[?ok?] ~]#?ss?-lnt

注:可以在n2、n3節點都安裝trackers服務,從而消除單點故障風險也能平均i/o壓力。

3.在n1上配置storage node

storage node配置文件路徑為/etc/mogilefs/mogstored.conf:

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

創建數據存儲目錄并修改屬組和屬主為mogilefs:

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

啟動mogstored,查看進程是否正常啟動端口是否監聽:

~]#?service?mogstored?start ~]#?ss?-lnt?#監聽端口為7500、7501

4.按照n1的步驟在節點n2、n3上安裝mogilefs,并將n1上的配置文件復制到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服務并確認監聽:

~]#?service?mogstored?start ~]#?ss?-lnt?#監聽端口為7500、7501

5.用在n1上用mogadm命令將所有節點整合成集群。

添加存儲節點,并檢查:

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集群中的存儲被識別成不同設備,需要在創建的/mogliefs/mogdata目錄下再創建名為dev*的目錄,使每個節點被當做存儲設備使用。mogilefs是將冗余存儲在不同設備中的,每一個節點都應該被識別為不同的設備。

在n1、n2、n3上的/mogliefs/mogdata/目錄下分別創建dev1,dev2,dev3目錄,并在trackers上添加設備:

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.創建domain和class

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

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

Nginx反代Mogilefs分布式儲存的方法

~]#?mogadm?domain?add?imgs?#創建名為imgs的domain ~]#?mogadm?domain?add?text?#創建名為text的domain ~]#?mogadm?domain?list?#查看domain?list

Nginx反代Mogilefs分布式儲存的方法

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

~]#?mogadm?class?add?imgs?png?--mindevcount=3?--hashtype=md5?#在domain?imgs中定義名為png的class,在不同設備中復制3份,并用md5做校驗 ~]#?mogadm?class?add?imgs?jpg?--mindevcount=3?--hashtype=md5?#在domain?imgs中定義名為jpg的class,在不同設備中復制3份,并用md5做校驗 ~]#?mogadm?domain?list

Nginx反代Mogilefs分布式儲存的方法

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

mogilefs可以用自建的api接口進行交互,其中有很多用于管理存儲數據的命令。例如上傳數據命令為mogupload,查看數據命令為mogfileinfo等。

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

~]#?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分布式儲存集群就搭建完成了,但若想要使客戶端能與之通信,就需要在接口上進行編程,這樣就很麻煩了,好在我們能用nginx做反代進行通信。下面來演示nginx反代mogilefs的步驟。

5.nginx反代mogilefs

1.打開n2,n3的mogilefsd服務,將3個節點全部設置為trackers(保證配置文件與n1相同):

~]#?service?mogilefsd?start

2.在n4節點編譯安裝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?{?#傳輸相關配置 ????proxy_pass?$mogilefs_path; ????proxy_hide_header?content-type; ????proxy_buffering?off; ???} ??}

多trackers示例:

在nginx配置中的http配置段添加調度模塊:

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分布式儲存的方法

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享