2019独角兽企业重金招聘Python工程师标准>>>

1、线程模型

1.1、Reactor多线程

1.2、处理流程

1) NIOAccetpor中的Selector只接收SocketChannel的accept事件;
2) 从NIOReactor[]数组中依次获取一个NIOReactor;
3) 将此SocketChannel放到对应NIOReactor中的Queue中;
4) 由NIOReactor新建的Thread,不断循环将Queue中的SocketChannel取出并注册到当前NIOReactor关联的Selector上面;
5) 不断循环Selector返回的SelectionKey进行数据读取;
6) 从DirectByteBufferPoll中先分配一块内存(trunk=4k);
7) 读取SocketChannel中的数据,如果一个trunk可以读完数据则进行认证、mysql协议解析,encode、并调用对应的handler处理。否则计算报文的长度根据size分配足够的内存,并将之前读取的数据copy进来,继续读取直至读完。

1.3、流程图

1.4、优点

1) 一个NIOAcceptor(聚合了一个Selector,一个线程)可以处理成百上千的客户端连接,每当有一个新的客户端连接时,就从NIOReactor[]数组中顺序获取一个NIOReactor,当达到数组上限时重新返回0,基本保障了NIOReactor间的负载均衡。
2) 通过NIOReactor[]线程组实现了串行化线程水平并行执行,线程之间没有交集,充分利用多核提升并行处理能力。
3) NIOReactor[]线程组互不影响,起到故障隔离作用。
4) 报文的读取、解析、编码、以及后续Handler的执行,始终都在一个NIOReactor 的IO线程上面操作,避免了线程上下文切换和并发修复的风险。

1.5、缺点

1) 维护性差:IO线程和handler业务线程为同一个线程,一旦handler处理(认证、解析、PS渲染、SQL解析、SQL路由)出现延迟,这些延迟毛刺定位难度很大。

1.6、思考

1、为什么不使用主从Reactor?
2、为什么或怎么可以把IO线程和业务Handler分开?

2、内存管理

DirectByteBufferPool启动时向系统申请固定数量(PROCESSORS * 20),大小(512 * 4096)一样的连续内存空间用于创建ByteBufferPage,ByteBufferPage被切分为固定大小的trunk(4096)块。通过BitSet位图进行内存的分配和回收,1代表已使用,0代表未使用,在每个ByteBufferPage上面通过AtomicBoolean实现并发控制。

2.1、分配流程

1) 根据size计算需要的trunk数量,整块连续分配,size<4K则分配一个trunk;
2) 根据上次分配的Page+1,依次从ByteBufferPage[]中取出一个进行分配,报错分配分配相对均衡,同时一定程度上缓解了线程间的竞争。
3) 分配时先对ByteBufferPage通过AtomicBoolean进行加锁,找到符合数量(BitSet为0)的连续空间,通过ByteBuffer的limit()和position()以及slice()进行分配,同时将对应的BitSet位图置为1,如果找不到则去下个Page中分配;
4) 如果都没有空间,则再分配异常,再没有则使用HeapByteBuffer。

2.2、优点

1) DirectByteBuffer的分配和释放比堆内慢10-20倍,进行池化可以快速分配内存;
2) 池化技术可以使对象复用,降低GC频率。
3) trunk块大小相同,BitSet位图内存分配和回收简单;
4) 做为全局数据,通过设置ByteBufferPage[]数量,缓解多线程环境下的锁竞争;

2.3、缺点

1) 一次性申请完成之后,不能动态扩展;
2) 固定大小内存,管理的粒度很粗,碎片较大;

2.4、Netty内存管理

Netty内存池的层级结构主要分为,Arena,ChunkList、Chunk、Page、SubPage
Arena:代表一个内存区域,内存池由Arena[]数组组成,分配时每个线程按照轮训策略选择一个Arena分配。一个Arena由两个PoolSubPage和ChunkList双向链表组成。
ChunkList:由多个Chunk组成的双向链表,可动态变化。
Chunk:每个Chunk由默认由2048个Page组成。
Page:大小固定,默认8K,通过完全二叉树管理Page的分配和释放。
SubPage:大小不固定,又分为tinySubPage,区间[16,512)和smallSubPage,区间[512,4096),通过位图分配和释放。

3、Druid SQL Parser

代码结构:

1、Parser:将SQL转换成AST(抽象语法树),包括Parser(语法解析)和Lexer(词法解析)
2、AST(Abstract Syntax Tree)
3、Visitor:遍历AST的工具
4、执行流程:词法解析(SQL词库) -> 语法解析(校验是否符合语法逻辑,如from 后面要跟表名) -> 输出AST

 

4、连接池

4.1、定时任务

1) 后端连接检测:SQL执行超时(300s)检查、Idle检查;
2) 前端连接检测:Idle检查(默认30min);
3) 后端连接健康心跳检测:连接是否正常(被对端关闭,网络断开重连等),维持最小连接;
4) 数据节点DataHost心跳检测:检测datasource是否可用;
5) 全局表一致性检测:数据量是否一致;

5、优化和未来

5.1、优化

