狠狠撸
Submit Search
1.2 刘奇 go在分布式数据库中的应用
?
1 like
?
170 views
L
Leo Zhou
Follow
Gopher China 2016
Read less
Read more
1 of 26
Download now
Downloaded 11 times
More Related Content
1.2 刘奇 go在分布式数据库中的应用
1.
Go 在分布式数据库中的应用 liuqi@pingcap.com
2.
我与 go 的那些事 ●
2011 实现了一个 bt 客户端 ● 2013 用 go 京东的消息推送系统 ● 2014 创建 Codis ● 2015 ○ 创立 PingCAP ○ 创建 TiDB 项目 ○ 开始被人黑 ● 2016 创建 TiKV 项目
3.
TiDB 介绍 ● 水平伸缩 ○
按需扩容/缩容 ● 异步/在线 Schema 变更 ○ 无论多大的表,所有的 Schema 变更都不会阻塞现有的操作 ● 分布式事务 ○ 分裂,合并, Rebalance 仍然保持一致性 ● MySQL 协议兼容 ○ 无缝业务迁移,不改代码立刻获得分布式的能力 ● 跨数据中心复制, 异地多活 ○ Raft ○ 通常是三个数据中心,容忍一个挂掉,五个数据中心,容忍两个挂掉 ● Go 语言实现 ○ 开发速度快
4.
TiDB 架构图 MySQL Client
MySQL Client MySQL Client TiKV TiDB TiClient KV API DistSQL MySQL Protocol TiDB SQL Layer Load Balancer TiDB TiClient KV API DistSQL MySQL Protocol TiDB SQL Layer ...
5.
TiKV 介绍 ● 高性能分布式
Key/Value ○ 提供最小化的 API (get/set/del/scan…) ● 内置 MVCC 支持 ○ 通过指定版本可以访问一段时间内的任意数据 ● 分布式事务 ○ 基于 Google Percolator 模型 ● 跨数据中心复制, 异地多活 ○ Raft (Port from etcd) ○ 感谢 Diego Ongaro 创造了 Raft, 感谢 etcd 高质量的实现 ○ 为什么选择 Raft ■ 相对 multi-paxos 简单,成熟,稳定 ● Rust 语言实现 ○ 运行速度极快 ○ 编译巨慢
6.
TiKV 架构图 Coprocessor MVCC KV API Transaction Raft
KV RocksDB
7.
Ti 全景图 MySQL Client
MySQL Client TiDB TiDBF1 SQL Layer TiKVSpanner KV Layer Ti Admin
8.
Go 如何高效跨语言通讯 ● Go
和 Rust 的结合 ○ 使用协议沟通 ○ 高性能的序列化和反序列化 ○ TCP / HTTP ○ Protobuf ■ Go 的默认实现性能太差(大量的内存分配) ■ 推荐使用 gogo 作为替代 ● Why not Cgo? ○ Cgo call 开销问题 ○ 写起来容易出现泄漏 ○ 最重要的是太丑了!!!
9.
Go in TiDB ●
SQL Layer ● MySQL Protocol Server ● Placement Driver (PD) ● Control Panel (TiAdmin)
10.
TiDB SQL Layer ●
goyacc / golex ○ Go 社区的语言应用开发工具 ● SQL Optimizer ○ 执行计划 ● MPP framework ○ 条件下推 ○ Coprocessor ○ Distributed SQL
11.
MySQL Protocol Server ●
Session 维护 ● MySQL 网络协议解析 ● 海量并发连接 ○ 无状态的 Server ○ Go 擅长的领域
12.
Placement Driver (PD) ●
数据分布信息存储 ○ Region Split / Merge ○ 与 RPC Client 配合 ● Auto Rebalance ● TSO ○ TimeStamp Oracle ● 上帝视角
13.
Control Panel (TiAdmin) ●
WebUI ○ Beego Rocks! ● Metric 收集 / 展示 ○ TPS / QPS / IOPS ... ● 进程 / 服务管理监控 ○ 组件比较多,尽量少的人工介入 ○ 进程状态监控 ● etcd 维护进程和服务状态信息 ○ 去单点 ○ 持久化
14.
如何实现动态伸缩 1. 弹性扩展 a. Split b.
Reblance 2. 弹性收缩 a. Reblance b. Merge
15.
Machine A Region 1 [A-Z) Region
Split
16.
Machine A Region 1 [A-Z) Region
Split PD I want to split OK, go ahead
17.
Machine A Region 1 [A-M) Region
2 [M-Z) Region Split
18.
Machine A Region 1 [A-M) Region
2 [M-Z) Region Move PDMove Region 2 to Machine B
19.
Machine A Region 1 [A-M) Region
Move (Balance) Machine B Region 2 follower [M-Z) Region 2 [M-Z) Using Raft Configration Change
20.
Machine A Region 1 [A-M) Region
Move (Balance) Machine B Region 2 [M-Z) Region 2 [M-Z) Using Raft Configration Change
21.
Machine A Region 1 [A-M) Region
Move (Balance) Machine B Region 2 [M-Z)
22.
如何进行数据路由 ● TiClient ● Placement
Driver ● etcd
23.
err: not in
my region Meta Storage Etcd PD TiClient Client Region Server 1 Region Server 2 1 2 3 4 5 6 7 8 9 如何进行数据路由
25.
总结 go 语言一些心得 ●
go 是一门工程性,实践性的语言,无需特殊技巧 ● 编译速度快,至少 1.4 以前很快 ● 很容易做并发, streaming, worker pool, connection pool ● 超爱 pprof ● 无依赖部署 ● 社区强大,各种库比较齐备 ● 和生态易于整合 (etcd, k8s) ● 再也没有争论了 (gofmt, golint…)
26.
谢谢大家 https://github.com/pingcap/tidb We’re hiring.
Download