1. 程式人生 > >資料庫中介軟體Atlas調研筆記

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

轉自:https://mp.weixin.qq.com/s/31WOensXaLdaAp9WRMW7PA   架構師之路

前篇:

13年底負責資料庫中介軟體設計時的調研筆記,拿出來和大家分享,輕拍。

一、Atlas是什麼

  • 奇虎360的一個mysql資料庫中間層專案

  • 在mysql官方推出的mysql-proxy0.8.2的基礎上改的

  • 基於服務端的中介軟體

畫外音:資料庫中介軟體有基於服務端的,也有基於客戶端的,TDDL屬於後者;而cobar和Atlas是一箇中間層服務,屬於前者。

二、Atlas相對mysql-proxy的優勢

既然Atlas是基於mysql-proxy改的,有一些什麼優化呢?

  • 主流程中的Lua指令碼用C重寫

  • 網路模型,執行緒模型重寫

  • 實現了“真正意義”上的連線池,真正連線複用

  • 優化了鎖機制,效能提高數十倍

畫外音:效能提高數十倍是傳說,用過的同學可以出來說一說。

  • 官方mysql-proxy主庫宕機從庫亦不可用,Atlas優化為可讀不可寫 

優化之外,還新增了什麼特性呢?

  • ip過濾

  • 分表支援

  • dba可平滑上下線db

  • 自動摘除宕機db

三、Atlas最吸引人的分表功能

分表功能是Atlas相對於mysql-proxy最具有吸引力的功能。

分表設定

為了支援分表,需要增加分表設定

tables = $db_name

    .$table_name

    .$partition_column_name

    .$table_count

例如

tables = school:stu:id:100

  • 資料庫名叫school

  • 表名叫stu

  • 分表字段叫id

  • 總共分為100張表

這100張子表需要使用者手動逐個建立的,stu_0, stu_1, stu_2, … stu_99,並且所有的子表必須在一個數據庫裡。

畫外音:額,這個需要使用者手動執行,還是有點坑的。

畫外音:分表並且要求子表在一個庫裡,如果資料量過大,無法通過擴充套件例項來擴容,不確定Atlas對於這個問題是如何考慮“擴充套件性”的。

操作支援

Atlas支援select, delete, update, insert, replace操作,它會根據$partition_column_name 的值來對錶的個數進行取模,以定位到sql請求要落到哪個子表。

需要注意的是,sql語句必須帶上分表id作為查詢條件,如果不帶上id,則會提示stu表不存在。

畫外音:不支援誇庫分表,不支援非partition_column上的查詢,應用場景應該會比較受限。

四、Atlas的引數擴充套件

min-idle-connections

  • 用來實現mysq連線池功能,進行連線限制

  • Atlas為每臺DB建立一個連線池

  • 當有客戶端連線Atlas時,Atlas會先在第一臺DB上建立連線,直到第一臺DB連線池內的空閒連線數達到min-idle-connections,再在下一臺DB上建立連線,直到所有DB連線池內的空閒連線數都達到min-idle-connections,便不再建立新連線,而開始複用連線池內的連線

  • Atlas啟動時,配置裡的所有DB會按照主庫在前從庫在後的順序在記憶體裡排好次序,所以初始階段會先在主庫上建立連線

  • Atlas在執行過程中,某連線如果觸發了DB的wait_timeout,Atlas會把該連線銷燬,如果因此而導致連線池內的空閒連線數低於min-idle-connections,Atlas將在客戶端下一次連線時重新在該DB上建立連線

  • 初使用者常常會誤認為讀寫分離不起作用,其實是由於min-idle-connections設定得較大,而測試時只連線了一次或幾次,這樣的話建立的連線都在主庫上,從庫上還沒有建立連線,此時傳送讀語句,自然也只能打向主庫

  • DB的wait_timeout建議不要設得太小,因為Atlas有連線池機制,不會一直新建連線導致DB上連線數過多,所以DB不需要依賴wait_timeout防止過多連線,如果wait_timeout太小會導致Atlas的一些不必要的銷燬超時連線的開銷

畫外音:併發量比較大的時候,連線幾乎不會被銷燬。

client-ips

  • 該引數用來實現多使用者的許可權控制功能

配置格式如下:

client-ips : 127.0.0.1, 192.168.0.*

畫外音:簡單而實用的功能,多少事故是因為“線下將流量壓到線上”或者“ SecureCRT 視窗太多,切換錯了資料庫”。

lvs-ips

  • 該引數是Atlas前面掛接的LVS的物理網絡卡的IP,不是虛IP

  • 該引數用來實現平滑重啟功能,否則在重啟Atlas的瞬間的那些SQL請求都會失敗

  • 平滑重啟的條件:至少有兩臺配置相同的Atlas,且掛接在LVS之後

五、Atlas最受關注FAQ

問:Atlas是否支援多字符集?

:是,對多字符集的支援是Atlas對原版MySQL-Proxy的第一項改進。

問:Atlas是否支援事務操作?

支援,且處於事務狀態的客戶端中途退出時,Atlas會銷燬該客戶端使用的連線,讓後臺的mysql回滾事務,保證了事務的完整性。

畫外音:單庫多表。

問:自動讀寫分離挺好,但有時候寫完馬上就想讀,萬一主從同步延遲怎麼辦?

SQL語句前增加 /*master*/ 就可以將讀請求強制發往主庫,例如:

/*master*/ select * from t;

畫外音:額,需要呼叫方自己來強制讀主,說實話,不是特別實用。

問:主庫宕機,讀操作受影響麼?

不受影響,mysql-proxy不支援這個功能。

問:想下線一臺DB, 又不想停掉server, 怎麼辦?

可以通過管理介面手動上下線後端db:

remove backend i

問:想給叢集中增加一臺DB, 不想影響線上正常訪問可以嗎?

:可以通過管理介面可以實現:

add master ip:port

add slave ip:[email protected]

問:Atlas支援mysql的prepare特性嗎?

不支援,但打算在後續版本中支援。

問:Altas支援多個主庫的執行模式嗎?

目前還未對於Atlas後面掛接多個主庫的情形進行測試過,不建議這樣使用。建議使用一主一從或一主多從的模式。

問:Altas支援SQL安全性過濾嗎?

:支援,不帶where字句的delete可以過濾。

問:Altas未來有什麼發展規劃?

:支援跨機器的分庫分表,將資料分不到多臺機器上。

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

相關文章: