1. 程式人生 > >中介軟體-資料訪問層

中介軟體-資料訪問層

單機情況下資料庫在不同語言,不同平臺都有各自資料庫訪問元件,各種類似odbc、jdbc的封裝以及orm的處理都已經相當成熟。

資料庫壓力越來越大,處理方法是優化應用,減少壓力。二是對資料庫進行讀寫分離,加入搜尋引擎和快取等,進而採用拆分的方法

垂直拆分(業務邏輯拆分)

單機acid受影響,要麼放棄事物,要麼引入分散式事物

join操作受影響,因為在兩個庫中了

靠外來鍵進行約束的場景會收到影響

水平拆分

前三條和垂直拆分一樣

依賴單庫的自增序列生成唯一id受影響

單個邏輯意義上的表查詢要跨庫

上述只是部分影響,其它例如儲存過程,觸發器等都需要改寫才能完成相應的工作

x/open組織,現在的the open group指定的分散式事物規範

分散式事物規範:XA

分散式事物處理模型:DTP,它由三個元件,ap應用程式,rm資源管理器,tm事物管理器

事物管理器向事物指定標識,監控程序,負責事物的完成和失敗。事物分支標識xid,兩階段回滾需要用到xid

ap可以通過native api呼叫rm,不實現事物支援,也可以通過xa api進行事物呼叫,ap和事物管理器通過tx介面,tm和rm通過xa介面訪問

可以選擇是否實現兩階段提交,兩階段提交之間有準備過程,tm可以根據日誌回滾,但是由於tm的自身穩定性,網路問題,以及兩階段帶來的互動次數增多以及引入tm的開銷,可以考慮是否開啟兩階段提交

大型網站一致性理論基礎:cap

c: consistency 資料寫入成功後所有的節點都會同時看到這個新資料

a:無論成功還是失敗都要有響應

p:部分失效無論系統還是資料的時候系統還能正常雲狀

但是cap不能兼得,要有取捨,ca放棄p這正是單機資料庫的選擇,ap放棄c這正式很多分散式系統的選擇nosql系統就是這樣

一般的外面都是首先滿足ap最後追求c

這就是所謂base模型

basically available:基本可用允許分割槽失敗

soft state:軟狀態,允許一段時間的資料不統一

eventually consistency:最終一致

比兩階段提交更加輕量級的paxos協議

paxos的前提是不能有拜占庭將軍問題

叢集內資料一致性的演算法:quorum和 vector clock

第二種在同一份資料的每一次修改後面加上修改者和時間戳,因為比如四個人聚餐的問題,a說週一,b和c商量說週三可以,後來b和d說週四可以,a通過從c,d返回的資料確定時間,但是不知道先後順序無法判斷,所以要加上時間戳,實現最終的時間一致性

多機的自增問題

oracle 提供對sequence的支援,mysql有auto increment,但是在多機環境下這是個難題

怎麼保證自增序列的一致性和連續性

一個方案:把id集中管理,每次取用

效能問題:遠端取用效能損耗

生成器穩定性

儲存問題

兩種實現:1、中心id生成器 2、內嵌在應用層的id生成邏輯,在id生成的時候請求id

跨庫join

解決方案:1、在應用層把join分開,2、資料冗餘3、藉助外部系統如搜尋引擎解決一些跨庫問題

外來鍵約束:

比艱難,不能完全依賴庫之前的功能了,要求分庫後庫的內容是內聚的,否則只能靠應用層的判斷和容錯了

分表後的資料查詢問題,一般在應用層進行相應的排序,函式處理,求平均值,排序分頁等

資料層的整理流程

sql解析,規則處理,sql改寫,資料來源選擇,sql執行,返回處理合並