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

































