Skip to content

Commit bdaacf6

Browse files
PanternBaoyanhuqing666
authored andcommitted
add connection pool and online ddl (actiontech#129)
1 parent 97253e2 commit bdaacf6

8 files changed

Lines changed: 188 additions & 24 deletions

File tree

1.config_file/1.04_db.xml.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ db.xml包含具体的数据库组和实例配置,可以配置多组,每组可
8585
<td >心跳失败后,开始重试errorRetryCount次。<br>1.重试期间成功,则标记回OK。<br>(目的:防止网络抖动或者连接异常断开场景)<br>2.重试期间超时,按照超时逻辑处理。 </td>
8686
</tr>
8787
</table>
88-
88+
8989
+ dbInstance
9090

9191

@@ -186,7 +186,7 @@ db.xml包含具体的数据库组和实例配置,可以配置多组,每组可
186186
<heartbeat errorRetryCount="1" timeout="10">show slave status</heartbeat>
187187
<dbInstance name="instanceM2" url="ip4:3306" user="your_user" password="your_psw" maxCon="1000" minCon="10"
188188
primary="true">
189-
<property name="lifo">true</property>
189+
<property name="testOnCreate">true</property>
190190
</dbInstance>
191191
192192
<!-- can have multi read instances -->
@@ -196,12 +196,12 @@ db.xml包含具体的数据库组和实例配置,可以配置多组,每组可
196196
</dbGroup>
197197
</dble:db>
198198
199-
```
199+
```
200200

201201

202202

203203
### 1.4.2 MySQL用户权限说明
204-
204+
205205
<table >
206206
<tr>
207207
<th >权限项目</th>

2.Function/2.06_conns_pool.md

Lines changed: 81 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,86 @@
11
## 2.6 连接池管理
22

3-
### 2.6.1 Dble后端连接池的存储结构
4-
Dble的后端连接池基本分为两个部分,一个是在空闲的部分,一个是在等待响应的部分
5-
在空闲的部分基本结构符合在schema.xml配置文件里面的配置结构,在接近底层融合了配置信息内的dataNode的结构,最终形成面向具体实例具体database的空闲连接队列:
6-
7-
8-
![](pic/2.6_1.png)
9-
10-
### 2.6.2 Dble后端连接池的心跳管理
11-
dble后端节点的管理和心跳是通过定时任务dataNodeConHeartBeatCheck来完成的,此定时任务以server.xml中的dataNodeIdleCheckPeriod配置为周期,定时查看空闲的定时任务
12-
其流程基本逻辑如下:
13-
3+
在dble中每个后端MySQL节点由 PhysicalDbInstance 表示,PhysicalDbInstance中维护了两类连接:
4+
5+
1. 大部分业务使用的连接由连接池管理
6+
2. 独立于连接池之外的连接,这类连接主要有两类:MySQL实例的心跳连接和用于OneTimeJob的一次性任务的连接,这种连接是一次性的,用完即关,次数也比较少。
7+
8+
### 2.6.1 dble后端连接池管理
9+
10+
后端连接池使用 CopyOnWriteArrayList 存储该MySQL实例的全量连接,通过连接的state状态来维护连接的初始化,借出,空闲,心跳,移除状态。连接池初始化之后会维护一个evictor线程来维持连接池的扩缩容以及空闲连接的有效性。结构如下图所示:
11+
12+
![2.6_1](pic/2.6_1.png)
13+
14+
#### 2.6.1.1 连接获取
15+
16+
业务向连接池请求获取后端连接,会遍历连接池中的全量连接直到找到第一个空闲连接。若连接池中当时没有空闲连接,则线程会进入超时等待队列,在超时时间内未获取到连接,前端报错。
17+
18+
#### 2.6.1.2 连接释放
19+
20+
后端连接处理完业务之后,状态会被置为空闲,并且处理线程会唤醒在超时等待队列中的线程来重新获取连接。
21+
22+
#### 2.6.1.3 连接池扩缩容
23+
24+
连接池初始化之后会维护一个evictor线程来维持连接池的扩缩容以及空闲连接的有效性,evictor线程是一个定时任务。
25+
26+
扩容:当空闲连接数小于minCon时,维持连接池中的空闲连接在minCon的数量上,每次扩容的连接数量通过以下公式计算:min(配置的最小空闲连接数 - 当前连接池中空闲连接数, 配置的最大连接数 - 连接池中的总连接数) - 正在创建的连接数,若数量大于0,则创建该数量的连接。
27+
28+
缩容:当空闲连接数大于minCon时,维持连接池中的空闲连接在minCon的数量上,每次关闭的连接数量通过以下公式计算:(连接池中的最小连接数 - 配置的最小连接) > 0 && 连接达到 idleTimeout。
29+
30+
#### 2.6.1.4 连接有效性检测
31+
32+
在连接的不同阶段,提供对连接有效性的检测手段。
33+
34+
- testOnCreate为true,在连接被创建后,会发送ping命令探测连接有效性,若在connectionHeartbeatTimeout没有收到结果,会关闭连接。
35+
- testOnBorrow为true,在连接被借出后,会发送ping命令探测连接有效性,若在connectionHeartbeatTimeout没有收到结果,会关闭连接。
36+
- testOnReturn为true,在连接被返回后,会发送ping命令探测连接有效性,若在connectionHeartbeatTimeout没有收到结果,会关闭连接。
37+
- testWhileIdle为true,对所有空闲连接,发送ping命令探测连接有效性,若在connectionHeartbeatTimeout没有收到结果,会关闭连接。
38+
39+
#### 2.6.2 连接状态管理
40+
41+
由上文我们知道,后端连接池使用 CopyOnWriteArrayList 存储该MySQL实例的全量连接,通过连接的state状态来维护连接的初始化,借出,空闲,心跳,移除状态。下面是连接状态的跃迁图:
42+
1443
![](pic/2.6_2.png)
1544

16-
1. 遍历所有物理节点对应所有database的空闲连接队列
17-
2. 选取其中的空闲超过一个心跳周期的连接进行心跳
18-
3. 心跳在2S内能得到响应则放回,否则关闭连接
19-
4. 通过最小连接数和当前空闲连接数之前的差值确定需要提前准备空闲连接或者是关闭多余的空闲连接
45+
### 2.6.3 连接池属性
46+
47+
| 属性名 | 默认值 | 含义 |
48+
| ----------------------------- | ----------- | -------------------------- |
49+
| testOnCreate | false | 连接创建后是否检测有效性 |
50+
| testOnBorrow | false | 连接被借出后是否检测有效性 |
51+
| testOnReturn | false | 连接被返回时是否检测有效性 |
52+
| testWhileIdle | false | 连接空闲时是否检测有效性 |
53+
| connectionTimeout | 10s | 获取连接的超时时间 |
54+
| connectionHeartbeatTimeout | 20ms | 空闲连接检测后的超时时间 |
55+
| timeBetweenEvictionRunsMillis | 30s | 扩缩容线程的检测周期 |
56+
| idleTimeout | 10 minute | 连接空闲多久之后被回收 |
57+
| heartbeatPeriodMillis | 10s | 连接池的心跳周期 |
58+
| evictorShutdownTimeoutMillis | 10L * 1000L | 扩缩容线程停止的超时时间 |
59+
60+
### 2.6.4 dble后端连接池的心跳管理
61+
dble后端MySQL节点的心跳管理是通过定时任务来完成的,检测周期由heartbeatPeriodMillis来控制。dble会对每一个后端MySQL节点持有一个长连接,定期发送心跳语句,根据返回结果的不同将连接池标记为不同的状态。若心跳异常,会影响evictor线程的扩缩容。
62+
63+
#### 2.6.4.1 心跳周期内的不同阶段
64+
65+
我们可以将每个心跳周期简单划分为两个阶段:
66+
67+
- 检测阶段:心跳检测发起到收到回复的阶段
68+
- 空闲阶段:心跳返回后到下一个心跳检测发起的阶段
69+
70+
#### 2.6.4.2 心跳状态
71+
72+
dble的心跳状态有三种:
73+
74+
- ok状态:一次正常的心跳返回
75+
- timeout状态:最近的一次心跳在HeartbeatTimeout时间段内没有收到响应
76+
- error状态:心跳语句返回错误或者心跳连接异常都可能导致此种状态,dble里面会有重试机制来预防网络抖动等网络方面的异常。
77+
78+
#### 2.6.4.2 心跳重试
79+
80+
此处的心跳重试分为两种情况:第一种是心跳语句返回错误导致的重试,第二种是心跳连接关闭导致的重试。
81+
82+
- 对于心跳语句返回失败,dble会立即将连接池状态置为error状态,随即会发送errorRetryCount次心跳,若有一次心跳正常,心跳恢复成ok状态。
83+
- 对于心跳连接关闭引起的失败,dble会在接下来的时间立即发送errorRetryCount次心跳,若有一次心跳正常,则停止重试,但如果都失败,则将连接池状态置为error状态
84+
85+
2086

2.Function/2.1_manager_cmd/2.1.03_show.md

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ PORT: 端口
223223
##### show @@datasource.cluster;
224224

225225
描述:此功能在2.20.04.0 版本已经废除。
226-
226+
227227
#### 2.1.3.12 show @@processor
228228
##### show @@processor;
229229

@@ -1240,3 +1240,42 @@ mysql> show @@Questions;
12401240
Questions:收到的查询的数量
12411241
Transactions:执行事务的数量,非事务查询算单语句事务
12421242
```
1243+
1244+
#### 2.1.3.52 show @@connection_pool
1245+
1246+
##### show @@connection_pool
1247+
1248+
描述:查看后端连接池的各种属性
1249+
1250+
举例:
1251+
1252+
```
1253+
mysql> show @@connection_pool;
1254+
+----------+-------------+-------------------------------+--------+
1255+
| DB_GROUP | DB_INSTANCE | PROPERTY | VALUE |
1256+
+----------+-------------+-------------------------------+--------+
1257+
| dbGroup1 | instanceM1 | minCon | 2 |
1258+
| dbGroup1 | instanceM1 | maxCon | 4 |
1259+
| dbGroup1 | instanceM1 | testOnCreate | false |
1260+
| dbGroup1 | instanceM1 | testOnBorrow | false |
1261+
| dbGroup1 | instanceM1 | testOnReturn | false |
1262+
| dbGroup1 | instanceM1 | testWhileIdle | false |
1263+
| dbGroup1 | instanceM1 | connectionHeartbeatTimeout | 20 |
1264+
| dbGroup1 | instanceM1 | connectionTimeout | 10000 |
1265+
| dbGroup1 | instanceM1 | heartbeatPeriodMillis | 10000 |
1266+
| dbGroup1 | instanceM1 | idleTimeout | 600000 |
1267+
| dbGroup1 | instanceM1 | evictorShutdownTimeoutMillis | 10000 |
1268+
| dbGroup1 | instanceM1 | timeBetweenEvictionRunsMillis | 30000 |
1269+
+----------+-------------+-------------------------------+--------+
1270+
12 rows in set (0.01 sec)
1271+
1272+
```
1273+
1274+
行描述:
1275+
1276+
```
1277+
DB_GROUP:dbinstance所属DB_GROUP
1278+
DB_INSTANCE:dbinstance名
1279+
PROPERTY:属性名
1280+
VALUE:属性值
1281+
```

2.Function/2.1_manager_cmd/2.1.06_stop.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
### 2.1.6 stop命令
22
#### 2.1.6.1 stop @@heartbeat
33

4-
##### stop @@heartbeat keys:datahost
5-
其中:keys:datahost名字列表,可以是多个,用逗号隔开的key;
6-
**key**:可以直接是datahost,也可以是datahost$0-n (如datahost$0-2实际会输出datahost[0],datahost[1],datahost[2],疑似BUG);
4+
##### stop @@heartbeat keys:dbGroup
5+
其中:keys:dbGroup名字列表,可以是多个,用逗号隔开的key;
6+
**key**:可以直接是dbGroup,也可以是dbGroup$0-n (如dbGroup$0-2实际会输出dbGroup[0],dbGroup[1],dbGroup[2],疑似BUG);
77
**value**: 应当是个整数,单位毫秒
8-
描述:设置datahost名为key的host停止heartbeat n秒
8+
描述:设置dbGroup名为key的host停止heartbeat n秒
99
结果:返回OK
1010

1111
##### 注意:未作异常处理,慎用

2.Function/pic/2.6_1.png

-92.9 KB
Loading

2.Function/pic/2.6_2.png

-78.4 KB
Loading

3.SQL_Syntax/3.0_overview.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* [3.1.2 DDL&View Syntax](3.1_DDL/3.1.2_DDL&View_Syntax.md)
66
* [3.1.3 DDL&Index Syntax](3.1_DDL/3.1.3_DDL&Index_Syntax.md)
77
* [3.1.4 DDL透传](3.1_DDL/3.1.4_DDL_Penetrate.md)
8+
* [3.1.5 DDL&Database Syntax](3.1_DDL/3.1.5_DDL&Database_Syntax.md)
9+
* [3.1.6 ONLINE DDL](3.1_DDL/3.1.6_DDL&online_ddl.md)
810
* [3.2 DML](3.2_DML.md)
911
* [3.2.1 INSERT](3.2_DML/3.2.01_INSERT.md)
1012
* [3.2.2 REPLACE](3.2_DML/3.2.02_REPLACE.md)

0 commit comments

Comments
 (0)