數(shù)據(jù)庫中間件Atlas調(diào)研筆記
13年底負責數(shù)據(jù)庫中間件設(shè)計時的調(diào)研筆記,拿出來和大家分享,輕拍。
一、Atlas是什么
- 奇虎360的一個mysql數(shù)據(jù)庫中間層項目
- 在mysql官方推出的mysql-proxy0.8.2的基礎(chǔ)上改的
- 基于服務(wù)端的中間件
畫外音:數(shù)據(jù)庫中間件有基于服務(wù)端的,也有基于客戶端的,TDDL屬于后者;而cobar和Atlas是一個中間層服務(wù),屬于前者。
二、Atlas相對mysql-proxy的優(yōu)勢
既然Atlas是基于mysql-proxy改的,有一些什么優(yōu)化呢?
- 主流程中的Lua腳本用C重寫
- 網(wǎng)絡(luò)模型,線程模型重寫
- 實現(xiàn)了“真正意義”上的連接池,真正連接復(fù)用
- 優(yōu)化了鎖機制,性能提高數(shù)十倍
畫外音:性能提高數(shù)十倍是傳說,用過的同學(xué)可以出來說一說。
- 官方mysql-proxy主庫宕機從庫亦不可用,Atlas優(yōu)化為可讀不可寫
優(yōu)化之外,還新增了什么特性呢?
- ip過濾
- 分表支持
- dba可平滑上下線db
- 自動摘除宕機db
- …
三、Atlas最吸引人的分表功能
分表功能是Atlas相對于mysql-proxy最具有吸引力的功能。
1. 分表設(shè)置
為了支持分表,需要增加分表設(shè)置
- tables = $db_name
- .$table_name
- .$partition_column_name
- .$table_count
例如
- tables = school:stu:id:100
- 數(shù)據(jù)庫名叫school
- 表名叫stu
- 分表字段叫id
- 總共分為100張表
這100張子表需要用戶手動逐個建立的,stu_0, stu_1, stu_2, … stu_99,并且所有的子表必須在一個數(shù)據(jù)庫里。
畫外音:額,這個需要用戶手動執(zhí)行,還是有點坑的。
畫外音:分表并且要求子表在一個庫里,如果數(shù)據(jù)量過大,無法通過擴展實例來擴容,不確定Atlas對于這個問題是如何考慮“擴展性”的。
2. 操作支持
Atlas支持select, delete, update, insert, replace操作,它會根據(jù)$partition_column_name 的值來對表的個數(shù)進行取模,以定位到sql請求要落到哪個子表。
需要注意的是,sql語句必須帶上分表id作為查詢條件,如果不帶上id,則會提示stu表不存在。
畫外音:不支持夸庫分表,不支持非partition_column上的查詢,應(yīng)用場景應(yīng)該會比較受限。
四、Atlas的參數(shù)擴展
1. min-idle-connections
- 用來實現(xiàn)mysq連接池功能,進行連接限制
- Atlas為每臺DB建立一個連接池
- 當有客戶端連接Atlas時,Atlas會先在第一臺DB上建立連接,直到第一臺DB連接池內(nèi)的空閑連接數(shù)達到min-idle-connections,再在下一臺DB上建立連接,直到所有DB連接池內(nèi)的空閑連接數(shù)都達到min-idle-connections,便不再建立新連接,而開始復(fù)用連接池內(nèi)的連接
- Atlas啟動時,配置里的所有DB會按照主庫在前從庫在后的順序在內(nèi)存里排好次序,所以初始階段會先在主庫上建立連接
- Atlas在運行過程中,某連接如果觸發(fā)了DB的wait_timeout,Atlas會把該連接銷毀,如果因此而導(dǎo)致連接池內(nèi)的空閑連接數(shù)低于min-idle-connections,Atlas將在客戶端下一次連接時重新在該DB上建立連接
- 初使用者常常會誤認為讀寫分離不起作用,其實是由于min-idle-connections設(shè)置得較大,而測試時只連接了一次或幾次,這樣的話建立的連接都在主庫上,從庫上還沒有建立連接,此時發(fā)送讀語句,自然也只能打向主庫
- DB的wait_timeout建議不要設(shè)得太小,因為Atlas有連接池機制,不會一直新建連接導(dǎo)致DB上連接數(shù)過多,所以DB不需要依賴wait_timeout防止過多連接,如果wait_timeout太小會導(dǎo)致Atlas的一些不必要的銷毀超時連接的開銷
畫外音:并發(fā)量比較大的時候,連接幾乎不會被銷毀。
2. client-ips
- 該參數(shù)用來實現(xiàn)多用戶的權(quán)限控制功能
配置格式如下:
- client-ips : 127.0.0.1, 192.168.0.*
畫外音:簡單而實用的功能,多少事故是因為“線下將流量壓到線上”或者“ SecureCRT 窗口太多,切換錯了數(shù)據(jù)庫”。
3. lvs-ips
- 該參數(shù)是Atlas前面掛接的LVS的物理網(wǎng)卡的IP,不是虛IP
- 該參數(shù)用來實現(xiàn)平滑重啟功能,否則在重啟Atlas的瞬間的那些SQL請求都會失敗
- 平滑重啟的條件:至少有兩臺配置相同的Atlas,且掛接在LVS之后
五、Atlas最受關(guān)注FAQ
1. 問:Atlas是否支持多字符集?
答:是,對多字符集的支持是Atlas對原版MySQL-Proxy的第一項改進。
2. 問:Atlas是否支持事務(wù)操作?
答:支持,且處于事務(wù)狀態(tài)的客戶端中途退出時,Atlas會銷毀該客戶端使用的連接,讓后臺的mysql回滾事務(wù),保證了事務(wù)的完整性。
畫外音:單庫多表。
3. 問:自動讀寫分離挺好,但有時候?qū)懲犟R上就想讀,萬一主從同步延遲怎么辦?
答:SQL語句前增加 /*master*/ 就可以將讀請求強制發(fā)往主庫,例如:
- /*master*/ select * from t;
畫外音:額,需要調(diào)用方自己來強制讀主,說實話,不是特別實用。
4. 問:主庫宕機,讀操作受影響么?
答:不受影響,mysql-proxy不支持這個功能。
5. 問:想下線一臺DB, 又不想停掉server, 怎么辦?
答:可以通過管理接口手動上下線后端db:
- remove backend i
6. 問:想給集群中增加一臺DB, 不想影響線上正常訪問可以嗎?
答:可以通過管理接口可以實現(xiàn):
- add master ip:port
- add slave ip:port@weight
7. 問:Atlas支持mysql的prepare特性嗎?
答:不支持,但打算在后續(xù)版本中支持。
8. 問:Altas支持多個主庫的運行模式嗎?
答:目前還未對于Atlas后面掛接多個主庫的情形進行測試過,不建議這樣使用。建議使用一主一從或一主多從的模式。
9. 問:Altas支持SQL安全性過濾嗎?
答:支持,不帶where字句的delete可以過濾。
10. 問:Altas未來有什么發(fā)展規(guī)劃?
答:支持跨機器的分庫分表,將數(shù)據(jù)分不到多臺機器上。
【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】