版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据库中间件架构设计和实现技术中心·架构部罗立树关于我易宝支付核心开发阿里巴巴商品线(内部统称Offer,基于Cobar)服务化落地负责人,中文站开放平台负责人京东网站交易部架构师百度高级开发工程师,负责LBS地图商户中心架构和团购架构方面的工作Contents一些概念读写分离?HA(高可用性)?分库分表?事务和分布式事务?数据一致性?数据库性能关键点?CAP理论带着疑问思考假如你来设计一套中间件你会怎么设计?你认知的数据库中间件都有哪些?他们相对于我们的解决方案都有哪些优点???Contents现状中间件解决的问题简化开发,降低分库分表复杂度分库分表透明化统一配置管理提供监控链接管理HA支持LoadBlance支持提供更好的扩展能力中间件解决的问题Contents实现方式应用硬编码实现DAL封装(或者ORM封装)JDBC基于Mysql客户端协议基于客户端的访问模式Mysql协议访问模式实现方式比较比较项DAL方式ORM方式JDBC客户端方式mysql协议方式实现难度低中高较高应用代码复杂度高无无无性能高高高中透明性支持糟糕良好良好很好运维健壮性很好很好很好较弱部署结构复杂度轻量级轻量级轻量级较重耦合问题和业务代码耦合和框架耦合和jdbc版本耦合和mysql客户端交互协议版本耦合,数据库&协议升级问题数据库版本关联数据库无关数据库无关数据库无关仅局限mysql扩展能力较复杂良好良好良好线上修改影响范围小小小大跨语言支持难度大难度大难度大容易数据库服务器连接较多较多较多较少单库事务支持支持支持支持不支持分布式事务支持,性能差支持,性能差支持,性能差不支持方案选择方案选择解析没有完美的解决方案,只有适合的方案公司现状:90%以上应用是java代码成本考虑:轻量级使用物理成本低项目进度考虑:有一个快速的实现,逐步完善系统健壮性考虑:基于代理的方案健壮性差一些开发难度(人力成本):基于mysql协议的开发难度较大,不可控集群性能上考虑基于mysql协议的可以引入,但是方案上存在架构中心化的缺陷Contents功能规划设计的原则模块化职责分离支持封装和扩展…相关课题比较大,可以在下一次分享中讲述用户视觉常用分库分表的方式schema表名实例相同不同相同不同不同相同相同相同不同不同相同不同相同不同不同不同不同不同路由的方式ID段(range)Hash(mod)时间其他方式……领域对象BatchItem每一条语句的执行当做一个batch项Function分库分表路由规则Interceptor拦截器Executorsql执行器Merger结果合并处理器NodeAnalyzersql语法节点分析器Transaction事务抽象NameNode分表namenode抽象DataNode数据访问节点抽象…….分库分表的策略/***常用的方式有:*1.基于ID段的*2.基于hash的*3.按日期等*@authorluolishu
*/publicinterfaceFunction{/***执行方法返回下标*@paramparameterskey为字段名,大写开头,value为字段在sql中的值*@returnnamenode的下标*/intexecute(intsize,Map<String,Object>parameters);}并行Query支持支持写入,更新,查询到多个库和表的同一线程操作事务支持支持单库事务不支持分布式事务(简单支持)结果合并单库单表查询的不需要合并不带分库分分表字段:
聚集函数
groupby
orderby…limit
having
Join支持语句:Select*fromt_userujoint_cityconu.city_id=c.idwhereuser_id=‘luolishu’约束:不支持跨库join,被join的表要保证所有数据一致性嵌套查询Select*fromt_userwheret_city_idin(selectidfromt_citywherecountry=‘china’)嵌套查询-约束约束:不支持跨库,被子查询的表要保证所有数据一致性聚集函数Selectmin(id),max(age),avg(age),sum(age),count(age)fromt_user;聚集函数-解析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聚集函数-使用约束目前仅仅支持min,max,avg,count,sumGroupby中用到聚集函数,需要在结果中出现(今后可以考虑自动补全)Groupby语句:Selectmin(id),max(age),avg(age),sum(age),count(age),namefromt_userGroupbyname;Groupby-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang112?121chen522?392huang315?151li632?321chen866?661huang419?191liu216?161zhang13222442chen566351053huang31515151li41919191liu21616161zhangmergeGroupby-使用约束groupby字段需要出现在结果集里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中的条件字段必须要出现在结果集中Groupby,Orderby,limit-解析idagename112chen315li517huang722huangidagename216zhang419liu632chen866huang?chen112?huang239?li11532chen13266huang16619liu11916zhang11635huangmergeSelectavg(age),namefromt_user1groupbynameSelectavg(age),namefromt_user2groupbyname22chen24435huang310515li11519liu11916zhang116having使用约束总结避免join避免子查询避免跨库不使用分布式事务,尽量强调最终一致性分页不要取offset较大的值Group,orderby,having等条件必须要出现在结果集里ContentsGO语言+MysqlC++lib数据层访问虚拟化支持redis,mongodb,文件等存储方式Contents5分钟完成分库分表ContentsMaven依赖<dependency><groupId>com.bj58</groupId><artifactId>oceanus-client</artifactId><version>0.0.1-SNAPSHOT</version></dependency>接入方式公司内部组件:core、dao基于datasource标准修改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);配置项<bean/><threadpool/><datanode/><namenode/><table/><bean/>配置属性:id—唯一标识class—bean的实现类<bean/>配置示例<beanid="function1"class="com.bj58.oceanus.core.shard.HashFunction"/><threadpool/>配置属性:id—线程池唯一标识size—线程池大小<threadpool/>配置示例<threadpoolid=“default”size=“50”/>默认线程池,可以不配<threadpoolid=“userThreadPool”size=“500”/>指明线程池<datanode/>配置属性:id—唯一属性标识slaves—从属节点parent—父ID
子属性采用名字标识当做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—唯一标识
loadbalance—负载均衡策略<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:抽象出的数据库表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>分库分表策略实现,这里采用javascript的方式返回namenode的下标,下标从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等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026福建厦门市集美区松山实验幼儿园顶岗教师招聘1人笔试参考题库及答案解析
- 2026-广西不动产登记中心出纳招聘考试参考题库-含答案
- 2026舟山市公安局第三批警务辅助人员招聘14人笔试备考题库及答案解析
- 2026-贵州医疗卫生事业品牌宣传专员招聘考试参考题库-含答案
- 2026-广东文旅集团招聘考试参考题库-含答案
- 2026年有色金属铸造行业发展前景研判报告及未来五至十年服务化与定制化趋势
- 2026年三明市金湖旅游职业中专学校秋季招聘笔试备考题库及答案解析
- 2026年其他非电力家用器具制造行业投资策略研究报告及未来五至十年蓝海开拓与红海突围
- 2026年惠安县教师招聘考试备考题库及答案解析
- 2026年铁路运输辅助活动行业市场运营态势报告及未来五至十年平台化与生态化发展
- 2026年中科创达试工程师岗位笔目真题(考试直接用)附答案详解
- 短缺药品管理工作制度
- 旅游景区管理培训课件
- 【英语】高一英语完形填空夹叙夹议解题技巧及经典题型及练习题(含答案)
- 汤姆叔叔的小屋课件
- 北京市二中教育集团2025-2026学年七年级上学期月考语文试题(含答案)
- 气管切开吸痰护理宣教
- 2025国庆节中秋节双节特色实践作业(三)
- 2025年江苏省职业技能等级认定考试(政务服务办事员·四级)历年参考题库含答案详解(5卷)
- 养老服务行业面试常见问题与答案解析
- 餐饮店免责合同协议书
评论
0/150
提交评论