版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)庫中間件架構(gòu)設(shè)計(jì)和實(shí)現(xiàn)技術(shù)中心·架構(gòu)部羅立樹關(guān)于我易寶支付核心開發(fā)阿里巴巴商品線(內(nèi)部統(tǒng)稱Offer,基于Cobar)服務(wù)化落地負(fù)責(zé)人,中文站開放平臺(tái)負(fù)責(zé)人京東網(wǎng)站交易部架構(gòu)師百度高級(jí)開發(fā)工程師,負(fù)責(zé)LBS地圖商戶中心架構(gòu)和團(tuán)購架構(gòu)方面的工作Contents一些概念讀寫分離?HA(高可用性)?分庫分表?事務(wù)和分布式事務(wù)?數(shù)據(jù)一致性?數(shù)據(jù)庫性能關(guān)鍵點(diǎn)?CAP理論帶著疑問思考假如你來設(shè)計(jì)一套中間件你會(huì)怎么設(shè)計(jì)?你認(rèn)知的數(shù)據(jù)庫中間件都有哪些?他們相對(duì)于我們的解決方案都有哪些優(yōu)點(diǎn)???Contents現(xiàn)狀中間件解決的問題簡化開發(fā),降低分庫分表復(fù)雜度分庫分表透明化統(tǒng)一配置管理提供監(jiān)控鏈接管理HA支持LoadBlance支持提供更好的擴(kuò)展能力中間件解決的問題Contents實(shí)現(xiàn)方式應(yīng)用硬編碼實(shí)現(xiàn)DAL封裝(或者ORM封裝)JDBC基于Mysql客戶端協(xié)議基于客戶端的訪問模式Mysql協(xié)議訪問模式實(shí)現(xiàn)方式比較比較項(xiàng)DAL方式ORM方式JDBC客戶端方式mysql協(xié)議方式實(shí)現(xiàn)難度低中高較高應(yīng)用代碼復(fù)雜度高無無無性能高高高中透明性支持糟糕良好良好很好運(yùn)維健壯性很好很好很好較弱部署結(jié)構(gòu)復(fù)雜度輕量級(jí)輕量級(jí)輕量級(jí)較重耦合問題和業(yè)務(wù)代碼耦合和框架耦合和jdbc版本耦合和mysql客戶端交互協(xié)議版本耦合,數(shù)據(jù)庫&協(xié)議升級(jí)問題數(shù)據(jù)庫版本關(guān)聯(lián)數(shù)據(jù)庫無關(guān)數(shù)據(jù)庫無關(guān)數(shù)據(jù)庫無關(guān)僅局限mysql擴(kuò)展能力較復(fù)雜良好良好良好線上修改影響范圍小小小大跨語言支持難度大難度大難度大容易數(shù)據(jù)庫服務(wù)器連接較多較多較多較少單庫事務(wù)支持支持支持支持不支持分布式事務(wù)支持,性能差支持,性能差支持,性能差不支持方案選擇方案選擇解析沒有完美的解決方案,只有適合的方案公司現(xiàn)狀:90%以上應(yīng)用是java代碼成本考慮:輕量級(jí)使用物理成本低項(xiàng)目進(jìn)度考慮:有一個(gè)快速的實(shí)現(xiàn),逐步完善系統(tǒng)健壯性考慮:基于代理的方案健壯性差一些開發(fā)難度(人力成本):基于mysql協(xié)議的開發(fā)難度較大,不可控集群性能上考慮基于mysql協(xié)議的可以引入,但是方案上存在架構(gòu)中心化的缺陷Contents功能規(guī)劃設(shè)計(jì)的原則模塊化職責(zé)分離支持封裝和擴(kuò)展…相關(guān)課題比較大,可以在下一次分享中講述用戶視覺常用分庫分表的方式schema表名實(shí)例相同不同相同不同不同相同相同相同不同不同相同不同相同不同不同不同不同不同路由的方式ID段(range)Hash(mod)時(shí)間其他方式……領(lǐng)域?qū)ο驜atchItem每一條語句的執(zhí)行當(dāng)做一個(gè)batch項(xiàng)Function分庫分表路由規(guī)則Interceptor攔截器Executorsql執(zhí)行器Merger結(jié)果合并處理器NodeAnalyzersql語法節(jié)點(diǎn)分析器Transaction事務(wù)抽象NameNode分表namenode抽象DataNode數(shù)據(jù)訪問節(jié)點(diǎn)抽象…….分庫分表的策略/***常用的方式有:*1.基于ID段的*2.基于hash的*3.按日期等*@authorluolishu
*/publicinterfaceFunction{/***執(zhí)行方法返回下標(biāo)*@paramparameterskey為字段名,大寫開頭,value為字段在sql中的值*@returnnamenode的下標(biāo)*/intexecute(intsize,Map<String,Object>parameters);}并行Query支持支持寫入,更新,查詢到多個(gè)庫和表的同一線程操作事務(wù)支持支持單庫事務(wù)不支持分布式事務(wù)(簡單支持)結(jié)果合并單庫單表查詢的不需要合并不帶分庫分分表字段:
聚集函數(shù)
groupby
orderby…limit
having
Join支持語句:Select*fromt_userujoint_cityconu.city_id=c.idwhereuser_id=‘luolishu’約束:不支持跨庫join,被join的表要保證所有數(shù)據(jù)一致性嵌套查詢Select*fromt_userwheret_city_idin(selectidfromt_citywherecountry=‘china’)嵌套查詢-約束約束:不支持跨庫,被子查詢的表要保證所有數(shù)據(jù)一致性聚集函數(shù)Selectmin(id),max(age),avg(age),sum(age),count(age)fromt_user;聚集函數(shù)-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang122?664266?133416624.87501998mergeAvg(age)=sum(age)/count(age)SELECTMIN(id),MAX(age),AVG(age),SUM(age),COUNT(age)FROMt_user1SELECTMIN(id),MAX(age),AVG(age),SUM(age),COUNT(age)FROMt_user2聚集函數(shù)-使用約束目前僅僅支持min,max,avg,count,sumGroupby中用到聚集函數(shù),需要在結(jié)果中出現(xiàn)(今后可以考慮自動(dòng)補(bǔ)全)Groupby語句:Selectmin(id),max(age),avg(age),sum(age),count(age),namefromt_userGroupbyname;Groupby-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang112?121chen522?392huang315?151li632?321chen866?661huang419?191liu216?161zhang13222442chen566351053huang31515151li41919191liu21616161zhangmergeGroupby-使用約束groupby字段需要出現(xiàn)在結(jié)果集里DISTINCTDistinct=groupby所有resultcolumnOrderbySelectmin(id)asmin,max(age),avg(age),sum(age),count(age),namefromt_userGroupbynameOrderbymin;Orderby-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang112chen315li517huang722huang112chen315li216zhang517huang419liu722huang632chen866huangmerge216zhang419liu632chen866huangGroupby語句:Selectmin(id),max(age),avg(age),sum(age),count(age),namefromt_userGroupbynameOrderbynameLimit5Groupby,Orderby,limit-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang11212121chen52219.5392huang31515151li63232321chen86666661huang41919191liu13222442chen566351053huang31515151limergeLimit…offsetSelectmin(id)asmin,max(age),avg(age),sum(age),count(age),usernamefromt_userGroupbyusernameOrderbyminlimit10offset100;Limit…offset使用建議避免往后翻頁比較多的查詢涉及到翻頁需求,可以考慮走外部索引(search、cache或者索引表等)Having…Selectavg(age),namefromt_userhavingavg(age)>30約束條件:having中的條件字段必須要出現(xiàn)在結(jié)果集中Groupby,Orderby,limit-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang?chen112?huang239?li11532chen13266huang16619liu11916zhang11635huangmergeSelectavg(age),namefromt_user1groupbynameSelectavg(age),namefromt_user2groupbyname22chen24435huang310515li11519liu11916zhang116having使用約束總結(jié)避免join避免子查詢避免跨庫不使用分布式事務(wù),盡量強(qiáng)調(diào)最終一致性分頁不要取offset較大的值Group,orderby,having等條件必須要出現(xiàn)在結(jié)果集里ContentsGO語言+MysqlC++lib數(shù)據(jù)層訪問虛擬化支持redis,mongodb,文件等存儲(chǔ)方式Contents5分鐘完成分庫分表ContentsMaven依賴<dependency><groupId>com.bj58</groupId><artifactId>oceanus-client</artifactId><version>0.0.1-SNAPSHOT</version></dependency>接入方式公司內(nèi)部組件:core、dao基于datasource標(biāo)準(zhǔn)修改DAO依賴版本<dependency><groupId>com.bj58.spat</groupId><artifactId>com.bj58.spat.dao</artifactId><version>2.0.0-SNAPSHOT</version></dependency>修改Core依賴版本<dependency><groupId>com.bj58.spat</groupId><artifactId>com.bj58.spat.core</artifactId><version>2.0.3-SNAPSHOT</version></dependency>修改datasourceDataSourcedataSource=newDataSourceWrapper(ds);配置項(xiàng)<bean/><threadpool/><datanode/><namenode/><table/><bean/>配置屬性:id—唯一標(biāo)識(shí)class—bean的實(shí)現(xiàn)類<bean/>配置示例<beanid="function1"class="com.bj58.oceanus.core.shard.HashFunction"/><threadpool/>配置屬性:id—線程池唯一標(biāo)識(shí)size—線程池大小<threadpool/>配置示例<threadpoolid=“default”size=“50”/>默認(rèn)線程池,可以不配<threadpoolid=“userThreadPool”size=“500”/>指明線程池<datanode/>配置屬性:id—唯一屬性標(biāo)識(shí)slaves—從屬節(jié)點(diǎn)parent—父ID
子屬性采用名字標(biāo)識(shí)當(dāng)做key<datanode/>配置示例<datanodeid="datanode1"><url><![CDATA[jdbc:mysql://localhost:3306/showcase?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull]]></url><username>root</username><password>123456</password><driverClassName>com.mysql.jdbc.Driver</driverClassName><initialSize>5</initialSize><maxActive>20</maxActive><maxWait>6000</maxWait><maxIdle>3</maxIdle></datanode><datanode/>配置示例—繼承<datanodeid="datanode3"slaves="datanode3"parent="datanode1"><url><![CDATA[jdbc:mysql://localhost:3306/showcase?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull]]></url></datanode><namenode/>配置屬性:id—唯一標(biāo)識(shí)
loadbalance—負(fù)載均衡策略<namenode/>配置示例<namenodeid="abstract"loadbalance=""><datanodes><datanoderef="writenode1"access-mode="READ-WRITE"weight="10"/><datanoderef="writenode2"access-mode="READONLY"weight="10"/><datanodeid="datanode111"><url><![CDATA[jdbc:mysql://localhost:3306/showcase?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull]]></url><username>root</username><password>123456</password><driverClassName>com.mysql.jdbc.Driver</driverClassName><initialSize>5</initialSize><maxWait>60000</maxWait><maxIdle>150</maxIdle></datanode></datanodes></namenode><table/>配置屬性:
name:抽象出的數(shù)據(jù)庫表differ-name:是否生成表名
threadpool:指定線程池
columns:分庫分表字段
<table/>配置示例1<tablename="t_user"differ-name="true"threadpool="id"><columns><columnname="id"/></columns><namenodesrange="1-2"ref="abstract"/>
<functiontype="script"language="javascript">if($ID==1||$ID==3||$ID==5||$ID==7){return0;}else{return1;}</function></table>分庫分表策略實(shí)現(xiàn),這里采用javascript的方式返回namenode的下標(biāo),下標(biāo)從0開始分庫分表字段配置<table/>配置示例2<tablename="users2"differ-name="true"threadpool="id"><columns><columnname="id"/></columns><namenodes><namenoderef="users1"tablename="t_user1"/>
<namenodeid="users22"tablename="t_user2"schema="showcase2"><datanodes><datanodeid="datanode141"><url><![CDATA[jdbc:mysql://localhost:3306/showcase?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull]]></url>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際仲裁法律制度-深度研究
- 2025年廣西工商職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 朗格漢斯細(xì)胞與免疫細(xì)胞互作研究-深度研究
- 二零二五年度大廈物業(yè)服務(wù)質(zhì)量監(jiān)控與評(píng)估合同4篇
- 2025年廣東郵電職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年廣東碧桂園職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 二零二五年度旅行社責(zé)任險(xiǎn)合同4篇
- 2025年廣東建設(shè)職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 2025年度寵物美容院寵物寄養(yǎng)服務(wù)合同范本4篇
- 大數(shù)據(jù)存儲(chǔ)與管理-深度研究
- 2024年國家焊工職業(yè)技能理論考試題庫(含答案)
- 特魯索綜合征
- 《向心力》 教學(xué)課件
- 結(jié)構(gòu)力學(xué)數(shù)值方法:邊界元法(BEM):邊界元法的基本原理與步驟
- 2024年山東省泰安市高考語文一模試卷
- 北師大版物理九年級(jí)全一冊(cè)課件
- 2024年第三師圖木舒克市市場(chǎng)監(jiān)督管理局招錄2人《行政職業(yè)能力測(cè)驗(yàn)》高頻考點(diǎn)、難點(diǎn)(含詳細(xì)答案)
- RFJ 006-2021 RFP型人防過濾吸收器制造與驗(yàn)收規(guī)范(暫行)
- 盆腔炎教學(xué)查房課件
- 110kv各類型變壓器的計(jì)算單
- 新概念英語課件NCE3-lesson15(共34張)
評(píng)論
0/150
提交評(píng)論