罗立树-数据库中间件架构设计和实现细节_第1页
罗立树-数据库中间件架构设计和实现细节_第2页
罗立树-数据库中间件架构设计和实现细节_第3页
罗立树-数据库中间件架构设计和实现细节_第4页
罗立树-数据库中间件架构设计和实现细节_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库中间件架构设计和实现技术中心·架构部罗立树关于我易宝支付核心开发阿里巴巴商品线(内部统称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/>配置示例<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/>配置示例<table/>配置属性:

name:抽象出的数据库表differ-name:是否生成表名

threadpool:指定线程池

columns:分库分表字段

<ta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论