一个架构的演进和开发哲学黄东旭PingCAP关于我●PingCAPCofounder&CTO●MSRA/Netease/PingCAP●基础软件工程师/架构师/开源狂热分子○Codis○TiDB○TiKV●Weibo:@Dongxu_Huang●Email:huang@pingcap.com一个基础软件的开发者的创业和技术故事TheCrazyIdea●被MySQL分库分表和中间件折磨得不行了●Codis解决分布式缓存问题,然后呢?●Google的Spanner和F1好帅呀!从头做一个数据库,从根本上解决MySQL的扩展性问题So,经过一晚上的深(tou)思(nao)熟(fa)虑(re),决定:过了一天...●选择什么语言●架构怎么做●怎么保证写对了●开源还是不开源●人从哪来●钱从哪来●目标是个分布式系统怎么测试啊●...冷静一下,先确定一个小目标●完整的MySQL兼容○海量的测试○极小的用户迁移成本○明确的开发目标●等等,兼容MySQL的最简单的方案是?架构0.1MySQLInnoDBNewEngineKVKVKVKVKVMySQLInnoDBNewEngine架构0.1●为什么那么慢。。。●我想改改SQL优化器。。。○Noway●我想改改事务模型。。。○Noway架构0.2●好吧,为了灵活性,看来是绕不过去了●重写SQLLayer○Parser○Optimizer○Executor●不过,终于可以用最喜欢的编程语言了架构0.2TiDBNetworkLayerParserOptimizerExecutor?CTO说了要保证这货长得和MySQL一模一样●网络协议●语法TransactionAPI架构0.2●3个月过去了,一切进展顺利●不过。。。?AllproblemsincomputersciencecanbesolvedbyanotherlevelofindirectionRule#1:---DavidWheeler架构0.2在苦逼的写Parser的同时。。。我们还做了:●收集了MySQL社区所有我们能找到的集成测试,到现在大约累计了1000w个○MySQLunittests○SQLlogictests○ORMtests○...●将存储引擎的行为抽象成很薄的几个接口,使得可以无缝的接入各种嵌入式kvengine○BoltDB○LevelDB,RocksDB○LMDB○Mem○…●团队大约十号人了。。。还好每层都拆分的比较彻底,否则没法并行了●开源了,顺便上了把HackerNews的首页。。。Talkischeap,showmethetestsRule#2:Testmattersandit’scomplex●构建一个数据库最难不是写出来,而是证明它是对的●对于一个分布式数据库来说更加困难●新的开发者,新的模块加入,是否会带来问题?怎么证明?○只有测试架构0.5●由于SQL层已经和存储层完全分离,那么一个很自然的想法:接一个分布式存储上去啊!●有了一开始的前车之鉴,这次我们比较谨慎○选择一个比较稳定的分布式引擎,否则你也不知道是谁的锅。。。○HBase○WhyTiDBNetworkLayerParserOptimizerExecutorTransactionAPITiDBNetworkLayerParserOptimizerExecutorTransactionAPITiDBNetworkLayerParserOptimizerExecutorTransactionAPIDistributedKeyValueStorageMySQLClient架构0.5距此创业已半年。。。架构1.0:TiKV接口层有了海量的Test保证,让设计工作没有太过困难●架构选型○语言○模型○核心算法●当有极大的自由度的前提下,你是否能控制住膨胀的野心?因为复杂度才是你最大的敌人。WhyRust●我们的团队背景●高性能●安全●更现代的C++●WhynotGo?你不怕吗?WhyRustbtw...一不小心成了Rust社区最大的开源项目之一架构1.0:TiKV●弹性扩展●*真正的*高可用●高性能●强一致另外时间不太多。。2015年的冬天。。。我们就在纠结中度过Embracethecommunityyoudon'tneedtodoeverything(主要还是懒)Rule#3:Raft:EtcdWhyEtcd?●唯一在生产环境中大量验证过的Raft实现●架构设计合理,状态机抽象彻底,测试极其充分●在工程上对论文的原始算法做了大量优化●还有。。。我们和CoreOS的Etcdteam是好盆友。。。。但是etcd是go写的啊。。。●Portetcd’sRaftimplementationlinebyline.●Portetcd’stestslinebyline.Storageengine:RocksDB●Codebase:LevelDB●活跃的社区●多线程Compaction●各种贴心的API●无数个TuningPoint●还有...TransactionSQLLayerMVCCRaftLocalKey-ValueStorage(RocksDB)TiDBTheMySQLProtocollayerTiKVTheKey-ValuelayerMySQLProtocolServer2016年4月1日。。。TiKV开源了What’smore:Metrics监控是个大问题●Metrics监控是最容易被忽视的重要组件●自己写Metrics监控工具是个体力活,对于小团队来说得不偿失●Wherethere’sametricthere’saway.Prometheus+Grafana●Prometheus负责收集Metrics,并提供一个灵活的DSL提供查询,提供监控报警的机制●Grafana负责可视化,自定义DashboardToolsmatter●最小化业务方的迁移成本---基础设施团队的自我修养●「无意外」原则●「Alwaysbelieveshitisabouttohappen」○业务数据重如泰山○基础设施需要假设随时会挂○如何保护自己,如何保护业务syncer:MySQLto*MySQL(master)SyncerSavePoint(disk)RuleFilterMySQLTiDBClusterTiDBClusterTiDBClusterSyncerSyncerbinlogFakeslaveSyncerTiDBbinlog:TiDBto*展望:基础软件架构的趋势-Cloud-Native●Google和CNCF●被忽略的运维成本○人的价值到底是什么●面向未来的基础架构是什么?○对架构师的挑战ThanksQ&A