1) 聚焦而不是膨胀,核心功能和业务需求之前的平滑;
2) 提升统一内存池管理效率,缓解多线程分配时的锁竞争,减少内存碎片;
3) 杂乱的ScheduledExecutorService定时任务(10个)打乱了NIOReactor串行化设计思想,造成了没有必要的线程上下文切换,可统一管理这些定时任务,参考Netty中的时间轮定时任务;

5.2、未来

1、多维度、立体化、全方位监控体系;
2、便捷、易用的管控运维平台;
3、分布式数据库(动态扩容、Percolator分布式事务);

Ref:

https://blog.csdn.net/zhousenshan/article/details/82432805

https://www.jianshu.com/p/8d894e42b6e6

https://www.jianshu.com/p/2652686a43eb

转载于:https://my.oschina.net/u/3787772/blog/3039261

Mycat分库分表核心技术分析相关推荐

  1. MySQL单表膨胀优化之MyCat分库分表

    MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...

  2. mycat分库分表与读写分离

    mycat分库分表与读写分离 Dockerfile搭建mycat 1.创建mycat的配置文件 #新建目录 mkdir /docker/mycat#切换目录 cd /docker/mycat#下载my ...

  3. mycat分库分表+springcloud微服务小案例实现

    文章目录 1. MyCat综合案例 1.1 案例概述 1.1.1 案例介绍 1.1.2 系统架构 1.1.3 技术选型 1.2 案例需求 1.3 案例环境搭建 1.3.1 数据库 1.3.2 工程预览 ...

  4. mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置

    一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件,运行在代码应用和MySQL数据库之间的应用. 前身: corb ...

  5. docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...

    一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...

  6. 利用MyCAT分库分表

    文章目录 MyCAT分库分表 一.分库分表简介 二.垂直切分---分库 1.思想 2.配置实现 三.水平切分 MyCAT分库分表 一.分库分表简介 在业务数据量过多的时候,而且数据不断持续增长的情况下 ...

  7. MyCat分库分表和读写分离

    文章目录 1.MyCat 1.1.MyCat简介 1.2.Mycat对多数据库的支持 1.3.MyCAT架构 1.4.MyCat分库分表 1.5.MyCat下载与安装 1.5.1.下载mycat 1. ...

  8. mycat分库分表demo

    关于Mycat,它是一个阿里的开源项目,用来解决分库分表的海量数据存储和查询优化,关于它的简介,可以直接参考介绍:Mycat简介. 下面对自己的demo做个记录: 我之前从192.168.68.3克隆 ...

  9. 细讲MyCat分库分表策略

    作为服务端模式的典型代表,MyCat不仅提供了丰富的分库分表策略,也提供了非常灵活的读写分离策略,并且其对客户端的侵入性是非常小的.本文主要讲解MyCat主要提供的分库分表策略,并且还会讲解MyCat ...

最新文章

  1. Hugging Face官方课程来了!Transformers库维护者之一授课,完全免费
  2. 在VS2008中使用Qt编程
  3. 《数据库原理与应用》(第三版) 第 6 章 数据操作语句 基础 习题参考答案
  4. PowerDesigner 使用的一些技巧
  5. matlab胡良剑第五章,MATLAB习题参考答案(胡良剑,孙晓君)
  6. 如果误删谷歌浏览器的书签,怎么恢复
  7. smart原则_为什么现在少有人用德鲁克的SMART原则做目标管理了?
  8. 分布式事务模型--基于消息的分布式事务
  9. 【渝粤教育】国家开放大学2018年春季 0242-21T机械制图 参考试题
  10. C++ concurrent_queue::try_pop 方法
  11. paip.语义分析--单字动词表.txt
  12. Django(四):模型层Model
  13. Linux的操作系统下载及安装
  14. 论文阅读笔记 | 分类网络——ParNet
  15. vue开发app项目实例
  16. 分享两个C库源码中的移位函数
  17. mysql.sock 路径_关于mysql.sock路径的问题
  18. 7-1 打印倒直角三角形图形 (20 分)
  19. 两个网段共享打印机_两个网段打印机共享
  20. Gradle-SpringCloud聚合项目配置

热门文章

  1. 我用24小时、8块GPU、400美元在云上完成训练BERT!特拉维夫大学新研究
  2. Homebrew正式支持苹果M1,程序员换新Mac又多了一条理由
  3. 第十三届光华工程科技奖公布,彭士禄、张伯礼、王海峰等40人及1个团体获奖
  4. MIT新研究给量子计算机「泼冷水」:自然界辐射会干扰它,需要研究新对策 | Nature...
  5. 中国发展研究基金会联合百度发布智能经济白皮书:新基建是助燃剂,其势已成...
  6. NeurIPS 2019放榜:华人作者贡献42%,谷歌170篇屠榜;国内清华第一,腾讯领衔产业界...
  7. 意念实时转语音!Facebook的非植入式脑机接口,解码准确率达到76%
  8. 解读Windows更新下载器文件列表(推荐)
  9. 性能分析:hash索引导致delete慢
  10. 虚拟机软件之vmware workstation安装篇