基於MogileFS的分佈式存儲系統

  今天我們來認識一個新的存儲系統——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的工作機制

    基於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

  在兩個存儲節點可以看到文件已經都存在了:
基於MogileFS的分佈式存儲系統
  這裏有一個bug,如果不解決這個bug會導致這兩個存儲節點的數據不同步,來看一下bug存在的情況下:
基於MogileFS的分佈式存儲系統
  這個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、在網頁上訪問任意路徑,可以看到能正常訪問我們上傳的圖片。
基於MogileFS的分佈式存儲系統

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章