什麼是分布式存儲:
分布式存儲系統,是将資料分散存儲在多台獨立的裝置上。傳統的網絡存儲系統采用集中的存儲伺服器存放所有資料,存儲伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式網絡存儲系統采用可擴充的系統結構,利用多台存儲伺服器分擔存儲負荷,利用位置伺服器定位存儲資訊,它不但提高了系統的可靠性、可用性和存取效率,還易于擴充。
分布式檔案系統設計目标:
通路透明
位置透明
并發透明
失效透明
硬體透明
可擴充性
複制透明
遷移透明
CAP理論:
C:Consistency(一緻性) 任何一個讀操作總是能夠讀取之前完成的寫操作。
A:Availability(可用性) 每一次操作總是能夠在确定的時間傳回。
P:Partition Tolerance (分區容錯性) 在出現網絡分區的情況下,仍然能夠滿足一緻性和可用性。
<a href="http://s3.51cto.com/wyfs02/M00/47/55/wKioL1P4hvXjxLBRAAGPSBz30a0268.jpg" target="_blank"></a>
所有科學家都在緻力于CAP三元素并存的時候,Eric.Brewer教授指出CAP永遠無法兼顧,隻能根據具體應用來權衡和取舍,并且至多兩個元素可以共存,後來由兩位麻省理工學院的科學家證明此觀點是具有前瞻性的,由此形成Brewer的CAP定理。
正所謂魚和熊掌不可兼得,關注一緻性就需要處理因系統不可用而帶來寫操作失敗的情況,反之關注可用性就無法保證每次都能讀取到最新的寫入操作。傳統關系型資料庫側重于CA,而非關系型鍵值資料庫則側重于AP。
強一緻性(ACID):在單機環境中,強一緻性可以由資料庫的事務來保證;在分布式環境中,強一緻性很難做到,即便是做到也會因為分布式事物所帶來的性能低下,不适合在網際網路的環境中應用。
弱一緻性(包括最終一緻性):系統不能保證後續通路傳回最新的值,在通路到最新值之前這段時間稱之為不一緻視窗。
最終一緻性:是弱一緻性的一種特例,存儲系統保證如果對象有多次更新,在渡過不一緻視窗之後必将放回最後更新的值。
伺服器的一緻性:N代表節點的個數;W代表更新的時候需要确認已經被更新的節點個數;R代表讀取資料需要的節點數量。
W + R > N ----> 強一緻性(通常N=3,W=R=2)
W=N,R=1 ----> 最佳讀
W=1,R=N ----> 最佳寫
W + R <= N ----> 弱一緻性
分布式存儲檔案系統
Google Filesystem
GFS擅長處理單個大檔案
GFS+MapReduce (程式設計模型-運作架構-API)可以實作程式切割到多節點運作,實作分布式處理
Hadoop Distributed Filesystem
根據GFS思想開發的,擅長處理單個大檔案
ClusterFS
擅長處理單個大檔案
Taobao Filesystem
淘寶開源的檔案系統,擅長處理海量小檔案,适用于大規模場景。
MogileFS
是一個高性能的分布式存儲,擅長處理海量小檔案
Ceph
是一個 Linux PB級别的分布式檔案系統,測試中
MooseFS
分布式檔案系統,相容POSIX(FUSE),可以直接挂載使用,當節點多,并發量大環境中,可擴充性差,性能一般。
Lustre
一種平行分布式檔案系統
Mogilefs工作原理:
MogileFS是一個開源的分布式檔案系統。其特性包括:應用層的元件、無單點故障、自動檔案複制主要由mogilefsd和mogstored兩個程式組成。前者即是mogilefsd的tracker,它将一些全局資訊儲存在資料庫裡,例如站點domain,class,host等。後者即是存儲節點(store node),它其實是個HTTP Daemon,預設偵聽在7500端口,接受用戶端的檔案備份請求。在安裝完後,要運作mogadm工具将所有的store node注冊到mogilefsd的資料庫裡,mogilefsd會對這些節點進行管理和監控。
tracker節點:借助資料庫儲存各節點檔案的中繼資料資訊儲存每個域中所有鍵的存儲位置分布,友善檢索定位資料位置的同時監控各節點,告訴用戶端存儲區位置并指揮storage節點複制資料副本,程序名為mogilefsd(7001)。
database節點:為tracker節點提供資料存取服務。
storage節點:将指定域中的鍵轉換為其特有的檔案名存儲在指定的裝置檔案中,轉換後的檔案名為值,storage節點自動維護鍵值的對應關系,storage節點由于使用http進行資料傳輸,是以依賴于perlbal,storage節點前端可以使用nginx進行反向代理,但需要安裝nginx-mogilefs-module-master子產品進行名稱轉換。
Domain:一個域中的鍵值是惟一的,一個MogileFS可以有多個域,域可以用來存儲不同應用類型的資料的容器。
Host:每一個存儲節點稱為一個主機,一個主機上可以有多個儲存設備(單獨的硬碟),每個裝置都有ID号,Domain+Fid用來定位檔案。
Class:複制最小機關,檔案屬性管理,定義檔案存儲在不同裝置上份數。
實驗一、使用MySQL+MogileFS建構一個分布式存儲
實驗環境RHEL6.4
<a href="http://s3.51cto.com/wyfs02/M02/47/58/wKiom1P5QbOTfbOmAAFYgqz4_cs687.jpg" target="_blank"></a>
官方的介紹網站:http://www.danga.com/mogilefs/
安裝Perl子產品:
App::cpanminus
MogileFS::Server
MogileFS::Utils
IO::AIO
IO::WrapTie
Danga::Socket
我們可以使用CPAN工具安裝也可到http://search.cpan.org/ 網站上下載下傳安裝,如安裝Sys::Syscall子產品。
#wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
# tar zxvf Sys-Syscall-0.23.tar.gz
# cd Sys-Syscall-0.23
# perl Makefile.PL
# make
# make install
這裡我們為了簡便使用CPAN工具安裝
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
cpan -i App::cpanminus
cpan -i MogileFS::Server
cpan -i MogileFS::Utils
cpan -i IO::AIO
cpan -i IO::WrapTie
cpan -i Danga::Socket
注:存儲節點伺服器不用安裝DBD::mysql子產品
提供檔案夾,複制配置檔案(配置檔案模版可以在官網擷取)
mkdir /etc/mogilefs
cp /home/mogstored.conf mogilefsd.conf /etc/mogilefs/
以上操作每個節點都相同。
admin1:
編輯配置檔案/etc/mogilefs/mogilefsd.conf
<a href="http://s3.51cto.com/wyfs02/M00/47/5B/wKioL1P5eMqDP9fdAAPzUwSxiH0642.jpg" target="_blank"></a>
為mogilefsd程式提供服務啟動腳本(略)
安裝MySQL(略),建立資料庫,添加管理使用者。
create database mogfsdb;
grant all privileges on mogfsdb.* to 'moguser'@'127.0.0.1' identified by '123456';
grant all privileges on mogfsdb.* to 'moguser'@'192.168.18.202' identified by '123456';
flush privileges;
初始化資料庫,建立mogilefs使用者,建立pid檔案目錄并賦予權限,然後啟動服務。
mogdbsetup --dbhost='127.0.0.1' --dbname=mogfsdb --dbuser=moguser --dbpass=123456 --type=MySQL
useradd -r mogilefs
mkdir /var/run/mogilefsd/ -p
chown -R mogilefs.mogilefs /var/run/mogilefsd/
/etc/init.d/mogilefsd start
檢視是否啟動成功,端口是否監聽。
<a href="http://s3.51cto.com/wyfs02/M00/47/5B/wKioL1P5gSzSYYDMAAHNguQzCGY477.jpg" target="_blank"></a>
接下來配置mogstored
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mystore
為mogstored提供服務啟動腳本(略)
分區,格式化,挂載檔案系統,賦予權限。
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir /mystore/dev1 -pv
mount /dev/sdb1 /mystore/dev1
chown -R mogilefs.mogilefs /mystore/dev1
啟動服務
service mogstored start
admin2和admin3配置和admin1都差不多,拷貝admin1的配置檔案稍作修改即可(過程略)
由于admin3不用配tracker,是以隻需啟動mogstored服務就可以了。
添加存儲節點主機,添加儲存設備。
mogadm host add admin1 --ip=192.168.18.201 --status=alive --port=7500
mogadm host add admin2 --ip=192.168.18.202 --status=alive --port=7500
mogadm host add admin3 --ip=192.168.18.203 --status=alive --port=7500
mogadm device add admin1 1 --status=alive
mogadm device add admin2 2 --status=alive
mogadm device add admin2 5 --status=alive
mogadm device add admin3 3 --status=alive
mogadm device add admin3 4 --status=alive
檢視檢測狀态
<a href="http://s3.51cto.com/wyfs02/M00/47/5D/wKioL1P5riTzZKgtAAKu3Fqhgog565.jpg" target="_blank"></a>
檢視裝置清單
<a href="http://s3.51cto.com/wyfs02/M01/47/5C/wKiom1P5rmSh3MKKAAKTw1qJ8yA745.jpg" target="_blank"></a>
添加兩個域(domain)
mogadm domain add files
mogadm domain add images
<a href="http://s3.51cto.com/wyfs02/M01/47/5D/wKioL1P5sQGR3-XvAAE0AS1FYQA281.jpg" target="_blank"></a>
上傳檔案
mogupload --trackers=192.168.18.201 --domain=files --key='rc.sysinit' --file='/etc/rc.d/rc.sysinit'
mogupload --trackers=192.168.18.202 --domain=images --key='hu.jpg' --file='/root/Desktop/hu.jpg'
跟蹤檔案資訊
mogfileinfo --trackers=192.168.18.201 --domain=images --key='hu.jpg'
<a href="http://s3.51cto.com/wyfs02/M02/47/5E/wKioL1P50K6TFC-YAAIRtqD19CY012.jpg" target="_blank">。</a>
我們從以上三個路徑中,随便挑一個通路。
<a href="http://s3.51cto.com/wyfs02/M02/47/5F/wKioL1P50dmClylTAAMicaMZ6Uo584.jpg" target="_blank"></a>
實驗二、使用Nginx代理請求至tackers,實作通過鍵就可以通路到檔案。
<a href="http://s3.51cto.com/wyfs02/M00/47/5D/wKiom1P51VagAKzSAAFJKbqqxqE474.jpg" target="_blank"></a>
要實作Nginx代理tackers,需要在編譯Nginx的時候加入第三方子產品nginx_mogilefs_module.
下載下傳位址:http://wiki.nginx.org/3rdPartyModules
編譯Nginx
./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=/home/nginx_mogilefs_module-1.0.4
make && make install
編輯/etc/nginx/nginx.conf
定義後端tracker,實作負載均衡。
upstream trackers {
server 192.168.18.201:7001;
server 192.168.18.202:7001;
}
定義location代理至domain
location /files/ {
mogilefs_tracker trackers;
mogilefs_domain files;
mogilefs_methods GET;
mogilefs_noverify on;
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
location /images/ {
mogilefs_domain images;
配置完成後,啟動nginx。
上傳檔案到mogilefs。
mogupload --trackers=192.168.18.202 --domain=images --key='qier.jpg' --file='/root/Desktop/qier.jpg'
mogupload --trackers=192.168.18.202 --domain=files --key='test.html' --file='test.html'
然後使用浏覽器通路nginx伺服器,location後面跟key。
<a href="http://s3.51cto.com/wyfs02/M01/47/5F/wKiom1P559fjPZIhAACeu3LIhNQ730.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/47/60/wKioL1P56a3zR8ShAAIHq4WAYUc263.jpg" target="_blank"></a>
實驗成功!
接下來補充一下mogadm指令的額外指令。
mogadm slave //由于檔案中繼資料資訊是儲存在MySQL中的,每次請求檔案需要讀取MySQL一旦請求量太大,MySQL必定會成為性能瓶頸,這時我們要給MySQL做主從,這個指令就是用來添加從節點的,可以實作tracker與主從架構的MySQL互動時,實作讀寫分離。
mogadm fsck //檔案系統檢測,一般不要使用,除非叢集意外斷電,在上線時執行。
mogadm rebalance // 重新平衡,當資料出現熱區時使用,在執行之前需要定義平衡政策。
mogadm rebalance start // 啟動平衡政策。
mogadm rebalance policy //定義平衡政策。
mogadm rebalance test //用于測試是否出現資料不平衡的問題。
mogadm settings //定義mogilefs工作屬性。
mogadm class modify <domain> <class> --mindevcount= //定義檔案最小的副本份數
再總結兩個技巧,這我在寫這篇博文做實驗碰到的問題。
技巧一、MogileFS 中怎麼删除主機
在機器壞了的時候,就會給這些标壞掉了,但還是不能删除.下面是我建議的方式,當你給所有的硬碟裝置标成不可用後,你然後在 fsck ,這樣會同步檔案到其它的機器同樣的份數.接着為了确認進入 MySQL 中查一下。
<code>select</code> <code>count</code><code>(*) </code><code>from</code> <code>file_on </code><code>where</code> <code>devid=11;</code>
看看是不是去掉的硬碟裝置,真的沒有檔案的記錄在上面了.接着我們就可以安全的删除這個裝置了.
<code>delete</code> <code>from</code> <code>device </code><code>where</code> <code>devid=11;</code>
當對那個主機上的硬碟操作完時,你就可以删除你的主機了.
技巧二、MogileFS 複制不正常,發現檔案少于指定的份數解決方法
在安裝最新的 MogileFS 時,會發現測試的時候,怎麼樣複制檔案的過程都不正常.使用 telnet 到 7001 中使用 !watch 來檢視時會不斷的報下面的錯(詳細使用見 MogileFS 進階排錯).
使用 MogileFS 的 DEBUG 模式跟這個問題,是由于 Sys::Syscall 這個子產品更新成 0.25 的新版本引起的.
我們可以使用下面的指令來檢查目前的版本
如果發現是顯示上面的 0.25 就一定會出問題.建議退回到 0.23 就不會在出問題了.是以建議大家在安裝完 MogileFS 後,先退回這個子產品到 0.23.
筆者花了一整天時間整理出來的,終于可以完結了。
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1543856