作家
登录

假如让你来设计数据库中间件

作者: 来源: 2017-11-30 11:19:18 阅读 我要评论

  • 连接高低文治理,最轻易想到的高低文,一个数据库连接是和一个ITEM绑定的 
  • Mysql结不雅集的细化解析:须要考察Mysql协定
  • … 
  • (2.6)中心层-SqlParser

    中心层Sql分析组件SqlParser是中心层中异常重要的一个部分,它负责对sql语句的语法分析与语义分析。

    为什么要进行Sql语法语义分析?须要解析出什么东东?

    type=1请求转发 

    对于请求的中转,上游一个数据库连接对应一个逻辑库LOGIC_DB,由ConfigMgr可以知道对应下流一个真实的ITEM(ip/port/db),此时直接转发请求即可,无需解析Sql语句。

    type=2分库支撑

    对于分库的支撑,解析Sql语句可能须要获得这些问题的谜底:Sql是否带了partition-key-column?partition-key-column的值是若干?

    例如一条Sql语句:select * from user where uid=123456;

    就必须将“uid”列属性,以及uid的列属性值“123456”解析出来,以用作后续请求路由。

    留意:更细的情况是,针对每个表,分库partition-key-column都是不一样的,上例中还须要将表名user也解析出来。

    这一层次面对这些细节:

    • 若何解析Sql语句:可以参考mysql源码对SQL语句的解析,亦可参照cober对SQL语句的解析办法; 

    注:因为我们只须要支撑多库,数据库库名信息是在“连接”这一层获取的,又我们支撑的分布式Sql的种类有限,故只需解析partition-key-column,offset/limit等少数信息即可。

    (2.7)中心层-SqlModifier

    中心层Sql修改组件SqlModifier是中心层中异常重要的一个部分,它负责对sql语句改写。

    为什么要对Sql语句进行改写? 

    type=1的请求转发,无需修改Sql,但对于type=2的分库支撑,有些Sql语句就必须进行改写。

    例如:select * from user where uid in(1,2,3,4,5,6);

    select * from user where uid in(2,4,6); => 路由给0库;

    select * from user where uid in(1,3,5); => 路由给1库;

    又例如:select * from user limit 1000,10;

    则sql可能会被改写为:

    select * from user limit 0,1010; => 分别路由到两个库,收集完结不雅集共2020笔记录,再排序取个中1000-1010这10条。

    数据库中心层项目背景不再展开,根据前期的调研以及和公司同事的评论辩论,中心层的核心目标重要有两个:

    • db虚拟化:让db对营业线透明(本文的db均指mysql),营业线不再须要知道db的┞锋实ip,port,主大年夜关系,读写关系,高可用等
    • 分库的支撑:让db的分库对营业线透明

    哪些Sql须要改写,若何改写?

    结合我们须要实现的四类分布式Sql:

    • patition key通俗萌芽 
    • patition key上的IN萌芽 
    • 非patition key上的萌芽 
    • 有限功能的排序+分页萌芽 

    只有(2)和(4)两项须要改写,改写办法上文已述,个中(4)的改写效力较低,应用起来要谨慎。

    1. <db id=0 logic_db="im"type=1> 
    2.  
    3.        <item ip="10.58.1.100" port=3306 name="im" /> 
    4.  
    5. </db> 

    中心层Sql路由组件SqlRouter是中心层中异常重要的一个部分,它负责对sql语句进行路由。

    哪些Sql须要路由,若何路由?

    结合我们须要实现的四类分布式Sql:

    • patition key通俗萌芽 
    • patition key上的IN萌芽 
    • 非patition key上的萌芽 
    • 有限功能的排序+分页萌芽 

    只有(1)和(2)两项须要路由,(3)和(4)须要将请求分发至所有的PARTITION。

    (2.9)中心层-ResultSetMerger

    中心层结不雅集归并组件ResultSetMerger是中心层中异常重要的一个部分,它负责对结不雅集进行归并,筛选。

    哪些Sql须要归并结不雅集,筛选结不雅集? 

    结合我们须要实现的四类分布式Sql:

    • patition key通俗萌芽 
    • patition key上的IN萌芽 
    • 非patition key上的萌芽 
    • 有限功能的排序+分页萌芽 

    个中(2)和(3)类萌芽须要将结不雅集进行归并,(4)不只要归并结不雅集,还须要将结不雅集在本地进行排序,然后再筛选出真正的结不雅集。

    (2.10)其他组件

    • AdminServer:监听一个新端口,吸法术据库治理员敕令的server 
    • AdminMgr:实现治理员敕令的组件 
    • MonitorMgr:实现监控报警的组件 
    • StatisticsMgr:实现数据统计功能的组件 

    感激看完,解释你对数据库中心件感兴趣,建议在PC上细看3遍,必定更有收成。


      推荐阅读

      Win10偷笑!Mac重大安全系统漏洞被修复 苹果道歉

    CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了 昨天我们报道了最新的Mac OS体系出现严重马脚的问题,重要来说就是,你设置的暗码设置形同虚设,输入“root”作为用>>>详细阅读


    本文标题:假如让你来设计数据库中间件

    地址:http://www.17bianji.com/lsqh/39319.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)