小工具      在线工具  汉语词典  css  js  c++  java

mycat源码分析select

java,mycat,源码分析 额外说明

收录于:40天前

搭建源码环境

请先按下面这个说明 把mycat处理起来,
http://blog.csdn.net/mingover/article/details/78846853

下载源码,
覆盖下面三个文件
Mycat-Server\src\main\resources\server.xml
Mycat-Server\src\main\resources\rules.xml
Mycat-Server\src\main\resources\schema.xml

启动进程
MycatStartup.java

从mysql客户端登录mycat服务器

mycat中select的执行线程

说明在断点处,会有几个请求,比如show states;你需要寻找 sql 之一。

在 ServerConnection.routeEndExecuteSQL 中设置断点。我们可以看到线程内容如下图

$_NIOREACTOR-2-RW@2373" prio=5 tid=0x16 nid=NA runnable java.lang.Thread.State: RUNNABLE at io.mycat.server.ServerConnection.routeEndExecuteSQL(ServerConnection.java:275) at io.mycat.server.ServerConnection.execute(ServerConnection.java:226) at io.mycat.server.handler.SelectHandler.handle(SelectHandler.java:105) at io.mycat.server.ServerQueryHandler.query(ServerQueryHandler.java:79) at io.mycat.net.FrontendConnection.query(FrontendConnection.java:324) at io.mycat.net.FrontendConnection.query(FrontendConnection.java:344) at io.mycat.net.handler.FrontendCommandHandler.handle(FrontendCommandHandler.java:71) at io.mycat.net.FrontendConnection.rawHandle(FrontendConnection.java:500) at io.mycat.net.FrontendConnection.handle(FrontendConnection.java:482) at io.mycat.net.AbstractConnection.onReadData(AbstractConnection.java:327) at io.mycat.net.NIOSocketWR.asynRead(NIOSocketWR.java:196) at io.mycat.net.AbstractConnection.asynRead(AbstractConnection.java:279) at io.mycat.net.NIOReactor$RW.run(NIOReactor.java:113) at java.lang.Thread.run(Thread.java:744)

Select的数据分片思路

既然是分表,在查询的时候,自然 是把sql拆出来到多个节点中查询,通过代码,我们发现下面这几个关键类
ServerConnection.routeEndExecuteSQL -> RouteService.route
以下为获取rrs的内容

/** * 检查是否有分片 */
if (schema.isNoSharding() && ServerParse.SHOW != sqlType) {
    rrs = RouterUtil.routeToSingleNode(rrs, schema.getDataNode(), stmt);
} else {
    RouteResultset returnedSet = routeSystemInfo(schema, sqlType, stmt, rrs);
    if (returnedSet == null) {
    rrs = routeNormalSqlWithAST(schema, stmt, rrs, charset, cachePool,sqlType,sc);
}
}

如上图所示 DruidMycatRouteStrategy.routeSystemInfot得到了rrs对象,这个对象是包含了多个节点的sql,其内存内容如下图所示
这里写图片描述

以下copy自《mycat权威指南》
这里写图片描述

可以看到,路由中对应两个库,
源sql是 limit 10635,10
对应于两个库 是 limit 0,10645,可以猜想 其是要从两个库中查出这么多数据,然后进行排序取10条数据返回到客户端

还可以在日志中看到情况:

