首页 文章 精选 留言 我的

精选列表

搜索[mycat],共386篇文章
优秀的个人博客,低调大师

Mycat分库分表核心技术分析

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

优秀的个人博客,低调大师

Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm调优

性能优化 JVM调优 Java程序性能优化 Tomcat Mysql Spring IOC Spring AOP Spring MVC Spring 5新特性 Mybatis 分布式架构 架构核心服务层技术 架构关键技术设施 分布式消息通讯 异步于MQ 分布式缓存 Redis Memcached MongoDB 数据存储 高并发分流技术Nginx 分布式解决方案 应用框架源码解读 微服务专题 你还不知道微服务?怎么加(zhuang)薪(bi) SpringBoot 与微服务的区别于联系 快速构建SpringBoot工程 SpringBoot核心组件剖析 快速集成mybatis实战 快速集成Dubbo及案例实战 构建集成 redis及案例实战 构建Swagger插件实现API 管理及接口测试体系 SpringCloud Zuul路由网关详解源码探析 Ribbon客户端负载均衡原理 Feign声明式服务调用方式 Eureka注册中心构件 Config配置服务中心 svn、git快速集成 Sleuth调用链路跟踪 BUS消息总线技术 Docker虚拟化技术 介绍、安装与使用 compose部署脚本 service服务编排 redis分布式集群部署 docker file构建 通过maven插件打包镜像 部署及运行应用程序kubernetes编配 构建Mysql集群实战 高可用SpringCloud微服务与docker集成实现动态扩容实战 团队协作开发 Git Maven Jenkins Sonar B2C商城项目实战 撸起袖子干实事,项目经验那点事 系统设计 架构设计 数据库设计 部署设计 基础开发框架讲解 用户管理子系统 用户注册登录(二维码技术) 权限控制(shiro) 单点登录(session统一缓存、sso) 商品管理子系统 商品管理(MongoDB) 商品分类(MongoDB) 商品发布(nosql与mysql数据同步) 热卖商品排行(redis) 搜索子系统 基于ES的全文探索 检索需求分析 检索策略 索引设置 分词算法 命中率优化 订单实时统计 订单子系统 分布式环境生成唯一编号(zookeeper) 下单业务流程(消息中间件) 订单可靠性 秒杀功能(redis) 订单管理 订单功能(mongodb) 支付系统 微信支付对接 支付宝对接 银联对接 开发 分布式调度系统 数据统计 数据同步 任务调度配置 后台系统 日常管理 在线IM系统(websockedNIO) 用户行为分析(日志系统设计) 报表大数据查询优化(mysql查询优化) 欢迎大家加入Java高级架构/互联网:779792048本群提供免费的学习指导 架构资料 以及免费的解答不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导进群修改群备注:开发年限-地区-经验方便架构师解答问题 性能优化 性能调优 JVM调优 Java程序性能优化 Tomcat Mysql 应用框架源码解读 Spring概述 Spring容器 Spring AOP Spring MVC Spring 5新特性 Mybatis 分布式架构 分布式架构思维 架构开发基础 架构核心服务层技术 分布式环境指挥官Zookeeper 分布式消息通讯 异步于MQ 分布式缓存Nosql Redis Memcached 缓存开发专题 MongoDB 数据存储 高并发分流技术Nginx 分布式常见场景解决方案 微服务架构 Springboot SpringCloud Docker虚拟化技术 团队协作开发 Git Maven Jenkins Sonar B2C商城项目实战

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。