作者: 吳炳錫
作者介紹: 知數(shù)堂聯(lián)合創(chuàng)始人及MySQL高級講師,3306π社區(qū)聯(lián)合創(chuàng)始人,騰訊TVP成員。
本文大概5500字,閱讀大概需要15分鐘,建議電腦前閱讀。大綱如下:
- 概述
- 使用Radon attache功能的好處
- 基本環(huán)境描述
- 把wordPress/ target=_blank class=infotextkey>WordPress庫加入到Radon中
- 利用wordpress體驗Radon的透明分庫分表
- 總結(jié)
可以關(guān)注知數(shù)堂騰訊課堂上我分享的RadonDB相關(guān)視頻。
最近發(fā)現(xiàn)RadonDB在特性中引入一個新特性:Single table 到分區(qū)表快速轉(zhuǎn)換,另外還引進了一個優(yōu)秀的特性,把現(xiàn)有的MySQL庫直接attach到Radon下面。看到這兩個特性真是太贊了。可以非常方便用戶實現(xiàn)原來的單表,快速變成拆分表,一條命令搞定。具體的issue參考:https://github.com/radondb/radon/issues/436 而且這個特性會在1.0.8這個版本發(fā)布。下面我們一塊來體驗一下吧。該文檔可以用于先看看整體思想上有一個認識后再行動。
利用Radon attach獲得的好處
- 連接池外置。如果你的應(yīng)用程序沒有連接池,或是MySQL上掛了上千個以上的連接時又不想讓MySQL上因為掛連接而影響性能,那就可以考慮利用Radon做外置的連接池。例如:在原來老的MySQL上掛一個Radon,所有的表都是Single表模式,現(xiàn)的Radon只是對SQL解析獲取到表名,直接傳遞給后端,后面基本就是TCP中轉(zhuǎn)操作:從后端獲取結(jié)果返回給前端。修改:"max-connections": 1024 即可。
- 利用Radon實現(xiàn)原來的老的項目和日志數(shù)據(jù)或是海量數(shù)據(jù)混跑。利用attach功能掛載原來的MySQL,把大表遷移到Radon中。為了求穩(wěn),你還可以通過老庫訪問原來除了大表外的其它表,對于超級大表可以通過Radon訪問,當然Radon也可以訪問掛載上的MySQL.
- 可利用到Radon提供的 審計, 透明自動拆分功能。
基本環(huán)境及架構(gòu)描述
這里為了更清楚整個過程,采用全部自建環(huán)境:單機多實例環(huán)境 安裝:LAMP環(huán)境,可以用運行wordpress確認,在單庫環(huán)境下是正常的。wordpress使用數(shù)據(jù)庫端號:3306端口。為了看來了來效果,我在增加一個實例:3307 端口的數(shù)據(jù)庫。
這里只是一個功能測試,所以不在給MySQL做高可用,如果需要高可用可以搭建xenon環(huán)境。Radon安裝,可以看到前面章節(jié),啟動一個空的radon:
Radon配置如下
- {
- "proxy" : {
- "endpoint" : ":3316" ,
- "meta-dir" : "bin/radon-meta" ,
- "peer-address" : ":8080"
- "audit" : {
- "audit-dir" : "bin/radon-audit"
- },
- "log" : {
- "level" : "INFO"
- },
- "monitor" : {
- "monitor-address" : "0.0.0.0:13380"
- }
- }
添加MySQL到Radon中,在Radon進程所在的機器上執(zhí)行:
- curl - i - H 'Content-Type: Application/json' - X POST - d '{"name": "backend1", "address": "192.168.0.2:3307", "user":"wubx", "password": "wubxwubx", "max-connections":1024}' http : //127.0.0.1:8080/v1/radon/backend
參數(shù)說明:
- {
- "name" : 后端節(jié)點命名,要求唯一,
- "address" : 后端 MySQL 連接串,
- "user" : MySQL 連接用戶名,
- " password ": 數(shù)據(jù)庫連接密碼,
- " max - connections ": 最大支持多少個連接連后后端DB中, 加入Radon后也可以啟到一個連接池的作用。
- }
整個環(huán)境節(jié)架構(gòu)如下:
環(huán)境確認:博客鏈接3306端口,確認wordpress工作正常。
把wordpress庫加入到Radon中
- mysql - h 192.168 . 0.2 - P3316 - uwubx - pwubxwubx
- mysql > radon attach ( '192.168.0.2:3306' , 'wubx' , 'wubxwubx' );
觀察日志輸出:
- ...
從日志中可以看出來, Radon把原庫直接掛載到Radon下面,把原始3306庫下的wubx庫下表注刪到radon下面,同時把配置寫到:bin/radon-meta/backend.json & bin/radon-meta/wubx/ 這個目錄。同時也在3307兩個原始節(jié)點上建出來: wubx庫(日志:frm.write.database[db:wubx]),但沒有表。這里看一下backend.json內(nèi)容:
- {
- "backends" : [
- {
- "name" : "backend1" ,
- "address" : "192.168.0.2:3307" ,
- "user" : "wubx" ,
- "password" : "wubxwubx" ,
- "database" : "" ,
- "charset" : "utf8" ,
- "max-connections" : 1024 ,
- "role" : 0
- {
- "name" : "192.168.0.2:3306" ,
- "address" : "192.168.0.2:3306" ,
- "user" : "wubx" ,
- "password" : "wubxwubx" ,
- "database" : "" ,
- "charset" : "utf8" ,
- "max-connections" : 1024 ,
- "role" : 1
- }
- ]
- }
從上面配置上可以看到:192.168.0.2:3306也直接掛載了Radon下面。從上面的配置中,可以看到: 192.168.0.2:3306 在Radon中成為一個IP:PORT的后端存儲節(jié)點,另外Role:1 表示是一個attach上來的節(jié)點。
通過radon-meta對應(yīng)庫下的表分布對應(yīng)關(guān)系查看:
- cat bin / radon - meta / wubx / wp_users . json
- {
- "name" : "wp_users" ,
- "slots-readonly" : 0 ,
- "blocks-readonly" : 0 ,
- "shardtype" : "SINGLE" ,
- "shardkey" : "" ,
- "partitions" : [
- {
- "table" : "wp_users" ,
- "segment" : "" ,
- "backend" : "192.168.0.2:3306" ,
- "listvalue" : ""
- }
- ]
- }
這里Single表即是沒進行分庫分表。所有的庫都位于192.168.0.2:3306這個端口下wubx庫下。架構(gòu)如下:
現(xiàn)在把wordpress中配wp_config.php的配置從原來的3306連接指3316(radon)端口,可以發(fā)現(xiàn),也可以正常對外提供服務(wù)了。Radon中遇到Single表的情況下是把SQL透明下發(fā)到后達。所在這里Radon更相當于一個TCP的代理層,主要可以啟到“連接池”,審計等相關(guān)功能。接下來,我們可以看看Radon帶來的福利了,例如:審計, 透明自動拆分, 并行執(zhí)行, 分布式事務(wù) 等功能了。
利用wordpress體驗Radon的透明分庫分表
我們知道wordpress最大表是wpposts這個內(nèi)容表,當我們Blog積累的內(nèi)容足夠多的情況下, 該表也許會成為一個瓶頸。這里我們對wpposts表做一次從single表到拆分表的轉(zhuǎn)換:
- MySQL > RADON RESHARD wp_posts to new_wp_posts ;
- MySQL > alter table wp_posts rename wp_post_bak ;
- MySQL > alter table new_wp_posts rename to wp_posts ;
首先利用Radon reshard 把原來一個非拆分表,變成一個新的拆分表, 這里有一個不錯的設(shè)計, 該操作完,也不會把wp_posts表刪除,這是一個不錯的設(shè)計。后面利用改表名后,再來看看業(yè)務(wù)運行情況。現(xiàn)在的架構(gòu)如下 :
做完以上動作Wordpress白頁了,內(nèi)容頁顯示不出來,從Radon的報錯日志(radon.log)中發(fā)現(xiàn)Radon還沒支持 SQLCALCFOUNDROWS 這個函數(shù)。所以可以通過,查詢源碼中:
主要處理和wpdb->posts這個查詢有關(guān)found_rows就可以,處理辦法:
- if ( ! $q [ 'no_found_rows' ] && ! empty ( $limits ) )
- $found_rows = 'SQL_CALC_FOUND_ROWS' ;
- $found_rows = '' ;
再來確認:Blog又可以工作了。因為wordpress的分頁用到了SQLCALCFOUNDROWS這個功能,所以唯一不爽的地方,沒分頁了。
再來看一下wpposts表在后端節(jié)點的分布情況:
cat bin/radon-meta/wubx/wp_posts.json
- {
- "name" : "wp_posts" ,
- "slots-readonly" : 4096 ,
- "blocks-readonly" : 64 ,
- "shardtype" : "HASH" ,
- "shardkey" : "ID" ,
- "partitions" : [
- {
- "table" : "wp_posts_0000" ,
- "segment" : "0-64" ,
- "backend" : "backend1" ,
- "listvalue" : ""
- ...
- {
- "table" : "wp_posts_0031" ,
- "segment" : "1984-2048" ,
- "backend" : "backend1" ,
- "listvalue" : ""
- },
- {
- "table" : "wp_posts_0032" ,
- "segment" : "2048-2112" ,
- "backend" : "backend1" ,
- "listvalue" : ""
- },
- ...
- {
- "table" : "wp_posts_0063" ,
- "backend" : "backend1" ,
- "listvalue" : ""
- }
- ],
- "auto-increment" : {
- "column" : "ID"
- }
- }
從以上定義來看 wp_posts以ID用HASH的方式給給拆分成64個物理表,實質(zhì)上拆分成了4096個slot, 每個物理子表接受一個區(qū)間的slot服務(wù), 并完美的遷移到Radon集群下面節(jié)點上,如果有多個Backend,該動作會把拆分后的表均勻的分到其它節(jié)點上,在joins查詢各方面完美。限于篇幅問題,這里不再展開。如果對于拆分表后SQL是怎么運行的有興趣,可以連接入Radon中,運行: explain 具體的SQL看一下 Radon SQL改寫。
這里其實可以有一個大膽的嘗試,利用attach功能,把小表跑在attach節(jié)點上,大表跑在Radon拆分的節(jié)點,然后加多個attach節(jié)點,這樣下面整體的可管理性更強。這個方案需要進一步測試和官方確定是不是可以用。單個attach上去的節(jié)點也有點Radon中單獨建的Single table作用。
特別注意事項點如果把現(xiàn)有的業(yè)務(wù)數(shù)據(jù)庫直接加入到Radon中,原來的DB不要在做為Backend加入了。操作上就象上面操作,直接attach上去,就可以使用了,就行。
總結(jié)
通過本案例可以看出來,Radon對于現(xiàn)有項目遷移到分布式環(huán)境有著不錯的支持方案,對于SQL豐富度支持,也不錯,對于wordpress的SQL基本可以原生不動的遷移過來,可以說Radon對SQL的支持復(fù)雜度也上了一個新臺階。另一方面, 對于MySQL一些內(nèi)置函數(shù),支持不友好。從Radon代碼上看,Radon對于支持的指令都是嚴格處理,拿一個show table status; 這個指令的處理,一般的中間件,就是直接傳到后端第一個節(jié)點上,獲取數(shù)據(jù)返回就ok了,但Radon的處理是把這個請求會發(fā)到后端所有的節(jié)點,然后把結(jié)果進行合并后,返回,這點上感覺Radon做事上是力求正確。不是單純的兼容。所以最后,看到Radon在github開源項目上新的feature也都比較讓人激動,聽說這些功能也是一些互聯(lián)網(wǎng)公司在免費使用Radon后給官方提需求,青云的小伙伴認真的把這些需求也加到了issue中,排期進行。據(jù)了解,他們也非常歡迎大家提的需求。個人的另一個感受,Radon代碼風(fēng)格很爽,可以研究一下Radon的代碼,學(xué)習(xí)一下利用golang開發(fā)MySQL中間件:)。