2018-04-10 21:48:46,068 [WARN ][$_NIOREACTOR-5-RW] ServerConnection [id=1, schema=TESTDB, host=127.0.0.1, user=root,txIsolation=3, autocommit=true, schema=TESTDB]SELECT * from t_gd_user_copy t limit 10635,10, route={
   1 -> tx_pay{SELECT *
FROM t_gd_user_copy t
LIMIT 0, 10645}
   2 -> tx_pay2{SELECT *
FROM t_gd_user_copy t
LIMIT 0, 10645}

选择实施步骤

如下图,首先获取路由rrs,里面已经有notes描述了,各个节点的sql也可以了。

public void routeEndExecuteSQL(String sql, final int type, final SchemaConfig schema) {
// 路由计算
RouteResultset rrs = null;
try {
rrs = MycatServer
    .getInstance()
    .getRouterservice()
    .route(MycatServer.getInstance().getConfig().getSystem(),
    schema, type, sql, this.charset, this);

} catch (Exception e) {
    ...
}
    if (rrs != null) {
        // session执行
        session.execute(rrs, rrs.isSelectForUpdate()?ServerParse.UPDATE:type);
    }
}

拿到rrs后,去哪里查看mysql呢?

确认路由后,则需要具体去查询 节点的mysql了.
涉及到connection等,
涉及类:PhysicalDBNode.getConnection -> PhysicalDatasource.PhysicalDatasource

处理完conn后,使用MultiNodeQueryHandler.connectionAcquired具体执行sql,贴出关键内容:

private void _execute(BackendConnection conn, RouteResultsetNode node) {
    if (clearIfSessionClosed(session)) {
    return;
}
    conn.setResponseHandler(this);
try {
    conn.execute(node, session.getSource(), autocommit);
} catch (IOException e) {
    connectionError(e, conn);
}
}

如果继续在conn.execute里面进去,会发现mycat使用的是nio模式,所以这里不会有返回。返回及相关内容在回调函数中进行处理。

我们也可以在《mycat权威指南》文档中找到相关端倪
这里写图片描述

当sql返回时怎么办?

如果mycat请求mysql使用nio模式,那么返回的结果自然不会在发送线程中进行处理。但逻辑仍在处理程序中

如果是两台机器的sql,那么两台机器把sql发送到mysql后,就会去nio的resp进行处理。

MultiNodeQueryHandler类的以下方法

/** * 将汇聚结果集数据真正的发送给Mycat客户端 * @param source * @param eof * @param */
public void outputMergeResult(final ServerConnection source, final byte[] eof,          Iterator<UnsafeRow> iter,AtomicBoolean isMiddleResultDone) {
    ...
}

你去哪里回去找客户?

采用nio的话,发出和发送就是不同的线程,
如图所示 MultiNodeQueryHandler 处理类中 会把内容write出去,即发送到客户端
这里写图片描述

上面这个函数是 multiQueryHandler.outputMergeResult .
在这之前,还是有sort之类的逻辑

mycat的nio访问入口

如果你对java的nio编程有了解,可以去从入口中往里走
NIOReactor.run()

@Override
public void run() {
    int invalidSelectCount = 0;
    Set<SelectionKey> keys = null;
    for (;;) {
        ++reactCount;
    try {
        final Selector tSelector = this.selector;
        long start = System.nanoTime();
        tSelector.select(500L);
        long end = System.nanoTime();
        register(tSelector);
        keys = tSelector.selectedKeys();
        .....
. . .

相关推荐

额外说明

SpringBoot访问静态资源并jar外部静态资源,将前端打包的vue项目部署到静态资源中。

记录一下使用SpringBoot访问静态资源和SpringBoot打包之后的jar外部静态资源,在开发的时候,一般选择前后端分离的方式,前端使用vue 后端使用SpringBoot,通常情况下,部署都是前端通过http去请求后端资源,涉及到http请求,

额外说明

想法远程调试

文章目录 1,远程DEBUG的必要性 2,IDEA构建SpringBoot测试Demo 3,测试Demo项目配置支持远程调试 4,IDEA打包jar 5,启动jar并且带启动参数支持远程调试 6,IDEA远程DEBUG配置 7,IDEA远程DEBUG测试

额外说明

RabbitMq学习-rabbitmq与Springboot集成交换机的说明与配置(一)

一、概述 我们都知道交换机/转发器,再消息队列中非常实用,他也是rabbitmq区别其他消息队列的最显著的亮点。 在rabbitmq中的消息转发器类型中,我们知道有好几种,分别是哪些呢?看源码中的说明吧: /** * Enum for built-in

额外说明

PostgreSQL性能的几个重要参数

PG的配置文件是数据库目录下的postgresql.conf文件,8.0以后的版本可支持K,M,G这样的参数,只要修改相应参数后重新启动PG服务就OK了。 shared_buffers:这是最重要的参数,postgresql通过shared_buffer

额外说明

AIR读取本地文件

<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" fo

额外说明

【Unity小游戏】益智类小游戏《保护小猫》做一个暖心的铲屎官,还有语音聊天功能【文末送书】

目录 -引言 -【小游戏】保护小猫 效果展示+完整项目源码 -游戏图片 -工程解析 -核心代码讲解 -接入声网音频SDK -游戏源码下载 -总结 -评论区抽奖送书 -抽奖规则 -推荐理由(⭐⭐⭐⭐⭐) -引言 小伙伴们好久不见,今天给大家带来一个保护小猫

额外说明

es使用pencentiles对网站访问延时统计

在实际业务中,可能会遇到这样的需求,基于IP或者区域统计不同地区的网站网站访问量,根据访问量的不同指标,指导线上服务部署的优化等, 需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99 tp50:50%的请求的耗时最长

额外说明

JavaWeb|在IDEA中创建基于Maven的Web项目| Servlet依赖|这一篇就够了(超详细)

-作者简介:练习时长两年半的Java up主 -个人主页:老茶icon - ps:点赞-是免费的,却可以让写博客的作者开兴好久好久- -系列专栏:Java全栈,计算机系列(火速更新中) - 格言:种一棵树最好的时间是十年前,其次是现在 -动动小手,点个关

额外说明

配置linux的anaconda3国内清华、阿里云镜像 & anaconda查看源和恢复默认默认源操作

配置linux的anaconda3国内清华、阿里云镜像 配置源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda confi

额外说明

gitlab介绍安装及功能全部介绍

gitlab介绍与安装 我们了解git是以个人为中心,但是人人都得数据交互呀。Python程序员每天都忙着进行交易 交互式数据的方式 ● 使用github或者码云等公有代码仓库,托管代码的地方,谁都可以看 ● 公司内部使用github私有仓库 githu

ads via 小工具