資料庫中介軟體cobar調研筆記

2021-08-16 14:13:45 字數 3930 閱讀 5665

2017-11-15

58沈劍

架構師之路

13年底負責資料庫中介軟體設計時的調研筆記,拿出來和大家分享,輕拍。文章很長,可提前收藏,**。

一,cobar是什麼

畫外音:資料庫中介軟體有基於服務端的,也有基於客戶端的,cobar屬於前者。

二,cobar應用場景舉例

邏輯上:

物理上:

三,cobar使用方式

命令列:連dbtest虛擬庫

jdbc:也是連dbtest虛擬庫

檢視db

可看到dbtest1、dbtest2、dbtest3對使用者透明。

檢視table

可看到有tb1和tb2兩張表。

插入一些資料,對使用者而言,後端的分布式mysql是透明的:

畫外音:從其官網上看,自12年12月之後,cobar就沒有再更新過,官方微博也非常不活躍,不清楚現在它在阿里的使用情況,知道的同學請說一說。

四,cobar不支援什麼

五,cobar支援什麼

分布式資料庫:通過分庫實現

需要注意:不支援將test拆分成test_1,test_2,test_3並放入同乙個庫中這樣的拆分方式。

畫外音:後者正是360的atals的做法(atlas只支援單例項單庫分表)。

ha:通過到mysql的心跳實現

畫外音:需要注意,cobar是需要使用者自己來實現負載均衡的,方式有三種:

sql路由

在分庫的情況下,cobar會從sql中提取partition key列,來判斷sql被路由到哪乙個分庫進行執行;如果沒有帶partition key,則會將sql分發到所有分庫執行。

示例

tb1(id int)

假設以id切分資料,後端分了n個庫:

畫外音:sql帶上partition key對cobar來說,非常非常重要,並且partition key不支援修改(修改了庫就不對了喲)。

cobar不允許在同乙個連線中切換庫。

畫外音:資料庫連線和庫是繫結關係。

不建議通過cobar來執行ddl語句。

畫外音:所以建庫,建索引什麼的,還是直連mysql自己搞吧。

cobar自定義語句

cobar允許管理員通過管理命令上線和下線cobar節點。

被定義在乙個cobar集群中的cobar節點之間都會傳送心跳,所謂的心跳就是上面提到的show cobra_status; 這樣的話,就為每乙個cobar節點提供了知道同乙個集群內的所有cobar資訊的機會。當然,被下線,或者心跳超時的cobar節點的資訊不會被顯示出來。

sql語句前加上explain即可知道sql語句的路由情況。

事務的支援

cobar對單庫保持事務的強一致性。

對分庫保持事務的弱一致性。

分庫後事務提交包含兩個階段:

兩個階段之間,執行與提交序列處理,階段內部各個分庫並行處理。

畫外音:額,基本就是不支援分布式事務。

系統模組圖

畫外音:從模組圖來看,cobar的結構還是挺清晰的:

資料流圖

資料流圖和上述模組圖對應:

網路模型

採用非同步網路模型:

結果合併

會把多個物理庫的結果集合並,再返回給上游:

partition key是int時

好辦,直接取模

partition key是string時

f(string) = hash(string) % 1024

假設分4個庫:

如何擴容:

拆分後:

資料非均勻分布路由:

帶partition key單記錄查詢

直接根據partition key路由。

帶partition key的in查詢

將in進行拆分,請求發到對應多個分庫,然後將結果集合並。

不帶partition key的where查詢

假設partition key是user欄位,在product欄位上的where查詢,會將請求廣播到所有分庫,然後將結果集合並。

二維partition key

一張表的多個字段同時作為定位庫的拆分字段,仍以上圖的visit(product, user, info)為例,可以以product和user兩個欄位來同時來定位庫。

橫座標product屬性取hash,縱座標user屬性取hash。

select * from visit where product=『colacola』 and user=『a』

對於上述業務需求,同時帶有兩個列作為查詢條件,可以直接定位到庫7。

但是,此時如果只有其中的乙個字段作為查詢條件,反而得查詢多個庫,再做聚合:

select * from visit where product=『colacola』

對於上述業務需求,就必須查詢庫3,7,11,15了。

畫外音:不懂為什麼要按照雙key來做路由,單key路由,對於雙key的查詢,也沒有增加多少資料掃瞄量啊,加入雙key反而使得某些情況下策略複雜了,帶來的收益也不高。

小結

對的,對於where,cobar就是這樣的處理方式:

join有限的處理

如上,兩個表都進行了分庫,join需求如下:

select * from tb1 inner join tb2

on tb1.member_id=tb2.name

結果集理應如下:

方案一:迭代查詢

for row1 in select * from tb1

畫外音:我去,外層迴圈是對tb1中的所有記錄,在tb2來一遍掃瞄,bt1資料量大的情況下,這**受得了?

方案二:誇庫索引

對於tb1和tb2存在的潛在join需求,對join列建立誇庫索引。

select * from tb1 inner join tb2

on tb1.member_id=tb2.name

wheretb1.id=5

此時需要改寫sql語句,直接在索引表上進行查詢:

select * from idx where id1=5

此處需要注意:

group by的處理

以上表為例,patition key是id,要在c1上進行group by操作:

select sum(price) from tb1 group by c1;

改寫sql語句,先在各個分庫上group by一次,並將sum計算出來:

select sum(price),c1 from tb1 group by c1 order by c1;

各分庫進行group by + order by + sum之後,根據排序後的c1及對應sum結果,歸併一遍後即得到最終結果。

小結

對於複雜語句,可以這樣處理:

13年底的調研筆記,文中的「畫外音」是我當時的批註,希望能讓大家對cobar能有乙個初步的認識,有疑問之處,歡迎交流。

MyCat 取代Cobar資料庫中介軟體

什麼是mycat?簡單的說,mycat就是 乙個徹底開源的,面向企業應用開發的 大資料庫集群 支援事務 acid 可以替代mysql的加強版資料庫 乙個可以視為 mysql 集群的企業級資料庫,用來替代昂貴的oracle集群 乙個融合記憶體快取技術 nosql技術 hdfs大資料的新型sql ser...

面試 資料庫 中介軟體

lru是redis唯一支援的 演算法 no eviction 不刪除策略 對於所有的key allkeys lru 刪除最近訪問頻率低的key allkeys random 隨機刪除一部分key 對於設定expire volatile lru 刪除最近訪問頻率低的key volatile rando...

開源資料庫中介軟體 MyCat 學習筆記

1 簡介 mycat 曾是阿里開源產品cobar,cobar核心功能和優勢是 mysql 資料庫分片。mycat 是基於cobar 演變而來,對 cobar 的 進行了徹底的重構,使用 nio 重構了網路模組,並且優化了 buffer 核心,增強了聚合,join 等基本特性,同時相容絕大多數資料庫成...