資料庫中介軟體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能有一個初步的認識,有疑問之處,歡迎交流。
相關文章: