數(shù)據(jù)存儲重要性:
數(shù)據(jù)是企業(yè)最重要的財產(chǎn);
數(shù)據(jù)可靠性是企業(yè)的命根,一定要保證。
單機(jī)存儲原理:
存儲引擎:存儲系統(tǒng)的發(fā)動機(jī),它決定存儲系統(tǒng)的功能和性能;
引擎類型:哈希存儲引擎、b樹存儲引擎、lsm存儲引擎
哈希存儲引擎:基于哈希表結(jié)構(gòu) :數(shù)組 鏈表;支持createupdatedelete隨機(jī)read
b樹存儲引擎:基于b tree實現(xiàn),支持單條記錄的curd,支持順序查找。rdbms使用較多。
lsm樹存儲引擎:對數(shù)據(jù)的修改增量保存在內(nèi)存,達(dá)到一定條件再批量更新到磁盤;優(yōu)勢在于批量寫入;劣勢在于讀取需合并磁盤和內(nèi)存;
避免內(nèi)存數(shù)據(jù)丟失:修改操作寫入到commitlog日志。
數(shù)據(jù)模型:
文件:以目錄樹組織,如linux,mac,windows;
關(guān)系型:每個關(guān)系是一個表格,多行組成,每行多列;
鍵值(key-value):memcached, tokey, redis;
列存儲型:casadra, hbase;
圖形數(shù)據(jù)庫:neo4j, infogrid, infinite graph
文檔型:mongodb, couchdb
事務(wù)與并發(fā)控制:
事務(wù)4個基本屬性:acid 原子性、一致性、隔離性、持久性
并發(fā)控制:
鎖粒度:process->db->table->row
提供read并發(fā),read不加鎖:寫時復(fù)制、mvcc
數(shù)據(jù)恢復(fù):通過操作日志
多機(jī)存儲原理:
單機(jī)存儲原理在多機(jī)存儲仍然可用;多級存儲基于單機(jī)存儲;
數(shù)據(jù)分布:
分布在多個節(jié)點,節(jié)點間負(fù)載均衡;
分布方式:
靜態(tài):取模、uid2;
動態(tài):一致性hash,數(shù)據(jù)飄移問題(a節(jié)點更新前出現(xiàn)故障,更新遷移到b節(jié)點后a節(jié)點又恢復(fù));
復(fù)制:
分布式存儲多個副本;保證高可靠和高可用;commit log。
故障檢測:
心跳機(jī)制、數(shù)據(jù)遷移、故障恢復(fù);
flp定理與設(shè)計:
flp impossiblity(flp不可能性):
在異步消息通信場景,即使只有一個進(jìn)程失敗,沒有任何方法能保證非失敗進(jìn)程達(dá)到一致性。
cap定理與設(shè)計:
cap:一致性(consistency)、可用性(availabilty)、分區(qū)容忍性(tolerance of network partition)。
一致性和可用性需要折中權(quán)衡
分布式存儲系統(tǒng)需要能夠自動容錯,也就是說分區(qū)容忍性需要保證。
2pc(two phase commit)協(xié)議與設(shè)計:
用于分布式事務(wù);
兩類節(jié)點組成:
協(xié)調(diào)者(1個);
事務(wù)參與者(多個);
分兩階段:
請求階段:協(xié)調(diào)者通知參與者準(zhǔn)備提交或取消事務(wù),所有參與者都需要表決同意或者不同意。
提交階段:
收到參與者所有決策后,協(xié)調(diào)者進(jìn)行決策(提交或取消);
通知參與者執(zhí)行操作,所有參與者都同意就提交,否則取消;
參與者收到協(xié)調(diào)者的通知后執(zhí)行操作。
2pc協(xié)議是阻塞式:
事務(wù)參與者可能發(fā)生故障
–設(shè)置超時時間;
協(xié)議者可能發(fā)生故障
–日志記錄、備用協(xié)調(diào)者
應(yīng)用:交易訂單 等;
paxos協(xié)議與設(shè)計:
作用:
解決節(jié)點間的一致性問題;
主節(jié)點宕掉,則選擇新節(jié)點;
主節(jié)點常以操作日志的形式同步備節(jié)點。
分兩種角色:提議者(prpposer)、接受者(acceptor);
執(zhí)行步驟:
批準(zhǔn):proposer發(fā)送accept消息給accepter要求接受某個提議者;
確認(rèn):超一半的accepter接受,則提議值生效,proposer發(fā)送acknowledge消息通知所有的accepter提議生效。
與2pc比較::
2pc協(xié)議保證多個數(shù)據(jù)分片上操作的原子性;
paxos協(xié)議保證一個數(shù)據(jù)分片多個副本之間的數(shù)據(jù)一致性;
paxos協(xié)議用法:
實現(xiàn)全局的鎖服務(wù)或者命名和配置服務(wù);
—apache zookeeper
將用戶數(shù)據(jù)復(fù)制到多個數(shù)據(jù)中心;
—google megastore
數(shù)據(jù)存儲層冗余:
多個副本,實現(xiàn)訪問的高可用性。
如何實現(xiàn):
數(shù)據(jù)復(fù)制:
基于日志;
master-slave:mysqlmongodb
replic set:mongodb
雙寫:
存儲層多主對等結(jié)構(gòu);比較靈活,但數(shù)據(jù)模塊層成本較高;
數(shù)據(jù)備份:
冷備份:
定期將數(shù)據(jù)復(fù)制到某個存儲介質(zhì),是傳統(tǒng)的數(shù)據(jù)保護(hù)手段;
優(yōu)點:簡單、廉價,技術(shù)難度低;
缺點:定期存在數(shù)據(jù)不一致;恢復(fù)數(shù)據(jù)時間長;
熱備份:
online備份;提供更好的高可用性;
異步熱備份:
從主存儲寫入即返回給應(yīng)用端,由存儲系統(tǒng)異步寫入其他副本;
同步熱備份:
多份數(shù)據(jù)副本寫入同步完成,無主從之分;
為提高性能,應(yīng)用程序并發(fā)寫入;
響應(yīng)延遲是最慢的那臺服務(wù)器;
數(shù)據(jù)存儲層失效轉(zhuǎn)移機(jī)制:
失效確認(rèn):是否宕機(jī)、心跳;
訪問轉(zhuǎn)移:訪問路由到非宕機(jī)機(jī)器;存儲數(shù)據(jù)完全一致;
數(shù)據(jù)恢復(fù):主從、日志;