今天我們來認識一個新的存儲系統——MogileFS(分佈式文件存儲系統)。
(一)MogileFS是什麼
MogileFS是一個開源的分佈式文件存儲系統,由LiveJournal旗下的Danga Interactive公司開發。Danga團隊開發了包括 Memcached、MogileFS、Perlbal 等多個知名的開源項目。目前使用MogileFS 的公司非常多,如日本排名先前的幾個互聯公司及國內的yupoo(又拍)、digg、豆瓣、1號店、大衆點評、搜狗和安居客等,分別爲所在的組織或公司管理着海量的圖片,以大衆點評爲例,用戶全部圖片均有mogileFS存儲,數據量已經達到500TB級別以上。
(二)MogileFS有什麼特性
1、支持多節點冗餘
2、可實現自動的文件複製
3、使用名稱空間(命名空間),每個文件通過key來確定
4、不需要RAID,應用層可以直接實現RAID,不共享任何東西,通過“集羣”接口提供服務
5、工作於應用層,沒有特殊的組件要求
6、不共享任何數據,MogileFS不需要依靠昂貴的SAN來共享磁盤,每個機器只用維護好自己的磁盤。
(三)MogileFS的架構
mogileFS主要由三部分構成:tracker節點,database節點,storage節點
1、Tracker(MogileFSd 進程):這個是 MogileFS 的核心部分,他是一個調度器, MogileFSd 進程就是trackers進程程序,trackers 做了很多工作:Replication,Deletion,Query,Reaper,Monitor 等等,這個是基於事件的( event-based ) 父進程/消息總線來管理所有來之於客戶端應用的交互(requesting operations to be performed), ,包括將請求負載平衡到多個“query workers”中,然後讓 MogileFSd 的子進程去處理;
2、Database(MySQL):用來存放 MogileFS 的元數據 (命名空間, 和文件在哪裏),是Trackers 來操作和管理它,可以用mogdbsetup程序來初始化數據庫,因爲數據庫保存了MogileFS的所有元數據,建議做成HA架構;
3、Storage Nodes:這個是 MogileFS 存儲文件存放在這些機器上,也是 mogstored 節點,也叫 Storage Server,一臺存儲主要都要啓動一個 mogstored 服務.擴容就是增加這些機器,實際文件存放的地方。
(四)MogileFS的工作機制
每次文件的上傳和讀取,都經過前端TrackerServer服務器,trackerServer服務器受到client端的請求,查詢數據庫,返回 一個上傳或者是讀取的可用的後端StorageServer的地址,然後由client端直接操作後端StorageServer服務器。upload操 作返回就是成功或者失敗的結果,read操作就是返回對應的查詢數據。
(五) 具體的安裝和實現
通常情況下有兩種安裝方式:yum安裝和源碼安裝,這裏我們就以yum安裝爲例。
1、首先要安裝下列相關包。
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
本地安裝的rpm包:
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服務
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker節點
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客戶端
ogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存儲節點
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如 mogadm等。
2、 在tracker上進行以下配置:
1.安裝完mogilefs相關包後,安裝mariadb數據庫,然後對用戶進行授權:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'172.17.%.%' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
2.設定數據庫(MogileFS 中文件管理,我們可以簡單的使用 mog 開頭的系列 Linux 命令, 來進行管理, 當然也可以用 Client 的 API 來管理. 新的 MogileFS 的工具, 拆分成多個了. 下面這些命令, 都需要在 /etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers 來指定.)
mogdbsetup --help
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogile 用戶名默認爲:mogile
3.修該tracker的主配置文件
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
db_pass = mogile
listen = 172.17.253.210:7001
4.用自帶腳本啓動該服務,可以看到7001端口已經打開
/etc/init.d/mogilefsd start
5.登錄MySQL,查看mogilefs庫是否生成
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mogilefs |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
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)
3、配置storage文件
1.修改storage配置文件(由於兩個storage節點配置一樣,這裏就以storage1節點爲例。storage1:172.17.254.222,storage2:172.17.254.224)
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogstorage
2.MogileFS 中的存儲設備管理
建一個目錄並修改目錄權限 ( 並且需要 mount 一個硬盤給這個目錄 ) 給這個"設備" 使用, 我們這的例子是使用 dev1在主機中建一個目錄,建目錄使用 dev + ID 這種格式,記的所有系統中 ID 不能重複.也必 須和配置文件中的路徑一樣. 如下: mkdir -p /data/mogstorage/dev1 一定要注意, 給相對應用的塊設備 mount 到這個點, 軟鏈也行. 不然寫文件都會寫到系統硬上, 其它的硬盤都是空的
mkdir -p /data/mogstorage/dev1
chown mogilefs.mogilefs /data/mogstorage/ -R
3.啓動服務,可以看到7500端口已打開
/etc/init.d/mogstored start
4、在tracker節點上進行mogilefs存儲主機的管理:
1.現在加入“存儲節點”到 trackers 中.告訴註冊自己到 trackers.相當於爲每個主機 加入 MogileFS 的存儲系統
mogadm host add node1 --ip=172.17.254.222 --port=7500 --status=alive #添加主機,將主機信息註冊到數據庫中
mogadm host list #檢查這個主機是否加入到 MogileFS 的系統中
[root@localhost mysql]#mogadm host list
node1 [1]: alive
IP: 172.17.254.222:7500
node2 [2]: alive
IP: 172.17.254.224:7500
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive #可以修改主機IP
2.給"設備"加入”存儲的節點“當中,相當於爲每個設備加入 MogileFS 的存儲系統
mogadm device add node1 1
mogadm device add node2 2
mogadm device list
[root@localhost mysql]#mogadm device list
node1 [1]: alive
used(G) free(G) total(G) weight(%)
dev1: alive 3.780 46.195 49.976 100
node2 [2]: alive
used(G) free(G) total(G) weight(%)
dev2: alive 3.410 46.565 49.976 100
標記失效的設備,當硬盤壞了,設備有問題時,這時會自動在一個域內複製到最小設置的保存份數. 恢復上面一樣再一次 add 設備就好了 mogadm device mark node_name ID dead
3.當上面的準備好了,MogileFS 是運行中時,接下來我們要建一個我們自己的'名字空間'和加入文 件到存儲當中. 我們使用 mogadm 的工具來能創建一個"域"和"類".也可以使用這個來增加文件到"類"中.
建"域"
mogadm domain add imgs
檢查"域",顯示存在的域
mogadm domain list
在"域"中建"類",並加入最小保存份數
mogadm class add imgs class1 --mindevcount=3
[root@localhost mysql]#mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
imgs class1 3 MultipleHosts() NONE
imgs default 2 MultipleHosts() NONE
4.上傳文件進行測試
mogupload --domain=imgs --key=test1 --file=test1.png
mogupload --domain=imgs --key=test2 --file=test2.jpg
[root@localhost mysql]#mogfileinfo --domain=imgs --key=test1#查詢文件
- file: test1
class: default
devcount: 2
domain: imgs
fid: 11
key: test1
length: 72825
- http://172.17.254.224:7500/dev2/0/000/000/0000000011.fid
- http://172.17.254.222:7500/dev1/0/000/000/0000000011.fid
[root@localhost mysql]#mogfileinfo --domain=imgs --key=test2
- file: test2
class: default
devcount: 2
domain: imgs
fid: 10
key: test2
length: 87170
- http://172.17.254.222:7500/dev1/0/000/000/0000000010.fid
- http://172.17.254.224:7500/dev2/0/000/000/0000000010.fid
在兩個存儲節點可以看到文件已經都存在了:
這裏有一個bug,如果不解決這個bug會導致這兩個存儲節點的數據不同步,來看一下bug存在的情況下:
這個0的目錄下只在storage1節點存在,而另一邊沒有,然而這個問題就是由於我們安裝的這個Sys-Syscall的版本存在的問題,由於我們目前的版本是0.25的版本,所以這裏我們就需要降級,降到0.23的版本,這裏我們就需要去Sys-Syscal官網下載0.23的版本,然後編譯安裝。之後就看到了兩邊文件同步的狀況。
tar xf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23/
perl Makefile.PL
make
mkae install
5、在網頁上訪問任意路徑,可以看到能正常訪問我們上傳的圖片。