隨着信息技術不斷的發展,給咱們帶來便利的同時,不斷增長的數據量級、信息之間的鏈接關聯愈來愈複雜、數據訪問的併發量日益增長對I/O的要求愈來愈高、數據類型愈來愈複雜等難題也成爲信息技術繼續高速發展亟需解決的難題。分佈式存儲系統的出如今很大程度上解決了以上大部分難題。node
分佈式存儲系統,是將數據分散存儲在多臺獨立的設備上。傳統的網絡存儲系統採用集中的存儲服務器存放全部數據,存儲服務器成爲系統性能的瓶頸,也是可靠性和安全性的焦點,不能知足大規模存儲應用的須要。分佈式存儲系統採用可擴展的系統結構,利用多臺存儲服務器分擔存儲負荷,利用位置服務器定位存儲信息,它不但提升了系統的可靠性、可用性和存取效率,還易於擴展。mysql
分佈式存儲系統在接口類型上可分爲通用分佈式儲存和專用分佈式儲存。通用分佈式儲存是指沒有文件系統接口,須要經過API接口進行訪問;專用分佈式儲存也稱爲分佈式文件系統,它們通常都會有文件系統接口,能夠直接掛載。通用分佈式儲存有mogilefs、fastdfs等,專用分佈式儲存系統有moosefs等。nginx
1.Trackers(mogilefsd):Mogliefs的核心組件,主要功能是(Replication)節點文件複製、(Deletion)文件刪除、(Query)元數據查詢、(Monitor)健康監測、(Reaper)儲存失敗重置等等。它一般稱爲元數據服務器,但它不會去儲存元數據,而是將元數據儲存在如MySQL這一類的數據庫中。爲保證架構的可靠性,Trackers通常有多個。Trackers可看做是一個旁掛式代理,只負責處理元數據信息。c++
2.數據庫:數據庫用來存放Mogliefs的元數據,而由Trackers來管理數據。所以一般建議作HA。sql
3.mogstored(儲存節點):實際文件存放的地方。一般會將實際文件保存至少兩份副本。數據庫
在三個節點同時安裝Trackers和mogstored,選擇其中一個節點安裝MySQL。在生產環境最好是能單獨將MySQL部署而且作主從複製。Trackers和mogstored也能夠分開部署在不一樣節點上,這些都須要根據實際的生產環境來決定。這裏主要是演示mogilefs,不作MySQL主從複製演示。若想要Mogilefs能掛載,能夠用FUSE來實現。apache
須要注意的是mogilefs存儲的文件URL很特殊(後面會解釋mogilefs文件名生產的過程),如存儲一張圖片時文件URL可能會是相似6060/0000/0000/0000/00000021.jpg這樣的格式,對用戶來說就不太友好,用戶可能須要直觀的相似image.hello.com/21.jpg這樣的URL。因此一般會使用Nginx來反代Mogilefs。編程
Mogilefs是一個相對較年代較久但成熟的分佈式儲存,考慮到可能在Centos7上會出現兼容問題,這裏Centos6來演示。vim
操做系統: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
結構如上圖所示。
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
注:能夠在n二、n3節點都安裝Trackers服務,從而消除單點故障風險也能平均I/O壓力。
Java架構交流學習圈:874811168 面向1-3年經驗 Java開發人員 幫助突破瓶頸 提高思惟能力
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
~]# 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
添加存儲節點,並檢查:
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是將冗餘存儲在不一樣設備中的,每個節點都應該被識別爲不一樣的設備。
在n一、n二、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
在Mogilefs中,在多個節點上爲了方便文件副本管理,一般在設備中不會以文件爲單位進行管理,而是以class(類)作管理,複製刪除等操做都是以class爲最小單位進行的。每一個class中能夠放不少文件,class的容積也不是固定的。
在Mogilefs的存儲空間中,全部數據文件都在同一平面,因此不能有同名的狀況發生,這樣會影響Mogilefs的靈活性,因此引入了Domain(名稱空間)的概念。Domain包含Class,在不一樣的Domain中能夠有相同的文件名。Java架構交流學習圈:874811168 面向1-3年經驗 Java開發人員 幫助突破瓶頸 提高思惟能力
~]# 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
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的步驟。
~]# service mogilefsd start
安裝依賴包:
~]# 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
單Trackers示例:
1 location /imgs/ { 2 mogilefs_tracker 192.168.29.111:7001; #單Trackers示例 Java架構交流學習圈:874811168 面向1-3年經驗 Java開發人員 幫助突破瓶頸 提高思惟能力 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沒法鏈接形成的,檢查它們之間的鏈接狀況就能發現錯誤所在。