一、Mycat线程模型
Mycat的线程主要包括下面几个部分:
- 主线程
- IO线程:包括NIOAcceptor、NIOConnector、NIOReactor
- 调度线程(ScheduledExecutorService):包括scheduler、heartbeatScheduler
- 业务线程池:包括timerExecutor、businessExecutor
Mycat中,所有的线程(池)都是在Mycat启动时初始化的,具体的实现可以参考MycatServer类中的代码。下面我们就上面的线程逐一讲解各自的作用。
1、IO线程:NIOAcceptor、NIOConnector、NIOReactor
- NIOAcceptor:单线程,用于接受客户端连接请求
- NIOConnector:单线程,用于处理后端连接数据库的操作
- NIOReactor:通过线程池(NIOReactorPool)管理,线程的个数固定,默认为机器核数,例如:4核4G的机器,线程的个数就是4,可以在server.xml中进行配置:
<property name=”processors”>2</property>
机器的核数可以通过Runtime.getRuntime().availableProcessors()来获取
2、调度线程(ScheduledExecutorService):scheduler、heartbeatScheduler
Mycat线程模型使用了 1+N 的设计方式,1表示调度线程,N表示下面要说的业务线程池(timerExecutor),调度线程只负责调度,具体的逻辑交给timerExecutor执行。
scheduler主要负责下面几件事情
(1)定时检查不同分片表结构一致性
默认1min执行一次,可以在server.xml里面配置:
<property name=”checkTableConsistencyPeriod”>1</property>
(2)定时清理保存在SqlStat中的数据
每5s执行一次
(3)定时检查全局表一致性
默认每24h执行一次,可以在server.xml里面配置:
<property name=”glableTableCheckPeriod”>8640000</property>
(4)定时清理结果集排行榜,控制拒绝策略
默认每10min执行一次,可以在server.xml里面配置:
<property name=”clearBigSqLResultSetMapMs”>600000</property>
(5)清理catlet class
仅执行一次,项目启动后5min执行heartbeatScheduler主要负责下面几件事情
(1)定时更新系统时间
每20ms执行一次
(2)定时检查处理器
默认每1s执行一次,可以在server.xml里面配置:
<property name=”processorCheckPeriod”>1000</property>
(3)数据节点空闲连接超时检查
默认每5min执行一次,可以在server.xml里面配置:
<property name=”dataNodeIdleCheckPeriod”>300000</property>
(4)数据节点心跳检测
默认每10s执行一次,可以在server.xml里面配置:
<property name=”dataNodeHeartbeatPeriod”>10000</property>
(5)定时清理老的连接
每5s执行一次