1. 程式人生 > >Nginx反代Mogilefs分散式儲存示例

Nginx反代Mogilefs分散式儲存示例

一、分散式儲存系統簡介

  隨著資訊科技不斷的發展,給我們帶來便利的同時,不斷增加的資料量級、資訊之間的連線關聯越來越複雜、資料訪問的併發量日益增加對I/O的要求越來越高、資料型別越來越複雜等難題也成為資訊科技繼續高速發展亟需解決的難題。分散式儲存系統的出現在很大程度上解決了以上大部分難題。

  分散式儲存系統,是將資料分散儲存在多臺獨立的裝置上。傳統的網路儲存系統採用集中的儲存伺服器存放所有資料,儲存伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模儲存應用的需要。分散式儲存系統採用可擴充套件的系統結構,利用多臺儲存伺服器分擔儲存負荷,利用位置伺服器定位儲存資訊,它不但提高了系統的可靠性、可用性和存取效率,還易於擴充套件。

  分散式儲存系統在介面型別上可分為通用分散式儲存和專用分散式儲存。通用分散式儲存是指沒有檔案系統介面,需要通過API介面進行訪問;專用分散式儲存也稱為分散式檔案系統,它們一般都會有檔案系統介面,可以直接掛載。通用分散式儲存有mogilefs、fastdfs等,專用分散式儲存系統有moosefs等。

二、Mogilefs

1.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。

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.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm Perlbal-1.78-1.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm
perl-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 庫以及裡面的表:

  啟動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 [email protected]:/etc/mogilefs/
~]# scp /etc/mogilefs/*.conf [email protected]:/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

  若想讓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

6.建立Domain和Class

  在Mogilefs中,在多個節點上為了方便檔案副本管理,通常在裝置中不會以檔案為單位進行管理,而是以class(類)做管理,複製刪除等操作都是以class為最小單位進行的。每個class中可以放很多檔案,class的容積也不是固定的。

  在Mogilefs的儲存空間中,所有資料檔案都在同一平面,所以不能有同名的情況發生,這樣會影響Mogilefs的靈活性,所以引入了Domain(名稱空間)的概念。Domain包含Class,在不同的Domain中可以有相同的檔名。

~]# mogadm domain add imgs #建立名為imgs的Domain
~]# mogadm domain add text #建立名為text的Domain
~]# mogadm domain list #檢視Domain list

   可以自定義Class的屬性,格式為: mogadm class add <domain> <class> [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

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的檔案的儲存情況。

   至此,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示例:

 1 location /imgs/ {
 2             mogilefs_tracker 192.168.29.111:7001; #單Trackers示例
 3             mogilefs_domain imgs; #指定Domain
 4             mogilefs_class png jpg; #指定Class
 5 
 6             mogilefs_pass { #傳輸相關配置
 7                 proxy_pass $mogilefs_path;
 8                 proxy_hide_header Content-Type;
 9                 proxy_buffering off;
10             }
11         }

  多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配置段添:

 1 location /imgs/ {
 2                 mogilefs_tracker mogsvr;
 3             mogilefs_domain imgs;
 4             mogilefs_class png jpg;
 5 
 6             mogilefs_pass {
 7                 proxy_pass $mogilefs_path;
 8                 proxy_hide_header Content-Type;
 9                 proxy_buffering off;
10             }
11         }

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

 

 總結:

  在上傳檔案時遇到一個錯誤提示MogileFS::Backend: couldn't connect to mogilefsdbackend at /usr/local/share/perl/5.8.4/Client.pm line 282,這是由於mogilefsd服務於MySQL無法連線造成的,檢查它們之間的連線情況就能發現錯誤所在。