一蚁趁、 數(shù)據(jù)庫從單擊到分布式會面臨的問題
思考方向: 單機的CRUD擴展到多機后面臨的問題瘦真、原來依賴的單機數(shù)據(jù)庫特性不在可用(自增id忠蝗、事務處理...)
如:基本的sql語句select <columnName1>, <columnName2>.. from <tablename> where xx join <tablename2> on <condition> order by yy 其邏輯表分布在不同數(shù)據(jù)庫不同表的時候逛绵,需要進行的各種處理
- 垂直墙歪、水平拆分
a. 單機的ACID被打破,事務難搞
b. join操作變得比較困難舍悯、外鍵關聯(lián)
c. 單庫的自增序列生成唯一ID需要自己實現(xiàn)
d. 邏輯表的查詢需要跨庫 - CAP / Base
a. CAP
i. Consistency 一致性
ii. Availability 可用性
iii. Partition-Tolerance 分區(qū)容忍性
b. Base模型
i. Basically Available 基本可用航棱,允許分區(qū)失敗
ii. Soft state 軟狀態(tài),接受一段時間的狀態(tài)不同步
iii. Eventally consistent 最終一致萌衬,保證最終數(shù)據(jù)的狀態(tài)是一致的 - 分表分庫后的查詢
a. 跨庫join
i. 把數(shù)據(jù)庫的join分成多次數(shù)據(jù)庫操作饮醇,然后在應用層合并數(shù)據(jù)
ii. 數(shù)據(jù)冗余,把原來需要join的操作變成單表查詢秕豫,需要結(jié)合具體的業(yè)務場景做冗余處理
iii. 借助外部系統(tǒng)朴艰,如搜索引擎
b. 排序观蓄、函數(shù)處理、聚合操作
c. 非排序分頁: 等比/等步長獲取
d. 排序后分頁: 需要獲取2倍頁號的數(shù)據(jù)量
二祠墅、數(shù)據(jù)訪問層的設計
分布式數(shù)據(jù)庫中間件操作執(zhí)行流程
主要圍繞上圖所示的6個步驟侮穿,除了SQL執(zhí)行外其他5個步驟分布式數(shù)據(jù)訪問層介入
- sql解析得到sql中關鍵信息,如表名毁嗦、字段亲茅、where條件等
- 然后根據(jù)參數(shù)和規(guī)則處理確定目標數(shù)據(jù)源連接
a. 固定hash算法
b. 一致性hash算法 + 虛擬節(jié)點
c. 映射表與規(guī)則自定義計算 - 一般原則是分庫后盡可能避免跨庫查詢, 但是在必要的時候還是需要進行sql改寫的狗准,比如一些聚合查詢分表后的邏輯表
- 數(shù)據(jù)源選擇克锣, 一寫多讀 / 多寫多讀的情況選擇哪個數(shù)據(jù)庫連接
- Sql執(zhí)行
- 結(jié)果集返回并合并
后續(xù)深入:
- 分布式事務 XA、Paxos協(xié)議
- 使用并研究ctrip dal的實現(xiàn)思路
- 一致性hash算法實現(xiàn)
- java開源分布式數(shù)據(jù)中間件
- 數(shù)據(jù)庫拆分案例驶俊,拆分方式以及灰度過渡處理方式