MyCat 分析01

一、后端连接工厂,开启socketChannel

1 如果是AIO,就开启一个异步的channel

2 NIO 模式,就开启SocketChannel,然后设置为非阻塞的

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

查看代码MySQLConnectionFactory,创建后台连接的过程

1.获取连接池pool的config

2.创建一个AIO的channel,也就是Async

3.然后根据channel,初始化MySQLConnection,并且设置ip,port,user,password,schema,连接池pool

和超时时间

4.channel连接到这个connection

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再看physicalDBNode 获取连接的方式getConnection方法

1.首先检查schema不能为null,并且schema必须等于当前的database

2.检查dbpool必须初始化完毕

3.如果是强制走slave库

3.1 如果有负载均衡标志,就和获取所有的active读节点,然后调用random函数,均等随机;如果没有负载均衡标志,就把写节点设置为

不强制走slave

4.如果强制走master,记录写节点的负载值,获取connection,并且设置不可读

5.如果没有强制走master或者slave,就根据负载均衡策略获取合适的后端连接,策略如下

5.1 所有读写节点参与read请求的负载均衡,除了当前活跃的写节点

5.2 所有读写节点参与read请求的负载均衡

5.3 返回所有符合条件的读节点

5.4 不做负载均衡,balance=0或其他不为以上的值

MycatServerStartup 启动Mycat

1.zk初始化

  1.1 如果当前zk是启用的,就把zk的数据加载到本地

2.从系统配置,获取home路径

3.获取mycat实例

4.获取mycatServer实例,初始化

5.调用startup方法启动

MycatServer的构造函数

1.读取文件配置

2.启动一个单线程的定时线程

3.启动一个单独的心跳定时线程

4.新建一个sql记录器

5.缓存服务初始化

6.路由计算初始化

7.从配置中加载数据node的active index

8.从配置中初始化SQL解析器

9.从配置中初始化catlet加载器

10.记录启动时间

startUp方法

1.从config中加载系统配置

2.初始化路由策略工厂routeStrategyFactory

3.启动manager

4.启动Nio processors

5.初始化mycatMemory

6.继续创建businessExecutor, sequenceExecutor,timeExecutor

7.如果是aio,就创建aio的asyncChannelGroups和AIOAcceptor

8.如果是nio的,就初始化NIOReactorPool和NIOConnector,NIOAcceptor

9.启动manager,也就是serverChannel设置为open,然后accept

10.server启动,同9

11.初始化dataNode

12.心跳调度heartbeatScheduler开始执行

13.定时清理结果集排行榜,控制拒绝策略

14.初始化回滚日志recovery log

15.如果首次启动发现zk上dnindex为空,则将本地初始化zk

16.初始化路由数据initRuleData,写入到zk目录下

Mycat初始化时,会初始化MycatConfig

1.加载schema.xml,  rule.xml  和 server.xml的配置

都是通过ConfigInitialLizer读取

2.循环所有的dataNodes,然后加载它们的schema配置

3.初始化重加载配置时间

4.配置加载锁

重新加载配置的流程

1.停止老的数据源心跳

2.备份老的数据源配置

3.启动新的数据源心跳

4.执行新的配置

整体的配置加载流程, 入口是ConfigInitializer,配置的加载顺序是rule.xml,schema.xml,最后读取server.xml。

1.读取rule.xml,使用ruleLoader,调用load

  1.1 从file中读取dtd和xml

  1.2 读取出语意树

  1.3 从配置中加载function,获取name,class标签,然后根据class利用反射新建分片算法,读取参数配置分片算法,放入functions map

  1.4 从配置中加载tableRule,获取每个tableRule标签,判断是否重复,目前只处理第一个rule,从上面的map中获取分片算法,然后填充到rule中,最后放入tableRules这个map中

2.读取schema.xml 的配置

  2.1 先调用上面读取rule.xml的配置

  2.2 将tableRules拿出,用于加载schema做rule有效判断,以及之后的分片路由计算。

  2.3 释放ruleLoader

  2.4 开始读取schema.xml配置,读取出dtd和xml,初始化root

  2.5 加载所有的dataHost,判断如果重复,抛出ConfigException;读取最大和最小连接数,负载均衡配置(0-读写不分离 1-读和待定的写节点不参与负载均衡 2-读操作都随机地在读写节点上分发 3-读请求 随机分发给读节点,写节点不承担读请求)

  2.6 继续读取切换类型( -1-不自动切换 1-自动切换 2-基于Mysql主从同步决定是否切换 3-基于Mysql galary cluster 的切换机制

  2.7 读取从节点延迟阈值,读取写类型, 还有dbDriver,dbType,slaveIDs等

  2.8 读取心跳语句,读取初始化sql的配置,读取写节点writeHost和没一个写节点对应的读节点readHost,放入到readHostsMap

  2.9 通过上面读取的各种配置信息,填充hostConf,放到dataHosts这个map中

  2.10 加载所有的DataNode,读取“dataNode” 标签,获取nodeList

  2.11 读取dnName,databases,hostString,然后创建dataNode

  2.12 最后加载所有的schema,读取“schema”标签,获取nodeList

  2.13  读取各个属性,包括name,dataNode,最大连接数,返回结果集限制

  2.14 校验检查并且添加dataNode

  2.15 加载schema下所有的tables ,判断schema是否重复

  2.16 上面的配置填充schemaConfig,包括db类型,如果不是mysql类型,需要支持多数据源,记录每种dataNode的DB类型,填充到schemaConfig,最后保存到schemas这个map

3.读取server.xml 

 3.1 读取出dtd和xml

 3.2 加载System标签,读取出mysqlVersion

 3.3 加载User标签,读取用户相关的信息,包括name,password,用户DML权限,

     放入users这个map

 3.4 加载cluster配置,包括主机地址host,权重weight,分组信息

 3.5 加载全局SQL防火墙配置

4.初始化权限管理

5.不同类型的全局序列处理器的配置加载,包括MysqlDB,LocalTime,ZK_Distributed,

  ZK_Global_Increment

6.配置文件初始化,自检:检查user与schema配置不为空

7.实际链路的连接测试

发布了386 篇原创文章 · 获赞 2 · 访问量 9845

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/105014865