海量小文件存儲利器Mogilefs

#######################################################################

  • 數據存儲的趨勢和大數據帶來的挑戰

  • 分佈式存儲與CAP定理

  • 分佈式存儲文件系統

  • Mogilefs基本原理

  • Mogilefs實現

  • Nginx反向代理Tracker節點

#######################################################################


數據存儲的趨勢和大數據帶來的挑戰

       當下我們處在一個互聯網飛速發展的信息社會,在海量併發連接的驅動下每天所產生的數據量必然以幾何方式增長,隨着信息連接方式日益多樣化,數據存儲的結構也隨着發生了變化。在這樣的壓力下使得人們不得不重新審視大量數據的存儲所帶來的挑戰,例如:數據採集、數據存儲、數據搜索、數據共享、數據傳輸、數據分析、數據可視化等一系列問題。

傳統存儲在面對海量數據存儲表現出的力不從心已經是不爭的事實,例如:縱向擴展受陣列空間限制、橫向擴展受交換設備限制、節點受文件系統限制。

       然而分佈式存儲的出現在一定程度上有效的緩解了這一問題,之所以稱之爲緩解是因爲分佈式存儲在面對海量數據存儲時也並非十全十美毫無壓力,依然存在的難點與挑戰例如:節點間通信、數據存儲、數據空間平衡、容錯、文件系統支持等一系列問題仍處在不斷摸索和完善中。


分佈式存儲與CAP定理

       首先要說明的是一個完美分佈式系統有三個最重要的元素,他們分別是:

       一致性(Consistency):任何一個讀操作總是能讀取之前完成的寫操作。

       可用性(Availability):每次操作總是能夠在預定時間返回。

       分區容錯性(Partition Tolerance):在出現網絡分區(分佈式)的情況下,仍然能夠滿足一致性和可用性。

032623364.png

       2007年,正當所有科學家都在致力於CAP三元素並存的時候,Eric.Brewer教授站了出來並指出CAP永遠無法兼顧,只能根據具體應用來權衡和取捨,並且至多兩個元素可以共存,後來由兩位麻省理工學院的科學家證明此觀點是具有前瞻性的,由此形成Brewer的CAP定理

       正所謂魚和熊掌不可兼得,關注一致性就需要處理因系統不可用而帶來寫操作失敗的情況,反之關注可用性就無法保證每次都能讀取到最新的寫入操作。傳統關係型數據庫側重於CA,而非關係型鍵值數據庫則側重於AP

       對於大型站點,可用性(Availability)分區容錯性(Partition Tolerance)的優先級會高於一致性(Consistency),這裏並不是指完全捨棄一致性,而是通過其他手段實現數據的弱一致性,例如:用戶微博的瀏覽數和評論可以容忍相對長時間的不一致,幾乎不會影響用戶體驗,而股票價格的數據則異常敏感,即便是10秒鐘的數據不一致也無法容忍,爲了能更形象的瞭解所謂“各種一致性”需要進行一下內容的回顧。

       強一致性(ACID)在單機環境中,強一致性可以由數據庫的事務來保證;在分佈式環境中,強一致性很難做到,即便是做到也會因爲分佈式事物所帶來的性能低下,不適合在互聯網的環境中應用。

       弱一致性(包括最終一致性)系統不能保證後續訪問返回最新的值,在訪問到最新值之前這段時間稱之爲不一致窗口

       最終一致性:是弱一致性的一種特例,存儲系統保證如果對象有多次更新,在渡過不一致窗口之後必將放回最後更新的值。

       服務器的一致性N代表節點的個數;W代表更新的時候需要確認已經被更新的節點個數;R代表讀取數據需要的節點數量。

               W + R > N  ---->  強一致性(通常N=3,W=R=2)

               W=N,R=1   ---->  最佳讀

               W=1,R=N   ---->  最佳寫

               W + R <= N ---->  弱一致性


分佈式存儲文件系統

Google FilesystemGFS+MapReduce擅長處理單個大文件
Hadoop Distributed FilesystemGFS的山寨版+MapReduce,擅長處理單個大文件
ClusterFS擅長處理單個大文件
Taobao Filesystem擅長處理海量小文件
MogileFS擅長處理海量小文件
Ceph是一個 Linux PB級別的分佈式文件系統
MooseFS通用簡便,適用於研發能力不強的公司
Lustre一種平行分佈式文件系統


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:複製最小單位,文件屬性管理,定義文件存儲在不同設備上份數。

       流程圖如下:

032539679.png

       1、應用層發起GET請求到Nginx。

       2、Nginx根據負載均衡機制隨機代理到後臺Node one。

       3、Node one向從服務器發起查詢請求。

       4、從服務器返回查詢結果。

       5、Node one將查詢結果返回給Nginx。

       6、Nginx將查詢結果根據模塊轉換爲合理的url方位Node three。

       7、Node Three將文件內容通過http協議返回給Nginx。

       8、Nginx將結果返回給應用層的請求。


