數據庫中間件Atlas調研筆記
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最具有吸引力的功能。
1. 分表設置
為了支持分表,需要增加分表設置
- 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對于這個問題是如何考慮“擴展性”的。
2. 操作支持
Atlas支持select, delete, update, insert, replace操作,它會根據$partition_column_name 的值來對表的個數進行取模,以定位到sql請求要落到哪個子表。
需要注意的是,sql語句必須帶上分表id作為查詢條件,如果不帶上id,則會提示stu表不存在。
畫外音:不支持夸庫分表,不支持非partition_column上的查詢,應用場景應該會比較受限。
四、Atlas的參數擴展
1. 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的一些不必要的銷毀超時連接的開銷
畫外音:并發量比較大的時候,連接幾乎不會被銷毀。
2. client-ips
- 該參數用來實現多用戶的權限控制功能
配置格式如下:
- client-ips : 127.0.0.1, 192.168.0.*
畫外音:簡單而實用的功能,多少事故是因為“線下將流量壓到線上”或者“ SecureCRT 窗口太多,切換錯了數據庫”。
3. lvs-ips
- 該參數是Atlas前面掛接的LVS的物理網卡的IP,不是虛IP
- 該參數用來實現平滑重啟功能,否則在重啟Atlas的瞬間的那些SQL請求都會失敗
- 平滑重啟的條件:至少有兩臺配置相同的Atlas,且掛接在LVS之后
五、Atlas最受關注FAQ
1. 問:Atlas是否支持多字符集?
答:是,對多字符集的支持是Atlas對原版MySQL-Proxy的第一項改進。
2. 問:Atlas是否支持事務操作?
答:支持,且處于事務狀態的客戶端中途退出時,Atlas會銷毀該客戶端使用的連接,讓后臺的mysql回滾事務,保證了事務的完整性。
畫外音:單庫多表。
3. 問:自動讀寫分離挺好,但有時候寫完馬上就想讀,萬一主從同步延遲怎么辦?
答:SQL語句前增加 /*master*/ 就可以將讀請求強制發往主庫,例如:
- /*master*/ select * from t;
畫外音:額,需要調用方自己來強制讀主,說實話,不是特別實用。
4. 問:主庫宕機,讀操作受影響么?
答:不受影響,mysql-proxy不支持這個功能。
5. 問:想下線一臺DB, 又不想停掉server, 怎么辦?
答:可以通過管理接口手動上下線后端db:
- remove backend i
6. 問:想給集群中增加一臺DB, 不想影響線上正常訪問可以嗎?
答:可以通過管理接口可以實現:
- add master ip:port
- add slave ip:port@weight
7. 問:Atlas支持mysql的prepare特性嗎?
答:不支持,但打算在后續版本中支持。
8. 問:Altas支持多個主庫的運行模式嗎?
答:目前還未對于Atlas后面掛接多個主庫的情形進行測試過,不建議這樣使用。建議使用一主一從或一主多從的模式。
9. 問:Altas支持SQL安全性過濾嗎?
答:支持,不帶where字句的delete可以過濾。
10. 問:Altas未來有什么發展規劃?
答:支持跨機器的分庫分表,將數據分不到多臺機器上。
【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】