基于代理的分库分表中间件_第1页
基于代理的分库分表中间件_第2页
基于代理的分库分表中间件_第3页
基于代理的分库分表中间件_第4页
基于代理的分库分表中间件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

基于代理方式的分库分表中间件dbproxy目的地技术部周文斌目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3Dbproxy是什么?数据库代理关系数据库的路由器关系数据库升级到大数据的应用中间件基于开源的mycat实现支持数据的水平拆分2023/2/3解决的问题数据的增长存储问题数据库连接的集中式管理数据库的透明化扩展数据库的透明化迁移2023/2/3实现的功能分库分表读写分离负载均衡服务注册发现权限控制目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3总体架构mysqlmysqlpgBackendConnectionManagerpgDriverFrontendConnectionManager协议适配(mysql)协议解析Sql解析规则路由Sqlexecutor结果合并响应报文客户端客户端MysqlDriverMysql数据包目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3前端连接管理客户端FrontendConnectionManager连接请求acceptFrontendConnection握手报文发送握手报文构造握手报文认证信息校验认证响应报文响应报文1.跟客户端建立连接2.进行权限认证3.前端连接的创建及销毁协议解析模块MySQLMessage封装了Mysql协议包的操作方便对TCP的数据进行Mysql协议解析3byte1bytenbytes消息长度报文数据序号消息头消息体1bytenbyte命令参数mysql报文请求消息体协议解析模块3byte1bytenbytes3byte1bytenbytes3byte1bytenbytes3byte1bytenbytes3byte1bytenbytesResultSetHeaderFieldEOFRowDataEOFResultSetHeaderPacket,FieldPacket,EOFPacket,RowDataPacketMysql响应报文目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3路由模块SQL解析DruidParse分库标示路由规则路由函数读写分离特殊路由事务强制读主库无分库标示qmq路由SQL解析获取分库标示,定位分片参数1分片2分片…

解析语句,定位主从SelectStatement从库UpdateStatement,DeleteStatement,InsertStatement主库2023/2/3路由配置2023/2/3<dataNodename="dn0"dataHost="server0"database="des_trade"/><dataHostname="server0"maxCon="15"minCon="10"balance="2"writeType="0"dbType="postgresql"dbDriver="jdbc"> <heartbeat>selectnow()</heartbeat> <writeHosthost="hostM0" url="jdbc:postgresql://:5432/des_trade" user="tuan_usr"password=“xxxxxxxxx"> <readHosthost="hostS01" url="jdbc:postgresql://:6432/des_trade" user="tuan_usr"password=“xxxxxxxxx"/> </writeHost></dataHost>数据库节点对应的dn0,dn1路由配置每个表都会配置分库规则每条规则对应一个路由函数<tablename="order_oplog"primaryKey="ID"dataNode="dn0,dn1"rule="begin-after-one-day-by-oid"/><tableRulename="begin-after-one-day-by-oid"><rule><columns>oid</columns><algorithm>afterOneDayByOid</algorithm></rule></tableRule><functionname="afterOneDayByOid"class="com.qunar.des.dbproxy.function.PartitionByOIDAfterDay"><propertyname="dateFormat">yyyy-MM-dd</property><propertyname="sBeginDate">2015-09-24</property><propertyname="sPartionDay">180</property></function>路由模块路由函数路由算法

RuleAlgorithmRuleAlgorithmAbstractPartitionAlgorithmPartitionByOIDAfterDayPartitionByDateAfterDay路由模块Sql语句DruidParserRouterWriteReadupdateselectselect*fromtablewhereid=1updatetablesetstatus=2whereid=1SelectStatementselect*fromtablewhereid=1UpdateStatementupdatetablesetstatus=2whereid=1读写分离事务begintransaction selectsql updatesql insertsql

committransaction(rollbacktransaction)

直接路由到Write库,直到事务提交/回滚强制读主库/*balance*/方式@ReadMaster注解特殊路由2023/2/319无分库标示select语句,会查询所有的库表,将数据汇总后,返回给客户端insert语句,直接报错update语句,会更新所有库表的数据delete语句,会删除所有的库表的数据qmq_msg_queue的路由参照同一事务内其他sql的路由如果没有其他sql,则执行默认的路由特殊路由2023/2/320目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3SQL执行模块ResponseHandlerSingleNodeHandlerMultiNodeHandlerCommitNodeHandlerRollbackHandlerSingleNodeHandler.execute()路由到一个分片时被执行执行MultiNoderHandlerNodeHandler.execute()路由到多分片时被执行执行CommitNodeHmit()提交事务执行CommitNodeHandler.rollback()回滚事务执行SQL执行模块NonBlockSession:一个连接的会话,绑定前端连接跟后端连接无事务:每个sql在不同连接执行有事务:所有sql在同一个连接上执行

SQL执行模块NonBlockingSessioncon1con2con3Sql1,sql2,sql3sql1sql2sql3NonBlockingSessioncon1sql1,sql2,sql3,commitSql1,sql2,sql3commitreleasecon1releasecon1releasecon2releasecon3无事务有事务前端连接后端连接SQL执行过程客户端connectionSql请求路由Mysql报文postgresqlSQL执行器Sql语句报文转换执行结果Mysql响应报文执行结果Sql解析mysql目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3后端连接管理模块管理后端数据库连接创建新的数据库连接回收连接分片主从管理控制读写分离后端连接管理管理后端真实数据库的连接DBBackendConnctionMangerSql执行请求Connection执行结果目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3负载均衡注册发现使用zookeeper实现,dbproxy启动的时候在zookeeper上注册服务地址,客户端监听对应节点的信息,如果有服务上线,或者下线,动态的获得dbproxy的服务列表,然后动态生成数据源,供客户端使用。zookeeperdbproxydbproxydbproxyregisterclientdatasourcedynamicDataSourcesubscribecreateinjection负载均衡负载均衡,是使用了spring的动态数据源AbstractRoutingDataSource,扩展了该数据源,从动态数据源中根据一定的负载均衡策略,选出一个可以使用的数据源。

(1).随机策略:随机选一个可用的数据源。

com.qunar.des.dbproxy.datasource.balance.RandomStrategy (2).轮询策略:从可用的数据源中,按照顺序轮询。 com.qunar.des.dbproxy.datasource.balance.RoundRobinWeightStrategy

可以通过实现BalanceStrategy.getNext实现不同的负载均衡策略。Dbproxy分组通过为dbproxy配置不同的组,可以灵活的组装不同的dbproxy为一个集群dbproxydbproxydbproxydbproxydbproxydbproxydbproxydbproxydbproxydes.dbproxy.orderdes.dbproxy.voucherdes.dbproxy.task目录解决的问题总体架构前端连接管理路由模块SQL执行模块后端连接管理负载均衡权限控制2023/2/3权限控制基于appcode进行权限控制新增应用Qconfig动态增加appcode增加新机器就已经有权限了2023/2/3监控报警慢查询监控连接数监控执行SQL错误监控前后

温馨提示

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

评论

0/150

提交评论