一、常見的分佈式存儲系統
目前我們使用的分佈式存儲方面的應用均是有google的幾篇論文演化出來的,下面就是這幾篇論文所出現的架構:
Google File System(大規模分散文件系統) :用於分佈式存儲
MapReduce (大規模分散FrameWork) :用於分佈式計算
BigTable(大規模分散數據庫) :用於列式數據庫
Chubby(分散鎖服務)
1、GFS(Google File System)
Google公司爲了滿足本公司需求而開發的基於Linux的專有分佈式文件系統。。儘管Google公佈了該系統的一些技術細節,但Google並沒有將該系統的軟件部分作爲開源軟件發佈。 下面分佈式文件系統都是類 GFS的產品。
2、HDFS
Hadoop 實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。 Hadoop是Apache Lucene創始人Doug Cutting開發的使用廣泛的文本搜索庫。它起源於Apache Nutch,後者是一個開源的網絡搜索引擎,本身也是Luene項目的一部分。Aapche Hadoop架構是MapReduce算法的一種開源應用,是Google開創其帝國的重要基石。
3、Ceph
是加州大學聖克魯茲分校的Sage weil攻讀博士時開發的分佈式文件系統。並使用Ceph完成了他的論文。 說 ceph 性能最高,C++編寫的代碼,支持Fuse,並且沒有單點故障依賴, 於是下載安裝, 由於 ceph 使用 btrfs 文件系統, 而btrfs 文件系統需要 Linux 2.6.34 以上的內核才支持。 可是ceph太不成熟了,它基於的btrfs本身就不成熟,它的官方網站上也明確指出不要把ceph用在生產環境中。
4、Lustre
Lustre是一個大規模的、安全可靠的,具備高可用性的集羣文件系統,它是由甲骨文公司開發和維護的。 該項目主要的目的就是開發下一代的集羣文件系統,可以支持超過10000個節點,數以PB的數據量存儲系統。 目前Lustre已經運用在一些領域,例如HP SFS產品等。
5、MogileFS
由memcahed的開發公司danga一款perl開發的產品,目前國內使用mogielFS的有圖片託管網站yupoo等。 MogileFS是一套高效的文件自動備份組件,由Six Apart開發,廣泛應用在包括LiveJournal等web2.0站點上。
MogileFS由3個部分組成:
第1個部分是server端,包括mogilefsd和mogstored兩個程序。前者即是 mogilefsd的tracker,它將一些全局信息保存在數據庫裏,例如站點domain,class,host等。後者即是存儲節點(store node),它其實是個HTTP Daemon,默認偵聽在7500端口,接受客戶端的文件備份請求。在安裝完後,要運行mogadm工具將所有的store node註冊到mogilefsd的數據庫裏,mogilefsd會對這些節點進行管理和監控。
第2個部分是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
第3個部分是客戶端API,目前只有Perl API(MogileFS.pm)、PHP,用這個模塊可以編寫客戶端程序,實現文件的備份管理功能。
6、mooseFS
支持FUSE,相對比較輕量級,對master服務器有單點依賴,用perl編寫,性能相對較差,國內用的人比較多。
7、FastDFS
是一款類似Google FS的開源分佈式文件系統,是純C語言開發的。 FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。
8、TFS
TFS(Taobao !FileSystem)是一個高可擴展、高可用、高性能、面向互聯網服務的分佈式文件系統,主要針對海量的非結構化數據,它構築在普通的Linux機器 集羣上,可爲外部提供高可靠和高併發的存儲訪問。TFS爲淘寶提供海量小文件存儲,通常文件大小不超過1M,滿足了淘寶對小文件存儲的需求,被廣泛地應用 在淘寶各項應用中。它採用了HA架構和平滑擴容,保證了整個文件系統的可用性和擴展性。同時扁平化的數據組織結構,可將文件名映射到文件的物理地址,簡化 了文件的訪問流程,一定程度上爲TFS提供了良好的讀寫性能。
9、GridFS文件系統
MongoDB是一種知名的NoSql數據庫,GridFS是MongoDB的一個內置功能,它提供一組文件操作的API以利用MongoDB存儲文件,GridFS的基本原理是將文件保存在兩個Collection中,一個保存文件索引,一個保存文件內容,文件內容按一定大小分成若干塊,每一塊存在一個Document中,這種方法不僅提供了文件存儲,還提供了對文件相關的一些附加屬性(比如MD5值,文件名等等)的存儲。文件在GridFS中會按4MB爲單位進行分塊存儲。
二、MogileFS
1、MogileFS的特性
應用層提供服務,不需要使用核心組件
無單點(tracker(跟蹤點)mogstore(存儲節點)database(MySQL))
自動文件複製:複製的最小單位不是文件,而是class
傳輸中立:無特殊協議,可以通過NFS或HTTP實現通信
簡單的命名空間:沒有目錄,直接存在存儲空間上,通過域來實現
不共享任何數據:
2、Mogilefs基本原理
MogileFS是一個開源的分佈式文件系統,用於組建分佈式文件集羣,由LiveJournal旗下DangaInteractive公司開發,Danga團隊開發了包括 Memcached、MogileFS、Perlbal等不錯的開源項目:(注:Perlbal是一個強大的Perl寫的反向代理服務器)。MogileFS是一個開源的分佈式文件系統。主要特性包括:應用層的組件、無單點故障、自動文件複製、具有比RAID更好的可靠性、無需RAID支持等……核心角色如下:
tracker節點:藉助數據庫保存各節點文件的元數據信息保存每個域中所有鍵的存儲位置分佈,方便檢索定位數據位置的同時監控各節點,告訴客戶端存儲區位置並指揮storage節點複製數據副本,進程名爲mogilefsd(7001)。
database節點:爲tracker節點提供數據存取服務。
storage節點:將指定域中的鍵轉換爲其特有的文件名存儲在指定的設備文件中,轉換後的文件名爲值,storage節點自動維護鍵值的對應關係,storage節點由於使用http進行數據傳輸,因此依賴於perlbal,storage節點前端可以使用nginx進行反向代理,但需要安裝nginx-mogilefs-module-master模塊進行名稱轉換,進程名mogstored(7501),perbal(7500)。
Domain:一個域中的鍵值是惟一的,一個MogileFS可以有多個域,域可以用來存儲不同應用類型的數據的容器。
Host:每一個存儲節點稱爲一個主機,一個主機上可以有多個存儲設備(單獨的硬盤),每個設備都有ID號,Domain+Fid用來定位文件。
Class:複製最小單位,文件屬性管理,定義文件存儲在不同設備上份數。
3、mogilefs簡單部署
注意mysql的安裝這裏就不介紹了,以下爲tracker節點的操作。
數據庫授權:
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.%.%' identified by 'redhat'; Query OK, 0 rows affected (0.22 sec) MariaDB [mogilefs]> grant all on mogilefs.* to 'moguser'@'192.168.%.%' identified by 'mogpass'; Query OK, 0 rows affected (0.00 sec)
安裝mogilefs:
[[email protected] ~]# ls 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-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [[email protected] ~]# yum install -y *.rpm perl-IO-AIO
初始化數據庫:
[[email protected] ~]# mogdbsetup --dbhost=192.168.1.8 --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbrootpass=redhat --dbuser=moguser --dbpass=mogpass 驗證是否初始化成功: MariaDB [(none)]> 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)
mogilefs服務配置,修改mogilefs.conf文件:
[[email protected] ~]# vim /etc/mogilefs/mogilefsd.conf # 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 # Database connection information db_dsn = DBI:mysql:mogilefs:host=192.168.1.8 db_user = moguser db_pass = mogpass # IP:PORT to listen on for mogilefs client requests listen = 192.168.1.8: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
更改目錄權限:
[[email protected] ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd
啓動服務:
[[email protected] ~]# service mogilefsd start [[email protected] ~]# ss -tnlp |grep mogilefs LISTEN 0 128 192.168.1.8:7001 *:* users:(("mogilefsd",9145,6))
以下爲各storage節點的操作。
安裝mogilefs:
[root@node2 ~]# ls 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-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [root@node1 ~]# yum install -y *.rpm perl-IO-AIO [root@node2 ~]# yum install -y *.rpm perl-IO-AIO
node1節點配置:
[root@node1 ~]# cat /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /data/mogdata [root@node1 ~]# mkdir -p /data/mogdata/dev1 [root@node1 ~]# chown -R mogilefs.mogilefs /data/mogdata/dev1
啓動服務並查看是否正常啓動:
[root@node1 ~]# service mogstored start
[root@node1 ~]# ss -tnlp |grep mog LISTEN 0 128 *:7500 *:* users:(("mogstored",2012,4)) LISTEN 0 128 *:7501 *:* users:(("mogstored",2012,9))
node2節點配置:
[root@node2 ~]# cat /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /data/mogdata [root@node2 ~]# mkdir -p /data/mogdata/dev2 [root@node2 ~]# chown -R mogilefs.mogilefs /data/mogdata/dev2 [root@node2 ~]# ss -tnlp |grep mog LISTEN 0 128 *:7500 *:* users:(("mogstored",4199,4)) LISTEN 0 128 *:7501 *:* users:(("mogstored",4199,9))
以下爲tracker節點的操作。
添加node1節點:
[[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host add node1 --ip=192.168.1.9 --status=alive [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host list node1 [1]: alive IP: 192.168.1.9:7500 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device add node1 1 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device list node1 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 3.319 8.670 11.989 100
添加node2節點:
[[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host add node2 --ip=192.168.1.10 --status=alive [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device add node2 002 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host list node1 [1]: alive IP: 192.168.1.9:7500 node2 [2]: alive IP: 192.168.1.10:7500 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device list node1 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 3.319 8.670 11.989 100 node2 [2]: alive used(G) free(G) total(G) weight(%) dev2: alive 2.860 9.129 11.989 100
添加domain:
[[email protected] ~]# mogadm --tracker=192.168.1.8:7001 domain add files [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 domain list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE
上傳文件:
[[email protected] ~]# mogupload --trackers=192.168.1.8:7001 --domain=files --key='/issue.html' --file='/etc/issue' [[email protected] ~]# moglistkeys --trackers=192.168.1.8:7001 --domain=files /issue.html [[email protected] ~]# mogfileinfo --trackers=192.168.1.8:7001 --domain=files --key='/issue.html' - file: /issue.html class: default devcount: 2 domain: files fid: 3 key: /issue.html length: 47 - http://192.168.1.10:7500/dev2/0/000/000/0000000003.fid - http://192.168.1.9:7500/dev1/0/000/000/0000000003.fid
測試:
[[email protected] ~]# curl CentOS release 6.6 (Final) Kernel \r on an \m [[email protected] ~]# curl http://192.168.1.10:7500/dev2/0/000/000/0000000003.fid CentOS release 6.6 (Final) Kernel \r on an \m
添加domain並上傳文件:
[[email protected] ~]# mogadm --trackers=192.168.1.8:7001 domain add p_w_picpaths [[email protected] ~]# mogupload --trackers=192.168.1.8:7001 --domain=p_w_picpaths --key='/logo.png' --file='/usr/share/backgrounds/default_1920x1200.png' [[email protected] ~]# mogfileinfo --trackers=192.168.1.8:7001 --domain=p_w_picpaths --key='/logo.png' - file: /logo.png class: default devcount: 2 domain: p_w_picpaths fid: 4 key: /logo.png length: 1470177 - http://192.168.1.10:7500/dev2/0/000/000/0000000004.fid - http://192.168.1.9:7500/dev1/0/000/000/0000000004.fid
測試:
下載文件:
[[email protected] ~]# mogfetch --trackers=192.168.1.8:7001 --domain=p_w_picpaths --key='/logo.png' --file='./log.png' [[email protected] ~]# ls -l log.png -rw-r--r-- 1 root root 1470177 9月 17 21:22 log.png
刪除文件:
[[email protected] ~]# mogdelete --trackers=192.168.1.8:7001 --domain=p_w_picpaths --key='/logo.png'