Mogilefs實現

      由於各角色和服務之間都是基於套接字通信,就服務本身來說沒有耦合性,所以可以使用少量機器運行多種服務角色,功能圖如下:

034037457.png

       1、通過Nginx+Keepalived實現高可用的負載均衡,通過upstream模塊可以有選擇性的轉發應用層的請求至後端tracker節點。

       2、DRBD+Corosync+Pacemaker的機制保證了Mysql的高可用,詳細配置請參閱博文:DAS之mysql高可用解決方案

       3、爲了進一步提升Mysql的性能引入從節點爲其分攤讀操作,從節點的數據可以根據具體業務規模來設定,如果使用數據庫代理進行讀寫分離,代理會成爲單點故障,則需要爲代理做高可用,另外Tracker節點支持手動爲其指定從節點,因此可以根據自己的喜好,Mysql代理和複製相關實現請參閱博文:Mysql複製及代理

##### Database節點
安裝mariadb
授權
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'mypass';
CREATE DATABASE mogilefs;
GRANT ALL ON mogilefs.* TO 'moguser'@'%' IDENTIFIED BY 'mogpass';
FLUSH PRIVILEGES;
##### Tracker節點(可以是所有節點)
安裝 mogilefs
修改配置文件如下
vim /etc/mogilefs/mogilefsd.conf        
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.1.241
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
conf_port = 7001
query_jobs = 100
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
service mogilefsd start     #啓動服務
ss -tanlp (LISTEN      0      128       192.168.1.241:7001  )
##### storage節點(可以是所有節點)
安裝 mogilefs
mkdir /mogdata/dev1 -pv     #創建設備目錄
chown -R mogilefs.mogilefs /mogdata/dev2/   #權限
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata          #目錄級別
service mogstored start
ss -tanlp (*:7500)
##### tracker節點添加storage節點和常用命令
mogadm check        #檢測節點
mogadm host list    #每個存儲節點稱爲一個host
mogadm host add 192.168.1.213 --ip=192.168.1.213 --ip=192.168.1.213 --status=alive      #添加第一個存儲節點
mogadm host add 192.168.1.242 --ip=192.168.1.242 --ip=192.168.1.242 --status=alive       #添加第一個存儲節點
mogadm host add 192.168.1.241 --ip=192.168.1.241 --ip=192.168.1.241 --status=alive      #添加第一個存儲節點
mogadm device add 192.168.1.213 1    #添加第一個設備,設備號唯一不能重名
mogadm device add 192.168.1.242 2   #添加第二個設備
mogadm device add 192.168.1.241 3   #添加第三個設備
mogadm check    #可以查看狀態
mogadm domain add files     #創建文件存儲域
mogadm domain add images    #創建圖片存儲域
mogadm domain list  #查看所有域
mogupload --trackers=192.168.1.241 --domain=files --key='/fstab' --file='/etc/fstab'     #上傳fstab文件,key爲'/fstab'
mogfileinfo --trackers=192.168.1.241 --domain=files --key='/fstab'    #根據key查看文件存放信息

註釋:mogupload工具是爲了測試,實際環境中上傳是由程序員在代碼中使用mogilefs的API進行交互。

042651555.png


Nginx反向代理Tracker節點

##### 配置Nginx
安裝tng
yum install pcre-devel -y
yum groupinstall "Development Tools" "Server Platform Development"
yum install libxslt-devel gd-devel lua-devel geoip-devel
tengine-1.5.1.tar.gz
nginx-mogilefs-module-master.zip    #mogilefs模塊需要打補丁
mkdir -pv /var/tmp/nginx/client     #模塊需要
unzip nginx-mogilefs-module-master.zip
useradd -r nginx
./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/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 \
  --enable-mods-shared=all \
  --add-module=/nginx-mogilefs-module-master
make && make install
vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
. !$
提供腳本.....
配置nginx
vim /etc/nginx/nginx.cfg
upstream trackers {
        server 192.168.1.242:7001 weight=1;
        server 192.168.1.213:7001 weight=1;
        server 192.168.1.241:7001 backup;
        check interval=3000 rise=2 fall=5 timeout=1000;
        check_http_send "GET / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
   }
location /jpg/ {
        mogilefs_tracker trackers;
        mogilefs_domain images;
        mogilefs_methods GET;
        mogilefs_pass {
            proxy_pass $mogilefs_path;
            proxy_hide_header Content-Type;
            proxy_buffering off;
                }
       }
##### 配置keepalived
安裝keepalived
vim /etc/keepalived/keepalived.conf  # backup  priority 99
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LTT
}
vrrp_script chk_nginx {
   script "killall -0 nginx"
   interval 1
   weight -2
   fall 2
   rise 1
}
vrrp_instance IN_1 {
    state MASTER
    interface eth0
    virtual_router_id 22
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aaaa
    }
    virtual_ipaddress {
        192.168.1.222
    }
   track_script {
    chk_nginx
}
}


查看負載節點:

045554770.png


模擬GET方法測試Nginx_mogilefs模塊:

045933806.png

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