摘要: zebra源码结构 zebra客户端结构 分库分表数据源ShardDataSource初始化过程 分库分表语句ShardPreparedStatement执行过程 逻辑表名的解析过程 如果定位到多个分库或分表怎么执行的? 不带分片键的sql会怎么执行? 分组数据源GroupDataSource及其初 阅读全文
posted @ 2021-07-16 23:43 mushishi 阅读(565) 评论(0) 推荐(1) 编辑
摘要: 之所以要进行流量控制,是要避免业务应用流出量倾斜,超过分库能承载的压力 zebra的限流架构 粒度 指定要保护的db节点 指定要流控的应用ip 指定sqlId, 计算规则: sqlId = MD5(/appName/{mapper方法}).subString(0, 8) 限流策略: autoCont 阅读全文
posted @ 2021-07-16 23:19 mushishi 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 一、 JdbcFilter 过滤器 zebra 定义了 JdbcFilter 过滤器, 它包含的方法覆盖了 zebra 执行生命周期的各个环节(如各层数据源的初始化/刷新、分组连接的获取/关闭、sql的执行 等); 那么就方便在各个环节进行监控上报等操作了 public interface Jdbc 阅读全文
posted @ 2021-07-16 23:16 mushishi 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 如果数据库连接首次建立失败,会怎么样? SingleDataSource#initDataSourceOrigin -> this.dataSourcePool.build 构建底层数据库连接池的时候,如果创建失败会直接抛出一个异常 ,初始化状态不会置为 true,如下 throw new Zebr 阅读全文
posted @ 2021-07-16 22:58 mushishi 阅读(155) 评论(0) 推荐(0) 编辑
摘要: sql语句: (1) insert into [table] xx values(x,x,xx); (2) select @@Identity; 或 select last_insert_id(); 比如这种常见的 insert 后要获取自增主键值的, 需要在同一个连接同一个statement操作 阅读全文
posted @ 2021-07-16 22:56 mushishi 阅读(97) 评论(0) 推荐(0) 编辑
摘要: GroupDataSource的物理结构 负载均衡的对象 zebra的负载均衡是在GroupDataSource的读库 readDataSource( LoadBalanceDataSource) 中进行的, 它内部包含多个读库节点的SingleDataSource LoadBalanceDataS 阅读全文
posted @ 2021-07-16 22:54 mushishi 阅读(146) 评论(0) 推荐(0) 编辑
摘要: TableShardRule#eval 根据路由规则解析sql的时候如果没匹配找到分片键的值 // full table scan if is not insert sql. if (type != SqlType.INSERT && type != SqlType.REPLACE) { if (f 阅读全文
posted @ 2021-07-16 22:51 mushishi 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 假设分库分表情况如下 分库 id0:分表 test_0 、 test_1 分库 id1: 分表 test_2、 test_3 sql语句: select test.* from test 一、路由结果 DefaultRouter#router 路由出来的结果两个 RouterResult, 每个里边 阅读全文
posted @ 2021-07-16 22:40 mushishi 阅读(212) 评论(0) 推荐(0) 编辑
摘要: zebra 解析sql使用的阿里druid连接池内部的 ast解析器 SQLParser#parseInternal(SQLStatement stmt) 解析sql 语句的时候,会使用自定义 ast 的访问器 AbstractMySQLASTVisitor 去访问 SQLStatement 的 S 阅读全文
posted @ 2021-07-16 22:37 mushishi 阅读(119) 评论(0) 推荐(0) 编辑
摘要: SingleDataSource 对应 GroupDataSource 主库节点 或一个从库节点 由于它是对应的是实际的db节点,直接和底层数据库连接池打交道; zebra 将它的生命周期交由 SingleDataSourceManager 进行管理,负责构建、启停、销毁, 销毁的过程是异步的,先将 阅读全文
posted @ 2021-07-16 22:36 mushishi 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 在初始化 GroupDataSource 的时候,会往它的配置管理器 DefaultDataSourceConfigManager中添加了一个配置监听器 代码路径:GroupDataSource#init() -> initConfig(); this.dataSourceConfigManager 阅读全文
posted @ 2021-07-16 22:35 mushishi 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 前面 分组数据源GroupDataSource及其初始化 已经知道 GroupDataSource 在初始化的时候会初始化两个DataSource, 读 readDataSource + 写 writeDataSource 由于zebra 也是基于 jdbc规范实现的, 所以sql执行的过程和 jd 阅读全文
posted @ 2021-07-16 22:34 mushishi 阅读(260) 评论(0) 推荐(0) 编辑
摘要: GroupDataSource 负责一组 db节点,包含多个SingleDataSource, 将它们分为一个主和多个从进行读写分离和多个从库的负载均衡; 对应db部署架构的话 对应一个分库 或 一主多从 shardDataSource分库分表中的分库对应的就是 GroupDataSource,也可 阅读全文
posted @ 2021-07-16 22:33 mushishi 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 主要过程包括: 分库分表的路由定位 sql语句的 ast 抽象语法树的解析 通过自定义 SQLASTVisitor (MySQLSelectASTVisitor) 遍历sql ast,解析出逻辑表名 查找逻辑表名对应的分库分表规则 根据逻辑表的分库分表规则,遍历sql ast定位分片键的值 根据中间 阅读全文
posted @ 2021-07-16 22:31 mushishi 阅读(282) 评论(0) 推荐(0) 编辑
摘要: ShardDataSource 间接实现了 jdbc api 的 DataSource 接口 它持有多个GroupDataSource,存于 dataSourcePool 的 map 中 ,dataSourcePool 由数据源仓储 DataSourceRepository 初始化 ConfigSe 阅读全文
posted @ 2021-07-16 22:19 mushishi 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 最上层 ShardDataSource: 用于分库分表; 包含一个或多个 GroupDataSrouce GroupDataSource: 主要用于读写分离, 分库中的一个shard 最下层的 SingleDataSource: 主要用于和 mysql 单个实例的连接, 这边是真正和连接池 dbcp 阅读全文
posted @ 2021-07-16 22:18 mushishi 阅读(178) 评论(0) 推荐(0) 编辑
摘要: zebra-client(核心) : 除了监控外,几乎zebra所有核心功能,如读写分离、分库分表、就近路由、流量控制; zebra-cat-client(可选): 提供端到端的监控,将监控信息上报到CAT监控平台 zebra-dao(可选):对mybatis的轻量级封装,兼容mybatis原有的功 阅读全文
posted @ 2021-07-16 22:12 mushishi 阅读(494) 评论(0) 推荐(0) 编辑