1.3 Go practices in TiDB 姚维
1.76 MB
32 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
中文(简体) | .pdf | 3 |
摘要 | ||
文档介绍了TiDB中使用的Go语言实践,重点包括构建稳定的数据库和性能优化。构建稳定数据库的方法包括Schrödinger测试平台、故障注入(Failpoint injection)和Goroutine泄漏检测。性能优化部分讨论了Chunk与interface{}的对比,指出Chunk的优势在于更高效的行格式,但在内存使用和复杂类型处理上存在劣势。Chunk的结构包括多种数据类型的存储,但在并行计算和向量化执行中效果不佳。文档还提到向量化执行可以提高性能。 | ||
AI总结 | ||
## TiDB 中的 Go 实践总结
TiDB 通过一系列 Go 实践来确保数据库的稳定性和高性能,这些实践主要包括构建稳定数据库和优化两大方面。
### 1. 构建稳定数据库
- **Schrodinger 测试平台**:用于测试和验证数据库的稳定性,模拟各种故障场景。
- **Failpoint 注入**:通过代码注释定义故障点,使用 `gofail` 工具自动转换注释为代码或反之。例如,在提交功能中注入模拟错误,之后通过禁用故障点恢复正常行为,方便测试错误处理机制。
```go
func (txn *tikvTxn) Commit(ctx context.Context) error {
// gofail: var mockCommitError bool
// if mockCommitError && kv.IsMockCommitErrorEnable() {
// kv.MockCommitErrorDisable()
// return errors.New("mock commit error")
// }
// ... 正常提交逻辑 ...
}
```
- **Goroutine 泄漏检测**:在测试用例的前后加入检测钩子,自动检查是否有协程泄漏,避免因为未释放的协程导致的内存泄漏。
```go
func TestT(t *testing.T) {
testleak.BeforeTest()
TestingT(t)
testleak.AfterTestT(t)()
}
```
### 2. 优化
- **Chunk vs interface{}**:原始的 `Datum` 结构体存储数据虽然高效,但存在内存浪费和类型断言繁琐的问题。优化后采用 `Chunk` 格式,能有效降低内存占用并提升计算效率。
```go
type Datum struct {
k byte // 数据种类
collation uint8
decimal uint16
length uint32
i int64
b []byte
x interface{} // 存储其他类型
}
```
优化后的 `Chunk` 格式:
- **Chunk** 更加高效,专门用于向量化计算。
- 每个列独立存储避免内存浪费,例如:
```sql
CREATE TABLE `t` (
`a` int(11) DEFAULT NULL,
`b` varchar(10) DEFAULT NULL,
`c` decimal(10,5) DEFAULT NULL,
`d` timestamp NULL DEFAULT NULL
)
```
每列分别存储,提升了数据序列化效率,适合向量化执行,提升性能。
- **向量化执行**:优化后的数据格式更适合并行计算,提升处理速度。
### TiDB 架构概览
TiDB 包括:
- **TiKV**:键值存储引擎。
- **TiFlash**:列存储引擎,支持实时分析。
- **PD**:调度和管理模块。
- **分布式处理**:通过 Coprocessor 实现分层计算。
- **SQL 层**:包括解析、优化和执行。
### 核心要点总结
- **稳定性**:通过 Failpoint 和泄漏检测确保系统健壮。
- **性能优化**:采用更高效的数据存储和执行方式,提升处理能力。
- **架构优势**:模块化设计支持高扩展性和高性能。
这些实践确保了 TiDB 在稳定性和性能上的优秀表现,是其成为高效数据库的关键因素。 |
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
20 页请下载阅读 -
文档评分