分佈式系統:
1、系統的各組件分佈於網絡上多個計算機;
2、各組件彼此之間僅僅通過消息傳遞來通信並協調行動;
分佈式系統存在意義:
1、向上擴展的性價比越來越低;
2、單機擴展存在性能上升臨界點;
3、出於穩定性及可用性考慮,單機會存在多方面的問題;
計算機組成:CPU、內存、IO
多CPU:
多線程編程,(線程間共享進程的資源)
互不通信的線程模型
基於共享容器協同工作的模型
通過事件協調的多線程模型
多進程模型
網絡IO:
多進程:每個進程響應一個請求;
多線程、多進程:每進程生成多個線程,每線程響應一個用戶請求
多線程:每線程直接響應多個請求
基於socket實現網絡通信開發,其實現方式:
BIO:Blocking IO:一個進程或一個線程處理一個請求;
NIO:Nonblocking IO:基於事件驅動(epoll)思想,採用Reactor模式
AIO:基於事件驅動思想,採用Proactor模式
如何把應用從單機擴展至多機?
輸入設備的變化?
輸出設備的變化?
控制器的變化?
實現的模式:
透明代理
lvs的nat
haproxy, nginx
旁路代理
lvs的dr、tun
名稱服務
規則服務
Master/slave機制
運算器的變化:
存儲器的變化?
分佈式系統實現的難點:
缺乏全局時鐘?
面對故障時的獨立性
處理單點故障
事務處理
ACID
2PC、BASE、CAP、Paxos
大型網站站點的架構演進方式:
LAMT, LNMT
應用從資源佔用的角度分兩類:
CPU Bound
IO Bound: IO密集型
session sticky
ip based
cookie based
session replication
session server
引用MySQL主從面臨的問題:
1、數據複製的問題
2、應用選擇數據源的問題
引入緩存:
1、頁面緩存
varnish, squid
2、數據緩存
key-value store: memcached
主庫寫操作壓力:數據庫拆分
垂直拆分:把數據庫中不同的業務的數據拆分到不同的數據庫服務器中
水平拆分:把一個單獨的表中的數據拆分到多個不同的數據庫服務器上
NoSQL: 非關係數據
文檔數據庫
列式數據庫
... ...
DFS: 非結構化數據
TFS, MogileFS: 適用於海量小文件
HDFS, GFS:少量大文件
應用拆分:
根據業務特性拆分
根據用戶拆分:
用戶註冊
用戶登錄
用戶信息維護
根據對底層應用的調用進行拆分
異步:解耦
消息中間件:在分佈式系統中,完成消息發送和接收的基礎性軟件;
MOM:Message-oriented middleware
RabbitMQ, ActiveMQ, ZMQ
數據訪問層:
拆分:
垂直拆分:
單機的ACID保證被打破:要麼放棄事務,要麼引入分佈式事務;
一些Join查詢操作將變得非常困難:
原來依賴於外鍵實現的約束將無從保證;
水平拆分:
單機ACID保證被打破;
一些Join查詢操作將變得非常困難:
原來依賴於外鍵實現的約束將無從保證;
自增序列的ID號的產生會有影響;
針對單張表的查詢很有可能要跨庫操作;
分佈式事務的實現:
事務:事務參與者、支持事務的服務器、資源服務器、事務管理器
分佈式事務的模型及規範:
X/Open:XA(分佈式事務規範)
X/Open DTP: 定義了三個組件
AP: 應用程序,即使用DTP模型的程序
RM:資源管理器,即DBMS系統
TM:事務管理器,負責協調和管理管理條例,提供給AP應用程序編程接口並管理資源管理器
2PC:兩段式提交
Two Phase Commitment Procotol
CAP:2000年7月,Eric Brewer
一致性
可用性
網絡分區容錯性
任何一種分佈式系統最多隻能同時滿足上述三項中的兩項;因此,分佈式系統的目標:
AP:放棄C;大多數他布式系統都選擇此項;
CA:放棄P;
CP:
分佈式系統的目標:加強A和P,在C上進行妥協;
BASE模型:
BA:Basically Availibale
S:Soft state: 接受一段時間內的狀態不同步;
E:Eventually Consistent: 最終一致性;
回顧:
分佈式系統理論基礎,大型站點演化過程
CAP:
AP,C
BASE:
ACID
N, R, W:R+W<=N
MySQL主從複製:
W=N, R=1
Vector Clock
兩段式提交:分佈式事務協議
2PC, Paxos
Paxos協議的使用有一個前提:不存在拜占庭將軍問題
通訊網絡不靠譜,無法完成可靠的消息傳輸;
Proposers:
Acceptors:
Leaners:
Proposal: 議案,Value: 決議
LastTried[p]:
PreviousVote[p]:
NextBallot[p]:
LastVote[b,v]:
Distributed FS
分佈式存儲:不是文件系統,不遵循POSIX規範
分佈式文件系統
FUSE
Ceph
常見的分佈式文件系統:
GlusterFS:適用於存儲少量大文件
MogileFS:適用存儲海量小文件
使用MySQL存儲元數據
FastDFS
MooseFS:
Ceph:內核級別,支持PB級別存儲的分佈式文件系統;
HDFS:Lucene, MapReduce + HDFS = Hadoop (平臺), HBase(NoSQL)
GFS:Google FS
MapReduce
Bigtable
TFS: 適用於存儲海量小文件
Lustre: Oracle的開源的分佈式文件
MogileFS:
開源的分佈式存儲,由LiveJournal旗下的Danga Interactive;
memcached, MogileFS, Perlbal
MogileFS的特性:
1、用戶空間文件系統:無須特殊的核心組件;
2、無單點失敗:
3、自動文件複製
4、比“RAID”好多了
5、傳輸中立,無特殊協議(HTTP,NFS)
6、命名空間較簡單:每個文件對應於一個key;用於domain定義名稱空間;
7、不依賴於任何共享存儲設備;
MogileFS的組件:
Tracker:Mogilefsd進程;其實現的功能包括Replication,Deletion, Query, Monitor等等;
Storage Nodes: mogstored進程;文件實際存儲的位置,其實質上是一個http服務器,基於WebDAV模式工作,能完成文件創建、刪除、重命名等操作;
MySQL節點:用於爲tracker存儲元數據信息;mogilefs的名稱空間及文件名;
tracker: mogilefsd
storage nodes: mogstored
perl: perl模塊
cpan:
cpan> install module::name
離線安裝:
編譯:
# make Makefile.PL
# make
# make test
# make install
rpm包:
安裝tracker:
1、安裝相關的包:
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
2、授權數據庫用戶,並初始mysql數據庫
# mogdbsetup
3、修改配置文件
db_dsn = DBI:mysql:DBNAME:host=172.16.100.7
4、啓動mogilefsd進程
安裝mogstord:
1、安裝相關的包
MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm perl-IO-AIO
2、準備存儲設備
掛載至某路徑下,確認此路徑下存在文件devN
此路徑的屬主和屬組爲mogilefs.mogilefs
3、修改配置文件/etc/mogilefs/mogstored.conf
docRoot=
前面的掛載路徑;
配置mogielfs:
1、向tracker添加各mogstored主機
mogadm --trackers=TRACKER_NODE host add
2、向tracker添加各設備
mogadm --trackers=TRACKER_NODE device add
3、爲tracker定義名稱空間domain
mogadm --trackers=TRACKER_NODE domain add
4、爲domain添加一個或多個class
mogadm --trackers=TRACKER_NODE class add
可同時副本的最少個數;
上傳文件:
mogupload
查看文件信息:
mogfileinfo
http://www.magedu.com/images/bg.png
WebDAV:
回顧:
CAP:
AP, C
BASE:
最終一致性
MogileFS:
分佈式文件系統:GluserFS, HDFS, MooseFS, Ceph, FastDFS, MogileFS, Lustre, TFS
少量大文件
海量小文件
元數據的存儲位置:
有專用元數據節點:HDFS, MogileFS
元專用元數據節點:GlusterFS, Ceph
Client -->API(program) --> Tracker --> Mogstored
php, mogilefs
Client --> Nginx (mogilefs) --> Tracker --> Mogstored
domain: 名稱空間
每個文件通過key來標記,key在當前名稱空間內必須惟一;
domain:定義名稱空間
不同的domain內,其key可以相同;
同一個domain內,key不能相同;
class: 複製單元
文件不是複製單元
安裝php的mogilefs擴展
libxml2-devel
neon-devel
nginx_mogilefs:
GET
GlusterFS:
TCP/IP
特性:
擴展性
高可用性
全局統一的名稱空間
彈性哈希計算
彈性卷管理
基於標準協議
NFS, CIFS, FTP, HTTP, Gluster
設計目標:
彈性存儲系統:
線性橫向擴展:
消除了元數據服務器
高效地數據分佈
通過完全分佈式架構的並行化獲得最大化的性能
高可靠性:
技術的特點:
多個Brick Server可以通過客戶端上vol manager或者是存儲網關組織成集羣:
Stride(RIAD0)
Replication(RAID1)
DHT(分佈式哈希)
FUSE: Filesystem in User Space
Translators:
有多種類型的translator:
Cluster: 存儲集羣分佈,Stride, Replication, DHT
Debug: 跟蹤GlusterFS內部函數和系統調用,並輸出調試信息
Encrption:
Features:
Mgmt: 彈性卷管理
Mount: FUSE接口的實現
Nfs: 內置的NFS服務器
Performance: 性能優化
Protocol: GlusreFS協議
Storage: