越nb的工程师越喜欢高性能,认为越快越好。可是 TiDB 的首要目标不是作到最快,而是作到 Availability reliability 稳定性 IO和 无限扩展。高性能的成本过高,要根据用户的硬件优化。可是这里是通用的数据库,不可能去优化各类场景。简单留给用户,复杂留给本身(跟AWS意见相反)。mysql
认为 eventual consistency 是个伪概念,实际上就是没一致性或者弱一致性。好比 cassandra WRN 设置好了,但到底过多久 可以resolve?不肯定。太复杂,用户最好不须要知道操心这些复杂的设置。算法
跑分不是惟一的指标,TPCC/TPCH 分数高对实际没有太多指导意义。数据库是磨出来的。好比第一家客户,游戏公司,竟然建立了3万张表,json 的 meta 信息连起来很是慢。sql
构架上不是 P2P,而是不一样角色分得很清楚。数据库
KV 用的是 RocksDB 可是典型的 LSM tree 的写放大是15倍,这里优化到 value 拆出来,解决写放大的问题。json
支持 MySQL 的client,也支持 SparkSQL 的读。api
SQL layer 没有用 MySQL 的模块。一开始有试过,可是1)下面很难分布式 2)代码太烂很难改。魔改的话,半年能作;可是长期的维护成本更高。重作不麻烦,都重构了三次了。这里用 Go 比用 C/C++/Rust 重构更方便。分布式
一开始只想作 F1只作sql,和 CockroachDB 合做,后来他们往sql这边作,这边就只能往storage 作性能
挖了 Rust core team 的两我的。rust 很难招人,通常是招 C++的人而后转rust,他们会以为不少脑壳里的约定编译器帮你搞定了。优化
不要低估造工业级轮子的难度。用 grpc,raft,rocksdb的好处是,若是业界有新的进展,会直接让使用者收益。接口
Chunk (region) split 作了两个月,merge 作了三年。merge 作了形式化证实。
为何是如今?
Everything is pluggable , 顶层 api 不变,下面即插即用可替换
Distributed Transaction
Multi-tenancy achieved by kubernetes
本文首发于硅谷io