{
    "componentChunkName": "component---src-templates-blog-blog-tsx",
    "path": "/blog/categories/观点洞察",
    "result": {"pageContext":{"allBlogsCount":494,"category":{"name":"观点洞察"},"blogs":[{"id":"Blogs_517","title":"华锐技术何志东：证券核心交易系统分布式改造将迎来规模化落地阶段","tags":["数字化转型","分布式数据库"],"category":{"name":"观点洞察"},"summary":"证券业核心交易系统有什么需求?有哪些挑战?如何进行分布式架构升级?在 PingCAP 用户峰会 2023 上，华锐分布式技术实验室主任何志东接受采访时给出了他的观察和思考。","body":"近年来，数字化转型成为证券业发展的下一战略高地，根据 2021 年证券业协会专项调查结果显示，71% 的券商将数字化转型列为公司战略任务。  \n\n在落地数字化转型战略过程中，证券业核心交易系统面临着不少挑战。构建新一代分布式核心交易系统成为券商落地数字化转型的有效路径，证券业核心交易系统分布式改造已是大势所趋。  \n\n证券业核心交易系统有什么需求？有哪些挑战？如何进行分布式架构升级?在 PingCAP 用户峰会 2023 上，华锐分布式技术实验室主任何志东接受采访时给出了他的观察和思考。  \n\n## 证券业核心交易系统面临挑战\n\n在数字化转型的大背景下，金融业的系统架构都面临着新的需求和挑战。由于业务的差异，银行、证券、保险三大金融行业对系统架构的需求既存在共性，也有不同。\n\n何志东介绍，银行、证券、保险都属于金融业，金融业稳定第一，对系统的高可用能力要求极高，尤其是银行、证券对系统有更高的可用性要求。  \n\n相比于银行，证券业因自身的业务特性，对系统架构有独特的需求。首先是低延时，证券市场交易永远追求超低延时，证券核心交易系统需要微秒级(1 毫秒 = 1000 微秒)时延，银行系统达到毫秒级(1 秒 = 1000 毫秒)。其次是高并发，证券核心交易系统会有很多瞬间的脉冲，单一系统瞬间超万笔每秒，交易所侧的系统设计并发容量都是几十万笔每秒，这样的高并发量是双十一等购物节的峰值，但那并非常态，而高并发量是证券业的常态。在系统规模上，证券业的系统规模没有银行那么大。  \n\n“需要在小规模系统的情况下处理更高的并发，而且要求更低的时延，这就是证券业跟银行业核心交易系统的一个很重要的差别。”何志东说。  \n\n证券核心交易系统是证券公司交易执行平台，提供交易前端风控检查、订单生成、报盘、交易管理、运营等功能，为投资者提供交易服务。从 2005 年算起，上一代集中式架构的证券核心交易系统已经运行了近 18 年，证券行业正处在持续发展阶段，上一代系统面临着高可用、低延时、高吞吐、易扩展、安全方面的挑战，已经无法满足新的业务诉求。  \n\n“整个证券行业正在进入到新一代核心交易系统更新迭代的关键时间节点。”何志东说，证券业核心交易系统不断追逐新的技术，追求高可用和性能，支持全栈国产化以实现安全性，核心交易系统的分布式改造迫在眉睫。  \n\n今年 6 月，中国证券业协会印发《证券公司网络和信息安全三年提升计划(2023-2025)》，鼓励券商向分布式架构转型。计划明确鼓励有条件的券商积极推进新一代核心系统的建设，根据不同客户群开展核心系统技术架构的转型升级工作。积极从集中式专有技术架构向分布式、低时延、开放技术架构转型。  \n\n## 分布式改造加速破局\n\n何志东介绍，上一代证券交易系统围绕数据库构建，太过于依赖数据库的能力。而随着业务对极速低时延的需求加深，围绕着数据库构建系统的方式无法满足其低时延需求，假设每一步业务处理都要跟数据库进行交互，再往下走，数据库能达到毫秒级，系统不可能达到微秒级。\n\n由于证券行业追求极致的低延时，需要从底层硬件、基础软件再到上层应用全方位整体探索，软硬件一起结合才能实现技术攻关。所以华锐技术 2017 年成立了分布式技术实验室，把业内先进的硬件技术应用进来，华锐技术新一代证券分布式核心交易系统的技术路线是去数据库集中化，采用低时延消息总线通信、业务逻辑内存化处理，进行分布式改造，以实现超低时延，这是目前行业内已经验证可行的方案。  \n\n全栈国产化的趋势下，华锐技术联合各生态伙伴打造全栈国产化解决方案，助力证券业进行分布式改造。比如华锐核心交易平台(ATP)与 TiDB 组成的新一代分布式核心系统联合解决方案，以解决证券核心交易系统的挑战。  \n\n![核心交易解决方案架构图.png](https://img1.www.pingcap.com/prod/_d21ed8f120.png) \n\nATP 基于分布式低时延消息总线构建，实现微秒级高并发交易，并实现应用层分布式弹性扩缩容，提供高吞吐、低时延等关键业务能力;ATP 实时将数据写入 TiDB，提升数据持久化和高可用能力，并提供对外部机构查询接口;基于 TiDB 原生分布式和跨机房多活能力，实现数据库的跨机房多活能力。  \n\n该联合解决方案是全栈国产化方案，采用国产服务器、国产操作系统和交换机。满足高可用特性，联合方案采用两地三中心(一主两备)高可用部署，主备数据中心采用主备高可用部署，组件间实时同步保持强一致性，任意单点故障实现自动切换，RPO=0，RTO<10 秒。应用和数据库都支持水平扩展。  \n\n何志东指出，分布式的联合解决方案所采用的交换机、PC 服务器等设备，单一设备可靠性、性能比不上小型机，但通过上层应用、数据库、基础设施的高可用方案设计，构建出时延更低、性能更强、可用性可靠性更高，且可横向扩展的整体解决方案。  \n\n何志东认为，随着去年头部券商国泰君安新一代核心交易系统上线投产，并完成全量 1500 万客户的迁移，业内对全栈国产化核心交易系统先进替代的信心进一步增强，未来也会有更多的券商跟进。相比于银行业，证券核心交易系统的规模较小，且标准化程度更高，更依赖供应商提供的标准解决方案，分布式改造进展会更快，证券业核心交易系统分布式改造将迎来规模化落地阶段。华锐技术也将继续联合 PingCAP 这样的分布式数据库厂商，推动证券业核心交易系统的分布式升级改造，他认为 PingCAP 此时推出中国战略，能够更好地满足国内证券市场的需求，未来可期。\n","date":"2023-10-10","author":"任朝阳","fillInMethod":"writeDirectly","customUrl":"interview-archforce-technology","file":null,"relatedBlogs":[]},{"id":"Blogs_505","title":"AI 时代数据库如何 Ready？TiDB 率先给出答案","tags":["Serverless"],"category":{"name":"观点洞察"},"summary":"本文转载自微信公众号“大数据在线”。作者认为大模型所呈现出的强大能力，让 Data+AI 成为数据库领域的大势所趋。大模型与数据的同频共振，不仅会对当前的数据库技术架构带来根源性重构，更有望让数据库市场形成差异化的竞争，带来无限可能。","body":"> 本文转载自微信公众号“大数据在线”\n\n当ChatGPT横空出世的那一刻，很多行业都为之一震，意识到变革时刻已经到来。\n\n数据库是最早“觉醒”且付之行动的领域之一。业内普遍认为，大模型所呈现出的强大能力，让 Data+AI 成为数据库领域的大势所趋。大模型与数据的同频共振，不仅会对当前的数据库技术架构带来根源性重构，更有望让数据库市场形成差异化的竞争，带来无限可能。\n\n因此，从今年上半年起，DataBricks 等国外数据库厂商均在加码 Data+AI，而中国数据库企业也不逞多让，PingCAP、阿里云、华为云等多家企业纷纷出手，快速响应 Data+AI 的趋势。\n\n正如 PingCAP 创始人兼 CEO 刘奇在最近的 PingCAP 用户峰会 2023 上所言：“AI 正在重塑软件行业，数据库需要从架构上更系统地做到 AI ready。当数据库架构做到算算分离、存存分离、存算分离时，非常容易引入 AI。”\n\n![PingCAP-CEO-刘奇.png](https://img1.www.pingcap.com/prod/Ping_CAP_CEO_3da2ba59ed.png) \n \nPingCAP创始人兼CEO 刘奇\n\n## Data+AI，数据库差异化的东风\n\n凯文凯利在《未来十二大趋势》中认为，现在我们处于一个数据流动的时代。商业乃数据之商业。归根结底，你在处理的都是数据。\n\n的确，随着数据成为新的核心生产要素，企业的研发、供应链、营销、服务乃至创新均在以数据为基础进行全方位重塑，而 AIGC、大模型和通用人工智能技术的不断迭代与演进，则有望带来生产力的飞跃。Data+AI 的持续融合，将对数据和数据库带来由表及里的巨变：\n\n首先是数据消费门槛以前所未有的速度下降，人人用数不再是遥不可及的愿景。随着大模型所展现出的强大能力，以及 NLP to SQL、Text to SQL 取得的极大进步，数据使用的交互革命正在发生，数据的使用、消费不再是数据科学家等专业人员的专属，数据消费门槛大幅降低。\n\n而当人人用数成为现实，意味着数据的整合、查询、分析和应用等操作将会呈现出指数级的增长趋势，这无疑会对数据库产品的架构、性能以及可靠性等带来颠覆性的改变。\n\n另一个显著变化就是，随着数据消费成为企业数字化转型中的一种新常态，数据库自身需要走向服务化，屏蔽复杂技术与操作，借助AI使能让数据的管理、使用和操作需要智能化和自动化，以响应数据消费的新趋势。\n\n“无论技术世界如何变化，稳定性、性能、高可用、易用性与工具生态，永远都是用户对数据库的重要关注点。我们应该走向数据库的服务化，而不是服务化的数据库。”PingCAP 创始人兼 CTO 黄东旭直言道。\n\n![PingCAP创始人兼CTO-黄东旭.png](https://img1.www.pingcap.com/prod/Ping_CAP_CTO_ccf0bbe483.png)  \nPingCAP 创始人兼 CTO 黄东旭\n\n笔者认为，Data+AI 融合的这股东风，在加速推动数据库产品、架构走向重塑之际，中国数据库企业需要抓住机会实现产品、市场等全方位的突破。众所周知，因为政策红利的出现，中国市场过去几年涌现出一大批数据库相关企业，一方面说明数据库市场的潜力巨大，另一方面也反映出数据库产品同质化严重的情况。在技术变革之际，“偏安一隅”享受政策红利并不是长久之计，唯有在数据库核心架构实现领先，并扎根市场用户需求，方能真正走出数据库产品的差异化之路，进而实现市场的全面突破。\n\n面对 Data+AI 的浪潮，PingCAP 率先给出答案。在 PingCAP 2023 用户大会上，PingCAP 正式推出新一代架构的数据库：TiDB Serverless。刘奇直言：“TiDB Serverless 于四年前开始预研，经过四年的打磨正式发布，在架构层面满足 AI 时代带来的各种数据处理新需求。”\n\n## 数据库加速走向 AI Ready\n\n数据库如何加速走向 AI Ready？可以说，云原生是绕不开的话题。\n\n众所周知，随着云计算的广泛普及，大量传统政企行业用户开始上云与用云，以及在 AI 技术应用的推动下，一个全面云原生化的时代已经来临：从基础设施到应用开始全面走向云原生化。这其中，数据库又是一个重要抓手，数据库从单体到微服务架构再到 \n Serverless 架构的持续演进，响应了全面云原生化的需求变化。\n\n如果说云原生是数据库走向智能化的基础条件，那么 AI 则是云原生数据库持续演进的牵引力。就像新能源+智能化在重塑汽车行业一样，云原生和 AI 也在深刻影响着数据库的架构与产品。\n\n![涌现中的技术世界.jpeg](https://img1.www.pingcap.com/prod/_1b80ec94bc.jpeg)\n\n以 TiDB Serverless 数据库为例，其实现了复杂事务的自动化处理，大幅简化了应用的开发，用户不必再花费大量时间在数据库各项处理上，从而可以将精力投入到业务创新之中。\n\n据悉， TiDB Serverless 采用云原生/多云的设计理念，拥有云原生引擎 CSE（Cloud-native Storage Engine）架构，可以实现无需资源规划、秒级启动、0 元起步、按使用付费、极致弹性的数据库服务；TiDB Serverless 的关键组件则采用了全分离设计，不仅具备自动化的资源调度能力，还能够灵活集成 AI 能力；另外，Chat2Query 等新功能大幅降低了数据消费门槛，在数据库与数据消费端形成良好的对接。\n\n“TiDB Serverless 适用多重的应用场景，使用极为便捷且能做到高效的成本控制。”刘奇介绍道：“从去年底上线短短几个月时间，TiDB Serverless beta 版就拥有超过 1 万个活跃集群。”\n\nGartner 预测，到 2025 年，云原生负载占比将达到 95%，未来几年新增云原生应用占比将持续提升。笔者认为，在一个全面云原生的时代，以及 AI 应用需求的推动下，传统数据库厂商将逐渐失去原有的优势，而生于云、长于云、基于云原生架构的数据库将成为市场的中坚力量。“数据库正在全面融合 Serverless、AI 等趋势，TiDB Serverless 可以和 HTAP、AI 融合，形成三位一体的创新优势。”PingCAP 副总裁刘松表示道。\n\n但这并不意味着谁都能很快推出真正的云原生数据库。众所周知，数据库长期以来都是一个工程化程度极高的领域，云原生数据库不仅需要在初期技术路线选择上具有前瞻性，还需要持续和反复打磨产品。毫无疑问，PingCAP 在数据库架构的先进性、AI 技术的融合等方面走在了业界的最前列，为中国数据库产品率先探索出一条领先之路。\n\n刘奇认为，数据库与 AI 的结合还有巨大的探索空间，比如工作负载预测、资源智能化配置、数据分析等等，“小模型可能会在数据库很多环节中发挥巨大价值。小模型现在进步非常快，也更加专用和合规，尤其是小模型推理能力的持续进步，将极大推动 AI 在数据库领域的可用性。”\n\n## 扎根中国，实现业务与技术价值的双向奔赴\n\nIDC 表示，2022 年，中国市场所产生的数据库规模达 23.3ZB，全球占比达 23%，有望在 2026 年成为全球最大的数据圈。随着数字中国建设的稳步推进，数字经济、产业数字化的加速发展，将持续带来数据规模爆炸性增长和数据应用快速深化，也必然对于数据库的创新提出了更高挑战。\n\n在笔者看来，未来五年是中国数据库产业突围的关键期。随着中国千行百业数字化进程的不断深入，中国市场的业务规模、业务的复杂度以及市场需求将在全球无出其右。例如，中国已经有多家银行等金融机构的 App 达到月活用户（MAU）亿级规模，金融机构的营销、客服服务、风险控制等业务中大量基于数据和 AI 技术来实现……种种变化，使得中国数据库市场在经历了宏观政策驱动的因素影响后，未来市场会真正以先进技术驱动为导向。\n\n毫无疑问，PingCAP 今年对于市场和产品策略的调整，有望让其更好地深耕中国市场，利用先进技术与架构的数据库产品助力千行百业的数字化转型。\n\n首先，PingCAP 形成了更加清晰的市场与产品策略，通过TiDB 企业版、TiDB Cloud、TiDB Serverless三大产品，以及针对中国市场的平凯数据库，来满足不同市场和用户群体对于数据库的使用需求，在市场中的打法更加明确与聚焦。\n\n其次，PingCAP 多条产品线均是基于 TiDB 一个核心内核的基础，不同产品虽然市场定位不同，但均保持了内核的先进性。以面向中国企业用户的平凯数据库为例，在基于 TiDB Open Core 的基础上，增加了国产化基础套件、企业级安全套件等大量的企业级特性，契合中国企业级市场的各项差异化需求。\n\n![平凯数据库发布.png](https://img1.www.pingcap.com/prod/_8e47a973f3.png)\n\n最后，PingCAP 在国产化生态、交付与服务体系化等方面进行持续的完善，平凯数据库对于国产化生态兼容等投入大量精力，在满足中国企业数字化转型需求的同时，也确保先进的数据库产品能够在本土技术生态体系中得到充分的发挥。\n\n“平凯数据库脱胎于 TiDB 企业版。TiDB 企业版经过五年打磨，过去更多是面向全球用户提供通用性功能，但这对于中国企业级用户还远远不够。平凯数据库的推出，可以为中国企业级用户带来长期的价值。”刘奇最后表示道。","date":"2023-08-15","author":"大数据在线","fillInMethod":"writeDirectly","customUrl":"how-database-get-ready-in-era-of-ai","file":null,"relatedBlogs":[]},{"id":"Blogs_506","title":"飞得更高，扎得更深：数据新生态的突围之路","tags":["Serverless","平凯数据库"],"category":{"name":"观点洞察"},"summary":"本文转载自微信公众号“科技商业”。作者认为，只有不断探索数据技术边界，将先进技术融入到产品特性，并落实到千行百业的应用场景，才能达成助力企业业务创新的最终目标。从这个角度而言，数据新生态的市场突围，将永远在路上。","body":"> 本文转载自微信公众号“科技商业”，作者于洪涛。\n\n数据库一直被认为是软件市场皇冠上的明珠。即使在基础软件领域，数据库也是最难突破的。  \n\n然而，近年来市场环境的快速变化，带来了新的契机。在技术方面，分布式、云原生等新技术的流行，使得数据库产品正经历着更新换代；在中国市场，国产化需求的增长，也给更多数据库厂商带来了生存空间。  \n\n这些因素的共同作用，使得原本“铁板一块”的数据库市场，呈现出了明显的松动迹象，一大批数据库新生代快速崛起，形成了突围之势。但这也意味市场竞争的加剧，仅国内数据库厂商就超过 200 家。因此，探索出一条数据库新生代的突围之路，就成为当务之急。  \n\n成立于 2015 年的 PingCAP，是一家面向全球市场的企业级开源分布式数据库厂商。其服务的客户覆盖全球 20 多个国家，超过 3000 家企业将其分布式关系型数据库 TiDB 用于线上生产环境。  \n\n在近日的用户峰会 2023 上，PingCAP 发布了其面向未来的 TiDB Serverless 数据库，以及为中国企业级用户专门打造的“平凯数据库”，从先进性和本土化两个方面同时发力，在助力企业数字化转型的同时，实现自身竞争力的进一步提升。  \n\n![PingCAP-CEO-刘奇.png](https://img1.www.pingcap.com/prod/Ping_CAP_CEO_3da2ba59ed.png)\n\n图片 PingCAP 创始人兼 CEO 刘奇\n\n\n## 飞得更高：保持技术先进性  \n\n无论何时，数据库市场的核心竞争力都来自于技术，只有获得并保持技术先进性，才能赢得生存和发展的机会。过去的这些年里，开源、分布式、HTAP 架构、云原生、无服务器、人工智能等新兴技术，都在不断为数据库产品带来创新和变革。  \n\n作为从一开始就为企业关键业务打造的数据库，PingCAP 的 TiDB 也在持续进行技术创新，以帮助企业夯实关键业务的稳定性与性能。这对于奉行全球化战略的 PingCAP 来说，尤其至关重要。  \n\n当然，保持技术先进性的最终目的，是要帮助客户实现业务价值。PingCAP 创始人兼 CEO 刘奇表示，“Do More with Less，以少博多，让用户专注于创新”，一直是 PingCAP 的价值主张，也是 TiDB 持续不变的设计理念。  \n\n最新一轮的技术变革，无疑是以 AIGC 为代表的新一代 AI 技术。这一次，AI 正在重塑整个软件行业，其中也包括数据库。  \n\n我们能够看到，AI 与数据之间形成了相互赋能的促进关系。一方面，大模型的训练依赖海量的数据，对数据的存储、治理都提出了很高的要求，而大模型的推理应用，更是离不开数据库的有效支持；另一方面，AI 也正在成为融入数据库的能力，虽然外面可能看不到，但可以为我们带来更好的数据库功能和性能，提升数据处理和分析的效率。  \n\n刘奇认为，随着 AI 时代的到来，数据库技术应该朝着“人人可用”和“开放生态”的方向发展；更低成本、弹性拓展、永远在线、规模化数据整合，是新一代数据库的典型特征。  \n\n今年 7 月刚刚正式商用的 TiDB Serverless 数据库，就是 PingCAP 按照这一思路开发的下一代数据库产品，引领着数据库市场的未来发展潮流。  \n\nTiDB Serverless 是一款 AI-Ready 的数据库，高弹性、松耦合的特性，使得其很容易与 AI 相集成。更重要的是，TiDB Serverless 能够带来无需资源规划、秒级启动、按使用付费、极致弹性的数据库服务，让云上开发者和创业企业，能够零成本起步构建自己的数据库。  \n\n![平凯数据库发布.png](https://img1.www.pingcap.com/prod/_8e47a973f3.png)\n\n## 扎得更深：为中国企业定制  \n\n如果说全球数据库市场的变革，主要来自技术驱动的话；那么中国市场的变革，则来自于技术与政策的双重驱动。  \n\n国产化替代步伐的加快推进，外加中国市场的规模本来就很大，使得国内市场成为数据库新生代的兵家必争之地。服务好本土市场，赢得国内客户的青睐，就成功了一大半。  \n\n对于源自中国的 PingCAP 而言，中国市场的重要性不言而喻，TiDB 很多关键性的功能也来自于中国客户的应用场景。  \n\n在发布 TiDB Serverless 之后，TiDB 已经拥有了三大产品家族，包括面向企业级关键业务场景的 TiDB 企业版、面向数字原生企业的全托管的 TiDB Cloud，和面向云上开发者和创业企业的 TiDB Serverless。  \n\n在这三大产品线的基础上，PingCAP 又推出了为中国企业级客户定制的“平凯数据库”。  \n\n据介绍，平凯数据库是在 TiDB 企业版的基础上，添加了中国客户所特有的功能需求，提供了国产化需求的企业级功能、更完善的国产化生态兼容功能、更完善的国产化企业级服务支持能力，体现了 PingCAP 深耕中国、扎根中国市场的决心。  \n\nPingCAP 副总裁陈煜琦介绍说，TiDB 已经规模化进入国产化生态，并逐步进入中国用户的核心场景，为金融、制造、运营商，传媒、消费品、公共服务、交通物流、零售餐饮、出海等行业与领域的数字化转型服务。其中，在要求最为严苛的金融行业，TiDB 实现了大行核心场景的规模化落地，在股份制银行和城商行均实现核心系统突破，并推动了证券和保险机构核心系统国产化进程和国产数据库替代。  \n\n与此同时，基于 TiDB 开源社区的有力支撑，PingCAP 还与国内企业进行了合作模式的创新。平安科技就与 PingCAP 携手打造了TiDB 金融级分布式数据库发行版 UbiSQL，实现了双方的联合研发、联合解决方案和联合交付。\n\n## 落得更实：实现客户商业价值  \n\n随着数字经济的深入推进，如今的数字技术已经不仅仅是企业的支撑工具，更成为业务创新的引擎。同样，一个成功的数据库产品，应该是实现数据技术与商业价值的紧密结合，帮助客户取得业务成功。  \n\n漱玉平民大药房是一家拥有 6000 多家门店的医药零售连锁企业，于 2021 年在创业板上市。  \n\n在竞争日益加剧的当下，降本增效是企业的要务。漱玉大药房拥有 2000 万会员，包括公域会员、半公域会员、私域会员。如何对如此众多且构成复杂的会员进行高效管理，并在此基础上开展精准化营销，成为其 IT 部门重点思考的问题。  \n\n为此，漱玉大药房决定自研 CRM，以满足自身的定制化需求；同时将 CRM 部署在混合云上，在实现弹性扩缩容的同时降低成本。与此同时，其 CRM 的数据库系统则从 MySQL 迁移到了 TiDB。  \n\n漱玉大药房 CRM 研发负责人吴绍辰介绍说，漱玉大药房的店面构成也非常复杂，几千家店面分布在六省，分布式系统更适合其业务特点。他希望能够直接在数据库层级实现多租户，而不是采用多个数据库在其上层实现多租户。  \n\n部署 TiDB，很好地满足了漱玉大药房的业务需求，并实现了性能与成本的平衡。而这一迁移及上线过程，则是其与移动云合作完成的。移动云是 PingCAP 的生态合作伙伴，拥有一支 TiDB 的专门团队，并与 PingCAP 成立了联合实验室，具备全面的云原生数据库能力，为漱玉大药房的此次迁移提供了技术能力支持和解决方案支持，以及公有云基础设施。  \n\n在 PingCAP 用户峰会 2023 上，包括移动云、中电金信、中科软科技、华锐技术、英方软件、甄盈业财、东软在内的合作伙伴，与 PingCAP 共同发布了多项战略合作与联合解决方案。  \n\n陈煜琦则表示，在中国市场上，PingCAP 致力于构建“行业x区域x生态”的客户成功体系。除了深化生态构建之外，PingCAP 还深入行业场景、深耕区域市场，为中国客户提供更稳定、更易用、更智能的下一代数据库产品。  \n\n从 PingCAP 的亲身实践，我们不难看出，要想成为未来数据库市场的领先者，数据库新生代在扎根中国市场、满足国产化需求的同时，更要具有全球视野，把握技术潮流的脉动。\n\n只有不断探索数据技术边界，将先进技术融入到产品特性，并落实到千行百业的应用场景，才能达成助力企业业务创新的最终目标。从这个角度而言，数据新生态的市场突围，将永远在路上。","date":"2023-08-15","author":"于洪涛","fillInMethod":"writeDirectly","customUrl":"the-way-out-of-new-data-ecology","file":null,"relatedBlogs":[]},{"id":"Blogs_502","title":"唐刘：TiDB 研发工程实践及 TiDB 人才观丨CCF 中国数据库暑期学校","tags":["TiDB","工程实践"],"category":{"name":"观点洞察"},"summary":"在刚刚结束的 CCF 中国数据库暑期学校上， PingCAP 的研发副总裁唐刘分享了在 TiDB 研发过程中的工程实践经验和人才培养方法。","body":"## 导读\n\n在刚刚结束的 CCF 中国数据库暑期学校上， PingCAP 的研发副总裁唐刘分享了在 TiDB 研发过程中的工程实践经验和人才培养方法。目前，TiDB 已广泛应用于各行各业，有着庞大的用户基数，面临多样化的数据处理需求。PingCAP 通过开源、敏态+稳态的研发方式、自动化、持续测试以及持续倾听客户之声（Voice of Customer）等工程实践，成功应对了这些挑战。TiDB 的开源模式、人才培养、持续创造社会价值等也是 PingCAP 关注的焦点。以下为分享实录。阅读需约 8 分钟。\n\n![唐刘-CCF.png](https://img1.www.pingcap.com/prod/CCF_dbbc220137.png)\n\n我是 PingCAP 的研发负责人唐刘，也是 PingCAP 的第一个员工。从 8 年前，TiDB 的第一行代码开始，我就深入地参与到了这个项目中。非常荣幸我能有今天的机会，代表 PingCAP 与大家分享 TiDB 研发过程中的一些工程实践经验，以及我们人才培养的方法，供大家学习参考。\n\n![数字生活背后的 TiDB.png](https://img1.www.pingcap.com/prod/Ti_DB_998d76dba3.png)\n\n经过了 8 年的发展，TiDB 已经被应用在了各行各业，可以说无论是衣食住行、金融保险，生活中每个环节都有了 TiDB 的参与。如此广阔的应用场景也给 TiDB 数据库提出了更高的要求。  \n\n作为一款通用数据库，各行业、各场景对数据处理的需求截然不同，如何满足多种需求？面对庞大的用户基数，以及当下爆火的 AI 技术，整个社会的数据量持续膨胀，数据库又该如何应对？很多同学可能会觉得，开发一款数据库，单机能跑起来、能存数据就好了，然而当数据规模扩大 10 倍、100 倍，甚至达到 PB 级别，即使是 OLTP 数据库，这个压力和挑战也是完全不同的。极度复杂的业务场景下，大规模海量数据的处理与分析成为了我们必须面对的挑战。幸运的是，PingCAP 通过 8 年的努力，成功地解决了客户的实际问题，接下来我将和大家分享，PingCAP 是如何通过工程实践和人才培养来应对这些挑战的。\n\n## TiDB 工程实践\n\n### 1  开源  \n\n在 PingCAP 的工程实践中，最重要的是开源，从开发 TiDB 的第一天起，我们就选择了完全开源的方式来开发我们的数据库，我们完全基于 GitHub 平台来开发，任何人都可以直接在 GitHub 上下载 TiDB 的源代码，编译、部署、运行，也可以直接发布到线上环境，甚至可以在遵循开源协议的前提下将 TiDB 的服务售卖给客户。我们将一切能开源的都开源，能透明的都透明。开源协作这个观念放在今天大家可能已经习以为常，但是在 8、9 年前的国内，尤其是基础架构领域公司，有很多人会投来非常怀疑的目光。但是我们始终坚定地去走开源这条路，因为我们相信开源是我们能跟我们的用户取得信任的最高效的途径。只有开源才能让用户清晰地了解 TiDB 的系统架构、设计思路，用户脱离 PingCAP 也能够运维、使用甚至迭代这个产品，这种信任对一家基础软件公司来说是至关重要的。  \n\n然而开源协作也并不是一件很简单的事，培养使用 GitHub 的习惯也是有一定上手门槛的。比如我们遇到问题之后，首先要在 GitHub 上开 issue，详细地把这个问题描述出来，甚至还需要复现问题；处理问题时要写详细的设计文档，邀请其他人来 review，通过后才能提交 Pull Request 进行代码研发，再次通过 review 才能合并代码，真正投入使用。这一系列流程走下来会有人觉得会不会太繁琐了？其实这也是开源的魅力所在，通过这样的方式，才能打造一款合格的工业体系的产品。  \n\n### 2  敏态 + 稳态  \n\n除了开源，PingCAP 另一个重要的工程实践就是敏态 + 稳态的研发方式。作为一款数据库产品，TiDB 的每个客户对数据库产品的要求是不同的，比如对于互联网客户，要求就是短而快，而在金融核心的银行大客户，稳定才是最重要的。所以，如何让所有用户都「又快又稳」地感知到 TiDB 的价值？我们选择了敏态 + 稳态的迭代方式。首先我们以敏态的方式来应对业务的不确定性。具体来说，我们会以非常高的频次 - 月度发布 DMR 版本，就是 Development Milestone Release 的这样的版本，同时每周我们会将最新代码部署到云上面去，进入 TiDB Cloud 给到用户进行试用，通过用户体验快速地迭代打磨，借助于整个社区的力量，帮助我们的产品，尤其是新的 feature 快速地推向市场，让客户去感知、去使用。同时，我们也在以稳态的方式提升整个产品的核心能力。我们每半年会发布一个 LTS（Long Term Support）的版本，让企业客户能够安心使用。因为很多行业，比如我们银行业的客户，不会去使用非常激进的版本，而是主要出于稳定性的考量。在这个的大的 LTS 版本里面，我们就会专注于稳定性、高可用性和性能的不断提升。  \n\n接下来我分享这些“工程实践”是来自 TiDB 的，同时业界优秀的互联网公司、软件开发人员也都有这样的“最佳实践”。  \n\n### 3 自动化  \n\n想让程序跑得又快又稳，非常关键的就是自动化一切能自动化的服务，让机器和 AI 最大程度地放大开发人员的生产力。大家能在 GitHub 上看到的 PingCAP 的项目代码，如果用冰山来打比方，可能只是冰山海平面上非常小的一角，它的海平面以下有非常大的基座，就是我们的自动化测试体系—— CI/CD、自动化的 pipeline、AI 增强的问答系统，以及其它相关的系统，都是藏在 TiDB 源码后面的。因而 TiDB 能够实现完全自动化的部署、运维。PingCAP 除了数据库内核团队，也成立了专门的团队来实现这些自动化，这也是 PingCAP 能跑得快的一个重要因素。  \n\n### 4 测试，测试，测试  \n\n重要事情说三遍，测试、测试、测试。活动现场有了很多和同学交流的机会，很多同学会有一个共同的疑问：在工业界和学术界做数据库到底有什么不一样？  \n\n以 PingCAP 为例，在工业界，我们很多的工作都是聚焦于“测试”的。这是个看起来非常枯燥的工作，但也非常基础，只有做好测试工作，数据库才能更加健壮。我是一个有 20 多年研发经验的程序员，甚至可以非常笃定地说，只要是从事软件开发这个行业，数据库或是其他，只要涉及到基础架构，能不能写好测试会是区分一个工程师是否优秀的一个分水岭。基础软件是非常复杂的系统，复杂系统的稳定性和鲁棒性是非常关键的，只有深入理解系统的工作原理，才能有效地测试系统，才能不断修正、优化。所以在设计系统的时候，我们要保证系统的「可测性」。  \n\n### 5  Eat your own dog food  \n\n吃自己的狗粮，这也是软件开发中常提到的一件事。像我们自己做的 OSS Insight，一个开源的 GitHub 数据分析工具，就是基于我们自己的 TiDB Cloud 来构建的。同时 PingCAP 内部的很多系统也都是基于 TiDB、TiDB Cloud 的。一个系统如果你自己都不愿意尝试体验，那就很难是一个好的系统。  \n\n### 6  部署、研发、预研，时刻保持技术领先  \n\n为了时刻保持技术的领先性，现在 PingCAP 采用的是一个“三代”的研发模块——部署一代、研发一代、预研一代。比如我们底层的存储 TiKV，现在用户部署的基本都是我们的“部署一代”，也就是单个 RocksDB 的存储引擎，今年年底我们会发布现在正投入大量资源研发的下一代存储引擎，也就是基于多 RocksDB 的 Partitioned Raft KV 的新一代存储引擎。除此之外，我们还在研发另一套云原生的 Cloud Storage Engine。我们会同时保持三代的迭代速度，确保我们在每一个时间点上，TiDB 的技术架构都是领先的，都能给用户带来更大的价值。  \n\n### 7  持续倾听客户之声  \n\n另外一个学术界与工业界的差距就是，在工业界你需要了解你的产品目标用户是谁，你的产品谁来买单？做产品一定要根据用户的需求来做，而非自己主观的评估。无论你的技术多么 fancy，看起来有多酷，如果没人用，它都不是一款好的产品。PingCAP 一直非常重视用户的反馈，无论是通过 GitHub 的开源协作，还是 AskTUG 论坛、我们线下的客户之声活动，我们都在不断地根据用户的反馈来进行产品的设计和迭代。\n\n## TiDB 产品家族协同演进\n\n![TiDB 产品演进.png](https://img1.www.pingcap.com/prod/Ti_DB_fc1d4d5155.png)\n\n经过 8 年的打磨，TiDB 形成了一个完备的产品家族体系。最上面是 TiDB Open Core，也就是我们的源代码是完全开源的。基于这个 Open Core，我们推出了 TiDB 企业版、全托管的 TiDB Cloud，和 TiDB Serverless 版本。前两者对应着我之前提到的“敏态 + 稳态”，而 TiDB Serverless 则正在把 PingCAP 人一个非常有野心的愿望变成现实：我们希望给全世界的开发者提供一款免费的、永远在线的数据服务。我们希望 TiDB Serverless 能做到表级别的创建和唤醒，在满足一定 resource quota 的情况下，做到可预期的性能。\n\n![客户成功.png](https://img1.www.pingcap.com/prod/_414b62b721.png)\n\n## TiDB 人才生态\n\nTiDB 自主开源的模式，打造了敏态 + 稳态的工程体系和开放式的架构哲学，而这一切的基础、最核心的部分就是 TiDB 的人才生态。TiDB 一直坚持开源，而 PingCAP 作为一家公司，是以营利为目的的，为什么还能一直坚持开源信仰？我们坚持做企业一定要回报社会，一个好的商业模式是什么样的？我们觉得应该是先创造社会价值，再从社会价值上萃取一部分商业价值，这也是我们对于自己未来长期的期望。  \n\n![TiDB 人才画像.png](https://img1.www.pingcap.com/prod/Ti_DB_61de96cbdc.png)\n\nTiDB 在培养怎样的人才？从我们过去招聘的 JD 就可以看出来。归纳到这几点，第一就是技术专精，热爱开源，数据库作为基础软件，对计算机系统的理解、过硬的编程实力都是必须的，我们也希望大家能够深刻理解开源软件的协作模式；同时我们希望你有国际化的视野和拥抱创新的精神，TiDB 诞生于中国，服务于全球用户，在中国、北美、APAC、欧洲都有业务，只有具有开放的心态，才能更好地拥抱国际化；除此之外，客户导向也很重要，如我前面提到的“持续倾听客户之声”，贝索斯也在亚马逊的 leadership principle 中提出了一条 customer obsession，也就是痴迷客户，客户导向，唯有如此才能打造一款成功的产品。  \n\n![TiDB 人才生态.png](https://img1.www.pingcap.com/prod/Ti_DB_a13a3a841d.png)\n\n8 年以来，公司、产品不断壮大，TiDB 的人才生态也在逐步完善，现在也有了一些成果。我们通过 TiDB 成功地连接了全世界的数据库人才，TiDB 在全球有近 2000 名贡献者，遍布 45 个国家和地区，包括现场的同学也有很多 TiDB 的贡献者，TiDB 也成功进入了全球范围内超过 250 家高校。  \n\n## 技术人如何实现社会价值  \n\n作为一名工程师，如何创造社会价值？  \n\n又回到了最开始我们聊的：开源。只有开源，我们才能在全世界的代码宝库里，留下一些有长远价值的东西，我们的探索，也才能成为国内技术通行者的共同探索。  \n\n![共同探索.png](https://img1.www.pingcap.com/prod/_b40ce33262.png)\n\n在开源的基础上，为了让 TiDB 触手可及，我们做了许多努力。  \n\n首先，我们将 TiDB 的底层存储 TiKV、混沌工程测试平台 Chaos Mesh 都捐赠给了 CNCF 基金会，它们现在已经成为了非常技术公司构建自己云原生服务的底座；从 2021 到今天，PingCAP 连续三年与 CCF 数据库专委会合作，共同组织中国数据库暑期学校，促进工业界与学术界的联动，让更多学生接触到了数据库的专业知识；我们还打造了 Talent Plan 项目，一门非常适合技术爱好者入门数据库内核研发的数据库课程，现在已经与 250 多所高校合作，学员遍布全球……  \n\n今天，为了更好的支持中国数据库人才培养，持续赋能中国数据库行业，践行 PingCAP 对数据库人才的长期主义，和中国数据库一同成长，PingCAP 向中国计算机学会数据库专委会捐赠三年暑期学校工程实践的全部实验，2021 年的主题是分布式，2022 年是优化器，今年的主题是云数据库，[欢迎大家体验](https://tidbcloud.com/free-trial)。\n","date":"2023-08-02","author":"唐刘","fillInMethod":"writeDirectly","customUrl":"tidb-engineering-practice-and-talent-view","file":null,"relatedBlogs":[]},{"id":"Blogs_500","title":"黄东旭：The Future of Database，掀开 TiDB Serverless 的引擎盖","tags":["PingCAP  用户峰会","Serverless"],"category":{"name":"观点洞察"},"summary":"PingCAP 联合创始人兼 CTO 黄东旭分介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念，同时探讨了 TiDB Serverless 对于中国用户的价值。","body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 联合创始人兼 CTO 黄东旭分享了“The Future of Database”为主题的演讲，介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念。黄东旭通过分享个人经历和示例，强调了数据库的服务化而非服务化数据库的重要性，并展示了 TiDB Serverless 架构的创新之处，同时探讨了 TiDB Serverless 对于中国用户的价值。以下为分享实录。\n\n作为今天上午的最后一个话题，相信大家已经感受到今天我们分享的最核心逻辑，跟刚才刘奇分享的我们部署一代、研发一代相承接，到我这部分就是未来的一代：预研一代。  \n\n因为今天会场有很多熟悉的老朋友，看到我这个标题肯定会心一笑，我每次在大会上的演讲都是这个题目：The Future of Database。选择这个主题一是我发现每次讲未来的东西都有东西可以讲；另外一点，很多老朋友发现我去年总是不时消失一段时间，怀疑我去闭关修炼了，我也跟大家汇报一下东旭去哪儿了。  \n\n**Demo：我花了多长时间构建我自己的 OSSInsight Lite**\n\n![Demo.png](https://img1.www.pingcap.com/prod/Demo_079bcb3718.png)\n\n分享之前给大家看看，刘奇的分享里面的这一页，把我 GitHub 个人数据分析的服务截图放上去了，这个小 demo 是我个人的挑战，我能不能完全做到不写代码，不去买服务器，完全用现代化的在线的云上的应用做一个我自己的数据服务。\n\n![Demo.mp4](https://img1.www.pingcap.com/prod/Demo_16079ecd5d.mp4)\n\n在这个小的视频里边，我几乎全程只用了鼠标来操作，我想分享的点并不是让大家去学习这些技术，而是想让大家稍微体验一下现代的开发者构建应用的方式已经完全不同——门槛越来越低。  \n\n我经常会有一些天马行空的想法，比如我会想如果要给全世界的开发者都提供免费的数据库，这个成本得有多大？以现在的技术肯定支撑不了。那如果要做这么个东西的话，我们可能需要重新去思考数据库本身的一些最基础的东西。  \n\n## 一个人人可用的数据库服务有怎样的技术架构？\n\n![人人可用的数据库特征.png](https://img1.www.pingcap.com/prod/_a5ba0e9b97.png)\n\n这是一些数据库厂商会说的老生常谈：扩展性、稳定性、用户线性的扩缩容、节省成本、多租户、云原生。  \n\n但是刚才我说的那些新的需求或者面向未来的数据库，可能对每一项都会有更高的要求。比如你的系统已经具备了一定的扩展性和稳定性，但更重要的是你能不能给用户一个稳定的性能的预期，我经常说一句话，稳定的慢比不稳定的快其实更好，可预测性对系统和底层的架构提出了更高的要求；第二就是现在几乎每个分布式数据库都支持弹性扩容，而更高的要求可能是，在做这些扩缩容的复杂操作的时候，开发者、DBA 都不需要去费心，数据库的扩缩容对业务来讲是完全无感的，体验非常顺滑；成本层面，我们再把成本压缩到极限——我能不能，不用的时候就不花钱？开源软件的分发上、下载不要钱，但是运行软件的服务器要花钱，现在我们再往前想一步，——数据库、服务器零成本的起步能不能支持；多租户上，我们过去要去强调互相的隔离，但是如果为了实现大规模的海量的免费的用户、中小型的敏捷的业务，不仅要强调隔离，还得强调资源的高效利用和共享；云原生是老生常谈，做到云中立就是进一步的目标。  \n\n![新一代多租户.png](https://img1.www.pingcap.com/prod/_c206e0918c.png)\n\n我这边挑一个简单的例子，就从最近发布的多租户能力说起。如果把租户的规模从私有化部署的几十几百个，扩大到十万个、一百万个、一千万个甚至一亿个，平台如何去支撑这么大的租户数量，它需要哪些基础的能力，我们是怎么思考的？第一老生常谈，多租户一定要隔离；第二是刚才唐刘稍微讲了一下我们现在在研发的东西：资源管控，我们必须得实现一套很好的机制能够让海量用户更高效地利用和共享底层系统的资源，才能达到很低的成本；第三就是能区分，每一个用户在使用的体验上都必须能够感受到自己是在拥有整个数据库的。  \n\n![TiDB 迈向新一代多租户.png](https://img1.www.pingcap.com/prod/Ti_DB_0235c9089e.png)\n\n之前有人问我 TiDB 支持多租户、多应用这种模式吗，我当时一直都是比较保守，通过几个大版本的迭代，我现在可以负责任的说，TiDB 要去实现现代的多租户，基础的能力都已经满足了。  \n\n## TiDB Serverless：未来数据库理念的“概念车” \n\n我们回到最开始的话题：如果我们要给全世界的开发者提供数据库该咋做？今天我就给大家说一下背后的概念车，把 TiDB Serverless 引擎盖掀起来大家看一看。  \n\n![TiDB 经典架构.png](https://img1.www.pingcap.com/prod/Ti_DB_e95cce4b77.png)\n\n今天无数次讲到了 TiDB 的经典架构，然而如果把 TiDB 这个经典架构搬到云上，想实现“人人可用”这个目标，仅从成本上考虑，PingCAP 就得赔死了。  \n\n![TiDB 云原生哲学.png](https://img1.www.pingcap.com/prod/Ti_DB_f552bb4a5b.png)\n\n所以重新设计 TiDB Serverless 的时候，我当时定下了几个规范或者开发的哲学，其中最重要的一条就是我们应该做的是数据库的服务化，而不是服务化的数据库。  \n\n传统意义上来说我们要做云数据库，大家第一直观感觉，底下做个云管平台，每个租户部署一套 TiDB，把自动化的管控做完，这不就可以了吗？但是 TiDB Serverless 在这个方面，我们选择重新去思考一些非常基础的东西，刚才做云上运维 TiDB 的思路是行不通的，如果要做这么大规模这么新的东西的话，而且应该当做一个完整的服务去设计，而不是把它当做一个数据库去设计。  \n\n八年前一开始设计 TiDB 的时候，我看到的东西就是一台台具体的服务器，我看到的是 CPU、内存、磁盘，基于这些东西我们构造了 TiDB。但是如果我们现在在云上构建 Serverless 这个系统，拿到的是一张白纸，我今天重新再开始去设计这个系统的时候，我看到的已经不是 CPU、磁盘机器这样的东西了，我看到的东西是云上给我的服务，EC2、虚拟机，我看到的是对象存储，我甚至可以看到云厂商的 RDS，我能不能拿 RDS 作为系统的一部分，所以在新的云原生的工程哲学里边必须有一条能够充分利用云的基础设施，这也是我们能把成本推到如此极限的一个核心的思想。  \n\n![Serverless 解决之道.png](https://img1.www.pingcap.com/prod/Serverless_eefc36d590.png)\n\n掀开 TiDB Serverless 的引擎盖，大概有三个新的东西，第一个换了新的云原生的引擎 CSE（Cloud-native Storage Engine），非常朴素的名字。第二是终于在 TiDB 引入了逻辑上的 Key Space，第三就是 Resource Control 以及 RU 的概念，从上到下做全局流控。  \n\n![CSE 架构.png](https://img1.www.pingcap.com/prod/CSE_ac2a17d227.png)\n\n这是 CSE 整体的架构，核心就一点，它是一个极致的成本考虑下，极致的多租户背景下的新一代云上 OLTP 存储引擎。本质来说即使在之前的存储层，TiKV 这一层也开始做了存算分离，这就带来一个好处，比如有一些用户的数据是冷数据，因为我们在云上发现大多数的用户的业务和数据满足 82 法则，20%的热数据，80%可能是冷数据，但这些冷数据你在它不用的时候就可以按照流量的需求，直接 compact 到 AWS S3 这样云上更便宜的存储上面。AWS S3 存储的价格每 TB 每个月大概 20 美金，喝两杯咖啡就有一个月一个 TB 的存储空间了，这还是没有任何优惠的情况，实际上还可以更便宜。  \n\n![TiDB Serverless 架构.png](https://img1.www.pingcap.com/prod/Ti_DB_Serverless_5c7a108c6c.png)\n\n所以基于新的存储引擎，我们可以发现本身 TiDB 之上所有的组件一下子就变成了无状态的。当一个组件变成无状态了以后，怎么去降低成本？池化。  \n\n图中 TiDB 右边现在已经把所有的包括计算节点存储节点全都变成了池化的设计，最上面加入了一层 Gateway，用户直接连接到 Gateway，Gateway 负责对现在用户的请求从资源池中捞出一个活跃的节点，它不用的时候连接断开再放回去。  \n\n大家看这个图尤其是做系统架构多年的朋友会有个感觉，这个东西感觉不像一个数据库，反而像大型互联网公司后台的服务——有这个感觉就对了，因为我们在设计这个系统的时候就不是把它当做一个数据库在设计，而是把它当做一个真正的云服务在设计，所以才能达到极致的性能和成本的压缩。  \n\n![Key space 详解.png](https://img1.www.pingcap.com/prod/Key_space_fe6d7088be.png)\n\nTiKV 是 TiDB 的存储引擎，所有的数据都是通过 key-value 来编码的，Key Space 本质上，就是在编码前面加上一个用户 ID 的前缀，将 tenant ID 作为 group keys 的前缀。  \n\n![流控设计.png](https://img1.www.pingcap.com/prod/_ceb3e49390.png)\n\n这张图解释了零成本起步，业务没有流量的时候就不收钱，本质上还是依靠池化来实现的。刚才我提到用户的连接都是连接到一层可以水平扩展的 Cluster Gateway 上，Gateway 来控制计算节点是否启用。如果这个客户的数据特别冷，十天半个月都不访问一下，这个数据完全存储在对象存储上，在对象存储上的成本是极其低的，在用户请求的时候再快速加载回来。这样一个架构保证了 TiDB Serverless 基础设施的成本会被均摊到所有用户身上，用户越多，数据量越大的时候，成本也就会越来越低。  \n\n![OSSInsight 的故事.png](https://img1.www.pingcap.com/prod/OSS_Insight_e28b1c5ec4.png)\n\n我最后分享一个小小的例子。我们公司内部也有自己用自己产品的习惯，这是我们自己的一些服务 demo，全部用 TiDB 自己构建。我们做了一个很有趣的工具叫 OSS Insight，把 GitHub 上的数据抓下来做分析的一个在线应用，这个在以前传统的 TiDB Cloud，也就是经典 TiDB 云上部署架构下，一个月的成本在一万美金左右，上图就是我们付给自己的账单。  \n\n![成本降低.png](https://img1.www.pingcap.com/prod/_c65cdc99fc.png)\n\n同样这个业务今天已经接近 12 个 TB 了，这样一个巨型的数据库前一段把它迁移到 Serverless 以后，总体成本下降了 70%，而业务在使用层面上也完全没有任何的感知。  \n\n![自动应对.png](https://img1.www.pingcap.com/prod/_a72bd89b45.png)\n\n这里有一个很有趣的真实例子，刚才我们看到整体的 TiDB Serverless 的设计是面向弹性去做设计的，但是这种东西总是希望能有一个实际的例子去验证一下这东西是不是真的在现实生活中比较好用，我们也真的有了这样的机会。今年 4 月初 OSS Insight 成功登上了 HackerNews 的首页，流量一下暴增到原来的 7 倍，这个事情还发生在中国时间的深夜，我们的工程师都还在睡梦中，TiDB Serverless 自动发现了流量的突变把集群扩容，承担起 7 倍流量的业务负载以后，又自动缩回来，前端业务的各项指标都还是非常稳定的，也没有额外的收费。这是一个特别好的例子，我们也特别欣慰。  \n\n![Serverless 反哺.png](https://img1.www.pingcap.com/prod/Serverless_31a425ba2b.png)\n\n我今天分享了一些我们未来对数据库的看法，关于 TiDB Serverless，我还有三个点想强调。第一，虽然看到现在它是一个在纯云端的服务，但是我们有计划将更先进的架构服务于中国的客户，甚至你可以未来在私有化环境里面部署 TiDB 的 Serverless。因为我们设计这个系统内核的时候非常仔细的考虑了这个系统本身的可移植性，刚才这些东西未来大家会在自己的数据中心或者自己的云上去使用；第二，我个人认为这也是代表着数据库最前沿的发展的方向，就是云原生加上极致的弹性，我们在思考数据库本身的一些架构或者最底层的想法的变革都会遵循这个方向；第三点我个人觉得Serverless 是我们很好的练兵场，包括中国企业级客户我们预研出来的版本我们新的一些特性，最早会在 Serverless 上应用，比如刚才我说的 Key Space 这个功能，目前已经在 Serverless Tier 上实现了上万个用户的部署，经过上万个集群的打磨，很快也会在企业版和云上托管版本里边落地。  \n\n最后我想小小的总结一下今天我的分享以及我的一些感受。我也代表着 PingCAP，纵使大的经济环境充满各种不确定性，我们永远相信技术创新能够真正给业务带来价值，我也相信技术真正能够改变世界，所以我们相信未来永远是一个更好的世界。","date":"2023-07-24","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"the-future-of-database-2023","file":null,"relatedBlogs":[{"relatedBlog":{"body":"## 导读\n\n在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇分享了题为“创新涌动于先”的演讲，全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并携手用户代表发布了面向中国企业级用户的平凯数据库。以下是演讲实录全文，阅读需约 8 分钟。  \n\n过去一段时间，我拜访了全球各地的客户，聆听他们的挑战和建议，以及 PingCAP 是如何帮助他们解决挑战的。在这个过程中，我们也看到一些新的技术发展趋势。当下，AI 技术非常火，到处都是各种各样的 AI Demo，每家企业都在思考这样一个问题：**AI 到底有没有可能重塑软件行业？我的答案是——AI 这次真的要重塑整个软件行业了**。\n\n![刘奇.jpeg](https://img1.www.pingcap.com/prod/_b136706601.jpeg)\n\n## AI 重塑软件行业\n\n作为一家软件公司，我们思考的问题直接体感通常有两个：一个是代码，一个是数据。  \n\n先从代码说起，大家有没有意识到，很多人在过去一段时间不自觉地变成了程序员。今天，我们向 ChatGPT 提问题，它会给我们一个答案；向它提要求，它会给我们一个结果。比如我们可以让 ChatGPT 做总结、写文章，或者让它生成图片。大家可以回忆一下，在 AI 时代到来之前，所有这些工作都需要用程序去完成。我们需要用各种各样的辅助工具，那些东西都需要编程开发。而今天，我们没有写任何一行代码，只是提了个需求，结果就有了。以前，这需要很多程序员很长时间努力才能得到一样的结果。而现在，我们向 AI 发命令、提要求、提问题就能拿到结果，事实上就等于完成了编程工作。现在，自然语言已经成为最热门的编程语言。在过去七个月的时间里，GitHub 上新增代码中已经有超过 46% 是由 AI 生成的。如果从软件开发效率的角度看，AI 实际上已经完成差不多一半的人类工作。  \n\n再说数据，我们今年一月份发布了一个 AI 生成 SQL 的产品，叫 Chat2Query（前往 tidbcloud.com 立即注册体验），用户使用 Chat2Query 就不需要再写 SQL 了，只要用自然语言描述一下希望得到什么数据，希望做一个什么分析，SQL 便会自动生成，只要在数据库里运行一下，就能得到想要的结果，并且还能用图表化的形式自动展示出来。  \n\n![涌现中的技术世界-Data.png](https://img1.www.pingcap.com/prod/Data_007a8e1815.png)\n\n上图右侧是 PingCAP CTO 黄东旭在 GitHub 上的个人数据看板。以前要实现这样一个数据看板，需要一个前端程序员、需要一个数据分析人员写 SQL 来分析数据，还需要一个后端程序员部署服务，甚至还需要知道一点云的知识，理解如何把应用部署在云上。到了今天，这变成一件非常简单的事情，只需十分钟，一行代码都不用写。这是一次巨大的生产力提升，**AI 带来的能力让数据消费的门槛变得极低**。以前，我们必须是一个 SQL 的专家，才能分析数据。有人曾经写过一万多行的 SQL 来处理一个分析需求，这个东西不是人类能轻易掌握的。如今，这个门槛已经降到人人都有可能做到。这意味着我们只要能够连接上电脑，能和 AI 交互，能接触到数据，就可以消费数据。这个数量级可能达到 10 亿人。在接下来的几年里，由数据消费门槛降低带来的数据消费人数的增加，数据消费频次的增长，将使数据呈 10-100 倍规模的增长，这是一个远超我们预期的增速。\n\n## AI 时代，我们需要怎样的数据库技术？\n\n以上改变，将给数据库带来巨大的挑战，数据消费的门槛降到人人可用的程度，需要每个人都有一个数据库可用。早在四五年前，我和 CTO 黄东旭探讨过一个话题——如果 PingCAP 要为全世界所有开发者提供一个免费的数据库，那这个数据库的架构应该是什么样？  \n\n![涌现中的技术世界-我们需要怎样的数据库技术.png](https://img1.www.pingcap.com/prod/_bfe74f7599.png)\n\n我们希望这个数据库能够做到实时在线，随时都可以访问，随时都可以用；我们也希望它是一个开放的生态，因为我们不仅仅有存在数据库里面的数据，还有很多存在其他地方的数据，我们需要有一个生态能够和所有数据消费端做更好的对接。  \n\n后来，我们形成了一个结论，起码它应该是个云原生的架构。如果不是云原生的架构，我们就没有办法去应对各种各样弹性的需求；今天，一个用户相对容易预测，那为全球所有开发者都提供一个免费的数据库，就意味着我们会有数千万甚至数亿的用户，这个数据库怎么才能做得到？它需要很强的数据整合能力；其次，因为不同用户的需求是不一样的，数据量也不同，我们需要它有非常强的弹性扩展能力。  \n\n![向先进性要答案.png](https://img1.www.pingcap.com/prod/_51a85d6463.png)\n\n过去这两年的变化特别快，大家感知最直观的可能是宏观经济变化很快，其实除此之外，AI 技术的进步速度也非常快。从 ChatGPT 在去年 11 月底推出，到今天才过去短短八个月的时间。这八个月中已经创造了无数新的纪录，包括一个新的项目在 GitHub 上面获得 Star 的数据、ChatGPT 用户增长的速度等等。  \n\n大家在面对大量新技术的时候，都做出了最直观的选择，那就是拥抱先进性。过去一段时间我在与美国、日本的客户交流时，最直接的感受是每个人都在讨论两个方向，一个是成本，另一个是效率。在当前经济环境下，这几乎成了所有人的共同选择。\n\n## 客户的关注点就是 TiDB 的焦点  \n\n如果仔细观察 TiDB 发展的轨迹，你就会发现用户对数据库的关注点，其实和 TiDB 实际解决的问题是高度一致的。TiDB 在稳定性、性能、高可用性、易用性、工具生态的提升等方面付出了巨大努力。但我们认为这件事光努力还不够，我们还需要有一个非常好的演进策略以及分层的架构设计。  \n\n![TiDB 的设计与演进策略.png](https://img1.www.pingcap.com/prod/Ti_DB_b4992a11c0.png)\n\n在内部，我们有一个说法叫做 API First，各个模块之间优先设计 API（接下来我们也会推出更多基于 Open API 规范的 API 测试），有了 API 之后系统就很容易被其他各种各样的业务系统集成。举个例子，各大型用户基于 TiDB 都有自己公司内部的运维平台，通过我们提供的 API 能更好地融合到客户内部的平台里。在日本我和一个客户交流的时候，对方专门提到过这一点。过去他们需要花几天时间才能完成新版本的集成，但有 API 之后只要花几分钟就能做到。  \n\nTiDB 整个系统除了模块化的切分，也做了很好的纵向切割，从上到下分成三层。比如 Chat2Query 在最上面一层，这层会更关注整个系统的交互性、易用性，如何让系统更加自动化、更加智能；在 SQL 层主要关注如何提升它的稳定性，让它变得更加智能。比如 TiDB 的优化器如何更智能地选择，到底使用行存还是列存，还是让行列同时使用；最下面是内核层，所有人对此的关注点都一样，就是高可用、高性能。  \n\n![TiDB 存储引擎持续提升.png](https://img1.www.pingcap.com/prod/Ti_DB_2684b39c37.png)\n\n在内核层，TiDB 的存储引擎使用了一个持续升级的策略——部署一代、研发一代、预研一代。今天我们听到的所有关于 TiDB 的讨论，其实都是基于部署一代的体感，不少用户还使用着 TiDB 3.0、4.0，而这已经是四五年前的版本了。当然我们也希望用户能更快升级到最新版本，享受到新版本带来的优势，每一个新版本都会带来巨大的性能和稳定性提升。7.0 版本发布的实验特性 Partitioned Raft KV 就带来了巨大的性能提升。前面预测未来几年数据会扩大 10 倍，部分领域会扩大 100 倍，在如此大的数据规模下面我们的数据库能力是不是也能同步扩大 10 倍、100 倍？这是 Partitioned Raft KV 解决的问题。我们预研一代的存储引擎 Cloud Storage Engine 已经在后面要提到的 TiDB Serverless 中应用，我们的 CTO 黄东旭在后面的演讲和 Blog 中都有详细的解读。  \n\n如果大家留心就会注意到，过去一年时间里 TiDB 的 Online DDL 的速度提升了 10 倍。设想一下，我们有一个 100TB 的表，加一个索引要多久？对系统资源的消耗又是什么样的？除了 DDL，还有一点是 TiDB 的扩缩容的速度在这个引擎里面提升了 5 倍，这也意味着数据丢失的风险降低 5 倍，业务中断的风险降低 5 倍。\n\n## 平替还是跃迁？TiDB 产品家族的协同演进\n\n经过多年发展，TiDB 目前已经拥有三大产品家族：一是面向企业级市场的 TiDB 企业版，服务于企业级关键业务场景；二是全托管的 TiDB Cloud，提供云端一栈式 HTAP 数据库服务，已经成为欧洲、北美、日本、亚太地区众多数字原生企业的选择；三是刚刚正式商用的 TiDB Cloud Serverless，一个 AI Ready 的数据库，以极简架构、极致体验和超低门槛为云上开发者、创业公司提供低至零成本的选择，较 TiDB 社区版和 MySQL RDS 更具成本优势。  \n\n![TiDB 产品家族协同演进.png](https://img1.www.pingcap.com/prod/Ti_DB_9c9ef534c9.png)\n\nTiDB 是如何在多个版本间协同演进的？从上图可以看出，最上面有一个 TiDB 的 Open Core，TiDB 的所有这些版本都是基于共同的 Root 生长出来，去适应不同的客户和不同的使用场景。  \n\n![TiDB 企业版.png](https://img1.www.pingcap.com/prod/Ti_DB_35ca97f365.png)\n\nTiDB 企业版已经拥有很多大行、大型企业的使用经验，他们有些是从数据库一体机迁移过来的，在迁移过程中和 TiDB 一起积累了大量的迁移经验。最近 MySQL 5.7 马上就要结束产品生命周期（End of Life）了，用户应该怎么办？换一个数据库平替一下？我们的思路不一样，我们希望的是用户不仅仅是从 MySQL5.7 迁移到 TiDB，更要关注的是他迁移过来之后的获得的价值到底是什么。  \n\n我们希望 TiDB 提供的价值是“可持续、可扩展、可整合”。很多企业都有大量的 MySQL 5.7 ，有成百上千个 instance，管理和维护它们都是非常复杂的事情。TiDB 提供了资源共享的多租户能力，我们可以把更多的 MySQL 实例整合到一个或者多个 TiDB 集群，极大提升资源利用率，从而降低硬件成本，同步降低管理集群的成本。最近我们和一个客户交流，他们有很多 MySQL 实例，有的利用率不高，就直接降级，从原来的 8C 配置，直接降成 4C 或 2C 配置。过了一段时间，业务这边有个流量把系统卡死了，再给升级一下。过一段时间流量又下来了，再降级。这就很头疼，运维和开发的关系就很难处，降本增效的压力很大。这么多的 MySQL instance 一旦迁到 TiDB 上面，基于 TiDB 本身的资源共享能力，流量超了几倍都没问题，这就可以带来非常显著的降本增效。  \n\n![TiDB Cloud.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_b963ef4870.png)\n\n接下来是 TiDB Cloud，它在过去几年里得到了全球客户的认可，包括欧洲最大的移动出行公司 Bolt，北美新锐的 SaaS 公司 Catalyst，印度最大的电商 Flipkart，日本著名的游戏公司 CAPCOM 等等。  \n\n![TiDB Serverless GA.png](https://img1.www.pingcap.com/prod/Ti_DB_Serverless_GA_812a8f8373.png)\n\n最后是 TiDB Serverless。四年前，我亲手写下第一行源代码，探索新一代云上 Serverless 架构，这是预研一代的成果。非常幸运，预研一代的速度远远超出我们的预期，它现在已经正式商用了。过去几个月的时间里，TiDB Serverless beta 版已经拥有超过 1 万个活跃的集群。  \n\nServerless 带来了什么样的价值和能力呢？第一，低成本零元起步。TiDB Serverless 完成了 PingCAP 的一个梦想，我们有能力为全球每一个开发者提供一个免费的数据库。  \n\n我想稍微分享一个内部的小故事，最早 TiDB Cloud 的 free tier 成本是现在的 100 多倍。我们内部有个笑话，自己总是调侃说我们是“贵司”。“贵司”是什么意思呢？TiDB “贵”。因为比较的对象是 MySQL，作为一个分布式系统，TiDB 跟一般的系统比成本肯定高，起步就三个副本，还有计算层、调度层，跟单机比肯定是贵了。很幸运的是， TiDB Serverless 出来之后“贵司”终于不“贵”了。得益于 TiDB Serverless 采用的完全分离式的架构，不仅仅做到了存算分离，我们还做到了算算分离、存存分离，整个系统的弹性非常强，同时它的使用异常简单，用户体验非常好。我们收到大量用户的赞誉，超出了自己的预期。  \n\n大家都希望把自己的时间精力投资在自己的创新上面，投资在自己的业务上面，尽量不想再花时间在数据库上面，将所有复杂的事情都交给系统，交给 PingCAP 完全自动化处理。过去，大家可能会很好奇，这听起来好得有点过了，能做到吗？凭什么？  \n\n## TiDB Serverless 为什么比社区版更便宜？\n\n今天我们在云上面使用数据库或者使用传统的 RDS，不管是什么数据库，本质上都是买一个虚拟机，按照最高的峰值要求配置，不管你的业务现在跑的是什么量，哪怕 CPU 利用率是 1%，你也必须为它的 100% 利用率付费。这就是一个传统的计费模式，永远为最高的峰值付费。  \n\nTiDB Serverless 的创新在于，你永远只为你正在使用的资源付费。举个例子，你现在假设有 10 TB 的数据跑在 TiDB Serverless 上面，你没有任何访问，那所有的计算节点全部会被自动 shutdown，但你可以在百毫秒的时间内就马上让它启动提供服务。这是一个巨大的进步，用户仅仅为使用付费，使用曲线长什么样，TiDB 的计费就会长什么样。这就是为什么 TiDB Serverless 能够做到比现在的 RDS，比云上面部署社区版还要便宜，只要这个 CPU 的利用率低于 20%，全自动的弹性就会带来巨大的成本优势。  \n\n![经典数据库的跃迁路径.png](https://img1.www.pingcap.com/prod/_fdbb5572bc.png)\n\n今天，不管你使用的是经典的单机数据库、开源数据库还是云端的数据库，TiDB 都提供了成本更低，扩展性更强，更加省心的选择。  \n\n## 面向中国企业级用户，发布平凯数据库  \n\nTiDB 源于中国，很多关键特性也来自于中国复杂的用户场景，毫无疑问中国市场就是 TiDB 的根据地和大本营。最近我们和很多中国用户沟通交流，他们给了我们非常多的反馈，很多反馈都非常有价值，特别是对于 TiDB 未来发展的预期和展望。我们发现，TiDB 企业版经过五年的打磨，更多是面向全球用户提供通用性的功能，但是这些功能对于中国企业级用户来说还远远不够。  \n\n当下，随着 TiDB 逐步进入中国用户的核心场景以及 TiDB 规模化进入国产化生态，面向中国企业级用户的“平凯数据库”正式发布了。  \n\n![平凯数据库发布.jpeg](https://img1.www.pingcap.com/prod/_463e302b96.jpeg)\n\n简单来说，平凯数据库主要包含 TiDB Open Core 的稳定内核以及满足中国企业用户的增强级企业功能。第一，提供国产化需求的企业级功能，包括图形化管控平台、全链路数据迁移平台、安全特性等等；第二，提供更完善的国产化生态系统的接入功能，包括国产软硬件的适配，比如操作系统、服务器等等；第三，提供更完善的国产化企业级服务支持能力。  \n\n未来，我们希望平凯数据库站在 TiDB LTS（长期支持版）的基础上能为中国的客户带来更好的价值，我们希望这个过程是开放的，会定期在国内各个区域组织用户讨论交流的活动，我们希望大家能一起参与到未来平凯数据库的建设中来。","author":"刘奇","category":5,"customUrl":"always-ahead-by-max-liu","fillInMethod":"writeDirectly","id":496,"summary":"在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并发布了面向中国企业级用户的平凯数据库。","tags":["PingCAP 用户峰会"],"title":"刘奇：经典数据库亟需跃迁，TiDB 不是“平替”"}},{"relatedBlog":{"body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩，共同带来了“携手中国用户，打造世界级产品”主题分享。分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。以下为分享实录。\n\n## 携手中国用户，打造世界级产品  \n\n![唐刘.jpeg](https://img1.www.pingcap.com/prod/_d2b6c87028.jpeg)\n<center>PingCAP 研发副总裁 唐刘</center>\n\n我是 PingCAP 唐刘，负责 TiDB 的产研工作。首先请容我对在座的各位以及在线收看直播的用户报以最诚挚的敬意，因为有你们八年多不断的坚持、陪伴和信任，才有了我们现在源源不断的动力去打磨、去不断完善我们的产品，给客户带来更大的价值。  \n\n我们先来探讨一个话题，为什么中国企业以及中国的用户对 PingCAP 非常重要？从 TiDB 诞生的第一天起我们就致力于解决企业用户在规模化负载下的稳定性和性能问题。熟悉 TiDB 的用户应该都知道，我们最开始就是解决的 是 MySQL 分库分表的问题。经过八年多的发展，在各行各业无论衣食住行，还是金融保险都有了 TiDB 的身影。鉴于中国这样庞大的用户基数，大家可以想象这些规模化场景对整个数据库的稳定性和性能都提出了世界级的挑战。毫不夸张地说，如果我们能满足中国用户这些天花板级别的要求，我们就非常有信心地将产品推广到全世界，让全世界的用户享受到 TiDB 带给他们的价值。所以，中国对我们来说非常重要。  \n\n![中国企业用户.png](https://img1.www.pingcap.com/prod/_2a5350b5fe.png)\n\n过去一年，PingCAP 投入了大量资源去解决 TiDB 在规模化场景下的稳定性和性能问题，也取得了不小的成果。首先在国内的某头部大行，通过我们的跑批优化，在该行的反洗钱业务、客户详单查询业务跑批场景上有 2-3 倍的性能提升。在国内某头部城商行，我们通过悲观事务的优化，在他们的互联网核心交易场景，实现了延迟降低 4 倍，7*24 小时延迟抖动控制在 2% 以内的目标。在国内某互联网零售企业，我们通过多业务整合和资源管控的方式，不仅使得用户节省了成本，同时也让业务的整体延迟下降了将近 50%。这些是我们在过去一年中取得成绩的一部分，非常感谢这些用户对我们的选择和信任。  \n\n![集群稳定性案例.png](https://img1.www.pingcap.com/prod/_54cf2d40ba.png)\n\n当然不限于此，TiDB 的产品核心能力也有很多方面的重要提升。首先，在线 DDL 的性能提升了 10 倍。对于老版本中用户关注的 OOM 问题，经过我们一年多的努力，TiDB 最新的版本中的 OOM 较之前的版本下降了 99%，实现了质的飞跃。目前，TiDB 已经能做到单表 50TB 数据的小时级别导入，让用户非常顺滑、快速地将大批数据导入到 TiDB，满足用户对极致的 RPO 和 RTO 的述求，数据同步输出的延时也降低至了秒级。这些性能提升大家可以在最新的 TiDB 7.1 LTS 版本中享受到。未来，我们在后续的 TiDB 7.X 版本中，将继续致力于稳定性与性能的提升。  \n\n![性能提升.png](https://img1.www.pingcap.com/prod/_74c4ee9454.png)\n\n下面我给大家简单介绍 TiDB 7.X 版本中的三个重要新特性。  \n\n第一个特性是 Partitioned Raft KV，它带来的用户价值非常显著。我们能让用户相比之前用更少的机器，挂更大的盘，存更多的数据，还能提供更好的性能。在当前数据规模不断膨胀和多变的经济环境下，对用户来说这是一个非常具有吸引力的特性。使用 Partitioned Raft KV 这个特性之后，TiDB 无论是在性能还是在成本上面相比之前都有了质的飞跃，希望大家尽快使用 TiDB 的最新版本来体验这个功能。  \n\n![Partitioned Raft KV.png](https://img1.www.pingcap.com/prod/Partitioned_Raft_KV_a25b3b8a80.png)\n\n第二个重要新特性就是资源管控（Resource Control），之前有很多用户反馈在使用和维护多套 MySQL 集群上面精疲力尽，将多套 MySQL 集群归集到一个 TiDB 里面又担心跑在数据库里面的业务相互影响。TiDB 7.1 LTS 版本已经提供了一个非常好的解决方案，就是通过 Resource Control 让用户非常方便地将多个 MySQL 实例汇聚到一个 TiDB 集群里面，一方面能够极大降低用户对于多套 MySQL 集群的运维成本，降低了运维复杂度，另一方面通过多合一的业务汇聚能够帮助用户节省成本。在实际的用户场景中，我们发现使用多合一的汇聚能帮用户节省 40% 左右的成本，在当前经济环境的压力下和降本增效的背景下，基于 TiDB 资源管控的数据库整合方案无疑是理想的选择。  \n\n![Resource control.png](https://img1.www.pingcap.com/prod/Resource_control_386c27b3e6.png)\n\n第三个重要特性就是在线 DDL。在今天敏捷迭代的商业环境中，数据库需要跑得更快，但是我们不可能一开始就设计出一个完美的表结构。随着业务不断地快速变化，我们势必会对原始设计的表结构进行频繁的变更。运维过 MySQL 的同学应该都知道，当 MySQL 的集群规模非常大的时候（或者一些传统数据库集群规模非常大的时候），如果你要做一个 DDL 变更，这是多么痛苦的一件事情，不仅耗时会非常长，而且可能会造成停机维护、业务中断，甚至造成业务损失。然而，这一切在 TiDB 里面都不是问题，我们从第一天就支持了在线 DDL。在 TiDB 新版本中，在线 DDL 的性能提升了 10 倍，意味着你可以比竞争对手更快地进行表结构的变更，更敏捷地支撑业务迭代，以更快的速度在竞争中胜出。  \n![Online DDL.png](https://img1.www.pingcap.com/prod/Online_DDL_00e63b757a.png)\n\n后续的 TiDB 7.X 版本中将会推出 DDL 并行执行框架。如果你想要 DDL 执行得更快，只需要不断地添加节点，就能够实现性能的水平扩展，可以在 10 倍提升的基础上再乘以 N 个框架并行。这套框架不仅会用于当前的 DDL 处理，未来 TiDB 大批量的数据导入、大规模的数据统一分析、甚至一些重型查询的并行执行，我们都会通过这套框架进行统一的收敛。未来，我们希望通过这套并行框架给用户提供一套极致的性能体验。  \n\n![DDL 并行执行框架.png](https://img1.www.pingcap.com/prod/DDL_501ec7104a.png)\n\n这一系列新特性将会在 TiDB 7.5 LTS 中和大家见面。TiDB 7.5 版本将会提供更强大的资源管控能力，Partitioned Raft KV 将正式 GA，TiDB 也将全面兼容 MySQL 8.0。大家知道 MySQL 5.7 将在今年 10 月 End of Life，PingCAP 承诺我们会持续拥抱 MySQL 生态，不断地兼容 MySQL 5.7 和 MySQL 8.0，同时会带来顺畅的迁移体验，方便用户把数据库从 MySQL 迁移到 TiDB，实现无缝地迁移和使用。  \n\n![TiDB 7.5 重要功能.png](https://img1.www.pingcap.com/prod/Ti_DB_7_5_6b9ead8e9b.png)\n\n从第一天开始 TiDB 就致力于成为一款全球化的数据库，从第一天开始我们坚信中国用户一直是 TiDB 持续创新的核心发动机。据我们内部统计，TiDB 新版本中有 50% 的功能需求来自中国用户，TiDB 70% 的外部贡献者来自于中国，有 30,000 多名中国的 AskTUG 用户在体验产品并给出反馈。今年，我们启动了用户之声活动，来到各个区域倾听用户的声音，希望通过我们的努力携手中国用户打造一款世界级的数据库产品。  \n\n![用户之声.png](https://img1.www.pingcap.com/prod/_16a46aa063.png)\n\n## 平凯数据库，为中国企业用户需求量身定制  \n\n![丁岩.jpeg](https://img1.www.pingcap.com/prod/_ed03f98212.jpeg)\n<center>PingCAP 首席科学家 丁岩</center>\n\n我是平凯数据库的研发负责人丁岩。刚才唐刘介绍了很多 TiDB 的内核新特性，非常惊艳。对于中国企业用户来讲还有一个惊喜，一个专属的福利就是平凯数据库，我来介绍一下平凯数据库的发版策略和产品路线图。  \n\n我们锚定 TiDB 在每个 LTS 版本发布之后三个月左右，随着增强型企业级功能一起发布平凯数据库的新版本，节奏是每半年发布一个版本。平凯数据库是中国企业用户专属的一个福利，它有哪些吸引人的特性？  \n\n前面研究院付平老师介绍过，中国正在加速制定数据库的标准规范，涵盖方方面面。平凯数据库定位于全面地遵守国标、行标，兼容国产化生态，在安全合规方面让用户用得放心、用得安全。我们有很多大客户，例如国有大行的 TiDB 集群已经达到上百个，服务器达到上千台的规模，这个时候管理和运维就成为一个难题。平凯数据库适时地推出可视化管控平台（TEM），轻松管理上千台服务器、上百个 TiDB 集群，为用户节省管理运维的成本，提升管理效率。  \n\n![平凯数据库发版路线图.png](https://img1.www.pingcap.com/prod/_fc4539f0ac.png)\n\n中国市场上很多客户正在计划或者已经在把 Oracle 上的业务迁移到 TiDB，这个时候迁移成本包括迁移过程中的风险在所难免，我们也急客户所需，想客户所想，推出了全链路数据迁移平台（TMS），从数据库的对象，到 SQL 的兼容分析，到迁移前后 SQL 执行性能的对比，再到存量数据的迁移，提供一套全流程的迁移工具和解决方案，降低客户的迁移成本和迁移风险。此外，平凯数据库还提供存储过程的兼容，存储级的备份恢复，高级安全功能等。平凯数据库 7.1 版本将在今年 8 月底正式 GA。  \n\n![平凯数据库 7.1.png](https://img1.www.pingcap.com/prod/7_1_eb1e765d31.png)\n\n半年之后，我们将发布平凯数据库 7.5 版本。7.5 版本将在符合国标、行标最新的规范标准，在安全方面持续发力。在生态方面，TEM 支持 K8s 集群的管理；大数据生态兼容方面，7.5 版本支持 ORC 格式数据的导入；自动化部署支持 IPv6。7.5 版本将持续提升存储过程的执行效率。我们收到的中国企业用户的迫切需求，都会在后续版本中做规划和交付，更多惊艳的企业级新特性正在路上，敬请期待。  \n\n![平凯数据库未来规划.png](https://img1.www.pingcap.com/prod/_cd43406097.png)\n\n","author":"唐刘 丁岩","category":5,"customUrl":"build-world-class-products","fillInMethod":"writeDirectly","id":497,"summary":"PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。","tags":["PingCAP 用户峰会"],"title":"PingCAP 唐刘：携手中国用户，打造世界级产品"}},{"relatedBlog":{"body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 副总裁陈煜琦分享了“激流入海，PingCAP 中国业务发展策略”的演讲，介绍了 PingCAP 在技术层面的发展方向，强调了 PingCAP 服务于中国企业客户的重要性，并介绍了 PingCAP 助力客户长期业务发展的目标和方向。大会上，陈煜琦与中电金信、中科软科技、移动云、华锐技术、英方软件、甄盈业财、东软等合作伙伴代表，共同发布多项战略合作与联合解决方案。以下为分享实录。\n\n今天我演讲的主题是“激流入海，PingCAP 中国业务发展策略”，这个主题包含着两层含义：一层是指技术，例如新型分布式技术、HTAP、Serverless 等，怎么能够融入到数据库的技术海洋中；另外一层更重要的是 PingCAP 作为三位码农成立的极客公司，怎么能够服务好浩如烟海的中国企业客户的需求，助力客户长期的业务发展，这是我们过去一年不断尝试，过去五年不断打磨产品的重要目标和方向。\n\n## 深入核心场景，拓宽服务广度\n\n过去十年时间中国企业级市场的发展，特别是国产化替代领域，金融行业一直是排头兵，走在了行业的最前列。过去这一年，TiDB 在国有大行实现规模化的系统上线，在股份制和城商行进入了核心系统。过去的一年和今年证券行业进入了国产化替代的高峰阶段，我们看到越来越多的业务系统正在使用 TiDB 数据库承载。TiDB 也进入了保险企业的核心系统，多家保险企业把传统数据库迁移到了 TiDB。  \n\n![深入核心场景.png](https://img1.www.pingcap.com/prod/_5ee37115ec.png)\n\n在金融行业之外，作为一款通用型数据库 TiDB 也获得了众多行业的新客户，包括制造业，运营商、消费品、公共服务、交通物流、零售等，当然还有很多的中国出海企业。TiDB 在不同的行业场景下持续打磨产品能力和服务支持，已经取得了长足的进步。  \n\n![拓宽场景广度.png](https://img1.www.pingcap.com/prod/_86a41d20cb.png)\n\nPingCAP 一直聚焦如何能够服务好中国市场的企业级客户。我们在北、上、广、深、江浙和四川专门成立了从研发到销售到售后的全链条服务体系。在全中国，有超过一万名的 PCTA 和 PCTP 数据库专家覆盖更广的区域，与区域合作伙伴提供联合的服务支持。我们引以为豪的 TiDB 开源社区已经有超过三万多名注册用户，AskTUG 上问题的互助解决率已经超过了 90%。这是 TiDB 开源软件强大的基因和能力，倪院士也提到开源是中国软件发展的重要方向。  \n\n![区域团队.png](https://img1.www.pingcap.com/prod/_dc73061e3d.png)\n\n## 构建“行业 X 区域 X 生态” 的客户成功生态  \n\n开源生态是我们的基因，也是我们的基础，在开源生态之上我们构建了非常重要的基础架构生态，包括众多的国产芯片、操作系统、中间件和软硬件厂商。为了更好地服务行业客户的数字化转型，PingCAP 在过去 1-2 年与行业科技、解决方案和工具、服务和云合作伙伴们不断深化合作，锚定行业用户的需求，提供更加丰富的解决方案。  \n\n![生态合作.png](https://img1.www.pingcap.com/prod/_ed3f1873f3.png)\n\n今天，很多 PingCAP 的合作伙伴来到峰会现场，接下来我将请出其中的一些代表跟大家做一些分享。  \n\n![中电金信.jpeg](https://img1.www.pingcap.com/prod/_cbb35cab1c.jpeg)\n<center>中电金信副总裁 邵建军（左）</center>\n\n中电金信将与 PingCAP 正式成为战略合作伙伴，共同拓展金融市场。中电金信是中国电子成员企业，参与国家重大工程，依托行业场景，构建金融级数字底座，打造全栈全域解决方案，提供领先的咨询、软件产品及开发、质量安全保障及运营服务，为金融及重点行业数字化转型及安全发展提供强大动能。中电金信目前有 42,000 名员工，连续六年位列 IDC 中国银行业 IT 解决方案市场第一名。在数字化转型及 IT 架构变革背景下，中电金信在产品研发、解决方案持续投入，在新一代的分布式核心、信贷、CRM、支付、营销平台、数据中台、数据治理等领域持续发力。我们有幸与 PingCAP 在某城商行“基于云原生微服务分布式的新一代核心”项目中紧密合作。今后，我们希望与 PingCAP 一起携手并进、风雨同舟，一起把金融市场做大、做深、做强。  \n\n![中科软科技.png](https://img1.www.pingcap.com/prod/_2a547f4a00.png)\n<center>中科软高级副总裁 彭敬（左）</center>  \n\n中科软作为保险的一个 IT 龙头企业级，我们在十多年来一直稳居保险 IT 解决方案市场的第一位，近 16 年来业务的年复合增长率一直保持在 24% 左右。中科软覆盖了 98% 的保险机构客户，其中核心系统覆盖了 80% 的保险公司。随着 IFRS17 新会计准则推行，保险的财产系统、精算系统、财务系统、风险管理系统都面临着全面的升级，同时数据要素的政策背景与 IT 需求的多元化竞争也日趋激烈，中科软携手合作伙伴出台“云解决方案”，以数据治理为抓手，应对保险的产品重塑、运营模式重塑、商业模式重塑的三重挑战，进一步推动保险 IT 技术的完善与成熟。  \n\n中科软与 PingCAP 从 2019 年就开始合作，两家公司一直秉持着共同的开源理念，很快就在技术架构、技术迁移、数据架构、数据迁移层面进行了联合的研发，并和我们的客户一起努力，最终在国内的头部客户的核心系统上成功地进行了迁移上线。我们都知道金融领域的核心系统上的国产替代是最硬的骨头，尤其是数据库，它犹如给 飞行中的歼 20 换发动机，需要严密的切换和兜底方案，这并非一朝一夕的事。这几年客户、PingCAP 和中科软三方通力合作，为保险行业的核心系统数据库的国产替代提供了极具价值的最佳实践和避坑指南。下一步我们将在 HTAP 和大数据融合方向持续进行联合研发，期望以数据要素驱动业务创新。  \n\n![移动云.png](https://img1.www.pingcap.com/prod/_911c94cf24.png)\n<center>移动云云原生数据库研发负责人 薛港</center>\n\n移动云是国内发展最快、政企客户最多的一朵公有云。移动云和 PingCAP 有非常广泛且深入的合作，双方公司三年前成立了联合实验室，在联合实验室的框架里面我们在移动云上线了 TiDB 数据库服务，我们培养了大量 TiDB 的专业人才，包括运维、实施、内核的人才。过去三年里 TiDB 不仅在移动云内部支撑了我们很多核心的关键系统，也在我们移动的专业公司以及政企客户都有相关的落地案例，并取得非常好的反馈。过去几年里我们团队也积极参与 TiDB 社区的贡献和竞赛，团队的成员在社区发表多篇文章并获得年度 MVA 荣誉。移动云持续看好 TiDB 以及 TiDB 未来的发展。我们相信 TiDB 依托移动云强大的基础设施以及我们广泛的政企客户群体，未来一定能够在多个行业服务更多的用户。  \n\n![华锐技术.png](https://img1.www.pingcap.com/prod/_06dc85c067.png)\n<center>华锐分布式技术实验室主任 何志东</center>\n\n作为中国领先的分布式基础软件公司和证券、资管行业核心业务平台提供商，华锐技术首创证券行业第一家分布式技术实验室，自主研发出世界级分布式低时延消息中间件 AMI。AMI 不仅填补了国内细分领域的空白，其高可靠、高并发、高可用、低时延、集成能力等重要指标均已完成对国外同类产品的超越，实现先进替代；同时，AMI 对国产基础软硬件进行了深度适配和优化，能够让国产处理器跑出最佳性能。在机构交易领域，华锐技术是中国资本市场机构交易的第一品牌。华锐 ATP 以深厚的业务积累和领先的技术能力，服务众多国内中大型券商机构，TOP10 券商覆盖度 100%，百亿量化私募覆盖度 100%，凭借成熟的产品服务能力和完整的解决方案广受客户认可。在零售交易领域，2022 年 8 月，华锐与国泰君安共研的新一代信创分布式低延时交易平台（NGTP）正式上线，近 400 家营业部和 1600 万零售客户全部迁移至新平台，交易速度提升 30 倍，并创下多个证券行业“首家”，示范效应显著。华锐技术早在 2017 年就开始深入金融核心国产化研究，截至目前，已构建了面向证券交易和资管领域的全栈国产化解决方案，并落地多家客户案例，实现先进替代、真替真用、规模上线。PingCAP 作为华锐技术的生态合作伙伴，双方从 2021 年起开始合作，华锐的交易、风控、行情等产品均已完成与 TiDB 的深度适配。未来，华锐技术也将携手 PingCAP 等生态伙伴推出更加完善的国产化解决方案，助力证券行业实现数字化转型和金融核心自主创新。  \n\n![东软.png](https://img1.www.pingcap.com/prod/_7232266051.png)\n<center>东软医疗保障行业线技术总监 于伟</center>\n\n东软集团作为中国最重要的政府信息化保障厂商，过去两年东软和 PingCAP 一起成功地将 TiDB 分布式数据库应用于医疗保障核心交易系统中，服务于 1,100 万参保人这样的规模化场景，在交易分析场景中支撑着 4 亿人的就医与购药。未来我们期望东软和 PingCAP 一起能够共同成长、共同收获。  \n\n![甄盈业财-陈浩.jpeg](https://img1.www.pingcap.com/prod/_9d118269e0.jpeg)\n<center>甄盈业财联合创始人 & 产品事业部总经理 陈浩</center>\n\n甄盈业财聚焦于业财融合管理领域，基于多年实践孵化了统一清分结算、高效灵活计费等功能并形成了计费云、清分云等系列产品，旨在为各行业的客户提供业财一体、业财融合管理方案，加速财务数字化高效转型。我们跟 PingCAP 早在很多年前就已经相识相知，并且在实际项目中已经完成了相互认证。跟 PingCAP 的合作是历史必然的结果，因为我们的产品主要还是定位在业财衔接，每天会面临业务上万、上千万、上亿级别数据的消费、接入以及财务复杂逻辑处理，我们非常需要 PingCAP 这样的数据库解决方案合作伙伴跟我们一起服务好客户。期望接下来双方可以在资源的优势互补、市场的共同开拓、方案的深度融合上展开深入的交流合作，以更好地服务于我们的客户。  \n\n![英方软件.jpeg](https://img1.www.pingcap.com/prod/_679ee4936a.jpeg)\n<center>英方软件行业技术总监 吕玉良</center>\n\n上海英方软件成立于 2011 年，已经有十多年的发展历史，据 IDC 过去的三年的报告显示，在大中华区数据复制与保护这个专项领域里面，英方软件在国内的专业厂商里排名最靠前。英方软件很荣幸在今年年初成功登陆了科创板，我们也是国内数据复制这个专业领域第一家，目前也是唯一的一家上市公司。目前我们团队的规模在 700 人左右，整个服务体系分布在全国各地，我们也在积极拓展海外市场。未来，希望我们能跟 PingCAP 一起紧密协作，支撑好用户的业务，保障好用户的数据。  \n\n每家合作伙伴在介绍自己特色的时候，我就在想激流不光只是 PingCAP，激流是中国数以百万计的工程师，包括非常杰出的每个领域里面的领头企业、新兴企业共同完成这样一个拥抱新技术，服务好用户的过程。在这个过程中，企业服务一定是绕不开的话题。除了产品的易用性以外，非常重要的是服务的标准化以及服务的本地化。过去一年，在服务金融行业以及其他重要行业客户的过程中，我们不断地积累客户成功经验。PingCAP 是一家拥有开源基因的公司，我们把产研的支持前置作为一个非常重要的服务内容，当客户遇到问题的时候，快速定位和解决问题，这是我们一直以来的服务理念，也会一直坚持下去。  \n\n![客户成功生态.png](https://img1.www.pingcap.com/prod/_3782018e70.png)\n","author":"陈煜琦","category":5,"customUrl":"build-a-customer-success-ecosystem","fillInMethod":"writeDirectly","id":499,"summary":"在 PingCAP 用户峰会 2023 上，PingCAP 副总裁陈煜琦分享了“激流入海，PingCAP 中国业务发展策略”的演讲，介绍了 PingCAP 在技术层面的发展方向，强调了 PingCAP 服务于中国企业客户的重要性，并介绍了 PingCAP 助力客户长期业务发展的目标和方向。","tags":["PingCAP  用户峰会"],"title":"PingCAP 陈煜琦：深耕中国市场，构建客户成功生态"}}]},{"id":"Blogs_499","title":"PingCAP 陈煜琦：深耕中国市场，构建客户成功生态","tags":["PingCAP  用户峰会"],"category":{"name":"观点洞察"},"summary":"在 PingCAP 用户峰会 2023 上，PingCAP 副总裁陈煜琦分享了“激流入海，PingCAP 中国业务发展策略”的演讲，介绍了 PingCAP 在技术层面的发展方向，强调了 PingCAP 服务于中国企业客户的重要性，并介绍了 PingCAP 助力客户长期业务发展的目标和方向。","body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 副总裁陈煜琦分享了“激流入海，PingCAP 中国业务发展策略”的演讲，介绍了 PingCAP 在技术层面的发展方向，强调了 PingCAP 服务于中国企业客户的重要性，并介绍了 PingCAP 助力客户长期业务发展的目标和方向。大会上，陈煜琦与中电金信、中科软科技、移动云、华锐技术、英方软件、甄盈业财、东软等合作伙伴代表，共同发布多项战略合作与联合解决方案。以下为分享实录。\n\n今天我演讲的主题是“激流入海，PingCAP 中国业务发展策略”，这个主题包含着两层含义：一层是指技术，例如新型分布式技术、HTAP、Serverless 等，怎么能够融入到数据库的技术海洋中；另外一层更重要的是 PingCAP 作为三位码农成立的极客公司，怎么能够服务好浩如烟海的中国企业客户的需求，助力客户长期的业务发展，这是我们过去一年不断尝试，过去五年不断打磨产品的重要目标和方向。\n\n## 深入核心场景，拓宽服务广度\n\n过去十年时间中国企业级市场的发展，特别是国产化替代领域，金融行业一直是排头兵，走在了行业的最前列。过去这一年，TiDB 在国有大行实现规模化的系统上线，在股份制和城商行进入了核心系统。过去的一年和今年证券行业进入了国产化替代的高峰阶段，我们看到越来越多的业务系统正在使用 TiDB 数据库承载。TiDB 也进入了保险企业的核心系统，多家保险企业把传统数据库迁移到了 TiDB。  \n\n![深入核心场景.png](https://img1.www.pingcap.com/prod/_5ee37115ec.png)\n\n在金融行业之外，作为一款通用型数据库 TiDB 也获得了众多行业的新客户，包括制造业，运营商、消费品、公共服务、交通物流、零售等，当然还有很多的中国出海企业。TiDB 在不同的行业场景下持续打磨产品能力和服务支持，已经取得了长足的进步。  \n\n![拓宽场景广度.png](https://img1.www.pingcap.com/prod/_86a41d20cb.png)\n\nPingCAP 一直聚焦如何能够服务好中国市场的企业级客户。我们在北、上、广、深、江浙和四川专门成立了从研发到销售到售后的全链条服务体系。在全中国，有超过一万名的 PCTA 和 PCTP 数据库专家覆盖更广的区域，与区域合作伙伴提供联合的服务支持。我们引以为豪的 TiDB 开源社区已经有超过三万多名注册用户，AskTUG 上问题的互助解决率已经超过了 90%。这是 TiDB 开源软件强大的基因和能力，倪院士也提到开源是中国软件发展的重要方向。  \n\n![区域团队.png](https://img1.www.pingcap.com/prod/_dc73061e3d.png)\n\n## 构建“行业 X 区域 X 生态” 的客户成功生态  \n\n开源生态是我们的基因，也是我们的基础，在开源生态之上我们构建了非常重要的基础架构生态，包括众多的国产芯片、操作系统、中间件和软硬件厂商。为了更好地服务行业客户的数字化转型，PingCAP 在过去 1-2 年与行业科技、解决方案和工具、服务和云合作伙伴们不断深化合作，锚定行业用户的需求，提供更加丰富的解决方案。  \n\n![生态合作.png](https://img1.www.pingcap.com/prod/_ed3f1873f3.png)\n\n今天，很多 PingCAP 的合作伙伴来到峰会现场，接下来我将请出其中的一些代表跟大家做一些分享。  \n\n![中电金信.jpeg](https://img1.www.pingcap.com/prod/_cbb35cab1c.jpeg)\n<center>中电金信副总裁 邵建军（左）</center>\n\n中电金信将与 PingCAP 正式成为战略合作伙伴，共同拓展金融市场。中电金信是中国电子成员企业，参与国家重大工程，依托行业场景，构建金融级数字底座，打造全栈全域解决方案，提供领先的咨询、软件产品及开发、质量安全保障及运营服务，为金融及重点行业数字化转型及安全发展提供强大动能。中电金信目前有 42,000 名员工，连续六年位列 IDC 中国银行业 IT 解决方案市场第一名。在数字化转型及 IT 架构变革背景下，中电金信在产品研发、解决方案持续投入，在新一代的分布式核心、信贷、CRM、支付、营销平台、数据中台、数据治理等领域持续发力。我们有幸与 PingCAP 在某城商行“基于云原生微服务分布式的新一代核心”项目中紧密合作。今后，我们希望与 PingCAP 一起携手并进、风雨同舟，一起把金融市场做大、做深、做强。  \n\n![中科软科技.png](https://img1.www.pingcap.com/prod/_2a547f4a00.png)\n<center>中科软高级副总裁 彭敬（左）</center>  \n\n中科软作为保险的一个 IT 龙头企业级，我们在十多年来一直稳居保险 IT 解决方案市场的第一位，近 16 年来业务的年复合增长率一直保持在 24% 左右。中科软覆盖了 98% 的保险机构客户，其中核心系统覆盖了 80% 的保险公司。随着 IFRS17 新会计准则推行，保险的财产系统、精算系统、财务系统、风险管理系统都面临着全面的升级，同时数据要素的政策背景与 IT 需求的多元化竞争也日趋激烈，中科软携手合作伙伴出台“云解决方案”，以数据治理为抓手，应对保险的产品重塑、运营模式重塑、商业模式重塑的三重挑战，进一步推动保险 IT 技术的完善与成熟。  \n\n中科软与 PingCAP 从 2019 年就开始合作，两家公司一直秉持着共同的开源理念，很快就在技术架构、技术迁移、数据架构、数据迁移层面进行了联合的研发，并和我们的客户一起努力，最终在国内的头部客户的核心系统上成功地进行了迁移上线。我们都知道金融领域的核心系统上的国产替代是最硬的骨头，尤其是数据库，它犹如给 飞行中的歼 20 换发动机，需要严密的切换和兜底方案，这并非一朝一夕的事。这几年客户、PingCAP 和中科软三方通力合作，为保险行业的核心系统数据库的国产替代提供了极具价值的最佳实践和避坑指南。下一步我们将在 HTAP 和大数据融合方向持续进行联合研发，期望以数据要素驱动业务创新。  \n\n![移动云.png](https://img1.www.pingcap.com/prod/_911c94cf24.png)\n<center>移动云云原生数据库研发负责人 薛港</center>\n\n移动云是国内发展最快、政企客户最多的一朵公有云。移动云和 PingCAP 有非常广泛且深入的合作，双方公司三年前成立了联合实验室，在联合实验室的框架里面我们在移动云上线了 TiDB 数据库服务，我们培养了大量 TiDB 的专业人才，包括运维、实施、内核的人才。过去三年里 TiDB 不仅在移动云内部支撑了我们很多核心的关键系统，也在我们移动的专业公司以及政企客户都有相关的落地案例，并取得非常好的反馈。过去几年里我们团队也积极参与 TiDB 社区的贡献和竞赛，团队的成员在社区发表多篇文章并获得年度 MVA 荣誉。移动云持续看好 TiDB 以及 TiDB 未来的发展。我们相信 TiDB 依托移动云强大的基础设施以及我们广泛的政企客户群体，未来一定能够在多个行业服务更多的用户。  \n\n![华锐技术.png](https://img1.www.pingcap.com/prod/_06dc85c067.png)\n<center>华锐分布式技术实验室主任 何志东</center>\n\n作为中国领先的分布式基础软件公司和证券、资管行业核心业务平台提供商，华锐技术首创证券行业第一家分布式技术实验室，自主研发出世界级分布式低时延消息中间件 AMI。AMI 不仅填补了国内细分领域的空白，其高可靠、高并发、高可用、低时延、集成能力等重要指标均已完成对国外同类产品的超越，实现先进替代；同时，AMI 对国产基础软硬件进行了深度适配和优化，能够让国产处理器跑出最佳性能。在机构交易领域，华锐技术是中国资本市场机构交易的第一品牌。华锐 ATP 以深厚的业务积累和领先的技术能力，服务众多国内中大型券商机构，TOP10 券商覆盖度 100%，百亿量化私募覆盖度 100%，凭借成熟的产品服务能力和完整的解决方案广受客户认可。在零售交易领域，2022 年 8 月，华锐与国泰君安共研的新一代信创分布式低延时交易平台（NGTP）正式上线，近 400 家营业部和 1600 万零售客户全部迁移至新平台，交易速度提升 30 倍，并创下多个证券行业“首家”，示范效应显著。华锐技术早在 2017 年就开始深入金融核心国产化研究，截至目前，已构建了面向证券交易和资管领域的全栈国产化解决方案，并落地多家客户案例，实现先进替代、真替真用、规模上线。PingCAP 作为华锐技术的生态合作伙伴，双方从 2021 年起开始合作，华锐的交易、风控、行情等产品均已完成与 TiDB 的深度适配。未来，华锐技术也将携手 PingCAP 等生态伙伴推出更加完善的国产化解决方案，助力证券行业实现数字化转型和金融核心自主创新。  \n\n![东软.png](https://img1.www.pingcap.com/prod/_7232266051.png)\n<center>东软医疗保障行业线技术总监 于伟</center>\n\n东软集团作为中国最重要的政府信息化保障厂商，过去两年东软和 PingCAP 一起成功地将 TiDB 分布式数据库应用于医疗保障核心交易系统中，服务于 1,100 万参保人这样的规模化场景，在交易分析场景中支撑着 4 亿人的就医与购药。未来我们期望东软和 PingCAP 一起能够共同成长、共同收获。  \n\n![甄盈业财-陈浩.jpeg](https://img1.www.pingcap.com/prod/_9d118269e0.jpeg)\n<center>甄盈业财联合创始人 & 产品事业部总经理 陈浩</center>\n\n甄盈业财聚焦于业财融合管理领域，基于多年实践孵化了统一清分结算、高效灵活计费等功能并形成了计费云、清分云等系列产品，旨在为各行业的客户提供业财一体、业财融合管理方案，加速财务数字化高效转型。我们跟 PingCAP 早在很多年前就已经相识相知，并且在实际项目中已经完成了相互认证。跟 PingCAP 的合作是历史必然的结果，因为我们的产品主要还是定位在业财衔接，每天会面临业务上万、上千万、上亿级别数据的消费、接入以及财务复杂逻辑处理，我们非常需要 PingCAP 这样的数据库解决方案合作伙伴跟我们一起服务好客户。期望接下来双方可以在资源的优势互补、市场的共同开拓、方案的深度融合上展开深入的交流合作，以更好地服务于我们的客户。  \n\n![英方软件.jpeg](https://img1.www.pingcap.com/prod/_679ee4936a.jpeg)\n<center>英方软件行业技术总监 吕玉良</center>\n\n上海英方软件成立于 2011 年，已经有十多年的发展历史，据 IDC 过去的三年的报告显示，在大中华区数据复制与保护这个专项领域里面，英方软件在国内的专业厂商里排名最靠前。英方软件很荣幸在今年年初成功登陆了科创板，我们也是国内数据复制这个专业领域第一家，目前也是唯一的一家上市公司。目前我们团队的规模在 700 人左右，整个服务体系分布在全国各地，我们也在积极拓展海外市场。未来，希望我们能跟 PingCAP 一起紧密协作，支撑好用户的业务，保障好用户的数据。  \n\n每家合作伙伴在介绍自己特色的时候，我就在想激流不光只是 PingCAP，激流是中国数以百万计的工程师，包括非常杰出的每个领域里面的领头企业、新兴企业共同完成这样一个拥抱新技术，服务好用户的过程。在这个过程中，企业服务一定是绕不开的话题。除了产品的易用性以外，非常重要的是服务的标准化以及服务的本地化。过去一年，在服务金融行业以及其他重要行业客户的过程中，我们不断地积累客户成功经验。PingCAP 是一家拥有开源基因的公司，我们把产研的支持前置作为一个非常重要的服务内容，当客户遇到问题的时候，快速定位和解决问题，这是我们一直以来的服务理念，也会一直坚持下去。  \n\n![客户成功生态.png](https://img1.www.pingcap.com/prod/_3782018e70.png)\n","date":"2023-07-21","author":"陈煜琦","fillInMethod":"writeDirectly","customUrl":"build-a-customer-success-ecosystem","file":null,"relatedBlogs":[{"relatedBlog":{"body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，中国工程院院士倪光南亲临现场，为大会致辞。倪光南院士在致辞中表示 PingCAP 自主开源的创新模式已经在全球范围内得到广泛认可，并号召中国的企业和开发者加强知识产权保护和技术输出，提升中国开源数据库在国际市场的影响力和竞争力，在满足中国市场需求的同时，走向世界，服务全球用户。\n\n![倪光南.png](https://img1.www.pingcap.com/prod/_a0a17a0bd6.png)\n\n各位来宾，女士们、先生们\n\n大家上午好！\n\n非常荣幸受邀参加 2023 平凯星辰用户峰会。开源是科学开放精神的一种体现。开源经过近 40 年的发展历史，已经成为促进信息技术发展和技术创新的强大动力。开源代表着开放、合作和共享，它不仅是一种研发和商业模式，更是一种文化和思维方式。开源的力量可以打破传统的技术壁垒，促进知识的共享合作，加速技术的演进应用。国际上开源生态体系已经形成，越来越多的开发者加入到了开源大军当中，成为全球协同创新的中流砥柱。\n\n在开源数据库领域，中国的发展成就引人瞩目。中国企业和开发者们参与到开源数据库的研发和贡献中来，推动着中国开源数据库行业的快速崛起。我们看到了国内开源数据库项目的数量和质量都在不断提高，推出了众多优秀的开源数据库产品和解决方案。以平凯星辰为代表的开源数据库企业，一直致力于打造全球化的开源社区，其开源的数据库产品 TiDB 已经在全球范围内得到了广泛的认可和应用。他们多年来秉承开源文化理念，深耕开源创新之路，成功的探索出一条开源商业模式。在此，我也希望中国有更多的企业和开发者加入开源创新行列，加大对开源社区的投入和贡献，推出更多的高质量的中国开源创新项目，使开源在各领域取得更大的成就，推动中国从开源大国走向开源强国。\n\n今天，数据库作为核心的数据基础设施变得越发重要，我们看到了各种创新技术和产品不断涌现，大大促进了社会的数字化进程。在数据库技术的发展中，我们看到了一些重要的技术趋势，比如云原生、人工智能与数据库技术的结合等。这些数据库技术的前沿趋势和快速应用为国产化数据库生态的构建和创新的发展提供了重要的契机。为此，未来我们要注重加强数据库技术与云计算、人工智能等领域的融合，学习国际先进技术和经验，推动国产化数据库向云原生方向发展。同时，我们还要积极探索数据库技术与人工智能的深度融合，构建面向未来的智能数据处理技术。\n\n当前，发展国产化数据库具有重要的战略意义，在我国的各个领域，国产化进程正在加快推进，核心技术的自主创新能力正在全面提升。国产化数据库不仅要求技术的国产化，更要求我们构建起完整的国产化生态，包括研发、生产、销售、服务等各个环节。习近平总书记强调：“科学技术具有世界性，时代性，是人类共同的财富”。在当前新一轮科技革命和产业变革中，我们要顺应科技发展潮流，拥抱开源，与世界协同创新，要积极地参与和融入全球开源社区，共享知识，共谋发展，这既是为了获得更广泛的技术和市场资源，也是为了实现更高水平的科技自立自强。\n\n未来，我们希望中国的数据库技术与全球的技术协同发展，我们的数据库产品不仅能满足国内市场的需求，还能走向世界，服务全球的用户，为全球的协同创新贡献中国智慧，中国方案。\n\n最后，预祝峰会取得圆满成功！谢谢大家！","author":"倪光南","category":5,"customUrl":"opening-speech-from-guangnan-ni","fillInMethod":"writeDirectly","id":498,"summary":"在 PingCAP 用户峰会 2023 上，中国工程院院士倪光南亲临现场，为大会致辞。","tags":["PingCAP 用户峰会"],"title":"倪光南院士在 PingCAP 用户峰会的现场致辞"}},{"relatedBlog":{"body":"## 导读\n\n在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇分享了题为“创新涌动于先”的演讲，全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并携手用户代表发布了面向中国企业级用户的平凯数据库。以下是演讲实录全文，阅读需约 8 分钟。  \n\n过去一段时间，我拜访了全球各地的客户，聆听他们的挑战和建议，以及 PingCAP 是如何帮助他们解决挑战的。在这个过程中，我们也看到一些新的技术发展趋势。当下，AI 技术非常火，到处都是各种各样的 AI Demo，每家企业都在思考这样一个问题：**AI 到底有没有可能重塑软件行业？我的答案是——AI 这次真的要重塑整个软件行业了**。\n\n![刘奇.jpeg](https://img1.www.pingcap.com/prod/_b136706601.jpeg)\n\n## AI 重塑软件行业\n\n作为一家软件公司，我们思考的问题直接体感通常有两个：一个是代码，一个是数据。  \n\n先从代码说起，大家有没有意识到，很多人在过去一段时间不自觉地变成了程序员。今天，我们向 ChatGPT 提问题，它会给我们一个答案；向它提要求，它会给我们一个结果。比如我们可以让 ChatGPT 做总结、写文章，或者让它生成图片。大家可以回忆一下，在 AI 时代到来之前，所有这些工作都需要用程序去完成。我们需要用各种各样的辅助工具，那些东西都需要编程开发。而今天，我们没有写任何一行代码，只是提了个需求，结果就有了。以前，这需要很多程序员很长时间努力才能得到一样的结果。而现在，我们向 AI 发命令、提要求、提问题就能拿到结果，事实上就等于完成了编程工作。现在，自然语言已经成为最热门的编程语言。在过去七个月的时间里，GitHub 上新增代码中已经有超过 46% 是由 AI 生成的。如果从软件开发效率的角度看，AI 实际上已经完成差不多一半的人类工作。  \n\n再说数据，我们今年一月份发布了一个 AI 生成 SQL 的产品，叫 Chat2Query（前往 tidbcloud.com 立即注册体验），用户使用 Chat2Query 就不需要再写 SQL 了，只要用自然语言描述一下希望得到什么数据，希望做一个什么分析，SQL 便会自动生成，只要在数据库里运行一下，就能得到想要的结果，并且还能用图表化的形式自动展示出来。  \n\n![涌现中的技术世界-Data.png](https://img1.www.pingcap.com/prod/Data_007a8e1815.png)\n\n上图右侧是 PingCAP CTO 黄东旭在 GitHub 上的个人数据看板。以前要实现这样一个数据看板，需要一个前端程序员、需要一个数据分析人员写 SQL 来分析数据，还需要一个后端程序员部署服务，甚至还需要知道一点云的知识，理解如何把应用部署在云上。到了今天，这变成一件非常简单的事情，只需十分钟，一行代码都不用写。这是一次巨大的生产力提升，**AI 带来的能力让数据消费的门槛变得极低**。以前，我们必须是一个 SQL 的专家，才能分析数据。有人曾经写过一万多行的 SQL 来处理一个分析需求，这个东西不是人类能轻易掌握的。如今，这个门槛已经降到人人都有可能做到。这意味着我们只要能够连接上电脑，能和 AI 交互，能接触到数据，就可以消费数据。这个数量级可能达到 10 亿人。在接下来的几年里，由数据消费门槛降低带来的数据消费人数的增加，数据消费频次的增长，将使数据呈 10-100 倍规模的增长，这是一个远超我们预期的增速。\n\n## AI 时代，我们需要怎样的数据库技术？\n\n以上改变，将给数据库带来巨大的挑战，数据消费的门槛降到人人可用的程度，需要每个人都有一个数据库可用。早在四五年前，我和 CTO 黄东旭探讨过一个话题——如果 PingCAP 要为全世界所有开发者提供一个免费的数据库，那这个数据库的架构应该是什么样？  \n\n![涌现中的技术世界-我们需要怎样的数据库技术.png](https://img1.www.pingcap.com/prod/_bfe74f7599.png)\n\n我们希望这个数据库能够做到实时在线，随时都可以访问，随时都可以用；我们也希望它是一个开放的生态，因为我们不仅仅有存在数据库里面的数据，还有很多存在其他地方的数据，我们需要有一个生态能够和所有数据消费端做更好的对接。  \n\n后来，我们形成了一个结论，起码它应该是个云原生的架构。如果不是云原生的架构，我们就没有办法去应对各种各样弹性的需求；今天，一个用户相对容易预测，那为全球所有开发者都提供一个免费的数据库，就意味着我们会有数千万甚至数亿的用户，这个数据库怎么才能做得到？它需要很强的数据整合能力；其次，因为不同用户的需求是不一样的，数据量也不同，我们需要它有非常强的弹性扩展能力。  \n\n![向先进性要答案.png](https://img1.www.pingcap.com/prod/_51a85d6463.png)\n\n过去这两年的变化特别快，大家感知最直观的可能是宏观经济变化很快，其实除此之外，AI 技术的进步速度也非常快。从 ChatGPT 在去年 11 月底推出，到今天才过去短短八个月的时间。这八个月中已经创造了无数新的纪录，包括一个新的项目在 GitHub 上面获得 Star 的数据、ChatGPT 用户增长的速度等等。  \n\n大家在面对大量新技术的时候，都做出了最直观的选择，那就是拥抱先进性。过去一段时间我在与美国、日本的客户交流时，最直接的感受是每个人都在讨论两个方向，一个是成本，另一个是效率。在当前经济环境下，这几乎成了所有人的共同选择。\n\n## 客户的关注点就是 TiDB 的焦点  \n\n如果仔细观察 TiDB 发展的轨迹，你就会发现用户对数据库的关注点，其实和 TiDB 实际解决的问题是高度一致的。TiDB 在稳定性、性能、高可用性、易用性、工具生态的提升等方面付出了巨大努力。但我们认为这件事光努力还不够，我们还需要有一个非常好的演进策略以及分层的架构设计。  \n\n![TiDB 的设计与演进策略.png](https://img1.www.pingcap.com/prod/Ti_DB_b4992a11c0.png)\n\n在内部，我们有一个说法叫做 API First，各个模块之间优先设计 API（接下来我们也会推出更多基于 Open API 规范的 API 测试），有了 API 之后系统就很容易被其他各种各样的业务系统集成。举个例子，各大型用户基于 TiDB 都有自己公司内部的运维平台，通过我们提供的 API 能更好地融合到客户内部的平台里。在日本我和一个客户交流的时候，对方专门提到过这一点。过去他们需要花几天时间才能完成新版本的集成，但有 API 之后只要花几分钟就能做到。  \n\nTiDB 整个系统除了模块化的切分，也做了很好的纵向切割，从上到下分成三层。比如 Chat2Query 在最上面一层，这层会更关注整个系统的交互性、易用性，如何让系统更加自动化、更加智能；在 SQL 层主要关注如何提升它的稳定性，让它变得更加智能。比如 TiDB 的优化器如何更智能地选择，到底使用行存还是列存，还是让行列同时使用；最下面是内核层，所有人对此的关注点都一样，就是高可用、高性能。  \n\n![TiDB 存储引擎持续提升.png](https://img1.www.pingcap.com/prod/Ti_DB_2684b39c37.png)\n\n在内核层，TiDB 的存储引擎使用了一个持续升级的策略——部署一代、研发一代、预研一代。今天我们听到的所有关于 TiDB 的讨论，其实都是基于部署一代的体感，不少用户还使用着 TiDB 3.0、4.0，而这已经是四五年前的版本了。当然我们也希望用户能更快升级到最新版本，享受到新版本带来的优势，每一个新版本都会带来巨大的性能和稳定性提升。7.0 版本发布的实验特性 Partitioned Raft KV 就带来了巨大的性能提升。前面预测未来几年数据会扩大 10 倍，部分领域会扩大 100 倍，在如此大的数据规模下面我们的数据库能力是不是也能同步扩大 10 倍、100 倍？这是 Partitioned Raft KV 解决的问题。我们预研一代的存储引擎 Cloud Storage Engine 已经在后面要提到的 TiDB Serverless 中应用，我们的 CTO 黄东旭在后面的演讲和 Blog 中都有详细的解读。  \n\n如果大家留心就会注意到，过去一年时间里 TiDB 的 Online DDL 的速度提升了 10 倍。设想一下，我们有一个 100TB 的表，加一个索引要多久？对系统资源的消耗又是什么样的？除了 DDL，还有一点是 TiDB 的扩缩容的速度在这个引擎里面提升了 5 倍，这也意味着数据丢失的风险降低 5 倍，业务中断的风险降低 5 倍。\n\n## 平替还是跃迁？TiDB 产品家族的协同演进\n\n经过多年发展，TiDB 目前已经拥有三大产品家族：一是面向企业级市场的 TiDB 企业版，服务于企业级关键业务场景；二是全托管的 TiDB Cloud，提供云端一栈式 HTAP 数据库服务，已经成为欧洲、北美、日本、亚太地区众多数字原生企业的选择；三是刚刚正式商用的 TiDB Cloud Serverless，一个 AI Ready 的数据库，以极简架构、极致体验和超低门槛为云上开发者、创业公司提供低至零成本的选择，较 TiDB 社区版和 MySQL RDS 更具成本优势。  \n\n![TiDB 产品家族协同演进.png](https://img1.www.pingcap.com/prod/Ti_DB_9c9ef534c9.png)\n\nTiDB 是如何在多个版本间协同演进的？从上图可以看出，最上面有一个 TiDB 的 Open Core，TiDB 的所有这些版本都是基于共同的 Root 生长出来，去适应不同的客户和不同的使用场景。  \n\n![TiDB 企业版.png](https://img1.www.pingcap.com/prod/Ti_DB_35ca97f365.png)\n\nTiDB 企业版已经拥有很多大行、大型企业的使用经验，他们有些是从数据库一体机迁移过来的，在迁移过程中和 TiDB 一起积累了大量的迁移经验。最近 MySQL 5.7 马上就要结束产品生命周期（End of Life）了，用户应该怎么办？换一个数据库平替一下？我们的思路不一样，我们希望的是用户不仅仅是从 MySQL5.7 迁移到 TiDB，更要关注的是他迁移过来之后的获得的价值到底是什么。  \n\n我们希望 TiDB 提供的价值是“可持续、可扩展、可整合”。很多企业都有大量的 MySQL 5.7 ，有成百上千个 instance，管理和维护它们都是非常复杂的事情。TiDB 提供了资源共享的多租户能力，我们可以把更多的 MySQL 实例整合到一个或者多个 TiDB 集群，极大提升资源利用率，从而降低硬件成本，同步降低管理集群的成本。最近我们和一个客户交流，他们有很多 MySQL 实例，有的利用率不高，就直接降级，从原来的 8C 配置，直接降成 4C 或 2C 配置。过了一段时间，业务这边有个流量把系统卡死了，再给升级一下。过一段时间流量又下来了，再降级。这就很头疼，运维和开发的关系就很难处，降本增效的压力很大。这么多的 MySQL instance 一旦迁到 TiDB 上面，基于 TiDB 本身的资源共享能力，流量超了几倍都没问题，这就可以带来非常显著的降本增效。  \n\n![TiDB Cloud.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_b963ef4870.png)\n\n接下来是 TiDB Cloud，它在过去几年里得到了全球客户的认可，包括欧洲最大的移动出行公司 Bolt，北美新锐的 SaaS 公司 Catalyst，印度最大的电商 Flipkart，日本著名的游戏公司 CAPCOM 等等。  \n\n![TiDB Serverless GA.png](https://img1.www.pingcap.com/prod/Ti_DB_Serverless_GA_812a8f8373.png)\n\n最后是 TiDB Serverless。四年前，我亲手写下第一行源代码，探索新一代云上 Serverless 架构，这是预研一代的成果。非常幸运，预研一代的速度远远超出我们的预期，它现在已经正式商用了。过去几个月的时间里，TiDB Serverless beta 版已经拥有超过 1 万个活跃的集群。  \n\nServerless 带来了什么样的价值和能力呢？第一，低成本零元起步。TiDB Serverless 完成了 PingCAP 的一个梦想，我们有能力为全球每一个开发者提供一个免费的数据库。  \n\n我想稍微分享一个内部的小故事，最早 TiDB Cloud 的 free tier 成本是现在的 100 多倍。我们内部有个笑话，自己总是调侃说我们是“贵司”。“贵司”是什么意思呢？TiDB “贵”。因为比较的对象是 MySQL，作为一个分布式系统，TiDB 跟一般的系统比成本肯定高，起步就三个副本，还有计算层、调度层，跟单机比肯定是贵了。很幸运的是， TiDB Serverless 出来之后“贵司”终于不“贵”了。得益于 TiDB Serverless 采用的完全分离式的架构，不仅仅做到了存算分离，我们还做到了算算分离、存存分离，整个系统的弹性非常强，同时它的使用异常简单，用户体验非常好。我们收到大量用户的赞誉，超出了自己的预期。  \n\n大家都希望把自己的时间精力投资在自己的创新上面，投资在自己的业务上面，尽量不想再花时间在数据库上面，将所有复杂的事情都交给系统，交给 PingCAP 完全自动化处理。过去，大家可能会很好奇，这听起来好得有点过了，能做到吗？凭什么？  \n\n## TiDB Serverless 为什么比社区版更便宜？\n\n今天我们在云上面使用数据库或者使用传统的 RDS，不管是什么数据库，本质上都是买一个虚拟机，按照最高的峰值要求配置，不管你的业务现在跑的是什么量，哪怕 CPU 利用率是 1%，你也必须为它的 100% 利用率付费。这就是一个传统的计费模式，永远为最高的峰值付费。  \n\nTiDB Serverless 的创新在于，你永远只为你正在使用的资源付费。举个例子，你现在假设有 10 TB 的数据跑在 TiDB Serverless 上面，你没有任何访问，那所有的计算节点全部会被自动 shutdown，但你可以在百毫秒的时间内就马上让它启动提供服务。这是一个巨大的进步，用户仅仅为使用付费，使用曲线长什么样，TiDB 的计费就会长什么样。这就是为什么 TiDB Serverless 能够做到比现在的 RDS，比云上面部署社区版还要便宜，只要这个 CPU 的利用率低于 20%，全自动的弹性就会带来巨大的成本优势。  \n\n![经典数据库的跃迁路径.png](https://img1.www.pingcap.com/prod/_fdbb5572bc.png)\n\n今天，不管你使用的是经典的单机数据库、开源数据库还是云端的数据库，TiDB 都提供了成本更低，扩展性更强，更加省心的选择。  \n\n## 面向中国企业级用户，发布平凯数据库  \n\nTiDB 源于中国，很多关键特性也来自于中国复杂的用户场景，毫无疑问中国市场就是 TiDB 的根据地和大本营。最近我们和很多中国用户沟通交流，他们给了我们非常多的反馈，很多反馈都非常有价值，特别是对于 TiDB 未来发展的预期和展望。我们发现，TiDB 企业版经过五年的打磨，更多是面向全球用户提供通用性的功能，但是这些功能对于中国企业级用户来说还远远不够。  \n\n当下，随着 TiDB 逐步进入中国用户的核心场景以及 TiDB 规模化进入国产化生态，面向中国企业级用户的“平凯数据库”正式发布了。  \n\n![平凯数据库发布.jpeg](https://img1.www.pingcap.com/prod/_463e302b96.jpeg)\n\n简单来说，平凯数据库主要包含 TiDB Open Core 的稳定内核以及满足中国企业用户的增强级企业功能。第一，提供国产化需求的企业级功能，包括图形化管控平台、全链路数据迁移平台、安全特性等等；第二，提供更完善的国产化生态系统的接入功能，包括国产软硬件的适配，比如操作系统、服务器等等；第三，提供更完善的国产化企业级服务支持能力。  \n\n未来，我们希望平凯数据库站在 TiDB LTS（长期支持版）的基础上能为中国的客户带来更好的价值，我们希望这个过程是开放的，会定期在国内各个区域组织用户讨论交流的活动，我们希望大家能一起参与到未来平凯数据库的建设中来。","author":"刘奇","category":5,"customUrl":"always-ahead-by-max-liu","fillInMethod":"writeDirectly","id":496,"summary":"在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并发布了面向中国企业级用户的平凯数据库。","tags":["PingCAP 用户峰会"],"title":"刘奇：经典数据库亟需跃迁，TiDB 不是“平替”"}},{"relatedBlog":{"body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩，共同带来了“携手中国用户，打造世界级产品”主题分享。分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。以下为分享实录。\n\n## 携手中国用户，打造世界级产品  \n\n![唐刘.jpeg](https://img1.www.pingcap.com/prod/_d2b6c87028.jpeg)\n<center>PingCAP 研发副总裁 唐刘</center>\n\n我是 PingCAP 唐刘，负责 TiDB 的产研工作。首先请容我对在座的各位以及在线收看直播的用户报以最诚挚的敬意，因为有你们八年多不断的坚持、陪伴和信任，才有了我们现在源源不断的动力去打磨、去不断完善我们的产品，给客户带来更大的价值。  \n\n我们先来探讨一个话题，为什么中国企业以及中国的用户对 PingCAP 非常重要？从 TiDB 诞生的第一天起我们就致力于解决企业用户在规模化负载下的稳定性和性能问题。熟悉 TiDB 的用户应该都知道，我们最开始就是解决的 是 MySQL 分库分表的问题。经过八年多的发展，在各行各业无论衣食住行，还是金融保险都有了 TiDB 的身影。鉴于中国这样庞大的用户基数，大家可以想象这些规模化场景对整个数据库的稳定性和性能都提出了世界级的挑战。毫不夸张地说，如果我们能满足中国用户这些天花板级别的要求，我们就非常有信心地将产品推广到全世界，让全世界的用户享受到 TiDB 带给他们的价值。所以，中国对我们来说非常重要。  \n\n![中国企业用户.png](https://img1.www.pingcap.com/prod/_2a5350b5fe.png)\n\n过去一年，PingCAP 投入了大量资源去解决 TiDB 在规模化场景下的稳定性和性能问题，也取得了不小的成果。首先在国内的某头部大行，通过我们的跑批优化，在该行的反洗钱业务、客户详单查询业务跑批场景上有 2-3 倍的性能提升。在国内某头部城商行，我们通过悲观事务的优化，在他们的互联网核心交易场景，实现了延迟降低 4 倍，7*24 小时延迟抖动控制在 2% 以内的目标。在国内某互联网零售企业，我们通过多业务整合和资源管控的方式，不仅使得用户节省了成本，同时也让业务的整体延迟下降了将近 50%。这些是我们在过去一年中取得成绩的一部分，非常感谢这些用户对我们的选择和信任。  \n\n![集群稳定性案例.png](https://img1.www.pingcap.com/prod/_54cf2d40ba.png)\n\n当然不限于此，TiDB 的产品核心能力也有很多方面的重要提升。首先，在线 DDL 的性能提升了 10 倍。对于老版本中用户关注的 OOM 问题，经过我们一年多的努力，TiDB 最新的版本中的 OOM 较之前的版本下降了 99%，实现了质的飞跃。目前，TiDB 已经能做到单表 50TB 数据的小时级别导入，让用户非常顺滑、快速地将大批数据导入到 TiDB，满足用户对极致的 RPO 和 RTO 的述求，数据同步输出的延时也降低至了秒级。这些性能提升大家可以在最新的 TiDB 7.1 LTS 版本中享受到。未来，我们在后续的 TiDB 7.X 版本中，将继续致力于稳定性与性能的提升。  \n\n![性能提升.png](https://img1.www.pingcap.com/prod/_74c4ee9454.png)\n\n下面我给大家简单介绍 TiDB 7.X 版本中的三个重要新特性。  \n\n第一个特性是 Partitioned Raft KV，它带来的用户价值非常显著。我们能让用户相比之前用更少的机器，挂更大的盘，存更多的数据，还能提供更好的性能。在当前数据规模不断膨胀和多变的经济环境下，对用户来说这是一个非常具有吸引力的特性。使用 Partitioned Raft KV 这个特性之后，TiDB 无论是在性能还是在成本上面相比之前都有了质的飞跃，希望大家尽快使用 TiDB 的最新版本来体验这个功能。  \n\n![Partitioned Raft KV.png](https://img1.www.pingcap.com/prod/Partitioned_Raft_KV_a25b3b8a80.png)\n\n第二个重要新特性就是资源管控（Resource Control），之前有很多用户反馈在使用和维护多套 MySQL 集群上面精疲力尽，将多套 MySQL 集群归集到一个 TiDB 里面又担心跑在数据库里面的业务相互影响。TiDB 7.1 LTS 版本已经提供了一个非常好的解决方案，就是通过 Resource Control 让用户非常方便地将多个 MySQL 实例汇聚到一个 TiDB 集群里面，一方面能够极大降低用户对于多套 MySQL 集群的运维成本，降低了运维复杂度，另一方面通过多合一的业务汇聚能够帮助用户节省成本。在实际的用户场景中，我们发现使用多合一的汇聚能帮用户节省 40% 左右的成本，在当前经济环境的压力下和降本增效的背景下，基于 TiDB 资源管控的数据库整合方案无疑是理想的选择。  \n\n![Resource control.png](https://img1.www.pingcap.com/prod/Resource_control_386c27b3e6.png)\n\n第三个重要特性就是在线 DDL。在今天敏捷迭代的商业环境中，数据库需要跑得更快，但是我们不可能一开始就设计出一个完美的表结构。随着业务不断地快速变化，我们势必会对原始设计的表结构进行频繁的变更。运维过 MySQL 的同学应该都知道，当 MySQL 的集群规模非常大的时候（或者一些传统数据库集群规模非常大的时候），如果你要做一个 DDL 变更，这是多么痛苦的一件事情，不仅耗时会非常长，而且可能会造成停机维护、业务中断，甚至造成业务损失。然而，这一切在 TiDB 里面都不是问题，我们从第一天就支持了在线 DDL。在 TiDB 新版本中，在线 DDL 的性能提升了 10 倍，意味着你可以比竞争对手更快地进行表结构的变更，更敏捷地支撑业务迭代，以更快的速度在竞争中胜出。  \n![Online DDL.png](https://img1.www.pingcap.com/prod/Online_DDL_00e63b757a.png)\n\n后续的 TiDB 7.X 版本中将会推出 DDL 并行执行框架。如果你想要 DDL 执行得更快，只需要不断地添加节点，就能够实现性能的水平扩展，可以在 10 倍提升的基础上再乘以 N 个框架并行。这套框架不仅会用于当前的 DDL 处理，未来 TiDB 大批量的数据导入、大规模的数据统一分析、甚至一些重型查询的并行执行，我们都会通过这套框架进行统一的收敛。未来，我们希望通过这套并行框架给用户提供一套极致的性能体验。  \n\n![DDL 并行执行框架.png](https://img1.www.pingcap.com/prod/DDL_501ec7104a.png)\n\n这一系列新特性将会在 TiDB 7.5 LTS 中和大家见面。TiDB 7.5 版本将会提供更强大的资源管控能力，Partitioned Raft KV 将正式 GA，TiDB 也将全面兼容 MySQL 8.0。大家知道 MySQL 5.7 将在今年 10 月 End of Life，PingCAP 承诺我们会持续拥抱 MySQL 生态，不断地兼容 MySQL 5.7 和 MySQL 8.0，同时会带来顺畅的迁移体验，方便用户把数据库从 MySQL 迁移到 TiDB，实现无缝地迁移和使用。  \n\n![TiDB 7.5 重要功能.png](https://img1.www.pingcap.com/prod/Ti_DB_7_5_6b9ead8e9b.png)\n\n从第一天开始 TiDB 就致力于成为一款全球化的数据库，从第一天开始我们坚信中国用户一直是 TiDB 持续创新的核心发动机。据我们内部统计，TiDB 新版本中有 50% 的功能需求来自中国用户，TiDB 70% 的外部贡献者来自于中国，有 30,000 多名中国的 AskTUG 用户在体验产品并给出反馈。今年，我们启动了用户之声活动，来到各个区域倾听用户的声音，希望通过我们的努力携手中国用户打造一款世界级的数据库产品。  \n\n![用户之声.png](https://img1.www.pingcap.com/prod/_16a46aa063.png)\n\n## 平凯数据库，为中国企业用户需求量身定制  \n\n![丁岩.jpeg](https://img1.www.pingcap.com/prod/_ed03f98212.jpeg)\n<center>PingCAP 首席科学家 丁岩</center>\n\n我是平凯数据库的研发负责人丁岩。刚才唐刘介绍了很多 TiDB 的内核新特性，非常惊艳。对于中国企业用户来讲还有一个惊喜，一个专属的福利就是平凯数据库，我来介绍一下平凯数据库的发版策略和产品路线图。  \n\n我们锚定 TiDB 在每个 LTS 版本发布之后三个月左右，随着增强型企业级功能一起发布平凯数据库的新版本，节奏是每半年发布一个版本。平凯数据库是中国企业用户专属的一个福利，它有哪些吸引人的特性？  \n\n前面研究院付平老师介绍过，中国正在加速制定数据库的标准规范，涵盖方方面面。平凯数据库定位于全面地遵守国标、行标，兼容国产化生态，在安全合规方面让用户用得放心、用得安全。我们有很多大客户，例如国有大行的 TiDB 集群已经达到上百个，服务器达到上千台的规模，这个时候管理和运维就成为一个难题。平凯数据库适时地推出可视化管控平台（TEM），轻松管理上千台服务器、上百个 TiDB 集群，为用户节省管理运维的成本，提升管理效率。  \n\n![平凯数据库发版路线图.png](https://img1.www.pingcap.com/prod/_fc4539f0ac.png)\n\n中国市场上很多客户正在计划或者已经在把 Oracle 上的业务迁移到 TiDB，这个时候迁移成本包括迁移过程中的风险在所难免，我们也急客户所需，想客户所想，推出了全链路数据迁移平台（TMS），从数据库的对象，到 SQL 的兼容分析，到迁移前后 SQL 执行性能的对比，再到存量数据的迁移，提供一套全流程的迁移工具和解决方案，降低客户的迁移成本和迁移风险。此外，平凯数据库还提供存储过程的兼容，存储级的备份恢复，高级安全功能等。平凯数据库 7.1 版本将在今年 8 月底正式 GA。  \n\n![平凯数据库 7.1.png](https://img1.www.pingcap.com/prod/7_1_eb1e765d31.png)\n\n半年之后，我们将发布平凯数据库 7.5 版本。7.5 版本将在符合国标、行标最新的规范标准，在安全方面持续发力。在生态方面，TEM 支持 K8s 集群的管理；大数据生态兼容方面，7.5 版本支持 ORC 格式数据的导入；自动化部署支持 IPv6。7.5 版本将持续提升存储过程的执行效率。我们收到的中国企业用户的迫切需求，都会在后续版本中做规划和交付，更多惊艳的企业级新特性正在路上，敬请期待。  \n\n![平凯数据库未来规划.png](https://img1.www.pingcap.com/prod/_cd43406097.png)\n\n","author":"唐刘 丁岩","category":5,"customUrl":"build-world-class-products","fillInMethod":"writeDirectly","id":497,"summary":"PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。","tags":["PingCAP 用户峰会"],"title":"PingCAP 唐刘：携手中国用户，打造世界级产品"}}]},{"id":"Blogs_498","title":"倪光南院士在 PingCAP 用户峰会的现场致辞","tags":["PingCAP 用户峰会"],"category":{"name":"观点洞察"},"summary":"在 PingCAP 用户峰会 2023 上，中国工程院院士倪光南亲临现场，为大会致辞。","body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，中国工程院院士倪光南亲临现场，为大会致辞。倪光南院士在致辞中表示 PingCAP 自主开源的创新模式已经在全球范围内得到广泛认可，并号召中国的企业和开发者加强知识产权保护和技术输出，提升中国开源数据库在国际市场的影响力和竞争力，在满足中国市场需求的同时，走向世界，服务全球用户。\n\n![倪光南.png](https://img1.www.pingcap.com/prod/_a0a17a0bd6.png)\n\n各位来宾，女士们、先生们\n\n大家上午好！\n\n非常荣幸受邀参加 2023 平凯星辰用户峰会。开源是科学开放精神的一种体现。开源经过近 40 年的发展历史，已经成为促进信息技术发展和技术创新的强大动力。开源代表着开放、合作和共享，它不仅是一种研发和商业模式，更是一种文化和思维方式。开源的力量可以打破传统的技术壁垒，促进知识的共享合作，加速技术的演进应用。国际上开源生态体系已经形成，越来越多的开发者加入到了开源大军当中，成为全球协同创新的中流砥柱。\n\n在开源数据库领域，中国的发展成就引人瞩目。中国企业和开发者们参与到开源数据库的研发和贡献中来，推动着中国开源数据库行业的快速崛起。我们看到了国内开源数据库项目的数量和质量都在不断提高，推出了众多优秀的开源数据库产品和解决方案。以平凯星辰为代表的开源数据库企业，一直致力于打造全球化的开源社区，其开源的数据库产品 TiDB 已经在全球范围内得到了广泛的认可和应用。他们多年来秉承开源文化理念，深耕开源创新之路，成功的探索出一条开源商业模式。在此，我也希望中国有更多的企业和开发者加入开源创新行列，加大对开源社区的投入和贡献，推出更多的高质量的中国开源创新项目，使开源在各领域取得更大的成就，推动中国从开源大国走向开源强国。\n\n今天，数据库作为核心的数据基础设施变得越发重要，我们看到了各种创新技术和产品不断涌现，大大促进了社会的数字化进程。在数据库技术的发展中，我们看到了一些重要的技术趋势，比如云原生、人工智能与数据库技术的结合等。这些数据库技术的前沿趋势和快速应用为国产化数据库生态的构建和创新的发展提供了重要的契机。为此，未来我们要注重加强数据库技术与云计算、人工智能等领域的融合，学习国际先进技术和经验，推动国产化数据库向云原生方向发展。同时，我们还要积极探索数据库技术与人工智能的深度融合，构建面向未来的智能数据处理技术。\n\n当前，发展国产化数据库具有重要的战略意义，在我国的各个领域，国产化进程正在加快推进，核心技术的自主创新能力正在全面提升。国产化数据库不仅要求技术的国产化，更要求我们构建起完整的国产化生态，包括研发、生产、销售、服务等各个环节。习近平总书记强调：“科学技术具有世界性，时代性，是人类共同的财富”。在当前新一轮科技革命和产业变革中，我们要顺应科技发展潮流，拥抱开源，与世界协同创新，要积极地参与和融入全球开源社区，共享知识，共谋发展，这既是为了获得更广泛的技术和市场资源，也是为了实现更高水平的科技自立自强。\n\n未来，我们希望中国的数据库技术与全球的技术协同发展，我们的数据库产品不仅能满足国内市场的需求，还能走向世界，服务全球的用户，为全球的协同创新贡献中国智慧，中国方案。\n\n最后，预祝峰会取得圆满成功！谢谢大家！","date":"2023-07-20","author":"倪光南","fillInMethod":"writeDirectly","customUrl":"opening-speech-from-guangnan-ni","file":null,"relatedBlogs":[{"relatedBlog":{"body":"## 导读\n\n在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇分享了题为“创新涌动于先”的演讲，全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并携手用户代表发布了面向中国企业级用户的平凯数据库。以下是演讲实录全文，阅读需约 8 分钟。  \n\n过去一段时间，我拜访了全球各地的客户，聆听他们的挑战和建议，以及 PingCAP 是如何帮助他们解决挑战的。在这个过程中，我们也看到一些新的技术发展趋势。当下，AI 技术非常火，到处都是各种各样的 AI Demo，每家企业都在思考这样一个问题：**AI 到底有没有可能重塑软件行业？我的答案是——AI 这次真的要重塑整个软件行业了**。\n\n![刘奇.jpeg](https://img1.www.pingcap.com/prod/_b136706601.jpeg)\n\n## AI 重塑软件行业\n\n作为一家软件公司，我们思考的问题直接体感通常有两个：一个是代码，一个是数据。  \n\n先从代码说起，大家有没有意识到，很多人在过去一段时间不自觉地变成了程序员。今天，我们向 ChatGPT 提问题，它会给我们一个答案；向它提要求，它会给我们一个结果。比如我们可以让 ChatGPT 做总结、写文章，或者让它生成图片。大家可以回忆一下，在 AI 时代到来之前，所有这些工作都需要用程序去完成。我们需要用各种各样的辅助工具，那些东西都需要编程开发。而今天，我们没有写任何一行代码，只是提了个需求，结果就有了。以前，这需要很多程序员很长时间努力才能得到一样的结果。而现在，我们向 AI 发命令、提要求、提问题就能拿到结果，事实上就等于完成了编程工作。现在，自然语言已经成为最热门的编程语言。在过去七个月的时间里，GitHub 上新增代码中已经有超过 46% 是由 AI 生成的。如果从软件开发效率的角度看，AI 实际上已经完成差不多一半的人类工作。  \n\n再说数据，我们今年一月份发布了一个 AI 生成 SQL 的产品，叫 Chat2Query（前往 tidbcloud.com 立即注册体验），用户使用 Chat2Query 就不需要再写 SQL 了，只要用自然语言描述一下希望得到什么数据，希望做一个什么分析，SQL 便会自动生成，只要在数据库里运行一下，就能得到想要的结果，并且还能用图表化的形式自动展示出来。  \n\n![涌现中的技术世界-Data.png](https://img1.www.pingcap.com/prod/Data_007a8e1815.png)\n\n上图右侧是 PingCAP CTO 黄东旭在 GitHub 上的个人数据看板。以前要实现这样一个数据看板，需要一个前端程序员、需要一个数据分析人员写 SQL 来分析数据，还需要一个后端程序员部署服务，甚至还需要知道一点云的知识，理解如何把应用部署在云上。到了今天，这变成一件非常简单的事情，只需十分钟，一行代码都不用写。这是一次巨大的生产力提升，**AI 带来的能力让数据消费的门槛变得极低**。以前，我们必须是一个 SQL 的专家，才能分析数据。有人曾经写过一万多行的 SQL 来处理一个分析需求，这个东西不是人类能轻易掌握的。如今，这个门槛已经降到人人都有可能做到。这意味着我们只要能够连接上电脑，能和 AI 交互，能接触到数据，就可以消费数据。这个数量级可能达到 10 亿人。在接下来的几年里，由数据消费门槛降低带来的数据消费人数的增加，数据消费频次的增长，将使数据呈 10-100 倍规模的增长，这是一个远超我们预期的增速。\n\n## AI 时代，我们需要怎样的数据库技术？\n\n以上改变，将给数据库带来巨大的挑战，数据消费的门槛降到人人可用的程度，需要每个人都有一个数据库可用。早在四五年前，我和 CTO 黄东旭探讨过一个话题——如果 PingCAP 要为全世界所有开发者提供一个免费的数据库，那这个数据库的架构应该是什么样？  \n\n![涌现中的技术世界-我们需要怎样的数据库技术.png](https://img1.www.pingcap.com/prod/_bfe74f7599.png)\n\n我们希望这个数据库能够做到实时在线，随时都可以访问，随时都可以用；我们也希望它是一个开放的生态，因为我们不仅仅有存在数据库里面的数据，还有很多存在其他地方的数据，我们需要有一个生态能够和所有数据消费端做更好的对接。  \n\n后来，我们形成了一个结论，起码它应该是个云原生的架构。如果不是云原生的架构，我们就没有办法去应对各种各样弹性的需求；今天，一个用户相对容易预测，那为全球所有开发者都提供一个免费的数据库，就意味着我们会有数千万甚至数亿的用户，这个数据库怎么才能做得到？它需要很强的数据整合能力；其次，因为不同用户的需求是不一样的，数据量也不同，我们需要它有非常强的弹性扩展能力。  \n\n![向先进性要答案.png](https://img1.www.pingcap.com/prod/_51a85d6463.png)\n\n过去这两年的变化特别快，大家感知最直观的可能是宏观经济变化很快，其实除此之外，AI 技术的进步速度也非常快。从 ChatGPT 在去年 11 月底推出，到今天才过去短短八个月的时间。这八个月中已经创造了无数新的纪录，包括一个新的项目在 GitHub 上面获得 Star 的数据、ChatGPT 用户增长的速度等等。  \n\n大家在面对大量新技术的时候，都做出了最直观的选择，那就是拥抱先进性。过去一段时间我在与美国、日本的客户交流时，最直接的感受是每个人都在讨论两个方向，一个是成本，另一个是效率。在当前经济环境下，这几乎成了所有人的共同选择。\n\n## 客户的关注点就是 TiDB 的焦点  \n\n如果仔细观察 TiDB 发展的轨迹，你就会发现用户对数据库的关注点，其实和 TiDB 实际解决的问题是高度一致的。TiDB 在稳定性、性能、高可用性、易用性、工具生态的提升等方面付出了巨大努力。但我们认为这件事光努力还不够，我们还需要有一个非常好的演进策略以及分层的架构设计。  \n\n![TiDB 的设计与演进策略.png](https://img1.www.pingcap.com/prod/Ti_DB_b4992a11c0.png)\n\n在内部，我们有一个说法叫做 API First，各个模块之间优先设计 API（接下来我们也会推出更多基于 Open API 规范的 API 测试），有了 API 之后系统就很容易被其他各种各样的业务系统集成。举个例子，各大型用户基于 TiDB 都有自己公司内部的运维平台，通过我们提供的 API 能更好地融合到客户内部的平台里。在日本我和一个客户交流的时候，对方专门提到过这一点。过去他们需要花几天时间才能完成新版本的集成，但有 API 之后只要花几分钟就能做到。  \n\nTiDB 整个系统除了模块化的切分，也做了很好的纵向切割，从上到下分成三层。比如 Chat2Query 在最上面一层，这层会更关注整个系统的交互性、易用性，如何让系统更加自动化、更加智能；在 SQL 层主要关注如何提升它的稳定性，让它变得更加智能。比如 TiDB 的优化器如何更智能地选择，到底使用行存还是列存，还是让行列同时使用；最下面是内核层，所有人对此的关注点都一样，就是高可用、高性能。  \n\n![TiDB 存储引擎持续提升.png](https://img1.www.pingcap.com/prod/Ti_DB_2684b39c37.png)\n\n在内核层，TiDB 的存储引擎使用了一个持续升级的策略——部署一代、研发一代、预研一代。今天我们听到的所有关于 TiDB 的讨论，其实都是基于部署一代的体感，不少用户还使用着 TiDB 3.0、4.0，而这已经是四五年前的版本了。当然我们也希望用户能更快升级到最新版本，享受到新版本带来的优势，每一个新版本都会带来巨大的性能和稳定性提升。7.0 版本发布的实验特性 Partitioned Raft KV 就带来了巨大的性能提升。前面预测未来几年数据会扩大 10 倍，部分领域会扩大 100 倍，在如此大的数据规模下面我们的数据库能力是不是也能同步扩大 10 倍、100 倍？这是 Partitioned Raft KV 解决的问题。我们预研一代的存储引擎 Cloud Storage Engine 已经在后面要提到的 TiDB Serverless 中应用，我们的 CTO 黄东旭在后面的演讲和 Blog 中都有详细的解读。  \n\n如果大家留心就会注意到，过去一年时间里 TiDB 的 Online DDL 的速度提升了 10 倍。设想一下，我们有一个 100TB 的表，加一个索引要多久？对系统资源的消耗又是什么样的？除了 DDL，还有一点是 TiDB 的扩缩容的速度在这个引擎里面提升了 5 倍，这也意味着数据丢失的风险降低 5 倍，业务中断的风险降低 5 倍。\n\n## 平替还是跃迁？TiDB 产品家族的协同演进\n\n经过多年发展，TiDB 目前已经拥有三大产品家族：一是面向企业级市场的 TiDB 企业版，服务于企业级关键业务场景；二是全托管的 TiDB Cloud，提供云端一栈式 HTAP 数据库服务，已经成为欧洲、北美、日本、亚太地区众多数字原生企业的选择；三是刚刚正式商用的 TiDB Cloud Serverless，一个 AI Ready 的数据库，以极简架构、极致体验和超低门槛为云上开发者、创业公司提供低至零成本的选择，较 TiDB 社区版和 MySQL RDS 更具成本优势。  \n\n![TiDB 产品家族协同演进.png](https://img1.www.pingcap.com/prod/Ti_DB_9c9ef534c9.png)\n\nTiDB 是如何在多个版本间协同演进的？从上图可以看出，最上面有一个 TiDB 的 Open Core，TiDB 的所有这些版本都是基于共同的 Root 生长出来，去适应不同的客户和不同的使用场景。  \n\n![TiDB 企业版.png](https://img1.www.pingcap.com/prod/Ti_DB_35ca97f365.png)\n\nTiDB 企业版已经拥有很多大行、大型企业的使用经验，他们有些是从数据库一体机迁移过来的，在迁移过程中和 TiDB 一起积累了大量的迁移经验。最近 MySQL 5.7 马上就要结束产品生命周期（End of Life）了，用户应该怎么办？换一个数据库平替一下？我们的思路不一样，我们希望的是用户不仅仅是从 MySQL5.7 迁移到 TiDB，更要关注的是他迁移过来之后的获得的价值到底是什么。  \n\n我们希望 TiDB 提供的价值是“可持续、可扩展、可整合”。很多企业都有大量的 MySQL 5.7 ，有成百上千个 instance，管理和维护它们都是非常复杂的事情。TiDB 提供了资源共享的多租户能力，我们可以把更多的 MySQL 实例整合到一个或者多个 TiDB 集群，极大提升资源利用率，从而降低硬件成本，同步降低管理集群的成本。最近我们和一个客户交流，他们有很多 MySQL 实例，有的利用率不高，就直接降级，从原来的 8C 配置，直接降成 4C 或 2C 配置。过了一段时间，业务这边有个流量把系统卡死了，再给升级一下。过一段时间流量又下来了，再降级。这就很头疼，运维和开发的关系就很难处，降本增效的压力很大。这么多的 MySQL instance 一旦迁到 TiDB 上面，基于 TiDB 本身的资源共享能力，流量超了几倍都没问题，这就可以带来非常显著的降本增效。  \n\n![TiDB Cloud.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_b963ef4870.png)\n\n接下来是 TiDB Cloud，它在过去几年里得到了全球客户的认可，包括欧洲最大的移动出行公司 Bolt，北美新锐的 SaaS 公司 Catalyst，印度最大的电商 Flipkart，日本著名的游戏公司 CAPCOM 等等。  \n\n![TiDB Serverless GA.png](https://img1.www.pingcap.com/prod/Ti_DB_Serverless_GA_812a8f8373.png)\n\n最后是 TiDB Serverless。四年前，我亲手写下第一行源代码，探索新一代云上 Serverless 架构，这是预研一代的成果。非常幸运，预研一代的速度远远超出我们的预期，它现在已经正式商用了。过去几个月的时间里，TiDB Serverless beta 版已经拥有超过 1 万个活跃的集群。  \n\nServerless 带来了什么样的价值和能力呢？第一，低成本零元起步。TiDB Serverless 完成了 PingCAP 的一个梦想，我们有能力为全球每一个开发者提供一个免费的数据库。  \n\n我想稍微分享一个内部的小故事，最早 TiDB Cloud 的 free tier 成本是现在的 100 多倍。我们内部有个笑话，自己总是调侃说我们是“贵司”。“贵司”是什么意思呢？TiDB “贵”。因为比较的对象是 MySQL，作为一个分布式系统，TiDB 跟一般的系统比成本肯定高，起步就三个副本，还有计算层、调度层，跟单机比肯定是贵了。很幸运的是， TiDB Serverless 出来之后“贵司”终于不“贵”了。得益于 TiDB Serverless 采用的完全分离式的架构，不仅仅做到了存算分离，我们还做到了算算分离、存存分离，整个系统的弹性非常强，同时它的使用异常简单，用户体验非常好。我们收到大量用户的赞誉，超出了自己的预期。  \n\n大家都希望把自己的时间精力投资在自己的创新上面，投资在自己的业务上面，尽量不想再花时间在数据库上面，将所有复杂的事情都交给系统，交给 PingCAP 完全自动化处理。过去，大家可能会很好奇，这听起来好得有点过了，能做到吗？凭什么？  \n\n## TiDB Serverless 为什么比社区版更便宜？\n\n今天我们在云上面使用数据库或者使用传统的 RDS，不管是什么数据库，本质上都是买一个虚拟机，按照最高的峰值要求配置，不管你的业务现在跑的是什么量，哪怕 CPU 利用率是 1%，你也必须为它的 100% 利用率付费。这就是一个传统的计费模式，永远为最高的峰值付费。  \n\nTiDB Serverless 的创新在于，你永远只为你正在使用的资源付费。举个例子，你现在假设有 10 TB 的数据跑在 TiDB Serverless 上面，你没有任何访问，那所有的计算节点全部会被自动 shutdown，但你可以在百毫秒的时间内就马上让它启动提供服务。这是一个巨大的进步，用户仅仅为使用付费，使用曲线长什么样，TiDB 的计费就会长什么样。这就是为什么 TiDB Serverless 能够做到比现在的 RDS，比云上面部署社区版还要便宜，只要这个 CPU 的利用率低于 20%，全自动的弹性就会带来巨大的成本优势。  \n\n![经典数据库的跃迁路径.png](https://img1.www.pingcap.com/prod/_fdbb5572bc.png)\n\n今天，不管你使用的是经典的单机数据库、开源数据库还是云端的数据库，TiDB 都提供了成本更低，扩展性更强，更加省心的选择。  \n\n## 面向中国企业级用户，发布平凯数据库  \n\nTiDB 源于中国，很多关键特性也来自于中国复杂的用户场景，毫无疑问中国市场就是 TiDB 的根据地和大本营。最近我们和很多中国用户沟通交流，他们给了我们非常多的反馈，很多反馈都非常有价值，特别是对于 TiDB 未来发展的预期和展望。我们发现，TiDB 企业版经过五年的打磨，更多是面向全球用户提供通用性的功能，但是这些功能对于中国企业级用户来说还远远不够。  \n\n当下，随着 TiDB 逐步进入中国用户的核心场景以及 TiDB 规模化进入国产化生态，面向中国企业级用户的“平凯数据库”正式发布了。  \n\n![平凯数据库发布.jpeg](https://img1.www.pingcap.com/prod/_463e302b96.jpeg)\n\n简单来说，平凯数据库主要包含 TiDB Open Core 的稳定内核以及满足中国企业用户的增强级企业功能。第一，提供国产化需求的企业级功能，包括图形化管控平台、全链路数据迁移平台、安全特性等等；第二，提供更完善的国产化生态系统的接入功能，包括国产软硬件的适配，比如操作系统、服务器等等；第三，提供更完善的国产化企业级服务支持能力。  \n\n未来，我们希望平凯数据库站在 TiDB LTS（长期支持版）的基础上能为中国的客户带来更好的价值，我们希望这个过程是开放的，会定期在国内各个区域组织用户讨论交流的活动，我们希望大家能一起参与到未来平凯数据库的建设中来。","author":"刘奇","category":5,"customUrl":"always-ahead-by-max-liu","fillInMethod":"writeDirectly","id":496,"summary":"在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并发布了面向中国企业级用户的平凯数据库。","tags":["PingCAP 用户峰会"],"title":"刘奇：经典数据库亟需跃迁，TiDB 不是“平替”"}},{"relatedBlog":{"body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩，共同带来了“携手中国用户，打造世界级产品”主题分享。分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。以下为分享实录。\n\n## 携手中国用户，打造世界级产品  \n\n![唐刘.jpeg](https://img1.www.pingcap.com/prod/_d2b6c87028.jpeg)\n<center>PingCAP 研发副总裁 唐刘</center>\n\n我是 PingCAP 唐刘，负责 TiDB 的产研工作。首先请容我对在座的各位以及在线收看直播的用户报以最诚挚的敬意，因为有你们八年多不断的坚持、陪伴和信任，才有了我们现在源源不断的动力去打磨、去不断完善我们的产品，给客户带来更大的价值。  \n\n我们先来探讨一个话题，为什么中国企业以及中国的用户对 PingCAP 非常重要？从 TiDB 诞生的第一天起我们就致力于解决企业用户在规模化负载下的稳定性和性能问题。熟悉 TiDB 的用户应该都知道，我们最开始就是解决的 是 MySQL 分库分表的问题。经过八年多的发展，在各行各业无论衣食住行，还是金融保险都有了 TiDB 的身影。鉴于中国这样庞大的用户基数，大家可以想象这些规模化场景对整个数据库的稳定性和性能都提出了世界级的挑战。毫不夸张地说，如果我们能满足中国用户这些天花板级别的要求，我们就非常有信心地将产品推广到全世界，让全世界的用户享受到 TiDB 带给他们的价值。所以，中国对我们来说非常重要。  \n\n![中国企业用户.png](https://img1.www.pingcap.com/prod/_2a5350b5fe.png)\n\n过去一年，PingCAP 投入了大量资源去解决 TiDB 在规模化场景下的稳定性和性能问题，也取得了不小的成果。首先在国内的某头部大行，通过我们的跑批优化，在该行的反洗钱业务、客户详单查询业务跑批场景上有 2-3 倍的性能提升。在国内某头部城商行，我们通过悲观事务的优化，在他们的互联网核心交易场景，实现了延迟降低 4 倍，7*24 小时延迟抖动控制在 2% 以内的目标。在国内某互联网零售企业，我们通过多业务整合和资源管控的方式，不仅使得用户节省了成本，同时也让业务的整体延迟下降了将近 50%。这些是我们在过去一年中取得成绩的一部分，非常感谢这些用户对我们的选择和信任。  \n\n![集群稳定性案例.png](https://img1.www.pingcap.com/prod/_54cf2d40ba.png)\n\n当然不限于此，TiDB 的产品核心能力也有很多方面的重要提升。首先，在线 DDL 的性能提升了 10 倍。对于老版本中用户关注的 OOM 问题，经过我们一年多的努力，TiDB 最新的版本中的 OOM 较之前的版本下降了 99%，实现了质的飞跃。目前，TiDB 已经能做到单表 50TB 数据的小时级别导入，让用户非常顺滑、快速地将大批数据导入到 TiDB，满足用户对极致的 RPO 和 RTO 的述求，数据同步输出的延时也降低至了秒级。这些性能提升大家可以在最新的 TiDB 7.1 LTS 版本中享受到。未来，我们在后续的 TiDB 7.X 版本中，将继续致力于稳定性与性能的提升。  \n\n![性能提升.png](https://img1.www.pingcap.com/prod/_74c4ee9454.png)\n\n下面我给大家简单介绍 TiDB 7.X 版本中的三个重要新特性。  \n\n第一个特性是 Partitioned Raft KV，它带来的用户价值非常显著。我们能让用户相比之前用更少的机器，挂更大的盘，存更多的数据，还能提供更好的性能。在当前数据规模不断膨胀和多变的经济环境下，对用户来说这是一个非常具有吸引力的特性。使用 Partitioned Raft KV 这个特性之后，TiDB 无论是在性能还是在成本上面相比之前都有了质的飞跃，希望大家尽快使用 TiDB 的最新版本来体验这个功能。  \n\n![Partitioned Raft KV.png](https://img1.www.pingcap.com/prod/Partitioned_Raft_KV_a25b3b8a80.png)\n\n第二个重要新特性就是资源管控（Resource Control），之前有很多用户反馈在使用和维护多套 MySQL 集群上面精疲力尽，将多套 MySQL 集群归集到一个 TiDB 里面又担心跑在数据库里面的业务相互影响。TiDB 7.1 LTS 版本已经提供了一个非常好的解决方案，就是通过 Resource Control 让用户非常方便地将多个 MySQL 实例汇聚到一个 TiDB 集群里面，一方面能够极大降低用户对于多套 MySQL 集群的运维成本，降低了运维复杂度，另一方面通过多合一的业务汇聚能够帮助用户节省成本。在实际的用户场景中，我们发现使用多合一的汇聚能帮用户节省 40% 左右的成本，在当前经济环境的压力下和降本增效的背景下，基于 TiDB 资源管控的数据库整合方案无疑是理想的选择。  \n\n![Resource control.png](https://img1.www.pingcap.com/prod/Resource_control_386c27b3e6.png)\n\n第三个重要特性就是在线 DDL。在今天敏捷迭代的商业环境中，数据库需要跑得更快，但是我们不可能一开始就设计出一个完美的表结构。随着业务不断地快速变化，我们势必会对原始设计的表结构进行频繁的变更。运维过 MySQL 的同学应该都知道，当 MySQL 的集群规模非常大的时候（或者一些传统数据库集群规模非常大的时候），如果你要做一个 DDL 变更，这是多么痛苦的一件事情，不仅耗时会非常长，而且可能会造成停机维护、业务中断，甚至造成业务损失。然而，这一切在 TiDB 里面都不是问题，我们从第一天就支持了在线 DDL。在 TiDB 新版本中，在线 DDL 的性能提升了 10 倍，意味着你可以比竞争对手更快地进行表结构的变更，更敏捷地支撑业务迭代，以更快的速度在竞争中胜出。  \n![Online DDL.png](https://img1.www.pingcap.com/prod/Online_DDL_00e63b757a.png)\n\n后续的 TiDB 7.X 版本中将会推出 DDL 并行执行框架。如果你想要 DDL 执行得更快，只需要不断地添加节点，就能够实现性能的水平扩展，可以在 10 倍提升的基础上再乘以 N 个框架并行。这套框架不仅会用于当前的 DDL 处理，未来 TiDB 大批量的数据导入、大规模的数据统一分析、甚至一些重型查询的并行执行，我们都会通过这套框架进行统一的收敛。未来，我们希望通过这套并行框架给用户提供一套极致的性能体验。  \n\n![DDL 并行执行框架.png](https://img1.www.pingcap.com/prod/DDL_501ec7104a.png)\n\n这一系列新特性将会在 TiDB 7.5 LTS 中和大家见面。TiDB 7.5 版本将会提供更强大的资源管控能力，Partitioned Raft KV 将正式 GA，TiDB 也将全面兼容 MySQL 8.0。大家知道 MySQL 5.7 将在今年 10 月 End of Life，PingCAP 承诺我们会持续拥抱 MySQL 生态，不断地兼容 MySQL 5.7 和 MySQL 8.0，同时会带来顺畅的迁移体验，方便用户把数据库从 MySQL 迁移到 TiDB，实现无缝地迁移和使用。  \n\n![TiDB 7.5 重要功能.png](https://img1.www.pingcap.com/prod/Ti_DB_7_5_6b9ead8e9b.png)\n\n从第一天开始 TiDB 就致力于成为一款全球化的数据库，从第一天开始我们坚信中国用户一直是 TiDB 持续创新的核心发动机。据我们内部统计，TiDB 新版本中有 50% 的功能需求来自中国用户，TiDB 70% 的外部贡献者来自于中国，有 30,000 多名中国的 AskTUG 用户在体验产品并给出反馈。今年，我们启动了用户之声活动，来到各个区域倾听用户的声音，希望通过我们的努力携手中国用户打造一款世界级的数据库产品。  \n\n![用户之声.png](https://img1.www.pingcap.com/prod/_16a46aa063.png)\n\n## 平凯数据库，为中国企业用户需求量身定制  \n\n![丁岩.jpeg](https://img1.www.pingcap.com/prod/_ed03f98212.jpeg)\n<center>PingCAP 首席科学家 丁岩</center>\n\n我是平凯数据库的研发负责人丁岩。刚才唐刘介绍了很多 TiDB 的内核新特性，非常惊艳。对于中国企业用户来讲还有一个惊喜，一个专属的福利就是平凯数据库，我来介绍一下平凯数据库的发版策略和产品路线图。  \n\n我们锚定 TiDB 在每个 LTS 版本发布之后三个月左右，随着增强型企业级功能一起发布平凯数据库的新版本，节奏是每半年发布一个版本。平凯数据库是中国企业用户专属的一个福利，它有哪些吸引人的特性？  \n\n前面研究院付平老师介绍过，中国正在加速制定数据库的标准规范，涵盖方方面面。平凯数据库定位于全面地遵守国标、行标，兼容国产化生态，在安全合规方面让用户用得放心、用得安全。我们有很多大客户，例如国有大行的 TiDB 集群已经达到上百个，服务器达到上千台的规模，这个时候管理和运维就成为一个难题。平凯数据库适时地推出可视化管控平台（TEM），轻松管理上千台服务器、上百个 TiDB 集群，为用户节省管理运维的成本，提升管理效率。  \n\n![平凯数据库发版路线图.png](https://img1.www.pingcap.com/prod/_fc4539f0ac.png)\n\n中国市场上很多客户正在计划或者已经在把 Oracle 上的业务迁移到 TiDB，这个时候迁移成本包括迁移过程中的风险在所难免，我们也急客户所需，想客户所想，推出了全链路数据迁移平台（TMS），从数据库的对象，到 SQL 的兼容分析，到迁移前后 SQL 执行性能的对比，再到存量数据的迁移，提供一套全流程的迁移工具和解决方案，降低客户的迁移成本和迁移风险。此外，平凯数据库还提供存储过程的兼容，存储级的备份恢复，高级安全功能等。平凯数据库 7.1 版本将在今年 8 月底正式 GA。  \n\n![平凯数据库 7.1.png](https://img1.www.pingcap.com/prod/7_1_eb1e765d31.png)\n\n半年之后，我们将发布平凯数据库 7.5 版本。7.5 版本将在符合国标、行标最新的规范标准，在安全方面持续发力。在生态方面，TEM 支持 K8s 集群的管理；大数据生态兼容方面，7.5 版本支持 ORC 格式数据的导入；自动化部署支持 IPv6。7.5 版本将持续提升存储过程的执行效率。我们收到的中国企业用户的迫切需求，都会在后续版本中做规划和交付，更多惊艳的企业级新特性正在路上，敬请期待。  \n\n![平凯数据库未来规划.png](https://img1.www.pingcap.com/prod/_cd43406097.png)\n\n","author":"唐刘 丁岩","category":5,"customUrl":"build-world-class-products","fillInMethod":"writeDirectly","id":497,"summary":"PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。","tags":["PingCAP 用户峰会"],"title":"PingCAP 唐刘：携手中国用户，打造世界级产品"}}]},{"id":"Blogs_497","title":"PingCAP 唐刘：携手中国用户，打造世界级产品","tags":["PingCAP 用户峰会"],"category":{"name":"观点洞察"},"summary":"PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。","body":"## 导读\n\n在 PingCAP 用户峰会 2023 上，PingCAP 研发副总裁唐刘、PingCAP 首席科学家丁岩，共同带来了“携手中国用户，打造世界级产品”主题分享。分别从 TiDB 7.x 版本内核的演进方向、面向中国企业级用户的新品平凯数据库的发版策略和产品路线图两个角度，解析 TiDB 产品家族协同演进路径。以下为分享实录。\n\n## 携手中国用户，打造世界级产品  \n\n![唐刘.jpeg](https://img1.www.pingcap.com/prod/_d2b6c87028.jpeg)\n<center>PingCAP 研发副总裁 唐刘</center>\n\n我是 PingCAP 唐刘，负责 TiDB 的产研工作。首先请容我对在座的各位以及在线收看直播的用户报以最诚挚的敬意，因为有你们八年多不断的坚持、陪伴和信任，才有了我们现在源源不断的动力去打磨、去不断完善我们的产品，给客户带来更大的价值。  \n\n我们先来探讨一个话题，为什么中国企业以及中国的用户对 PingCAP 非常重要？从 TiDB 诞生的第一天起我们就致力于解决企业用户在规模化负载下的稳定性和性能问题。熟悉 TiDB 的用户应该都知道，我们最开始就是解决的 是 MySQL 分库分表的问题。经过八年多的发展，在各行各业无论衣食住行，还是金融保险都有了 TiDB 的身影。鉴于中国这样庞大的用户基数，大家可以想象这些规模化场景对整个数据库的稳定性和性能都提出了世界级的挑战。毫不夸张地说，如果我们能满足中国用户这些天花板级别的要求，我们就非常有信心地将产品推广到全世界，让全世界的用户享受到 TiDB 带给他们的价值。所以，中国对我们来说非常重要。  \n\n![中国企业用户.png](https://img1.www.pingcap.com/prod/_2a5350b5fe.png)\n\n过去一年，PingCAP 投入了大量资源去解决 TiDB 在规模化场景下的稳定性和性能问题，也取得了不小的成果。首先在国内的某头部大行，通过我们的跑批优化，在该行的反洗钱业务、客户详单查询业务跑批场景上有 2-3 倍的性能提升。在国内某头部城商行，我们通过悲观事务的优化，在他们的互联网核心交易场景，实现了延迟降低 4 倍，7*24 小时延迟抖动控制在 2% 以内的目标。在国内某互联网零售企业，我们通过多业务整合和资源管控的方式，不仅使得用户节省了成本，同时也让业务的整体延迟下降了将近 50%。这些是我们在过去一年中取得成绩的一部分，非常感谢这些用户对我们的选择和信任。  \n\n![集群稳定性案例.png](https://img1.www.pingcap.com/prod/_54cf2d40ba.png)\n\n当然不限于此，TiDB 的产品核心能力也有很多方面的重要提升。首先，在线 DDL 的性能提升了 10 倍。对于老版本中用户关注的 OOM 问题，经过我们一年多的努力，TiDB 最新的版本中的 OOM 较之前的版本下降了 99%，实现了质的飞跃。目前，TiDB 已经能做到单表 50TB 数据的小时级别导入，让用户非常顺滑、快速地将大批数据导入到 TiDB，满足用户对极致的 RPO 和 RTO 的述求，数据同步输出的延时也降低至了秒级。这些性能提升大家可以在最新的 TiDB 7.1 LTS 版本中享受到。未来，我们在后续的 TiDB 7.X 版本中，将继续致力于稳定性与性能的提升。  \n\n![性能提升.png](https://img1.www.pingcap.com/prod/_74c4ee9454.png)\n\n下面我给大家简单介绍 TiDB 7.X 版本中的三个重要新特性。  \n\n第一个特性是 Partitioned Raft KV，它带来的用户价值非常显著。我们能让用户相比之前用更少的机器，挂更大的盘，存更多的数据，还能提供更好的性能。在当前数据规模不断膨胀和多变的经济环境下，对用户来说这是一个非常具有吸引力的特性。使用 Partitioned Raft KV 这个特性之后，TiDB 无论是在性能还是在成本上面相比之前都有了质的飞跃，希望大家尽快使用 TiDB 的最新版本来体验这个功能。  \n\n![Partitioned Raft KV.png](https://img1.www.pingcap.com/prod/Partitioned_Raft_KV_a25b3b8a80.png)\n\n第二个重要新特性就是资源管控（Resource Control），之前有很多用户反馈在使用和维护多套 MySQL 集群上面精疲力尽，将多套 MySQL 集群归集到一个 TiDB 里面又担心跑在数据库里面的业务相互影响。TiDB 7.1 LTS 版本已经提供了一个非常好的解决方案，就是通过 Resource Control 让用户非常方便地将多个 MySQL 实例汇聚到一个 TiDB 集群里面，一方面能够极大降低用户对于多套 MySQL 集群的运维成本，降低了运维复杂度，另一方面通过多合一的业务汇聚能够帮助用户节省成本。在实际的用户场景中，我们发现使用多合一的汇聚能帮用户节省 40% 左右的成本，在当前经济环境的压力下和降本增效的背景下，基于 TiDB 资源管控的数据库整合方案无疑是理想的选择。  \n\n![Resource control.png](https://img1.www.pingcap.com/prod/Resource_control_386c27b3e6.png)\n\n第三个重要特性就是在线 DDL。在今天敏捷迭代的商业环境中，数据库需要跑得更快，但是我们不可能一开始就设计出一个完美的表结构。随着业务不断地快速变化，我们势必会对原始设计的表结构进行频繁的变更。运维过 MySQL 的同学应该都知道，当 MySQL 的集群规模非常大的时候（或者一些传统数据库集群规模非常大的时候），如果你要做一个 DDL 变更，这是多么痛苦的一件事情，不仅耗时会非常长，而且可能会造成停机维护、业务中断，甚至造成业务损失。然而，这一切在 TiDB 里面都不是问题，我们从第一天就支持了在线 DDL。在 TiDB 新版本中，在线 DDL 的性能提升了 10 倍，意味着你可以比竞争对手更快地进行表结构的变更，更敏捷地支撑业务迭代，以更快的速度在竞争中胜出。  \n![Online DDL.png](https://img1.www.pingcap.com/prod/Online_DDL_00e63b757a.png)\n\n后续的 TiDB 7.X 版本中将会推出 DDL 并行执行框架。如果你想要 DDL 执行得更快，只需要不断地添加节点，就能够实现性能的水平扩展，可以在 10 倍提升的基础上再乘以 N 个框架并行。这套框架不仅会用于当前的 DDL 处理，未来 TiDB 大批量的数据导入、大规模的数据统一分析、甚至一些重型查询的并行执行，我们都会通过这套框架进行统一的收敛。未来，我们希望通过这套并行框架给用户提供一套极致的性能体验。  \n\n![DDL 并行执行框架.png](https://img1.www.pingcap.com/prod/DDL_501ec7104a.png)\n\n这一系列新特性将会在 TiDB 7.5 LTS 中和大家见面。TiDB 7.5 版本将会提供更强大的资源管控能力，Partitioned Raft KV 将正式 GA，TiDB 也将全面兼容 MySQL 8.0。大家知道 MySQL 5.7 将在今年 10 月 End of Life，PingCAP 承诺我们会持续拥抱 MySQL 生态，不断地兼容 MySQL 5.7 和 MySQL 8.0，同时会带来顺畅的迁移体验，方便用户把数据库从 MySQL 迁移到 TiDB，实现无缝地迁移和使用。  \n\n![TiDB 7.5 重要功能.png](https://img1.www.pingcap.com/prod/Ti_DB_7_5_6b9ead8e9b.png)\n\n从第一天开始 TiDB 就致力于成为一款全球化的数据库，从第一天开始我们坚信中国用户一直是 TiDB 持续创新的核心发动机。据我们内部统计，TiDB 新版本中有 50% 的功能需求来自中国用户，TiDB 70% 的外部贡献者来自于中国，有 30,000 多名中国的 AskTUG 用户在体验产品并给出反馈。今年，我们启动了用户之声活动，来到各个区域倾听用户的声音，希望通过我们的努力携手中国用户打造一款世界级的数据库产品。  \n\n![用户之声.png](https://img1.www.pingcap.com/prod/_16a46aa063.png)\n\n## 平凯数据库，为中国企业用户需求量身定制  \n\n![丁岩.jpeg](https://img1.www.pingcap.com/prod/_ed03f98212.jpeg)\n<center>PingCAP 首席科学家 丁岩</center>\n\n我是平凯数据库的研发负责人丁岩。刚才唐刘介绍了很多 TiDB 的内核新特性，非常惊艳。对于中国企业用户来讲还有一个惊喜，一个专属的福利就是平凯数据库，我来介绍一下平凯数据库的发版策略和产品路线图。  \n\n我们锚定 TiDB 在每个 LTS 版本发布之后三个月左右，随着增强型企业级功能一起发布平凯数据库的新版本，节奏是每半年发布一个版本。平凯数据库是中国企业用户专属的一个福利，它有哪些吸引人的特性？  \n\n前面研究院付平老师介绍过，中国正在加速制定数据库的标准规范，涵盖方方面面。平凯数据库定位于全面地遵守国标、行标，兼容国产化生态，在安全合规方面让用户用得放心、用得安全。我们有很多大客户，例如国有大行的 TiDB 集群已经达到上百个，服务器达到上千台的规模，这个时候管理和运维就成为一个难题。平凯数据库适时地推出可视化管控平台（TEM），轻松管理上千台服务器、上百个 TiDB 集群，为用户节省管理运维的成本，提升管理效率。  \n\n![平凯数据库发版路线图.png](https://img1.www.pingcap.com/prod/_fc4539f0ac.png)\n\n中国市场上很多客户正在计划或者已经在把 Oracle 上的业务迁移到 TiDB，这个时候迁移成本包括迁移过程中的风险在所难免，我们也急客户所需，想客户所想，推出了全链路数据迁移平台（TMS），从数据库的对象，到 SQL 的兼容分析，到迁移前后 SQL 执行性能的对比，再到存量数据的迁移，提供一套全流程的迁移工具和解决方案，降低客户的迁移成本和迁移风险。此外，平凯数据库还提供存储过程的兼容，存储级的备份恢复，高级安全功能等。平凯数据库 7.1 版本将在今年 8 月底正式 GA。  \n\n![平凯数据库 7.1.png](https://img1.www.pingcap.com/prod/7_1_eb1e765d31.png)\n\n半年之后，我们将发布平凯数据库 7.5 版本。7.5 版本将在符合国标、行标最新的规范标准，在安全方面持续发力。在生态方面，TEM 支持 K8s 集群的管理；大数据生态兼容方面，7.5 版本支持 ORC 格式数据的导入；自动化部署支持 IPv6。7.5 版本将持续提升存储过程的执行效率。我们收到的中国企业用户的迫切需求，都会在后续版本中做规划和交付，更多惊艳的企业级新特性正在路上，敬请期待。  \n\n![平凯数据库未来规划.png](https://img1.www.pingcap.com/prod/_cd43406097.png)\n\n","date":"2023-07-19","author":"唐刘 丁岩","fillInMethod":"writeDirectly","customUrl":"build-world-class-products","file":null,"relatedBlogs":[{"relatedBlog":{"body":"## 导读\n\n在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇分享了题为“创新涌动于先”的演讲，全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并携手用户代表发布了面向中国企业级用户的平凯数据库。以下是演讲实录全文，阅读需约 8 分钟。  \n\n过去一段时间，我拜访了全球各地的客户，聆听他们的挑战和建议，以及 PingCAP 是如何帮助他们解决挑战的。在这个过程中，我们也看到一些新的技术发展趋势。当下，AI 技术非常火，到处都是各种各样的 AI Demo，每家企业都在思考这样一个问题：**AI 到底有没有可能重塑软件行业？我的答案是——AI 这次真的要重塑整个软件行业了**。\n\n![刘奇.jpeg](https://img1.www.pingcap.com/prod/_b136706601.jpeg)\n\n## AI 重塑软件行业\n\n作为一家软件公司，我们思考的问题直接体感通常有两个：一个是代码，一个是数据。  \n\n先从代码说起，大家有没有意识到，很多人在过去一段时间不自觉地变成了程序员。今天，我们向 ChatGPT 提问题，它会给我们一个答案；向它提要求，它会给我们一个结果。比如我们可以让 ChatGPT 做总结、写文章，或者让它生成图片。大家可以回忆一下，在 AI 时代到来之前，所有这些工作都需要用程序去完成。我们需要用各种各样的辅助工具，那些东西都需要编程开发。而今天，我们没有写任何一行代码，只是提了个需求，结果就有了。以前，这需要很多程序员很长时间努力才能得到一样的结果。而现在，我们向 AI 发命令、提要求、提问题就能拿到结果，事实上就等于完成了编程工作。现在，自然语言已经成为最热门的编程语言。在过去七个月的时间里，GitHub 上新增代码中已经有超过 46% 是由 AI 生成的。如果从软件开发效率的角度看，AI 实际上已经完成差不多一半的人类工作。  \n\n再说数据，我们今年一月份发布了一个 AI 生成 SQL 的产品，叫 Chat2Query（前往 tidbcloud.com 立即注册体验），用户使用 Chat2Query 就不需要再写 SQL 了，只要用自然语言描述一下希望得到什么数据，希望做一个什么分析，SQL 便会自动生成，只要在数据库里运行一下，就能得到想要的结果，并且还能用图表化的形式自动展示出来。  \n\n![涌现中的技术世界-Data.png](https://img1.www.pingcap.com/prod/Data_007a8e1815.png)\n\n上图右侧是 PingCAP CTO 黄东旭在 GitHub 上的个人数据看板。以前要实现这样一个数据看板，需要一个前端程序员、需要一个数据分析人员写 SQL 来分析数据，还需要一个后端程序员部署服务，甚至还需要知道一点云的知识，理解如何把应用部署在云上。到了今天，这变成一件非常简单的事情，只需十分钟，一行代码都不用写。这是一次巨大的生产力提升，**AI 带来的能力让数据消费的门槛变得极低**。以前，我们必须是一个 SQL 的专家，才能分析数据。有人曾经写过一万多行的 SQL 来处理一个分析需求，这个东西不是人类能轻易掌握的。如今，这个门槛已经降到人人都有可能做到。这意味着我们只要能够连接上电脑，能和 AI 交互，能接触到数据，就可以消费数据。这个数量级可能达到 10 亿人。在接下来的几年里，由数据消费门槛降低带来的数据消费人数的增加，数据消费频次的增长，将使数据呈 10-100 倍规模的增长，这是一个远超我们预期的增速。\n\n## AI 时代，我们需要怎样的数据库技术？\n\n以上改变，将给数据库带来巨大的挑战，数据消费的门槛降到人人可用的程度，需要每个人都有一个数据库可用。早在四五年前，我和 CTO 黄东旭探讨过一个话题——如果 PingCAP 要为全世界所有开发者提供一个免费的数据库，那这个数据库的架构应该是什么样？  \n\n![涌现中的技术世界-我们需要怎样的数据库技术.png](https://img1.www.pingcap.com/prod/_bfe74f7599.png)\n\n我们希望这个数据库能够做到实时在线，随时都可以访问，随时都可以用；我们也希望它是一个开放的生态，因为我们不仅仅有存在数据库里面的数据，还有很多存在其他地方的数据，我们需要有一个生态能够和所有数据消费端做更好的对接。  \n\n后来，我们形成了一个结论，起码它应该是个云原生的架构。如果不是云原生的架构，我们就没有办法去应对各种各样弹性的需求；今天，一个用户相对容易预测，那为全球所有开发者都提供一个免费的数据库，就意味着我们会有数千万甚至数亿的用户，这个数据库怎么才能做得到？它需要很强的数据整合能力；其次，因为不同用户的需求是不一样的，数据量也不同，我们需要它有非常强的弹性扩展能力。  \n\n![向先进性要答案.png](https://img1.www.pingcap.com/prod/_51a85d6463.png)\n\n过去这两年的变化特别快，大家感知最直观的可能是宏观经济变化很快，其实除此之外，AI 技术的进步速度也非常快。从 ChatGPT 在去年 11 月底推出，到今天才过去短短八个月的时间。这八个月中已经创造了无数新的纪录，包括一个新的项目在 GitHub 上面获得 Star 的数据、ChatGPT 用户增长的速度等等。  \n\n大家在面对大量新技术的时候，都做出了最直观的选择，那就是拥抱先进性。过去一段时间我在与美国、日本的客户交流时，最直接的感受是每个人都在讨论两个方向，一个是成本，另一个是效率。在当前经济环境下，这几乎成了所有人的共同选择。\n\n## 客户的关注点就是 TiDB 的焦点  \n\n如果仔细观察 TiDB 发展的轨迹，你就会发现用户对数据库的关注点，其实和 TiDB 实际解决的问题是高度一致的。TiDB 在稳定性、性能、高可用性、易用性、工具生态的提升等方面付出了巨大努力。但我们认为这件事光努力还不够，我们还需要有一个非常好的演进策略以及分层的架构设计。  \n\n![TiDB 的设计与演进策略.png](https://img1.www.pingcap.com/prod/Ti_DB_b4992a11c0.png)\n\n在内部，我们有一个说法叫做 API First，各个模块之间优先设计 API（接下来我们也会推出更多基于 Open API 规范的 API 测试），有了 API 之后系统就很容易被其他各种各样的业务系统集成。举个例子，各大型用户基于 TiDB 都有自己公司内部的运维平台，通过我们提供的 API 能更好地融合到客户内部的平台里。在日本我和一个客户交流的时候，对方专门提到过这一点。过去他们需要花几天时间才能完成新版本的集成，但有 API 之后只要花几分钟就能做到。  \n\nTiDB 整个系统除了模块化的切分，也做了很好的纵向切割，从上到下分成三层。比如 Chat2Query 在最上面一层，这层会更关注整个系统的交互性、易用性，如何让系统更加自动化、更加智能；在 SQL 层主要关注如何提升它的稳定性，让它变得更加智能。比如 TiDB 的优化器如何更智能地选择，到底使用行存还是列存，还是让行列同时使用；最下面是内核层，所有人对此的关注点都一样，就是高可用、高性能。  \n\n![TiDB 存储引擎持续提升.png](https://img1.www.pingcap.com/prod/Ti_DB_2684b39c37.png)\n\n在内核层，TiDB 的存储引擎使用了一个持续升级的策略——部署一代、研发一代、预研一代。今天我们听到的所有关于 TiDB 的讨论，其实都是基于部署一代的体感，不少用户还使用着 TiDB 3.0、4.0，而这已经是四五年前的版本了。当然我们也希望用户能更快升级到最新版本，享受到新版本带来的优势，每一个新版本都会带来巨大的性能和稳定性提升。7.0 版本发布的实验特性 Partitioned Raft KV 就带来了巨大的性能提升。前面预测未来几年数据会扩大 10 倍，部分领域会扩大 100 倍，在如此大的数据规模下面我们的数据库能力是不是也能同步扩大 10 倍、100 倍？这是 Partitioned Raft KV 解决的问题。我们预研一代的存储引擎 Cloud Storage Engine 已经在后面要提到的 TiDB Serverless 中应用，我们的 CTO 黄东旭在后面的演讲和 Blog 中都有详细的解读。  \n\n如果大家留心就会注意到，过去一年时间里 TiDB 的 Online DDL 的速度提升了 10 倍。设想一下，我们有一个 100TB 的表，加一个索引要多久？对系统资源的消耗又是什么样的？除了 DDL，还有一点是 TiDB 的扩缩容的速度在这个引擎里面提升了 5 倍，这也意味着数据丢失的风险降低 5 倍，业务中断的风险降低 5 倍。\n\n## 平替还是跃迁？TiDB 产品家族的协同演进\n\n经过多年发展，TiDB 目前已经拥有三大产品家族：一是面向企业级市场的 TiDB 企业版，服务于企业级关键业务场景；二是全托管的 TiDB Cloud，提供云端一栈式 HTAP 数据库服务，已经成为欧洲、北美、日本、亚太地区众多数字原生企业的选择；三是刚刚正式商用的 TiDB Cloud Serverless，一个 AI Ready 的数据库，以极简架构、极致体验和超低门槛为云上开发者、创业公司提供低至零成本的选择，较 TiDB 社区版和 MySQL RDS 更具成本优势。  \n\n![TiDB 产品家族协同演进.png](https://img1.www.pingcap.com/prod/Ti_DB_9c9ef534c9.png)\n\nTiDB 是如何在多个版本间协同演进的？从上图可以看出，最上面有一个 TiDB 的 Open Core，TiDB 的所有这些版本都是基于共同的 Root 生长出来，去适应不同的客户和不同的使用场景。  \n\n![TiDB 企业版.png](https://img1.www.pingcap.com/prod/Ti_DB_35ca97f365.png)\n\nTiDB 企业版已经拥有很多大行、大型企业的使用经验，他们有些是从数据库一体机迁移过来的，在迁移过程中和 TiDB 一起积累了大量的迁移经验。最近 MySQL 5.7 马上就要结束产品生命周期（End of Life）了，用户应该怎么办？换一个数据库平替一下？我们的思路不一样，我们希望的是用户不仅仅是从 MySQL5.7 迁移到 TiDB，更要关注的是他迁移过来之后的获得的价值到底是什么。  \n\n我们希望 TiDB 提供的价值是“可持续、可扩展、可整合”。很多企业都有大量的 MySQL 5.7 ，有成百上千个 instance，管理和维护它们都是非常复杂的事情。TiDB 提供了资源共享的多租户能力，我们可以把更多的 MySQL 实例整合到一个或者多个 TiDB 集群，极大提升资源利用率，从而降低硬件成本，同步降低管理集群的成本。最近我们和一个客户交流，他们有很多 MySQL 实例，有的利用率不高，就直接降级，从原来的 8C 配置，直接降成 4C 或 2C 配置。过了一段时间，业务这边有个流量把系统卡死了，再给升级一下。过一段时间流量又下来了，再降级。这就很头疼，运维和开发的关系就很难处，降本增效的压力很大。这么多的 MySQL instance 一旦迁到 TiDB 上面，基于 TiDB 本身的资源共享能力，流量超了几倍都没问题，这就可以带来非常显著的降本增效。  \n\n![TiDB Cloud.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_b963ef4870.png)\n\n接下来是 TiDB Cloud，它在过去几年里得到了全球客户的认可，包括欧洲最大的移动出行公司 Bolt，北美新锐的 SaaS 公司 Catalyst，印度最大的电商 Flipkart，日本著名的游戏公司 CAPCOM 等等。  \n\n![TiDB Serverless GA.png](https://img1.www.pingcap.com/prod/Ti_DB_Serverless_GA_812a8f8373.png)\n\n最后是 TiDB Serverless。四年前，我亲手写下第一行源代码，探索新一代云上 Serverless 架构，这是预研一代的成果。非常幸运，预研一代的速度远远超出我们的预期，它现在已经正式商用了。过去几个月的时间里，TiDB Serverless beta 版已经拥有超过 1 万个活跃的集群。  \n\nServerless 带来了什么样的价值和能力呢？第一，低成本零元起步。TiDB Serverless 完成了 PingCAP 的一个梦想，我们有能力为全球每一个开发者提供一个免费的数据库。  \n\n我想稍微分享一个内部的小故事，最早 TiDB Cloud 的 free tier 成本是现在的 100 多倍。我们内部有个笑话，自己总是调侃说我们是“贵司”。“贵司”是什么意思呢？TiDB “贵”。因为比较的对象是 MySQL，作为一个分布式系统，TiDB 跟一般的系统比成本肯定高，起步就三个副本，还有计算层、调度层，跟单机比肯定是贵了。很幸运的是， TiDB Serverless 出来之后“贵司”终于不“贵”了。得益于 TiDB Serverless 采用的完全分离式的架构，不仅仅做到了存算分离，我们还做到了算算分离、存存分离，整个系统的弹性非常强，同时它的使用异常简单，用户体验非常好。我们收到大量用户的赞誉，超出了自己的预期。  \n\n大家都希望把自己的时间精力投资在自己的创新上面，投资在自己的业务上面，尽量不想再花时间在数据库上面，将所有复杂的事情都交给系统，交给 PingCAP 完全自动化处理。过去，大家可能会很好奇，这听起来好得有点过了，能做到吗？凭什么？  \n\n## TiDB Serverless 为什么比社区版更便宜？\n\n今天我们在云上面使用数据库或者使用传统的 RDS，不管是什么数据库，本质上都是买一个虚拟机，按照最高的峰值要求配置，不管你的业务现在跑的是什么量，哪怕 CPU 利用率是 1%，你也必须为它的 100% 利用率付费。这就是一个传统的计费模式，永远为最高的峰值付费。  \n\nTiDB Serverless 的创新在于，你永远只为你正在使用的资源付费。举个例子，你现在假设有 10 TB 的数据跑在 TiDB Serverless 上面，你没有任何访问，那所有的计算节点全部会被自动 shutdown，但你可以在百毫秒的时间内就马上让它启动提供服务。这是一个巨大的进步，用户仅仅为使用付费，使用曲线长什么样，TiDB 的计费就会长什么样。这就是为什么 TiDB Serverless 能够做到比现在的 RDS，比云上面部署社区版还要便宜，只要这个 CPU 的利用率低于 20%，全自动的弹性就会带来巨大的成本优势。  \n\n![经典数据库的跃迁路径.png](https://img1.www.pingcap.com/prod/_fdbb5572bc.png)\n\n今天，不管你使用的是经典的单机数据库、开源数据库还是云端的数据库，TiDB 都提供了成本更低，扩展性更强，更加省心的选择。  \n\n## 面向中国企业级用户，发布平凯数据库  \n\nTiDB 源于中国，很多关键特性也来自于中国复杂的用户场景，毫无疑问中国市场就是 TiDB 的根据地和大本营。最近我们和很多中国用户沟通交流，他们给了我们非常多的反馈，很多反馈都非常有价值，特别是对于 TiDB 未来发展的预期和展望。我们发现，TiDB 企业版经过五年的打磨，更多是面向全球用户提供通用性的功能，但是这些功能对于中国企业级用户来说还远远不够。  \n\n当下，随着 TiDB 逐步进入中国用户的核心场景以及 TiDB 规模化进入国产化生态，面向中国企业级用户的“平凯数据库”正式发布了。  \n\n![平凯数据库发布.jpeg](https://img1.www.pingcap.com/prod/_463e302b96.jpeg)\n\n简单来说，平凯数据库主要包含 TiDB Open Core 的稳定内核以及满足中国企业用户的增强级企业功能。第一，提供国产化需求的企业级功能，包括图形化管控平台、全链路数据迁移平台、安全特性等等；第二，提供更完善的国产化生态系统的接入功能，包括国产软硬件的适配，比如操作系统、服务器等等；第三，提供更完善的国产化企业级服务支持能力。  \n\n未来，我们希望平凯数据库站在 TiDB LTS（长期支持版）的基础上能为中国的客户带来更好的价值，我们希望这个过程是开放的，会定期在国内各个区域组织用户讨论交流的活动，我们希望大家能一起参与到未来平凯数据库的建设中来。","author":"刘奇","category":5,"customUrl":"always-ahead-by-max-liu","fillInMethod":"writeDirectly","id":496,"summary":"在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并发布了面向中国企业级用户的平凯数据库。","tags":["PingCAP 用户峰会"],"title":"刘奇：经典数据库亟需跃迁，TiDB 不是“平替”"}}]},{"id":"Blogs_496","title":"刘奇：经典数据库亟需跃迁，TiDB 不是“平替”","tags":["PingCAP 用户峰会"],"category":{"name":"观点洞察"},"summary":"在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并发布了面向中国企业级用户的平凯数据库。","body":"## 导读\n\n在刚刚结束的 PingCAP 用户峰会 2023 上，PingCAP 创始人兼 CEO 刘奇分享了题为“创新涌动于先”的演讲，全面解析了 AI 时代 TiDB 的演进方向，宣布 TiDB Serverless 正式商用，并携手用户代表发布了面向中国企业级用户的平凯数据库。以下是演讲实录全文，阅读需约 8 分钟。  \n\n过去一段时间，我拜访了全球各地的客户，聆听他们的挑战和建议，以及 PingCAP 是如何帮助他们解决挑战的。在这个过程中，我们也看到一些新的技术发展趋势。当下，AI 技术非常火，到处都是各种各样的 AI Demo，每家企业都在思考这样一个问题：**AI 到底有没有可能重塑软件行业？我的答案是——AI 这次真的要重塑整个软件行业了**。\n\n![刘奇.jpeg](https://img1.www.pingcap.com/prod/_b136706601.jpeg)\n\n## AI 重塑软件行业\n\n作为一家软件公司，我们思考的问题直接体感通常有两个：一个是代码，一个是数据。  \n\n先从代码说起，大家有没有意识到，很多人在过去一段时间不自觉地变成了程序员。今天，我们向 ChatGPT 提问题，它会给我们一个答案；向它提要求，它会给我们一个结果。比如我们可以让 ChatGPT 做总结、写文章，或者让它生成图片。大家可以回忆一下，在 AI 时代到来之前，所有这些工作都需要用程序去完成。我们需要用各种各样的辅助工具，那些东西都需要编程开发。而今天，我们没有写任何一行代码，只是提了个需求，结果就有了。以前，这需要很多程序员很长时间努力才能得到一样的结果。而现在，我们向 AI 发命令、提要求、提问题就能拿到结果，事实上就等于完成了编程工作。现在，自然语言已经成为最热门的编程语言。在过去七个月的时间里，GitHub 上新增代码中已经有超过 46% 是由 AI 生成的。如果从软件开发效率的角度看，AI 实际上已经完成差不多一半的人类工作。  \n\n再说数据，我们今年一月份发布了一个 AI 生成 SQL 的产品，叫 Chat2Query（前往 tidbcloud.com 立即注册体验），用户使用 Chat2Query 就不需要再写 SQL 了，只要用自然语言描述一下希望得到什么数据，希望做一个什么分析，SQL 便会自动生成，只要在数据库里运行一下，就能得到想要的结果，并且还能用图表化的形式自动展示出来。  \n\n![涌现中的技术世界-Data.png](https://img1.www.pingcap.com/prod/Data_007a8e1815.png)\n\n上图右侧是 PingCAP CTO 黄东旭在 GitHub 上的个人数据看板。以前要实现这样一个数据看板，需要一个前端程序员、需要一个数据分析人员写 SQL 来分析数据，还需要一个后端程序员部署服务，甚至还需要知道一点云的知识，理解如何把应用部署在云上。到了今天，这变成一件非常简单的事情，只需十分钟，一行代码都不用写。这是一次巨大的生产力提升，**AI 带来的能力让数据消费的门槛变得极低**。以前，我们必须是一个 SQL 的专家，才能分析数据。有人曾经写过一万多行的 SQL 来处理一个分析需求，这个东西不是人类能轻易掌握的。如今，这个门槛已经降到人人都有可能做到。这意味着我们只要能够连接上电脑，能和 AI 交互，能接触到数据，就可以消费数据。这个数量级可能达到 10 亿人。在接下来的几年里，由数据消费门槛降低带来的数据消费人数的增加，数据消费频次的增长，将使数据呈 10-100 倍规模的增长，这是一个远超我们预期的增速。\n\n## AI 时代，我们需要怎样的数据库技术？\n\n以上改变，将给数据库带来巨大的挑战，数据消费的门槛降到人人可用的程度，需要每个人都有一个数据库可用。早在四五年前，我和 CTO 黄东旭探讨过一个话题——如果 PingCAP 要为全世界所有开发者提供一个免费的数据库，那这个数据库的架构应该是什么样？  \n\n![涌现中的技术世界-我们需要怎样的数据库技术.png](https://img1.www.pingcap.com/prod/_bfe74f7599.png)\n\n我们希望这个数据库能够做到实时在线，随时都可以访问，随时都可以用；我们也希望它是一个开放的生态，因为我们不仅仅有存在数据库里面的数据，还有很多存在其他地方的数据，我们需要有一个生态能够和所有数据消费端做更好的对接。  \n\n后来，我们形成了一个结论，起码它应该是个云原生的架构。如果不是云原生的架构，我们就没有办法去应对各种各样弹性的需求；今天，一个用户相对容易预测，那为全球所有开发者都提供一个免费的数据库，就意味着我们会有数千万甚至数亿的用户，这个数据库怎么才能做得到？它需要很强的数据整合能力；其次，因为不同用户的需求是不一样的，数据量也不同，我们需要它有非常强的弹性扩展能力。  \n\n![向先进性要答案.png](https://img1.www.pingcap.com/prod/_51a85d6463.png)\n\n过去这两年的变化特别快，大家感知最直观的可能是宏观经济变化很快，其实除此之外，AI 技术的进步速度也非常快。从 ChatGPT 在去年 11 月底推出，到今天才过去短短八个月的时间。这八个月中已经创造了无数新的纪录，包括一个新的项目在 GitHub 上面获得 Star 的数据、ChatGPT 用户增长的速度等等。  \n\n大家在面对大量新技术的时候，都做出了最直观的选择，那就是拥抱先进性。过去一段时间我在与美国、日本的客户交流时，最直接的感受是每个人都在讨论两个方向，一个是成本，另一个是效率。在当前经济环境下，这几乎成了所有人的共同选择。\n\n## 客户的关注点就是 TiDB 的焦点  \n\n如果仔细观察 TiDB 发展的轨迹，你就会发现用户对数据库的关注点，其实和 TiDB 实际解决的问题是高度一致的。TiDB 在稳定性、性能、高可用性、易用性、工具生态的提升等方面付出了巨大努力。但我们认为这件事光努力还不够，我们还需要有一个非常好的演进策略以及分层的架构设计。  \n\n![TiDB 的设计与演进策略.png](https://img1.www.pingcap.com/prod/Ti_DB_b4992a11c0.png)\n\n在内部，我们有一个说法叫做 API First，各个模块之间优先设计 API（接下来我们也会推出更多基于 Open API 规范的 API 测试），有了 API 之后系统就很容易被其他各种各样的业务系统集成。举个例子，各大型用户基于 TiDB 都有自己公司内部的运维平台，通过我们提供的 API 能更好地融合到客户内部的平台里。在日本我和一个客户交流的时候，对方专门提到过这一点。过去他们需要花几天时间才能完成新版本的集成，但有 API 之后只要花几分钟就能做到。  \n\nTiDB 整个系统除了模块化的切分，也做了很好的纵向切割，从上到下分成三层。比如 Chat2Query 在最上面一层，这层会更关注整个系统的交互性、易用性，如何让系统更加自动化、更加智能；在 SQL 层主要关注如何提升它的稳定性，让它变得更加智能。比如 TiDB 的优化器如何更智能地选择，到底使用行存还是列存，还是让行列同时使用；最下面是内核层，所有人对此的关注点都一样，就是高可用、高性能。  \n\n![TiDB 存储引擎持续提升.png](https://img1.www.pingcap.com/prod/Ti_DB_2684b39c37.png)\n\n在内核层，TiDB 的存储引擎使用了一个持续升级的策略——部署一代、研发一代、预研一代。今天我们听到的所有关于 TiDB 的讨论，其实都是基于部署一代的体感，不少用户还使用着 TiDB 3.0、4.0，而这已经是四五年前的版本了。当然我们也希望用户能更快升级到最新版本，享受到新版本带来的优势，每一个新版本都会带来巨大的性能和稳定性提升。7.0 版本发布的实验特性 Partitioned Raft KV 就带来了巨大的性能提升。前面预测未来几年数据会扩大 10 倍，部分领域会扩大 100 倍，在如此大的数据规模下面我们的数据库能力是不是也能同步扩大 10 倍、100 倍？这是 Partitioned Raft KV 解决的问题。我们预研一代的存储引擎 Cloud Storage Engine 已经在后面要提到的 TiDB Serverless 中应用，我们的 CTO 黄东旭在后面的演讲和 Blog 中都有详细的解读。  \n\n如果大家留心就会注意到，过去一年时间里 TiDB 的 Online DDL 的速度提升了 10 倍。设想一下，我们有一个 100TB 的表，加一个索引要多久？对系统资源的消耗又是什么样的？除了 DDL，还有一点是 TiDB 的扩缩容的速度在这个引擎里面提升了 5 倍，这也意味着数据丢失的风险降低 5 倍，业务中断的风险降低 5 倍。\n\n## 平替还是跃迁？TiDB 产品家族的协同演进\n\n经过多年发展，TiDB 目前已经拥有三大产品家族：一是面向企业级市场的 TiDB 企业版，服务于企业级关键业务场景；二是全托管的 TiDB Cloud，提供云端一栈式 HTAP 数据库服务，已经成为欧洲、北美、日本、亚太地区众多数字原生企业的选择；三是刚刚正式商用的 TiDB Cloud Serverless，一个 AI Ready 的数据库，以极简架构、极致体验和超低门槛为云上开发者、创业公司提供低至零成本的选择，较 TiDB 社区版和 MySQL RDS 更具成本优势。  \n\n![TiDB 产品家族协同演进.png](https://img1.www.pingcap.com/prod/Ti_DB_9c9ef534c9.png)\n\nTiDB 是如何在多个版本间协同演进的？从上图可以看出，最上面有一个 TiDB 的 Open Core，TiDB 的所有这些版本都是基于共同的 Root 生长出来，去适应不同的客户和不同的使用场景。  \n\n![TiDB 企业版.png](https://img1.www.pingcap.com/prod/Ti_DB_35ca97f365.png)\n\nTiDB 企业版已经拥有很多大行、大型企业的使用经验，他们有些是从数据库一体机迁移过来的，在迁移过程中和 TiDB 一起积累了大量的迁移经验。最近 MySQL 5.7 马上就要结束产品生命周期（End of Life）了，用户应该怎么办？换一个数据库平替一下？我们的思路不一样，我们希望的是用户不仅仅是从 MySQL5.7 迁移到 TiDB，更要关注的是他迁移过来之后的获得的价值到底是什么。  \n\n我们希望 TiDB 提供的价值是“可持续、可扩展、可整合”。很多企业都有大量的 MySQL 5.7 ，有成百上千个 instance，管理和维护它们都是非常复杂的事情。TiDB 提供了资源共享的多租户能力，我们可以把更多的 MySQL 实例整合到一个或者多个 TiDB 集群，极大提升资源利用率，从而降低硬件成本，同步降低管理集群的成本。最近我们和一个客户交流，他们有很多 MySQL 实例，有的利用率不高，就直接降级，从原来的 8C 配置，直接降成 4C 或 2C 配置。过了一段时间，业务这边有个流量把系统卡死了，再给升级一下。过一段时间流量又下来了，再降级。这就很头疼，运维和开发的关系就很难处，降本增效的压力很大。这么多的 MySQL instance 一旦迁到 TiDB 上面，基于 TiDB 本身的资源共享能力，流量超了几倍都没问题，这就可以带来非常显著的降本增效。  \n\n![TiDB Cloud.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_b963ef4870.png)\n\n接下来是 TiDB Cloud，它在过去几年里得到了全球客户的认可，包括欧洲最大的移动出行公司 Bolt，北美新锐的 SaaS 公司 Catalyst，印度最大的电商 Flipkart，日本著名的游戏公司 CAPCOM 等等。  \n\n![TiDB Serverless GA.png](https://img1.www.pingcap.com/prod/Ti_DB_Serverless_GA_812a8f8373.png)\n\n最后是 TiDB Serverless。四年前，我亲手写下第一行源代码，探索新一代云上 Serverless 架构，这是预研一代的成果。非常幸运，预研一代的速度远远超出我们的预期，它现在已经正式商用了。过去几个月的时间里，TiDB Serverless beta 版已经拥有超过 1 万个活跃的集群。  \n\nServerless 带来了什么样的价值和能力呢？第一，低成本零元起步。TiDB Serverless 完成了 PingCAP 的一个梦想，我们有能力为全球每一个开发者提供一个免费的数据库。  \n\n我想稍微分享一个内部的小故事，最早 TiDB Cloud 的 free tier 成本是现在的 100 多倍。我们内部有个笑话，自己总是调侃说我们是“贵司”。“贵司”是什么意思呢？TiDB “贵”。因为比较的对象是 MySQL，作为一个分布式系统，TiDB 跟一般的系统比成本肯定高，起步就三个副本，还有计算层、调度层，跟单机比肯定是贵了。很幸运的是， TiDB Serverless 出来之后“贵司”终于不“贵”了。得益于 TiDB Serverless 采用的完全分离式的架构，不仅仅做到了存算分离，我们还做到了算算分离、存存分离，整个系统的弹性非常强，同时它的使用异常简单，用户体验非常好。我们收到大量用户的赞誉，超出了自己的预期。  \n\n大家都希望把自己的时间精力投资在自己的创新上面，投资在自己的业务上面，尽量不想再花时间在数据库上面，将所有复杂的事情都交给系统，交给 PingCAP 完全自动化处理。过去，大家可能会很好奇，这听起来好得有点过了，能做到吗？凭什么？  \n\n## TiDB Serverless 为什么比社区版更便宜？\n\n今天我们在云上面使用数据库或者使用传统的 RDS，不管是什么数据库，本质上都是买一个虚拟机，按照最高的峰值要求配置，不管你的业务现在跑的是什么量，哪怕 CPU 利用率是 1%，你也必须为它的 100% 利用率付费。这就是一个传统的计费模式，永远为最高的峰值付费。  \n\nTiDB Serverless 的创新在于，你永远只为你正在使用的资源付费。举个例子，你现在假设有 10 TB 的数据跑在 TiDB Serverless 上面，你没有任何访问，那所有的计算节点全部会被自动 shutdown，但你可以在百毫秒的时间内就马上让它启动提供服务。这是一个巨大的进步，用户仅仅为使用付费，使用曲线长什么样，TiDB 的计费就会长什么样。这就是为什么 TiDB Serverless 能够做到比现在的 RDS，比云上面部署社区版还要便宜，只要这个 CPU 的利用率低于 20%，全自动的弹性就会带来巨大的成本优势。  \n\n![经典数据库的跃迁路径.png](https://img1.www.pingcap.com/prod/_fdbb5572bc.png)\n\n今天，不管你使用的是经典的单机数据库、开源数据库还是云端的数据库，TiDB 都提供了成本更低，扩展性更强，更加省心的选择。  \n\n## 面向中国企业级用户，发布平凯数据库  \n\nTiDB 源于中国，很多关键特性也来自于中国复杂的用户场景，毫无疑问中国市场就是 TiDB 的根据地和大本营。最近我们和很多中国用户沟通交流，他们给了我们非常多的反馈，很多反馈都非常有价值，特别是对于 TiDB 未来发展的预期和展望。我们发现，TiDB 企业版经过五年的打磨，更多是面向全球用户提供通用性的功能，但是这些功能对于中国企业级用户来说还远远不够。  \n\n当下，随着 TiDB 逐步进入中国用户的核心场景以及 TiDB 规模化进入国产化生态，面向中国企业级用户的“平凯数据库”正式发布了。  \n\n![平凯数据库发布.jpeg](https://img1.www.pingcap.com/prod/_463e302b96.jpeg)\n\n简单来说，平凯数据库主要包含 TiDB Open Core 的稳定内核以及满足中国企业用户的增强级企业功能。第一，提供国产化需求的企业级功能，包括图形化管控平台、全链路数据迁移平台、安全特性等等；第二，提供更完善的国产化生态系统的接入功能，包括国产软硬件的适配，比如操作系统、服务器等等；第三，提供更完善的国产化企业级服务支持能力。  \n\n未来，我们希望平凯数据库站在 TiDB LTS（长期支持版）的基础上能为中国的客户带来更好的价值，我们希望这个过程是开放的，会定期在国内各个区域组织用户讨论交流的活动，我们希望大家能一起参与到未来平凯数据库的建设中来。","date":"2023-07-17","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"always-ahead-by-max-liu","file":null,"relatedBlogs":[]},{"id":"Blogs_495","title":"是时候了！MySQL 5.7 的下一站，不如试试 TiDB？","tags":["MySQL","TiDB"],"category":{"name":"观点洞察"},"summary":"随着 MySQL 5.7 EOL 到来，升级到一个更高版本、且有官方支持的 MySQL 似乎是最直接的方案，但是否有其他选择呢？我们是否可以找到一个既能满足当下不断发展的数据处理需求，又能克服当前 MySQL 技术限制的完美替代方案？","body":"## 导读  \n\n在 2023 年 10 月 21 日，MySQL 5.7 将达到其生命周期的终点（EOL,End of Life）。这意味着 Oracle 将不再为 MySQL 5.7 提供官方更新、错误修复或安全补丁。  \n\n自发布以来，MySQL 5.7 成为了许多应用开发者的首选的数据库，但日新月异的数据应用场景和技术也对数据库技术栈提出了新的需求。随着 MySQL 5.7 EOL 到来，升级到一个更高版本、且有官方支持的 MySQL 似乎是最直接的方案，但是否有其他选择呢？我们是否可以找到一个既能满足当下不断发展的数据处理需求，又能克服当前 MySQL 技术限制的完美替代方案？  \n\n本文将介绍一些可能的替代方案的优缺点，重点探讨分布式数据库（如 TiDB）的架构优势。\n\n## MySQL 的发展及面临的挑战\n\n当下，数据价值越来越受到企业的重视，“数据驱动”也成为了一个重要的课题，事务性数据处理方式在过去十年中发生了巨大变化，实时、海量的事务处理日益成为主流，同时对从这些数据中获得即时的分析和洞察的需求也依然存在。然而，MySQL 在应对这些不断演进的需求时存在一些局限性：\n\n- 扩展性：面向写入密集型应用程序，MySQL 的性能变得不稳定。当数据规模超过单个节点的容量时，性能会受到影响。\n\n- 高可用性：虽然 MySQL 提供了复制和集群等功能以实现高可用性，但要有效地设置和管理这些功能需要仔细规划、配置和持续监控。此外，传统的 MySQL 复制可能出现延迟，进而导致数据不一致。\n\n- 实时分析：随着企业对事务性数据的实时洞察的需求增加，在 MySQL 架构中将联机事务处理（OLTP）和在线分析处理（OLAP）系统分离的架构会产生性能上的瓶颈。分析查询可能会影响事务处理的性能。而使用单独的分析数据库处理这些查询则增加了技术栈复杂性。\n\n- 应对现代架构：现代架构向云原生和微服务的转变对 MySQL 这样的单机系统提出了挑战。\n\n当企业的基础设施无法满足需求，数据规模从 1TB 增长到 100TB+，同时仍期望保持相同的性能时，这些限制带来的不便就愈发明显。\n\n## 探索替代方案：MySQL 5.7 EOL 后，何去何从？\n\n随着 MySQL 5.7 EOL 即将到来，现在是重新评估选择并为未来的数据处理能力做好准备的时候了。\n\n### Option 1 升级到官方支持的 MySQL 版本\n\n这涉及从 MySQL 5.7 迁移到较新版本，如 MySQL 8.0，由 Oracle 提供维护和支持。\n\n- 优点：这个选项确保了对现有 MySQL 架构的持续支持，能够持续获取新功能和性能改进。通常，这是最简单的选择，因为它对现有基础设施和应用代码的改动较少。\n- 缺点：升级到较新版本的 MySQL 并不能解决 MySQL 架构导致的扩展性、高可用性和处理现代云原生架构相关的固有挑战。同时，它还依赖于 Oracle 接下来的战略方向，比如对 MySQL 产品的支持力度。\n\n### Option 2 采用第三方 MySQL 商业版本\n\n像 MariaDB 和 Percona Server 这样的 MySQL 分支版本是由第三方公司独立开发，为 MySQL 用户提供了替代路径。\n\n- 优点：这些分支版本通常能够比 MySQL 本身更快地引入功能和性能改进。转向分支版本可以依旧获取持续的支持、与 MySQL 兼容的特性的熟悉性以及潜在的增强功能。\n- 缺点：与 MySQL 一样，这些分支版本在处理高并发的写入密集型工作负载，或在分布式架构中部署时仍面临挑战。此外，支持的力度可能有所不同，一些企业可能不愿意对由社区驱动的项目提供更多的支持。\n\n### Option 3 迁移到分布式数据库\n\n如果现有的应用程序需要超出单个 MySQL 实例所能提供的可扩展性和高可用性，那么分布式数据库（如 TiDB）可能是一个合适的选择。\n\n- 优点：分布式数据库将传统关系型数据库管理系统（RDBMS）的优点（ACID 特性、对 SQL 的支持）与 NoSQL 系统的优点（水平可扩展性、高可用性）结合在一起。特别是 TiDB，完全兼容 MySQL 5.7，使得迁移变得更加容易。\n- 缺点：迁移到分布式数据库的过程可能需要进行全面评估，而不仅仅是简单地升级 MySQL 或切换到分支版本。虽然 TiDB 兼容 MySQL，但可能不支持某些 MySQL 特定的功能，并且可能需要对现有的应用程序代码进行一定范围的调整。\n\n## TiDB - 兼容 MySQL 的分布式数据库\n\n想象一下，如果既能够像操作 MySQL 一样熟悉，同时又获得分布式数据库系统的可扩展性和可用性，那该多好？这恰是 TiDB 所擅长的。\n\n[TiDB](/product/) 是由 PingCAP 开发的领先的开源分布式数据库。它无缝地结合了关系型数据库和 NoSQL 数据库的优势，将传统关系型数据库管理系统的 ACID 特性、 SQL 兼容性与 NoSQL 系统的水平可扩展性相结合。\n\n![TiDB 的架构.png](https://img1.www.pingcap.com/prod/Ti_DB_f4af222207.png)\n<center>图 1：TiDB的架构</center>\n\n以下是 TiDB 提供的主要功能的详细介绍：\n\n- 水平扩展性：TiDB 的分布式架构允许数据自动分片到多个节点上。随着工作负载的增长，您可以轻松地向集群添加更多节点来处理不断增加的需求，而不会出现显著的性能下降。\n- 高可用性：TiDB 通过在多个节点上复制数据来保持数据的冗余，并实现了自动故障切换。即使集群中的一个或多个节点故障，也能确保您的数据保持可访问状态。\n- 强一致性：在许多分布式数据库中，一致性和可用性之间存在权衡。但是 TiDB 不是这样。它使用一种称为 Percolator 的分布式事务协议，保证了快照隔离一致性，确保集群中的所有节点对数据具有一致的视图。\n- MySQL 兼容性：TiDB 支持 MySQL 协议，并且与 MySQL 语法具有广泛的兼容性。这意味着许多现有的应用程序、框架和针对 MySQL 设计的工具可以与 TiDB 一起使用。\n- 实时分析：TiDB 利用 混合事务/分析处理（HTAP） 的能力，实现实时运营分析。TiKV、TiFlash 可按需部署在不同的节点上，解决 HTAP 资源隔离的问题。TiDB 提供了一个统一的平台，用于即时高效地分析运营数据。\n- 云原生架构：TiDB 设计时考虑了云原生的原则，因此非常适合在云环境中部署。它支持 Docker 和 Kubernetes 等容器化技术，并集成了阿里云、AWS、GCP 等云平台。\n\n## 总结\n\n数据库选型是一项关键决策，它对组织的增长和成功有着重大影响。随着 MySQL 5.7 EOL 到来，现在是 MySQL 用户进行评估、计划并为未来做好准备的时候了。如果您面临可扩展性、高可用性、实时分析或适应云原生架构等挑战，从 MySQL 迁移到分布式数据库（如 TiDB）可能是一个理想的选择。\n\n然而，同样重要的是，要认识到 MySQL 和 TiDB 在 MySQL 生态系统中可以共存并相互协作的可能性。许多客户已经意识到同时使用 MySQL 和 TiDB 的好处，特别是对于大规模应用程序而言。通过在使用 MySQL 的同时，企业利用 TiDB 可以实现更高的可扩展性、高可用性和混合工作负载处理能力。这种协同作用可以实现无缝的数据管理，并满足现代应用程序不断发展的需求。\n\n准备开始迁移之旅了吗？立即申请 TiDB 企业版试用，与我们的专家交流，探索 TiDB 的强大潜力和可能性！\n<a class=\"button is-primary is-normal\" href=\"/contact\" >联系我们</a>","date":"2023-06-28","author":"Bhanu Jamwal","fillInMethod":"writeDirectly","customUrl":"try-tidb-after-mysql-5.7-eol","file":null,"relatedBlogs":[]},{"id":"Blogs_471","title":"黄东旭：狂飙的 ChatGPT ，如何颠覆数据库交互形态？","tags":["ChatGPT","TiDB Cloud","Serverless","HTAP"],"category":{"name":"观点洞察"},"summary":"AI、Serverless 和 HTAP 的结合将是数据库发展的新里程碑，ChatGPT 只是个开始，接下来肯定会有更多更强的产品，在通向真正的 AGI 这条路上涌现。","body":"今天凌晨，OpenAI 发布了万众期待的多模态预训练大模型 GPT-4，它被称为迄今为止功能最强大的模型。自从问世以来，ChatGPT 在短短几个月间已经迅速引爆了整个科技领域。\n\n我在它刚发布的时候就开始用，现在几乎已经完全离不开它了，包括写文档、写邮件、写代码等工作，基本都在用 ChatGPT 辅助完成。\n\nChatGPT 可能是这个时代做出的第一次接近 AGI （Artificial general intelligence，通用人工智能）的产品。从 ChatGPT 的表现来看，它已经不是针对某一个具体细分领域的 AI 应用，而是拥有一些通识的系统。最令我惊讶的是，它其实已经具备了一些逻辑推理的能力，这是之前任何 AI 系统都没有达到的水平。\n\n目前基于 ChatGPT 提供的相关能力已经出现很多非常火的应用方向：\n\n第一个是最简单的翻译。ChatGPT 的翻译能力特别强，你丢给它一篇文章，或者丢给它一段文本，可以让它直接生成一段 summary，或者做特征关键字提取，这是目前一个很典型的应用；\n\n第二个应用是做数据清洗，比如你手上有一份 Excel 或者 CSV 文档，或其他任意的数据。过去做数据质量评估，需要很多文职人员手工去整理。现在，你丢给 ChatGPT 一个 CSV 文件，可以让它直接帮你去做类似纠错或者数据清洗的工作；\n\n第三类应用是我个人比较感兴趣的，是跟开发者相关的东西，比如代码生成，或者像 copilot 这样的应用；其他还有一些像比如帮你写文章或者帮你写邮件的应用。\n\n## ChatGPT 对于数据库技术的重大利好\n\n现在， ChatGPT 背后的这些能力其实都是构建在数据上，这对于数据库或数据存储技术来说，是一个特别大的利好。那它对数据库都提出了哪些新要求呢？我们首先来看下过去大家在使用数据这件事情上会有哪些特别痛苦的点：\n\n第一，数据存储。过去当你面向的是一堆单机数据库，而且是能力很弱的，比如 key value 或者一些支持的 workload 特别有限的数据存储技术，你就会发现很容易会造成一个个数据孤岛。而数据的价值只有在不断交叉或者不断交互的过程中，才能产生更高的价值。数据孤岛导致数据虽然存下来了，但是没有办法从中获取到更多的价值。\n\n假设有这样一个分布式 SQL 数据库，你能够很方便地与不同部分的数据，不同的表做关联交叉分析。这看起来很好，但它带来的挑战是数据存下来后，怎么快速地把数据或者 insight 变成一个在线的 service，这件事情其实过去是 OLTP 数据库干的。过去很长一段时间， OLTP 和 OLAP 是完全分开的两个系统。OLAP 当然可以做很复杂的 join 分析以及查询。但是你不可能直接拿一个数据仓库或者 OLAP Database 作为在线服务 ，对外实现数据变现。你还是得把它放到另外一个 OLTP 的 Database 里。\n\nHTAP 数据库的出现，解决了两个问题：一，数据能存下来，同时底层是打通的，不用担心会产生很多数据孤岛；二，这些复杂的 query、数据的 insight ，能够直接变成一个 OLTP 或者 online service 对外提供服务。ChatGPT 很难在一个分库分表的数据库上生成正确的 SQL，这有点像巧妇难为无米之炊。但是它可以直接生成 SQL，跑在 HTAP 的 database 上，这样整体的效率就能提升很多，完成一个这样的数据 insight 的应用门槛就会低很多。\n\n第二，数据变现。越来越多的公司都有一个叫做数据中台的部门， CEO 或者业务人员经常跑去跟数据分析师说，我想要某个数据，你帮我去跑 query 查询一下。但这里面又形成了一个矛盾， CEO 或者企业管理者是懂业务的，但是他不懂 SQL，数据分析师懂 SQL，但是又不太懂业务。ChatGPT 这种 AI 的出现，对于管理者来说，就相当于有了一个贴身的智能助理。你可以直接用自然语言和它说，我有一个决策要做，你先在 database 帮我把数据跑一遍，看看我问的问题的结果是什么。相当于直接将数据变现的门槛给降得很低，这对于数据中台或者数据分析师的行业可能会比较冲击。\n\n## 我们如何将 ChatGPT 融入 TiDB?\n\n对我来说，ChatGPT 最大的挑战其实是想象力。我们应该如何去使用它，怎么把它的能力尽可能地在不同行业里放大，这是我最近一直在想的事情。\n\nChatGPT 对我们这种基础软件公司来说最大的意义在于，原先很多普通人用不了这个软件，只能通过程序员或者 DBA 去操作。但现在 ChatGPT 一下把数据库的使用门槛变成了任何人都可以使用。你只要能够清楚地描述要干什么，它就能够在数据里帮你提取 insight。从这个角度看，ChatGPT 是一个具有非常深远意义的产品形态，所以我们第一时间就把它的能力集成到了 TiDB Cloud 服务里面——发布了一个自然语言转 SQL 工具  Chat2Query。\n\n![Chat2Query Demo.mp4](https://img1.www.pingcap.com/prod/Chat2_Query_Demo_554f072140.mp4)\n\n现在，大家都在讨论 ChatGPT，但事实上你可以认为 ChatGPT 只是 OpenAI 的一个 Demo，其背后的模型应该是 GPT 3.5 的一个大语言模型。OpenAI 把这些不同的语言模型通过 Open API 的方式暴露给全世界所有的开发者，并根据你的调用收取费用。开发者就可以基于这些 API 去做自己的应用，我们就是把它的 API 用到了 TiDB Cloud 里，封装在我们的产品后面。\n\nChat2Query 一经推出就非常火，很多开发者在上面构建了一些非常有意思的应用。一方面，它帮助 engineer 提升了不止一个数量级的开发效率；另一方面，它结合了 ChatGPT 的能力能够自动帮你写出 SQL，这使得整个数据库软件的形态都发生了变化。\n\n熟悉我们的朋友大概都知道，我们去年做了一个叫 OSS Insight 的开源社区数据分析平台。它最近推出了一个新功能 Data Explorer。你可以用自然语言去向它问问题，系统会自动给你答案。比如你可以问能不能为某个具体的 GitHub ID 生成一个 summary 报告，看这个 ID 平时是在贡献代码还是在提交 issue，或是只点赞。\n\n![OSS Insight Data Explorer Demo.mp4](https://img1.www.pingcap.com/prod/OSS_Insight_Data_Explorer_Demo_f81c51633e.mp4)\n\n过去通过写 SQL 当然也可以做这件事情，但是 Data Explorer 功能可以让你用自然语言去问这个问题。它通过 OpenAI 的 API 将自然语言转变成一个等价的 SQL，用这个 SQL 去背后的 TiDB 数据库中进行查询。\n\n其实，自然语言生成 SQL 也不是什么特别新鲜的事儿，以前就有过很多的相关研究论文。这件事最让我感到震惊的是，ChatGPT 并不是一个专门针对解决自然语言到 SQL 转换问题而设计的一套系统，但是它产生的结果出奇的好。\n\n你只要告诉它一些简单的 prompt 或是一些 hint，比如这张表大概长成什么样子，注意一些 rules 等。同时还要提醒它在写 SQL 时，最好用最佳实践。通过这些简单的 prompt ，就能让 ChatGPT 生成非常高质量的 SQL。它生成的 SQL 其实已经超越了很多专门为解决此类问题而设计的系统。\n\n而且你会发现，我告诉 ChatGPT、OpenAI 系统的这些 prompt 信息里，并没有提供更多的信息增量。这是什么意思呢？就像你教一个小朋友做数学题，你教他的并不是怎么解具体的问题，而是告诉他应该好好审题，并再仔细想一想，这一次解题需要先去解答哪些子问题。我们只是在告诉系统如何思考问题的方式，系统就能够以一个更高的成功率去回答你想要问的问题。\n\n未来，可能会产生一个新职业——Prompt engineering。在使用 OpenAI 的这些 ChatGPT 能力的时候，其实是有一定技巧的，很多人在使用 ChatGPT 的时候会觉得它经常胡说，但其实我们在用 OpenAI 根据表结构信息生成 SQL 时，不能简单地告诉它生成满足问题的 SQL，而应该在中间的上下文里提供很多的提示词。\n\n举个我用过的几个 Prompt 例子：第一，我让它想象一下自己是一个 Python 编译器，或者想象一下是一个程序员，“下面你的任务是把这个问题改写成一段 Python 的程序”；第二，让它想象一下自己是一个 Python 解释器，把刚才生成的代码放到自己假想的解释器里去运行，最后把解释器返回的结果返回来。最后你会发现，当你把上下文 Prompt 一列进去，它的回答正确率大大提升，这个就是 Prompt engineering 一个很有趣的例子。Prompt engineer 本质上是在教它一些思考方式，你只要告诉这个机器 let's think step by step，正确率就能提升很多。\n\n## AI+Serverless+HTAP，数据库发展新里程碑\n\n过去这几十年，数据库只有一种形态，就是增删改查，写 SQL。对于计算机软件来说，每一次人和软件的交互方式的变化都会促成一个巨大的革命，或者是一个变革，ChatGPT 的出现就像互联网的发明，或者蒸汽机的发明一样，必然会引发一次变革。AI+Serverless+HTAP，这几个东西融合在一起将成为数据库发展中非常重要的里程碑，它会改变接下来数据库软件本身的形态，甚至是商业模式。\n\nChatGPT 刚出来的时候，大家第一反应都会觉得它像搜索引擎，但我觉得不是，它并不是搜索引擎，它更像基础设施。ChatGPT 本身这个 demo 是用一个 chat board 的形式呈现在人们面前，但它真正有意义的是封装在这些应用之下的能力。未来几年，不管你做什么行业，你都要去想一想怎么去跟 AI 进行结合，不要觉得它只是 IT 圈的事，我觉得这是任何行业都有的机会。\n\n我们千万不要低估大语言模型在未来会对人类社会产生的影响，它不再是简简单单的一个聊天机器人，它会深刻地改变所有行业。比如给程序员做辅助，它能够让一个很强的程序员的生产力提升 10 倍、 20 倍。我现在用 ChatGPT+ Copilot 后，基本不再手写太多代码。我只要把问题描述清楚，它就能够把这些这些代码生成出来，我最多在上面再做一些微调。虽然它不是百分之百正确，但已经节省了我百分之七八十的工作时间。这里面最核心的一点就是我们要放弃掉一个执念—— AI 不如人类强的固有观念。过去很长一段时间一谈到 AI，可能就是调调参，做个推荐系统。但现在以 ChatGPT 为代表的产品已经能实现非常多的功能，我们不能再用传统的眼光去看待这个事物。\n\n**ChatGPT 只是个开始，接下来肯定会有更多更强的产品，在通向真正的 AGI 这条路上涌现**。\n\n[立即体验 Chat2Query 完整能力](https://tidbcloud.com/free-trial?utm_source=website-zh&utm_medium=referral&utm_campaign=chat2query_202301)\n\n","date":"2023-03-15","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"how-does-chatgpt-revolutionize-the-database-interaction","file":null,"relatedBlogs":[{"relatedBlog":{"body":"12 月 1 日，以\"去发现，去挑战\"为主题的 PingCAP DevCon 2022 主论坛在线上成功举办，为数万观众带来一场技术盛宴。PingCAP 联合创始人兼 CTO 黄东旭，在大会上分享了 “The Future of Database” 的主题演讲，分享了他对云原生、开发者生产力的理解，介绍了 Serverless HTAP 的意义以及未来的“技术无感化”发展方向。以下为演讲实录，全文约 7000 字。\n\n首先感谢所有用户，用户的使用是支撑 PingCAP 一直进步的最重要动力，每年看到 TiDB 越来越普及，用户越来越多，就感觉肩上的担子又重了。\n\n![1.png](https://img1.www.pingcap.com/prod/1_93f0db213c.png)\n\n在过去一年中，TiDB 有一个最重要的变化——发版节奏和模型发生了变化。今年，TiDB 第一次引入了 LTS 版本，以及形成了以两个月为周期的迭代发版节奏。此外，特别值得一提的是，今年 5 月 TiDB Cloud 正式 GA，去年我提到云的意义在于加速软件的迭代速度，短短大半年时间 **TiDB Cloud 已经进行了超过 34 次迭代，增加了上百个功能特性和改进**。这个迭代速度比 TiDB 内核本身的迭代速度更快，这也印证了之前我对于云的判断。\n\n## 数据库的“第一性原理”\n\n埃隆·马斯克有一个很有名的“第一性原理”，这些年我一直也在思考这个问题，对于一个数据库厂商或者数据库产品经理来说，数据库软件的第一性原理是什么？**对于数据库来说，一个很本质的问题是 developer 到底需要什么样的数据库**。这里说的 developer 并不是指数据库开发者，而是那些真正开发应用的开发者。为什么这么说呢？其实数字化转型也好，各种应用创新也好，其背后的驱动力到最后都是一行一行代码，而这些代码都是开发者写的。对于数据库软件来说，真正的用户其实就是开发者。\n\n![2.png](https://img1.www.pingcap.com/prod/2_81894f8cfc.png)\n\n上图是一项关于“在你的组织内部到底是谁在选择 Database”的调查，可以看到排名第一的是架构师、第二是开发者、第三是 DBA，三者加起来达到了超过 80% 的占比。这些人都是广义上的开发者，对于数据库软件来说真正的用户其实就是这些人。\n\n![3.png](https://img1.www.pingcap.com/prod/3_7b2415a552.png)\n\n数据库里另外一个大的趋势是 Cloud。我觉得今年已经不用再强调 Cloud is the future，从 Gartner 的报告可以看出，今年全球企业在 Cloud 上的投入已经超过了私有化数据中心的投入，并且每年的增速都非常快。\n\n![4.png](https://img1.www.pingcap.com/prod/4_4c3a3da5dc.png)\n\n在数据库领域中也有着同样的趋势，上图是云数据库和私有化部署的数据库软件的占比趋势。大家可以看到，2019年时，云上的数据库服务（Database as a Service）还不到传统数据库的一半，但今年几乎接近一样，可以预见明年一定会超过。所以，云是毋庸置疑的趋势，**在未来的数据库产品中，Cloud 一定会变成数据库服务的承载平台**。\n\n## 如何解放开发者的生产力？\n\n这次分享的主题依然是“The Future of Database”，要讲的是数据库的未来会是什么产品形态。谈到这个话题，我的思考习惯是先关注现在数据库到底有哪些痛点，开发者到底在为什么烦恼。\n\n![5.png](https://img1.www.pingcap.com/prod/5_f5295269ca.png)\n\n从这张图可以看出，开发者、程序员、DBA 日常的时间都花在了什么地方。你会发现他们 39% 的时间在做业务创新、在 Coding，41% 的时间在做基础设施维护，如买服务器、部署服务器、运维等等。这其实非常符合一个开发者的日常体感。有时候作为一个程序员，我想要雄心勃勃地做一个新的东西、新的应用时，会发现真正开发那个应用的时间可能只占整个时间的 10%-20% 左右，**大量时间都花费在买服务器、部署数据库、数据的备份恢复、CI/CD 搭建上，而不是在开发应用上面**。\n\n![6.png](https://img1.www.pingcap.com/prod/6_0bed9de7a1.png)\n\n这张图来自 a16z（美国一个特别著名的投资机构）在 2020 年底出的一份报告，他们提出了一套包治百病的数据架构“Unified Data Infrastructure”。当时看到这个架构的时候，我觉得它确实包含了我们遇到的各种各样的问题，这个架构确实能解决问题。**但另一方面，图中每个框其实都是一套非常复杂的软件**，这个架构的问题是框特别多、特别复杂，而且这些框之间互相的连接会把事情变得更加复杂。想象一下刚才提到的小例子，我在开发一个应用时要花很多时间去处理这些基础设施的问题，在这张图里，刚才这些不爽的体验要再乘十或二十倍，因为这些组件之间的连接会带来更多的复杂性。所以这个架构看起来很美，但实际上我们会花更多的时间去保障系统稳定运行。\n\n综上所述，**当今把开发者拖慢的最核心原因是开发者的生产力**，如果开发者的生产力提高了，业务创新、应用创新的速度就会变得更快。\n\n![7.png](https://img1.www.pingcap.com/prod/7_c761db6eb7.png)\n\nOSS Insight 是 PingCAP 自己开发的一个很好玩的 GitHub 数据分析工具，它抓取了 GitHub 上所有的信息和实时的数据，提供一些数据的洞察服务。这样一个看起来很简单、很有意思的小应用，**如果用传统的思路去构建系统，你就会发现要用一大堆不同的技术栈串联在一起才能实现，并且每一个技术栈还有着自身复杂的运维成本**。\n\n过去 20 年我们发明了太多的技术，太多不同的 Database，每一种 Database 都有着自己复杂的概念与运维。作为一个开发者，要想把它用好，就需要把这些东西都学习一遍。业界有一句特别真实的笑话：别发布了，别做新的东西了，我真的学不动了……**这些复杂的概念现在都没有被隐藏起来，反而全都透传给了开发者**。举一个简单的例子，如果你想在云上选择机型，就会发现不同的公有云厂商会有好多机型推荐给你，如 i3.xlarge、i3.2xlarge、i3.4xlarge 等等，这些机型代号背后到底意味着什么？这都是系统架构的复杂性。\n\n更不要说背后的成本，**如果你在云上选错了机型或者选错了服务，就会发现最后的账单和你选了正确的机型或者服务有着天壤之别**。最近很火的 FinOps，说白了就是如何科学地利用云去省钱。这意味着什么呢？意味着就连计费方式以及筛选的策略对于用户来说都是非常复杂的事情，复杂到需要用另外一套工具来去做优化，以帮助用户作出正确的决策。\n\n![8.jpg](https://img1.www.pingcap.com/prod/8_923cb0c9a2.jpg)\n\n**我们再往前看一下，今天的开发者到底是怎么去思考开发应用的？**这里我想分享一个最近特别喜欢的公司——Vercel，是一个非常偏向于开发者开发流程和体验的平台，在它的首页有三个英文单词：Develop（开发）、Preview（预览）和 Ship（上线），这其实就是一个开发者的视角。用过的同学就会知道，在 Vercel 这个平台上，一个应用开发者只需要关注网站怎么做，只需要去写 code。其他的事情，包括发布、部署、CDN、流量全都由 Vercel 帮忙封装好了，开发者只需要将 100% 的时间都放在业务逻辑开发上就可以了。这是一个很好的方向，这意味着应用的开发门槛在降低。**未来，应用开发者对数据库的关注点会从数据库变成 API，甚至在更长远的的未来只需要关注 web 前端开发就好了**。\n\n## 用“抽象”解决复杂性\n\n综上所述，从开发者的角度，或者新一代开发框架的角度来说，开发门槛正在变得越来越低，应用开发者变得越来越多，那数据库、数据技术、数据处理技术栈，怎么解决复杂性带来的矛盾呢？\n\n我觉得解决这个问题的思路可以用一个词来描述——**Abstraction（抽象）**。为什么抽象如此重要？抽象怎么帮我们解决问题？\n\n对于基础软件或者软件开发来说，概念的抽象程度提高，会带来什么样的结果？**第一，架构的复杂性会变得越来越低**。我们想象一下云，原来没有云的情况下你可能还要去考虑一下硬件、网络、磁盘、存储、数据中心的租赁，但有云了之后架构本身的复杂性是降低的，你不需要了解这么多东西，因为云底下的东西已经被隐藏掉了。这意味着作为一个开发者来说，他的心智负担在降低。就像用 Vercel 开发应用的时候你不需要关注 CDN，Vercel 已经解决了 CDN 的问题。心智负担降低意味着开发者能更快地开发出应用，能花更多的时间专注于业务创新，这就是商业的迭代速度。所以为了解决刚才说的矛盾，我们在数据技术上应该进一步去做抽象。\n\n![9.png](https://img1.www.pingcap.com/prod/9_f8a1a72329.png)\n\n在聊数据库的 Abstraction 前，我们可以看另外一个例子——**计算能力的抽象**。上面这个二维图示中，竖轴是技术的抽象程度，横轴是商业创新的迭代速度（Go-to-Market Speed），我们用它来看一下刚刚这个理论是不是成立。\n\n图中左下角是 On-Prem，意味着 20 年前要做一个网站，还要关心买服务器、租机房、网络租用等，抽象程度很低，**开发者要花大量时间在这些与业务无关的事情上，这也就意味着迭代速度是慢的**。\n\n后来人们是怎么解决的？**公有云的概念出现了，把刚才那些复杂的硬件、部署、网络等数据中心的复杂性抽象掉了**。你拿到就是一台机器，它到底是不是真实的机器你不用关心。这时，你要再开发一个应用，只需要在公有云上开个账号，把应用部署上去，按月给钱就行了。这比起自己去折腾数据中心来说，迭代速度又快了一步。\n\n**再往上看，云原生的概念出现了**。云原生的核心计算单元是 Container，Container 是更高层次的抽象。在虚拟机时代，你依然要去考虑 VM 挂了怎么办，但是在 Container 世界里，Container 以及底下云的调度器都不用你管，意味着迭代速度更快。\n\n![10.png](https://img1.www.pingcap.com/prod/10_8a00437db7.png)\n\n在数据库的世界里“抽象”是如何去体现的？**抽象程度最低的是云本身的基础设施**，比如你要在云上私有化部署一个数据库，你需要自己去维护 MySQL 或者 VM。这时候你看到的是云的基础设施，它的抽象程度很低。**再往上一层，比如 PingCAP 几年前要基于云提供的基础设施如虚拟机、S3、容器，去开发出一个叫 TiDB 的数据库**。TiDB 提供了 SQL 能力，Scalability 能力，以及低延迟、高可用、分布式事务、HTAP、Geo-partition 等等一大堆数据库内核层面的能力。在这个阶段已经有很多用户说，“哇，TiDB 挺好用的”。\n\n**过去一年中，PingCAP 一直在把这个数据库技术变成一个数据库的云服务，也就是我们在做的 TiDB Cloud**。技术和服务的区别是什么呢？TiDB 技术本身就像一辆车里的发动机，或者一个火箭里的引擎。但是一个发动机跟一辆车肯定不一样，尤其在云上。对于一个在云上想要使用数据库服务的用户来说，他需要数据的导入、数据的导出、备份、智能诊断、多租户各种各样周边的东西，**把它们拼装在一起才是一个服务，而不是给用户一个发动机让你自己拼出一辆车**。\n\n这张图里有一条虚线，虚线之下作为一个数据库开发者或者一个数据库厂商来说，关注点其实是能力或者 feature ，就好比说发动机是不是稳定、是不是快、是不是省油，这些是能力驱动为主的一个抓手，但是在这条虚线之上整个驱动力会变成怎么去提升用户体验。你想要提供服务，就要从用户使用服务的全生命周期去考虑。比如他刚进来注册的环节、绑定信用卡的环节、数据导入的环节、使用、调优、备份的环节，同步到其他数据源的环节，每一个环节都要去考虑，这里面考虑的点就是用户体验，**用户体验是指引这个产品做得更好用的方向**。\n\n## 下一级别的“抽象”是什么？\n\n**“抽象”再往前一步是什么？我们给出的答案是“Serverless”**。一个月前 PingCAP 已经发布了 TiDB 的 Serverless 云服务。如果刚才那个理论是 OK 的，“抽象程度越高，开发的效率越高”，**Serverless 就会变成在云原生之后新的“抽象”**。对于数据库来说 Serverless HTAP 是一个更高级别的“抽象”，它意味着更高的开发效率。\n\n可能大家第一次听到  Serverless HTAP ，这到底是什么东西？意味着什么？\n\n![11.png](https://img1.www.pingcap.com/prod/11_cc3ffe56c2.png)\n\n第一，想象一下如果有这么一个数据库，它的**启动或者创建，你不需要关心任何部署细节**，也不用管有几个节点，而且它是召之即来，挥之即去的，几十秒之内就能准备好，一键就能创建出来；\n\n第二，这个系统虽然看不见底下的基础设施，但是它会**跟着业务的负载变化而自动匹配**。比如说你的吞吐大到一定程度，不用再停下来加服务器，系统会自动进行扩展。当你的业务峰值降下来了，比如说双十一过后业务流量下来了，这个系统还能够自动地缩回来，甚至缩到 0。能缩到 0 其实很重要，在没有业务负载的情况下，系统能变成 0 意味着系统不再收钱，而且当有业务流量再过来的时候它也能在很短的时间内又恢复提供服务；\n\n第三，**HTAP Database**。提供了一栈式的 SQL 能力，这是 HTAP 本身的能力；\n\n第四，**Pay-as-you-go**。有的人可能会说公有云不是也是 Pay-as-you-go 吗？Serverless 跟云有什么区别？我觉得二者当然都是 Pay-as-you-go，但是能不能以一个更细的粒度去提供 Pay-as-you-go 的能力？过去我们其实还是按照服务器、虚拟机这样的资源来去看待一个月多少钱，这个服务能不能粒度更细一些，只收业务流量的钱？尤其是对于偏分析的场景来说，有很多时候我们做大数据分析，比如每天半夜要去跑个报表，可能需要一千个虚拟机算，20 秒钟算完，然后再缩回来。每天可能就凌晨需要这么多 OLAP 的服务器，但是我不可能白天也买这么多服务器，就为了晚上算那一下，能不能更细粒度的 Pay-as-you-go，只算 20 秒的钱非常重要。\n\n第五，也是长期以来被各种硬核数据库开发商忽略的一点，但未来会越来越重要，**一个 Serverless 的 HTAP Database 一定要跟现代的开发者开发应用的过程体验深度整合**。举个例子，比如我们在笔记本上开发应用，现在如果有一个召之即来、挥之即去的数据库，我的开发体验其实是贯穿于整个开发流程里的。所以，过去我们其实一直在把数据库与开发者分开来看。数据库关注性能、稳定性，各种各样特别硬核的跑分，但是未来将是从开发者的角度考虑如何去使用数据库，让这个数据库帮助开发者更快、更流畅地构建应用。我觉得对于 Serverless 数据库来说，很重要的一个课题是从用户角度看，它应该融入到每天的、现代的开发体验中。\n\n## TiDB Serverless Tier\n\n![12.jpg](https://img1.www.pingcap.com/prod/12_28a125c2bd.jpg)\n\n听起来很美好，Does it even possible？**经过大半年的时间，我们终于把这个东西的第一个原型做出来了，并在 11 月 1 号上线公测，这就是刚才说的 [TiDB Serverless Tier](https://tidbcloud.com/free-trial)**。\n\n我自己写了一个小程序，在一个全新的环境下，通过代码启动一个 TiDB 的 Serverless Tier 实例。在这个过程里，我只是告诉这个程序，要启动一个集群，这个集群叫什么名字，然后把密码一输，20 秒之后可以直接拿一个 MySQL 客户端连上去了，这个时间未来会进一步缩短。想象一下，如果缩短到三五秒钟，这会极大地改变开发应用的使用流程和体验。而且你不用关心它的扩展性，即使上线以后，业务流量变得巨大无比的时候，它也能够很好地扩容上去，没有流量的时候，它还能缩回来。\n\n![13.png](https://img1.www.pingcap.com/prod/13_d375c3dd69.png)\n\n当然它背后其实有很多很多的技术细节，本文我们就不一一细说了。其中我们有一个原则，就是怎么利用好云提供的不同的服务，比如 Spot Instances、S3、EBS、弹性的 Load Balancer。TiDB 的 Serverless Tier 背后对于云上所有的弹性资源都进行了很好的整合，以及巧妙的调度，提供了一个极致弹性的用户体验。这个用户体验比原来的云原生数据库更往前跨越了一步，细节更少，抽象程度更高。\n\n![14.png](https://img1.www.pingcap.com/prod/14_9c843d72cd.png)\n\n这是系统的设计图，就不展开太多了，给大家展示一下这个东西还是挺厉害的。\n\n![15.png](https://img1.www.pingcap.com/prod/15_c8ed753a77.png)\n\n所以，**TL;DR 是存在的，也是有可能被做出来的**。当 TiDB Serverless Tier 上线以后，我们发现它一上线就把整个 TiDB 在云上的 cost 降低了。拿最小集群来说，现在对比今年年初，成本降低到 1/5。而且在可见的未来，这个成本会变得更低；第二就是启动的时间，在今年 3 月份的时候，在云上启动一个新的 TiDB 集群需要 15 分钟，如果自己部署时间可能更长。现在只要 20 秒钟，不远的未来这个时间会缩短到更短。\n\n## 云端 Serverless HTAP 数据库服务，意味着什么？\n\n![16.png](https://img1.www.pingcap.com/prod/16_a008ec4dc8.png)\n\n第一，**我们一开始花了很长时间去构建了一个稳定的数据库内核**，可以弹性扩展、自动 Failover、ACID Transaction 等非常硬核的基础能力。但这些都是基础能力，这些东西应该隐藏在发动机里。作为一个开车的人，不用关心变速箱里有哪些特性；\n\n第二，**HTAP 能够提供实时的一栈式数据服务**。用户不需要关心什么是 OLAP，什么是 OLTP。一套系统可以支撑所有负载，也不用担心 OLAP 负载影响 OLTP 的正常服务；\n\n第三，基础设施层面，**Serverless 部署的成本变得极低，极致的 Serverless 不用关心任何运维的细节**。你可以通过代码和 open API 控制这些集群的起停。在拥有更大规模的基础设施时，这点是非常重要的。Serverless 在处理更复杂或更大系统的时候，能显著减低复杂性；\n\n第四，**真正的按需计费**。Serverless 能够真正按照资源的消耗量来去计费。对于开发者来说，想用数据库的时候，只要招手它就来，不用的时候，也不用给钱，任何时候去访问它，数据都在那儿，也能对外提供服务。\n\n![17.png](https://img1.www.pingcap.com/prod/17_63cfa346cc.png)\n\n**在这样的 Serverless 架构下，我们其实还能解锁更多的能力、更多的可能性**。\n\n举个例子，S3 是 TiDB Serverless Tier 底下重度依赖的云对象存储服务。用过 S3 的肯定都知道它便宜，可用性很高。更重要的一点是数据共享，比如大家都在用 AWS，A 用户用 S3，B 用户部分数据也在 S3 上，比如说我想把我的数据共享给另外一个用户的时候，既然都在 S3 上，那共享就变得很简单。以前在私有环境下，你还需要把数据下载出来拷给他，再上传进去，然后才能做分析。如果是在数据量比较大的情况下，这几乎是不可想象的。这种新架构的**一种可能性就是真正能够做到 Data Sharing**，当然这里面肯定还涉及到包括隐私计算，各种各样的安全性问题。但从技术底层来说，这种产品形态并非不可能了。\n\n另一种场景，比如说我想做一个区块链的数据分析应用，但做这样的应用，第一步你得把数据准备好。区块链的数据其实也不小，经常是大几百 GB 或几个 TB 的数据。但如果在 S3 上有一个公共的数据集已经准备好了，那**在云上 Serverless 用户只需要在启动的时候，加载这部分数据就好了**。这些能力在云下是根本不可能完成的任务。\n\n![18.png](https://img1.www.pingcap.com/prod/18_dbfc30531d.png)\n\n这些能力具备后，数据库的商业模式会变成什么样子？在去年的 DevCon 上，我提出了一个猜想，“数据库作为一个软件形态本身会消亡，而数据库的平台化、微服务化会取代原来的数据库软件形式”。这个理论正在变成现实，今天，我们可以看到几乎所有的数据库厂商，都在云上提供服务。\n\n## 更进一步\n\n未来再往前一步，会发展成什么样子？\n\n**Serverless 其实是云上 Database Service 更进一步产品形态的体现**。现在我可能还需要去关注买多少个数据库节点，买多少个集群，但是在未来，真正从开发者的角度来说，他所关心的应该只有数据操作的 API ，这一层才是离业务更近的东西。另一方面，**当 Serverless 在云上被提供后，数据共享、交换就变成了一个很自然或者很简单的事情，那时候我觉得会出现一个叫做 Data market 的新商业模式**。\n\n记得我在上大学学数据库课程的时候，我的老师告诉我，这个东西很简单，你只要会写 SQL 就 OK 了。但我工作以后，发现还有 OLTP、OLAP、时序数据库、图数据库，以及各种各样稀奇古怪的数据库，你得学习一大堆东西，这些东西里面有无数的细节。\n\n**我们想把它做得很简单，把开发者的体验带回从前**。数据库本来就应该是很简单的东西，我们应该花更多的时间关注于业务的创新、关注于真正重要的事情，这些复杂的东西，就让它简单起来好了。\n\n未来真正重要的东西是什么？**是流畅的开发体验。这就是我们终极的前进方向**，也是作为一个基础软件提供商的担当。虽然前面说了这么多很技术的东西，但其实 Serverless 很简单，现在它已经变得触手可及，大家可以通过 TiDB Cloud 就可以立刻体验它。","author":"黄东旭","category":2,"customUrl":"frictionless-developer-experience-with-the-serverless-htap-database","fillInMethod":"writeDirectly","id":440,"summary":"12 月 1 日，以\"去发现，去挑战\"为主题的 PingCAP DevCon 2022 主论坛在线上成功举办，为数万观众带来一场技术盛宴。PingCAP 联合创始人兼 CTO 黄东旭，在大会上分享了 “The Future of Database”的主题演讲，分享了他对云原生、开发者生产力的理解，介绍了 Serverless HTAP 的意义以及未来的”技术无感化“发展方向。","tags":["HTAP","Serverless"],"title":"黄东旭：开发者的“技术无感化”时代，从 Serverless HTAP 数据库开始 | PingCAP DevCon 2022"}},{"relatedBlog":{"body":"> 本文基于 TiDB Cloud 生态服务团队负责人张翔在 PingCAP DevCon 2022 的演讲内容整理而成。\n\n\n数据库不是单一软件，而是一个生态体系。成为一款好用的数据库，除了产品自身的能力外，繁荣的技术生态体系也至关重要，既可以提升使用体验，又可以降低使用门槛。\n\nPingCAP 在 2022 年 11 月 1 日正式发布了 TiDB Cloud Serverless Tier，本次分享在介绍 Serverless Tier 的技术细节之余，全面解析 TiDB 的技术生态全景和在生态构建中所做的努力。阅读本文，了解有关 Serverless 的更多信息，以及 PingCAP 在技术领域的最新进展。  \n\n## 云时代开发者面临的机遇和挑战\n\n现在云已经不再是一个新鲜的事物，我们已经处在云的时代，与之前相比，云时代的开发者面临着与之前不同的机遇和挑战。在云时代，我们有着新的技术设施，我这里举几个例子，每个云厂商都会提供块存储服务、对象存储服务和弹性计算服务。块存储服务有高吞吐、低时延和高持久的特性。对象存储服务，比如 AWS 的 S3、国内阿里云的 OSS，提供了低成本的海量存储空间，并且这些存储还有着超高的可用性，甚至可以跨地域复制来进行容灾。而弹性计算服务，可以给我们提供多种规格的计算实力，而且还提供了不同的计费模式，当然，根据用户的诉求进行弹性伸缩，也是一个基本的能力。\n\n![云上基础设施.png](https://img1.www.pingcap.com/prod/_e855917813.png)\n\n有了新的基础设施，当然也有新的挑战。云厂商给我们提供了许多的云服务，并且云的初衷之一，就是让使用者可以减少很多的运维工作。但是如果你现在深度地使用云，仍然需要运维大量的云上基础设施。这些运维工作使得我们开发者的精力被分散，没法完全专注于业务本身。除了运维工作之外，如何使用好云也是一门学问，前不久我刚刚参加了 AWS 的架构师培训，其实如何多快好省地用好云，不是一件简单的事儿。云服务的使用者，很容易就会造成云上资源的浪费，产生不必要的高额费用，特别是在现在许多的云服务，仍然是按时间来收费的情况下。对于有多套环境需求的场景，比如说公司内部有多个团队，不同的业务有各自的环境诉求，或者在 CICD 的场景下，我们可能会有 preview、stage、product 的多套环境需求，购买多套的云服务会产生高额的费用，但是共享一套云服务则可能会产生资源的竞争，甚至出现测试环境影响生产业务的情况。云上的服务，比如说云上的数据库服务，现在的使用方式仍然是提前规划容量，然后始终按照购买的时候的容量进行工作和计费，如果后期需要调整，仍然需要人工介入，手动去进行扩缩容。\n\n![新基础设施新挑战.png](https://img1.www.pingcap.com/prod/_ec4e75048b.png)\n\n这个是我们目前在使用云的时候，遇到的一些挑战。那么为了解决这些挑战，PingCAP 推出了 TiDB Cloud Serverless Tier。Serverless Tier 是世界上首款的 Serverless HTAP 数据库，PingCAP 推出它，希望能够帮助开发者解决刚才所说的那些挑战，成为云时代的新的 HTAP 数据库解决方案。TiDB Cloud Serverless Tier 目前是一个 Beta 的状态。下面，我就给大家介绍一下 TiDB Cloud Serverless Tier。\n\n## TiDB Cloud Serverless Tier(Beta) 世界上首款 Serverless HTAP 数据库\n\n当然在之前，我们还是先来看一下传统的TiDB集群。这是一个经典的 TiDB 集群架构，可以看到这是一个非常典型的分层架构，计算层是 TiDB Server，每个 TiDB Server 都是一个无状态的计算节点，可以非常容易的进行横向扩容，存储层是 TiKV 和 TiFlash。TiKV 是我们的分布式行存储引擎，TiFlash 是列存储引擎，整个存储层通过分布式协议实现了一致分布式存储。在计算层和存储层之外，我们还有一个调度单元 PD，这里存储了整个 TiDB 集群的元信息。在这样的一个架构下面， TiDB 已经有了很好的表现。比如 TiDB 有着非常好的扩展性，无论是计算还是存储，能力都可以随节点数线性扩展。\n\n![经典的 TiDB 集群架构.png](https://img1.www.pingcap.com/prod/Ti_DB_9c8347d384.png)\n\nTiDB 已经在生产场景经历了数百 TB 规模的数据和百万级 QPS 的流量的考验。TiDB 还有着非常好的弹性，系统规模可以随着业务的需求进行伸缩。而且伸缩是完全在线进行的，不会影响已有的数据和请求。同时，对于系统中的热点，TiDB 也有能力自动发现，自动调度。TiDB 也有着非常好的容灾和高可用的能力，如果节点出现故障，上面的数据可以自动的进行转移，并且配合 PingCAP 推出的 TiCDC 工具，还能够做到实时的 CDC 同步，实现异地容灾。\n\n![TiDB 的特性.png](https://img1.www.pingcap.com/prod/Ti_DB_4d614cab43.png)\n\n但是这样的一个经典架构在云的时代，面对着完全不同的基础设施，存在一些问题。第一，share-nothing，刚才我们提到云厂商提供的基础设施，无论是块存储，还是对象存储，天然就有着高可用，高持久的特性，云厂商已经帮我们做了数据复制，但是 TiKV，TiDB 的存储层，仍然做的自己的数据复制。这在云上其实是多余的，数据的复制不仅仅是存储资源的浪费，同时还需要消耗大量的带宽，在云上，网络也是会造成非常高额的费用。第二，存储层状态重。这是因为每个存储节点，其实都存储着一些数据的副本，扩容转移一个故障节点都需要对这些副本进行同步，导致横向扩展的速度仍然不够快，也进一步导致难以利用云厂商提供的竞价实例，从而能够进一步的去降低成本。第三，TiDB 之前是一个非常经典的计算、存储、调度分离的架构。但是在云时代，这样划分的颗粒度仍然过大，每一个节点承担的责任过多，导致 TiDB 整体的弹性仍然不够，其实我们可以在云上，将更多的功能拆分出来形成单独的微服务，这些微服务可以独立的去进行扩容和部署，甚至这些微服务可以被多个集群去共享。如果拆分出更多的微服务，TiDB 集群整体的弹性会进一步上升。\n\n![TiDB 经典架构在云时代面临的挑战.png](https://img1.www.pingcap.com/prod/Ti_DB_320d177f6b.png)\n\n基于这些问题，其实 PingCAP 做了很多的努力，也都做了相应的改进，大家可以看到这是现在 TiDB Cloud Serverless Tier 的一个新架构。首先在存储层开发了 Cloud Storage Engine 一个新的存储引擎，图中 Shared Storage Layer 和 Shared Storage Pool 这两层组合起来就是新的 Cloud Storage Engine。现在新的存储引擎融合使用了云上的块存储和对象存储，并且消除了原来存储层冗余的数据复制，彻底的解决了之前所说的 share-nothing 和状态重的问题。这样的改造使得存储层的节点扩展非常容易，而且非常迅速，而且大幅度地降低了成本。\n\n![TiDB Cloud Serverless Tier 的一个新架构.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_Serverless_Tier_0842be8424.png)\n\n在计算层我们进一步地拆分了 TiFlash，TiFlash 现在它的计算存储已经可以去分离，TiFlash 的计算部分可以像 TiDB Server 一样，作为一个独立的组件去进行管理，去扩容。第二，我们引入了新的一层，叫做 Gateway。Gateway 代替了 TiDB Server 与用户去进行交互，它负责诸如连接管理、唤醒节点，这样的功能。它的出现使得我们所说的多租户成为一个可能。第三，我们池化了计算节点，在图上右边的部分，有多个 TiDB 和 TiFlash。我们将计算节点进行了池化，这样的设计进一步降低了计算层的成本，以及提升了计算节点唤醒的速度。计算层和存储层的改动，使得 TiDB Cloud Serverless Tier 支持了多租户。现在一套 TiDB Cloud Serverless Tier 集群，可以支持多个租户，每个租户都是完全隔离的。在用户看来，他们拥有的就是一套独立的 TiDB 集群。\n\n最后，我们还拆分了一些相对独立的功能，做成微服务，比如数据压缩服务，降低了计算节点以及存储节点的复杂性，提升了 TiDB Cloud Serverless Tier 的整体的弹性，后续我们还会继续对更多的微服务进行拆分。\n\n![TiDB Cloud Serverless Tier 的一个新架构优势.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_Serverless_Tier_4e2105769e.png)\n\n做完相应的改进，新的架构解决了之前所说的传统架构在云上的问题，更好地适应了云上的基础设施。这边总结一下，一是推出了 Cloud Storage Engine，可以融合地使用块存储和对象存储，并且消除了多余的复制，解决了两类问题，一是冗余的复制，二是高额的网络费用。第二，拆分出了更多的微服务，更好地使用了云上的弹性算力。整体的改动使得 TiDB Cloud 可以支持多租户。\n\n技术上的努力使得 TiDB Cloud Serverless Tier 拥有了非常新颖的能力。TiDB Cloud Serverless Tier 拥有全部的 TiDB 的 HTAP 能力，是世界上第一款 Serverless HTAP 数据库。我们优化了 TiFlash 的架构，使其更好地适应了云上多租户的场景。从刚才介绍的 TiDB Cloud Serverless Tier 的架构上可以看到，我们对计算节点进行了池化，多租户也共享了存储。所以，TiDB Cloud Serverless Tier 目前可以做到秒级创建一个 TiDB 集群，并且如果你长时间不使用，再次连接的时候也仅需数百毫秒的时间就可以恢复完整的集群。这个操作对于用户来说，是完全透明的，用户甚至感知不到。未来，我们会进一步优化这个时间，集群创建时间会持续缩短，唤醒时间也会从数百毫秒缩短到数十毫秒。\n\n作为一款真正的 Serverless 云数据库，当然，TiDB Cloud Serverless Tier 是完全无需用户去运维的。在使用方式上，不需要像传统的云数据库那样，提前去规划容量，在需要的时候进行扩缩容，TiDB Cloud Serverless Tier 会根据流量自动地进行伸缩，无需任何手动的操作。具备了这么强大的能力，TiDB Cloud Serverless Tier 的计费方式也是真正的按使用量付费，用户只需要为自己真正使用的资源进行付费，不使用，即使这些集群仍然在运行当中，你也无需支付任何的费用，这也是 TiDB Cloud Serverless Tier 区别于传统云数据库甚至于其他 Serverless 数据库的不同之处，这些数据库即使你不使用，但只要集群被创建出来，仍然会按照创建时的规格进行收费，这其实会造成极大的资源浪费。\n\n同时 TiDB Cloud 是支持多云厂商的，Serverless Tier 也将会继承这一点。目前 TiDB Cloud Serverless Tier 仅支持在 AWS 上创建，但未来一定会支持更多的云厂商，同时 Serverless Tier 还支持多个区域，满足用户时延和数据存储区域选择的诉求。\n\n![Serverless Tier 多云厂商支持.png](https://img1.www.pingcap.com/prod/Serverless_Tier_c1f90aa92d.png)\n\n讲了这么多，接下来我们来展示一个 Demo，这个 Demo 就是我们从无到有来创建一个 TiDB Cloud Serverless Tier 集群，这个其实也是基本上是所有用户唯一需要与 TiDB Cloud Serverless Tier 打交道的一个动作，因为刚才我们说了，一旦创建之后其实你不需要去运维，你也不需要去进行手动扩缩容，TiDB Cloud Serverless Tier 会根据你的流量自动进行扩缩容，我们开始看一下集群创建的过程。\n\n![TiDB Clous Serverless Tier 启动.mp4](https://img1.www.pingcap.com/prod/Ti_DB_Clous_Serverless_Tier_890d517246.mp4)\n<center>Demo 视频</center>\n\n我们只需要点击创建，如果你需要可以选择名字以及供应商以及 region，这里我们都是使用默认的。然后就进入了创建的一个过程，可以看到大概在 20 秒的时候整个集群其实就已经从 creating 的状态变成了 avaliable 的状态，TiDB Cloud Serverless Tier 现在整个创建时间大概就是在 20 秒左右，可能会上下有一定波动，基本是在这样一个量级。只需要 20 秒你就可以拥有一个完全工作的 HTAP 云数据库，并且后续不需要你进行任何操作以及与它有任何运维上的交互。\n\n![Serverless Tier 服务每个人.png](https://img1.www.pingcap.com/prod/Serverless_Tier_ac44924166.png)\n\n希望经过我们的努力，TiDB Cloud Serverless Tier 可以成为一个服务于每个人的 HTAP 数据库，TiDB Cloud Serverless Tier 现在拥有了完整的 HTAP 能力，可以处理复杂的工作负载，并且真正地按使用量付费，对于任何人都只需要为自己使用的计算资源和存储资源付费，不存在资源浪费的情况，具有非常高的性价比。对于个人开发者，TiDB Cloud Serverless Tier 每个月其实都提供了一定量免费的 Quota，只要不超过这个 Quota，对于个人开发者而言，TiDB Cloud Serverless Tier 就是一个完全免费的触手可及的 HTAP 数据库，对于 Startup 来说，TiDB Cloud Serverless Tier 可以跟随业务增长自动进行扩容，而且这个扩容完全是自动的，不需要手动介入。Startup 可以专注于他的业务本身去发展自己的业务，不需要为数据基础设施去操心。对于大公司而言，因为 TiDB Cloud Serverless Tier 超高的性价比以及非常迅速的创建恢复时间，使得云上资源不再成为一个限制，每个部门、每个环境都可以拥有自己独立的数据库，未来我们还会推出 data branching 更好地帮助企业客户，当然如果公司有跨云部署的诉求，TiDB Cloud Serverless Tier 也是一个非常完美的选择。\n\n## 数据库不是单一软件，而是一个生态体系，除了产品自身的能力，繁荣的技术生态体系也至关重要\n\n当然，对于任何一个数据库的使用者不可能仅仅与数据库软件本身打交道，同时需要使用大量的数据库生态软件，TiDB Cloud Serverless Tier 拥有非常丰富的生态，接下来我们就来看一下 TiDB 的生态。数据库不是单一软件，而是一个生态体系，除了产品自身的能力，繁荣的技术生态体系也至关重要。TiDB 从出生起就非常重视生态，所以选择了与 MySQL 兼容，并且在这个上面做了许多努力。\n\n因为 TiDB 是 100% 兼容 MySQL 协议的，所以 TiDB 与所有的主流语言都是兼容的，比如 Go、Ruby、Java 、Python、JavaScript 等等，还有更多。TiDB 兼容的远远不只这些语言，这里列了一些比较流行的语言，只要一个语言拥有 MySQL driver，它就可以使用 TiDB，使用 TiDB Cloud Serverless Tier，不管这个语言多么小众。\n\n![TiDB 与所有主流语言兼容.png](https://img1.www.pingcap.com/prod/Ti_DB_554d8a4168.png)\n\n在语言之上，TiDB 还与基本上所有的流行的 ORM 框架兼容，与语言的 driver 不同，除了协议层的兼容之外，ORM 往往在功能上对 MySQL 的兼容性有着更高的要求，TiDB 的一些扩展能力也需要去进行补齐。TiDB 在这个方面做了很多努力，首先针对一些 ORM 开发了自己的插件，比如对于 django 和HIBERNATE，我们开发了django-tidb 和 hibernate-tidb 插件。TiDB 也在产品本身的 MySQL 兼容性的能力上做了很多增强，比如，可能在应用中我们可以不用，但是对于许多 ORM 框架都非常重要的两个功能 savepoint 和外键。这两个功能对于很多的 ORM 框架来说都非常重要，很多 ORM 框架对他的依赖都非常重。在最近两个 TiDB 的版本中发布了savepoint 功能和实验版本的外键功能，这使得 TiDB 进一步提升了与许多 ORM 框架的兼容性。\n\n![TiDB 与基本上所有的流行的 ORM 框架兼容.png](https://img1.www.pingcap.com/prod/Ti_DB_ORM_4d492a6de4.png)\n\n除了语言的 driver 和 ORM 框架之外，TiDB 以及 TiDB Cloud 还可以集成许多流行的平台，我们这里罗列了一些主要的，比如在数据处理领域，TiDB 可以与 Spark、Flink、Databricks 这些流行的大数据处理框架以及平台结合使用，来构建企业的 ETL pipeline，形成统一的数据处理平台。同时除了传统的 ELT 平台，TiDB 还可以与海外非常流行的 modern data stack 体系进行集成，我们给 Airbyte 贡献了 tidb-source-connector 和 tidb-destination-connector，开发了 dbt-tidb adapter，使得 TiDB、TiDB cloud 可以完美地与 Airbyte、dbt 进行集成。\n\n当然 TiDB 还支持类似于 Metabase 这样的 BI 平台，分析 TiDB 中存储的数据。在 CDC 的领域 TiCDC 支持了 avro 格式以及 kafka sink，使得 TiCDC 可以支持将数据导出到 confluent 平台，同时我们还测试了与 arcion 平台的兼容性，可以使用 arcion 平台来做 TiDB 或者 TiDB Cloud 的 CDC。\n\n![TiDB 以及 TiDB Cloud 可以集成许多流行的平台.png](https://img1.www.pingcap.com/prod/Ti_DB_Ti_DB_Cloud_d9cebec8ae.png)\n\nTiDB 和 TiDB Cloud 很早就支持了使用 prometheus 和 grafana 作为监控平台，我们还支持将监控的 metrics 导出到 datadog 平台，还可以实现与 Serverless 部署平台 Vercel、Netlify 的集成，以及与 no-code workflow automation 平台，像 zapier、n8n 的集成，以及与 IaC 工具 Terraform 的集成等等。接下来深入到一些领域来仔细看下。\n\n首先来看 modern data stack 领域也就是我们所说的 ELT pipeline，注意，这里不是传统的 ETL pipeline，是 ELT pipeline。首先介绍一下 Airbyte 和 dbt，Airbyte 是一个 data pipeline 平台，它可以连接数百种数据源和数据汇，将数据源中的数据导出到数据汇中，然后在数据汇中对数据进行整理。基于此，用户可以通过 Airbyte 实现任意的数据迁移，它的口号就是 data from any source to any destination。dbt 是一个 data transformation 工具，借助 dbt 用户可以非常灵活地在数据库或者数据仓库中操作数据，进行数据变换。结合使用 Airbyte、dbt 和 TiDB Cloud，用户可以将任意数据源中的数据，比如在 salesforce 中的 CRM 数据，google sheets 中的表格数据，甚至是像 Instagram 这样 2C 应用中的企业运营数据导入到 TiDB Cloud 中。有了数据，我们可以利用 BI 工具进行数据分析，因为 TiDB 以及 TiDB Cloud Serverless Tier 是一个 HTAP 数据库，在面对分析型负载的时候，有着更好的表现。甚至，如果说用户有数据归档的诉求，可以继续将 TiDB 作为 Airbyte 的数据源，将数据导入到像 Snowflake、Databricks、Google Big Query 这样的数据仓库或者说数据湖中去。\n\n![ELT pipeline.png](https://img1.www.pingcap.com/prod/ELT_pipeline_1d6f0c2b6a.png)\n\n总的来说，用户如果结合使用 TiDB Cloud、Airbyte 和 dbt 建立一条 ELT data pipeline，一是可以使自己的数据设施 all in Cloud，整条流水线都可以拥有非常好的弹性，可以满足业务增长的诉求。同时云上的基础设施拥有很高的性价比，可以降低数据基础设施的成本，而且因为 all in Cloud，你无需运维，降低了数据集成的技术、费用门槛。二是可以加速企业内业务数据的流动，Airbyte 拥有上百种的数据连接器，用户可以直接去使用，无需自己设计、开发，从而企业内的数据分析师可以更快地进行数据分析，帮助企业发现新的商业机会，而不是把精力浪费在基础设施的重复建设当中。\n\n接下来看 Vercel，Vercel 是海外领先的前端部署平台。使用 Vercel 开发者可以非常迅速地将自己的 web 应用进行部署、分发给全球的访问者，在这个过程当中 Vercel 还可以加入到开发者的 CICD 流程当中，使开发者可以轻松地预览效果。同时借助 Vercel 遍布全球的边端网络，访问者可以以极低的时延访问 web 应用，获得极佳的用户体验。\n\n![TiDB Cloud 与 Vercel集成.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_Vercel_621504a689.png)\n\nVercel 本身作为一个 Serverless Frontend Infrastructure，它不具备持久化数据存储的能力，这也就意味着如果仅仅使用 Vercel 的能力，没办法去开发一个复杂的 web 应用。所以我们可以结合 Vercel 和TiDB Cloud Serverless Tier，从而获得一套完整的 web 开发的 Fullstack Serverless Infrastructure，和前面的 all in Cloud 的 data pipeline 一样，这套 Web App Develop Infrastructure 也是 all in Cloud，用户无需运维，基础设施可以自动扩展，并且具有很高的性价比。\n\n为了让用户更好地使用 Vercel 和 TiDB Cloud Serverless Tier，我们开发了 TiDB Cloud Vercel Integration ，你可以在 Vercel 的 Integration 市场中找到它，通过这个 integration，只需要简单的几次点击就可以连接 TiDB Cloud Serverless Tier 集群和 Vercel 项目。同时我们还开发了 TiDB Cloud Starter 模板，这个模板可以让用户通过几次点击和几分钟的等待，就从无到有地构建一个全球可访问的 web 应用。以下是一个简单的 demo 让大家来体验这套 Fullstack Serverless Infrastructure。\n\n![TiDB Cloud 与 Vercel 集成.mp4](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_Vercel_fe6ecc3d20.mp4)\n<center>Vercel Demo 视频</center>\n\n> 这是 Vercel 的 template 列表，先找到我们的 TiDB Cloud Starter 模板，进入模板的详情页，点击 deploy 进到一个流程页。首先因为这是一个模板，所以我们要基于这个模板来创建一个我们自己应用的代码仓库，这里选择 starter，你只要简单的一次点击就可以。  \n> 在这个过程当中集成了 TiDB Cloud Vercel Integration，这个页面就是 integration 的页面。这里选择我们想要的 Vercel 项目以及想要的 TiDB Cloud Serverless Tier 的集群，选择之后点击 integrate，这个 integrate 的过程就结束了。到这里我们需要操作的过程已经完全结束了，现在处在等待 Vercel 帮你构建项目以及部署项目的一个阶段。大家可以看到，创建我们自己的代码仓库点击了一次，进行 integrate 点击了大概一到两次，我们就完成了所有的操作。  \n> 接下来稍微等待一下，大家可以看到现在大概过了两分钟，整个部署和构建过程就完成了。我们到 Vercel 项目的详情页去点击 visit，可以看到这时候这里展示的页面就是通过模板构建出来的一个项目的主页，大家可以看到这上面的 URL 是一个所有人都可以访问的 URL，现在这个项目已经对全球可以访问了。任何人在地球上的任何角落现在都可以来访问 bookstore 这个项目，整个的耗时也就大概两三分钟。这个项目前端整个的代码应用逻辑是部署在 Vercel 的 Serverless 的架构上面，后端数据存储是存储在 TiDB Cloud Serverless Tier 集群中。  \n\n我们进入下一个生态 Terraform，Terraform 是业界默认的跨云 IaC 工具，使用 Terraform 可以使用代码来管理云基础设施，将它集成到我们的 CICD 流程当中，我们在前不久开发了 TiDB Cloud Terraform Provider，使得用户可以通过 Terraform 来管理 TiDB Cloud 的资源。像图上展示的，我们可以通过这样的一个 Terraform 文件来创建一个 TiDB Cloud Serverless Tier 集群。Terraform Core 会解析这个文件，将 TiDB Cloud 资源的相关定义都发给我们开发的 TiDB Cloud Terraform Provider，TiDB Cloud Provider 会调用 TiDB Cloud Go SDK 来操作 TiDB Cloud 的资源。PingCAP 已经和 HashiCorp 成为了技术合作伙伴，TiDB Cloud Terraform Provider 也已经是 HashiCorp 认证的 Partner Provider，欢迎大家使用 Terraform 来操作 TiDB Cloud 的资源。\n\n![TiDB Cloud 与Terraform集成.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_Terraform_25f74ea286.png)\n\n## 展望未来\n\n最后，我们一起展望一下未来，TiDB Cloud Serverless Tier 才刚刚发布，我们仍然有很长的路要走。\n\n目前因为刚刚推出，Serverless Tier 还没有向用户开放诸如像备份、恢复、监控、报警这样的能力，我们很快就会添加这些能力并对用户进行开放。我们还会开发 PiTR 和 Branching 这些功能，方便用户进行数据共享，将数据库纳入CICD。我们还会进一步地去降低创建时间和成本，期望 Serverless Tier 集群的创建时间能从现在的 20 秒降低到 5 秒，唤醒时间从数百毫秒降低到数十毫秒。后续会推出 Data API，Data API 是通过 RESTful API 的形式提供数据库的 CRUD 能力，未来除了 RESTful 之外还可能推出 GraphQL API。通过 Data API 希望 Serverless Tier 可以更好地与 Serverless 生态结合，服务边缘请求。现在很多的 Serverless 的部署平台加速从中心化的托管能力向边缘进行扩张。当我们使用边缘的一些托管 runtime 是根本无法发出像传统的 TCP 请求的，所以 Data API 的推出可以让 Serverless Tier 更好地与这些平台进行结合。\n\n![Serverless Tier 未来展望.png](https://img1.www.pingcap.com/prod/Serverless_Tier_88d42f9216.png)\n\n在生态方面，我们会进一步提升 MySQL 兼容性，对接更多平台，给用户提供更多选择。PingCAP 始终坚持开源开放的路线，TiDB 社区从诞生开始就开放并包，我们期望大家加入，共建 TiDB 的繁荣生态。","author":"张翔","category":1,"customUrl":"tidb-serverless-and-technology-ecology-overview","fillInMethod":"writeDirectly","id":466,"summary":"本次分享在介绍 Serverless Tier 的技术细节之余，全面解析了 TiDB 的技术生态全景和在生态构建中所做的努力。阅读本文，了解有关 Serverless 的更多信息，以及 PingCAP 在技术领域的最新进展。","tags":["TiDB","Serverless"],"title":"TiDB Serverless 和技术生态全景"}}]},{"id":"Blogs_464","title":"PingCAP 唐刘：一个咨询顾问对 TiDB Chat2Query Demo 提出的脑洞","tags":["TiDB Cloud","Chat2Query","OpenAI"],"category":{"name":"观点洞察"},"summary":"本文分享了唐刘在展示 Chat2Query demo 过程中的一些思考。探讨了想打造一款好的产品，从用户角度出发的思考方式以及与用户交流的重要性。","body":"> **导读**  \n> 近日，TiDB Cloud 发布了 Chat2Query 功能，在 TiDB Cloud 上通过自然语言提问，即可生成相应的 SQL，通过 TiDB Cloud 对上传的任意数据集进行分析。Gartner 也在一份有关 ChatGPT 对数据分析影响研究的报告中提及了 PingCAP 的 Chat2Query 产品。\n本文分享了唐刘在展示 Chat2Query demo 过程中的一些思考。探讨了想打造一款好的产品，从用户角度出发的思考方式以及与用户交流的重要性：当我们向用户展示产品能力时，我们往往习惯站在技术的角度出发，然而当用户并不具备完备的相关技术背景时，我们需要换位思考，了解用户的工作流程和思维方式，才能真正让用户理解和接受我们的产品。  \n\n最近一段时间，一件非常让我自豪的事情就是我们在 TiDB Cloud 上面发布了基于 OpenAI 的智能数据探索功能 - Chat2Query。见到朋友，我都会非常开心地跟他们去推荐这个功能，跟他们现场演示如何使用，每当看到他们 「aha」 的表情，这个成就感还是挺强的。\n\n![Chat2Query demo演示.gif](https://img1.www.pingcap.com/prod/Chat2_Query_demo_c5b8c43bb1.gif)\n\n但是，我推荐的朋友几乎全是有技术背景的人，所以当我跟一位不懂技术的朋友进行推荐的时候，我才突然意识到，我们的这款产品离好看以及好用，还有很长的路要走。\n\n因为我的朋友是一位咨询顾问，她对于世界 500 强的财务表报数据非常感兴趣。刚好，我手上有一份今年的财务数据，于是就开始给她演示如何在 Chat2Query 里面，智能对数据进行洞察。\n\n## 啥，什么是 Database？\n\n于是，我先开始上传数据，到了导入数据的面板，我上传完成文件之后，我突然意识到一个很好玩的事情，而恰恰在同时，我的朋友问了一个问题也印证了这个事情。\n\n![TiDB Cloud数据上传.png](https://img1.www.pingcap.com/prod/Ti_DB_Cloud_bb4039ea0c.png)\n\n因为我的朋友不太懂技术，更别提懂数据库了，于是她问了我一个看起来很傻的问题 - 「什么是 Database？」\n\n对的，这个问题看起来非常的低级，什么是 Database？对于一个做了这么多年，用了这么多年数据库的我来说，这问题貌似很简单。但在那个时候，我突然明白，在我看来非常显然的一个单词，对于很多用户来说是完全不可理解的。也许有人会说，我的朋友压根不是我们产品的目标客户，没准是的，但从另一方面来说，有多少人会立刻理解我们在上图那个操作？或者我们能不能将上面那个设置的步骤变得更加的简单和好用？\n\n## 用户的心智模型\n\n于是我就跟我朋友讨论：“你期望如何来使用 Chat2Query？”我朋友回答道：“我是一个重度 Excel 用户，对我来说，我要做的就是上传 Excel 文件，然后我就能对这个 Excel 进行分析了。”\n\n这里可以看到，我的朋友不知道什么是 Database，但其实她日常工作的 Excel，其实跟 Database 的概念是能联系上的，一个 Excel 就是一个 Database，而 Excel 里面的 Sheet 就是 Table。所以如果我朋友要用这个产品，一个更直观的方式就是她上传好一个 Excel 文件之后，我们默认的就按照这个文件名给她建立一个 Database，为 Excel 文件里面的每个 Sheet 建立对应的 Table，根本不需要暴露任何的 Database 和 Table 的概念。\n\n所以一开始，如果我跟我朋友先从 Excel 探讨，用她之前的知识体系来做映射，没准她会更容易理解我们产品。如果一开始，我们就能很好的支持 Excel 相关的概念和操作，没准对我朋友就是一个替换 Excel 的首选了。\n\n## 好看又要好用\n\n数据导入成功之后，我们进入到 Chat2Query，自然我知道，我的朋友不会使用，即使 get started page 里面已经说了可以使用 `--` 然后再带上指令，触发 AI 的功能，自动生成 SQL，但这个仍然是不直观。于是我就问我的朋友，你期望如何分析你上传的数据，我的朋友说的很直观，给我打开了 Google 的主页。朋友说到，一个产品，能打动她，一个很重要的事情就是好看以及简单，Chat2Query 整个的界面交互，让她是没有太多的意愿使用的，上手难度太高，也不好看。\n\n对我朋友来说，她需要更加简单易用的交互界面，在她的认知里面，我们这个智能数据洞察的功能就应该跟 Google 一样，一个搜索框，问问题，得到答案，然后生成 Excel 给她做后面的分析。\n\n## 用户多层需求\n\n我俩继续讨论如何才能让她更好的使用 Chat2Query，毕竟我朋友是重度 Excel 用户，我们如何能给她更大的价值。我朋友想了想，如果 Chat2Query 能做到三层，那么将会很吸引她：\n\n- 第一层 - 处理她上传的私有数据，例如多个 Excel 文件。相比于简单的 Excel 处理，Chat2Query 可以在成百上千的 sheet 中帮助她获得一些洞察。\n- 第二层 - 对她在 TiDB cloud 上的私有数据以及能与 PingCAP 在 TiDB cloud 上托管的公开数据集进行查询分析。\n- 第三层 - 她可以将她在其他服务商的账号密码给我们，让 Chat2Query 能在第二层的基础上对她在其他服务商的数据进行联合查询分析。\n\n当我朋友跟我说这些的时候，我其实内心是很惊讶的。我最近在规划 TiDB Cloud 未来的技术架构方向，就是在思考通过构建一个弹性的计算引擎，以及数据 meta 的服务，来让用户非常方便的做到上面 3 层的操作。我非常高兴看到用户有类似的需求。\n\n然后我的朋友又继续说到，你这个能不能有历史记录的功能，能将我之前的洞察结果保存下来，甚至有没有对比功能，对不同时间的查询结果进行对比分析。不过后来我们讨论到，这个没准在外面的工具做可能更好，所以 Chat2Query 最好要提供一个 API 服务出去。实话，我这个不懂技术的朋友能想到 API，以及对 API 收费，以及对接其他的 BI 工具，还是挺让我吃惊的。\n\n## 写在最后\n\n这次与我的朋友的演示让我意识到了几点重要的事情：\n\n- 真正试着站在用户的角度思考问题是很重要的。我们需要了解用户平常使用的工具和完成的工作，并理解他们的思维方式。\n- 产品不仅要好看，也要好用。这对研发工程师来说是一个巨大的挑战，但幸运的是，这个世界上有很多这样的产品，我们可以学习借鉴。\n- 用户是最好的老师，与用户交流能获得非常不同的对产品的洞察。  \n\n最后，我希望我的朋友能成为我们的标杆用户，她非常愿意接受这个角色。\n\nBTW, 本文有一些文本使用了 ChatGPT 进行了润色。\n\n最后，如果你想体验 TiDB Cloud + AI 的能力，欢迎在 TiDB Cloud 上尝试 [Chat2Query](https://tidbcloud.com/free-trial?utm_source=blog-demo&utm_medium=referral&utm_campaign=chat2query_202301)，也希望收到更多来自大家的反馈。\n","date":"2023-02-27","author":"唐刘","fillInMethod":"writeDirectly","customUrl":"imagination-from-chat2query-demo","file":null,"relatedBlogs":[]},{"id":"Blogs_463","title":"技术出海丨数字原生企业的出海趋势和技术选择","tags":["TiDB","DNB","技术出海"],"category":{"name":"观点洞察"},"summary":"本文将以全球化的视野观察中国数字原生企业出海的新趋势，包括 DNB（ 数字原生企业）主要行业的发展特点，目前发展阶段的热点和未来转向，再从这些行业趋势来看中国出海企业面临的技术挑战。","body":"最近一年，中国企业出海成为热门话题，特别是数字原生企业的出海。许多文章和报告分析了中国数字原生企业在全球（东南亚、南美洲、欧洲、美国等）的发展趋势，以及一些成熟的数字原生企业在电商、游戏、社交、新一代数字媒体方面的成功经验。作为新一代分布式数据库的 TiDB，其主要服务对象也是全世界的数字原生企业。\n\n本文将以全球化的视野观察中国数字原生企业出海的新趋势，包括 DNB（ 数字原生企业）主要行业的发展特点，目前发展阶段的热点和未来转向，再从这些行业趋势来看中国出海企业面临的技术挑战，PingCAP 作为一家全球化数据企业在全球的布局和如何帮助出海企业获得增长。\n\n## 中国数字原生企业的当前优势\n\n过去两年，中国出海企业布局发生了重大变化。全球化已经成为长期生存战略，特别是在数字原生企业中，出海成为企业能够穿越周期并且持续生长的关键可能性。中国数字原生企业的人才优势逐渐体现，中国在整个移动互联网和数字平台时代所积累的人才优势是中国企业全球化的基础。未来十年，中国数字原生企业的出海和全球化将是值得关注的话题。\n\n中国在跨境电商、游戏、数字媒体、社交等领域，在各种共享经济应用方面，在东南亚和欧洲均显示出了巨大的优势。在过去十年的 Web2.0 移动互联网时代中，中国的模式创新和人才积累的优势，特别是在电商和社交媒体领域，已经成为全球企业争相仿效的最佳实践。而在新一代的 web3 和 NFT 技术平台中，也有大量的中国工程师和商业人员的存在。\n\n简单来说，中国数字原生企业具有独特的优势，这来自中国移动互联网发展的人口红利、工程师红利、web2.0 的经验积累、全球化的市场营销模式。中国工程师具有强大的技术能力，并不断溢出优秀的人才，这带来了巨大的效率优势。\n\n中国数字原生企业未来十年的全球化成功，最重要的因素是人才基础。人才分布决定了数字版图，现在全球各国开源人才分布的会变成未来五到十年数字经济的人才底座。从这个角度能看出：未来亚裔工程师和技术人才可能成为全球数字经济的最重要的建构师，其中中国人和印度人占有很大比例。亚洲的数字化以及全球的数字化可以得到亚裔工程师的支持，中国的数字原生企业可以依赖这种人才分布，并一开始就定位全球市场，现在开展全球化的出海企业在人才方面具有不同以往的信心。\n\n## 中国数字原生企业的成长挑战\n\n出海有机遇当然也有挑战。中国数字原生企业有人才优势和有 web2.0 积累的商业模式构建的能力，但仍缺乏三方面的能力：第一是全球化业务拓展中的跨文化组织和协同，如何使用本地化方法构建全球化组织。第二是运营风险与合规，各国都有自己独特的合规法案和内控法案，以及数据安全规定。这使得数字原生企业在全球拓展时会面临许多运营风险，特别是在数据安全和个人隐私方面。第三是技术人才和全球化基础设施问题，如何形成全球化的技术组织和标准，因为全球化时面临的技术人才是更难获得的。\n\n![640.png](https://img1.www.pingcap.com/prod/640_54a5dc1d9f.png)\n\n技术角度再延伸看，数字原生企业全球化面临的主要技术挑战包括：\n\n1. 全球部署：在多云环境下，如何管理自身的基础设施并处理数据合规的挑战。\n2. 高可用与安全：保护个人和企业数据的安全，解决高可用、高一致性和低延迟等生产数据要求，这些都是全场景业务的技术挑战。\n3. 技术架构的复杂：在全球获得高质量的技术团队是一项挑战，而全球的技术部署不能太复杂，否则将无法在当地解决计算引擎、数据库、中间件等各种架构的挑战。\n\n## PingCAP 全球化的探索和实践\n\nPingCAP 的全球化同样和中国数字原生企业一样，兼具机遇和挑战。为了提高自身的全球化能力，PingCAP 要不断努力，这是随着服务全球化的企业一起成长的。下面以 PingCAP 全球化为例的阐述是作为一个现实例子带来中国技术企业全球化的思考，也会给中国数字原生企业出海带来一些启发。\n\n首先，PingCAP 在全球布局时首先进入美国和日本市场。这两个市场通常被认为是中国企业海外扩展最困难和最具挑战性的市场。事实上，PingCAP 最初全球化的目的是为了制造最好的世界级产品和聚合全球化人才，但后来却意外发现，这两个国家的客户要求特别高，并面临一些挑战。但事实证明，最初走的这条自主开源的道路建立了信任，加上经过世界级场景打磨的产品，使得 TiDB 在这两个成熟市场得到认可。\n\n通过持续性服务这些成熟市场的头部用户，PingCAP 不仅得到了商业回报，还得到了真正的 “Lighthouse” 成功案例，这具有很强的说服力。今天，PingCAP 在美国的成功案例对欧洲、日本、新加坡、印度等的客户都有巨大的影响力。\n\nPingCAP 在日本的第一个客户是当地排名第一的一家移动支付公司。从 2018 年开始，日本用户开始从使用传统的 Oracle 数据库转向使用云数据库，并逐渐开始关注 NewSQL。NewSQL 在日本是一个新的热门词汇，TiDB 在没有大量员工的情况下，通过线下的客户拜访和分享活动等形成了良好的口碑。经过多年的发展，TiDB 已经在日本成为了用户最关注的新一代数据库，在 2022 年的 DBtech Showcase 大会上获得了排名第一的关注度。\n\n在硅谷，PingCAP 于 2022 年 11 月 1 日，成功举办了首届 HTAP Summit ，作为一家中国的创业公司，在硅谷这样的地方举办一场超过 200 人参加的线下大会是非常困难的，特别是对于那些在硅谷不够知名的中国技术公司来说。中国创业公司在做数字原生企业海外扩张时都会面临着人少、事多、挑战大、知名度不够等种种困难情况。\n\n在新加坡的亚太区，Web3 是当前热门话题。在不到一年的时间里，PingCAP 已经在新加坡获得了多个 Web3 的客户的认可。通过组织和参加活动，PingCAP 获得了当地技术公司的高度认可和关注，这也是 PingCAP 在新加坡和整个东南亚地区的特点。\n\n在印度，TiDB 成功支撑了印度最大的电商和物流公司在印度 \"双十一\" 这一天的高峰期。印度是一个开发者极其活跃的国家，在开源贡献者方面仅次于硅谷。在印度的 \"双十一\" 期间，通过使用 TiDB，他们实现了技术架构的变革，应对了全印度的 \"双十一\" 购物狂潮。\n\nPingCAP 是中国技术企业走向全球化的一员，任何数字原生企业都可能需要经历类似 PingCAP 的全球化拓展过程，这过程中可能会遇到各种各样的困难和挑战。每一次的进步都需要团队间的信任，包括与开发者建立联系、通过云技术提供服务，以及不懈的探索和努力。\n\n## 中国数字原生企业如何选择全球化的合作伙伴\n\n在选择全球化的技术合作伙伴时，中国的全球化数字原生企业应该考虑如下必选项和优选项，这是由 PingCAP 和全球用户以及中国数字原生企业在过去几年中的经验得出的。这里着重强调了对于一个有全球化抱负的中国数字原生企业如何选择合适的技术合作伙伴。\n\n![640-2.png](https://img1.www.pingcap.com/prod/640_2_45817df395.png)\n\n在选择全球化技术合作伙伴方面，有以下几个必选项：\n\n1. 选择技术领先的企业，因为技术领先直接影响到业务的竞争力。\n2. 中国企业出海必然面临多云的选择，因此必须选择一个云中立的厂商，以保证一次应用适配，同时还能节省成本。\n3. 合作伙伴必须具备全球化的合规经验，全球化的支持能力，包括用户服务支持当地的需求。\n4. 全球范围内均有技术团队，既需要当地的人员，也要有核心技术团队在中国，这对于中国数字原生企业来说是非常重要的。\n\nTiDB 在日本、印度等困难的地方仍能获得用户信任的原因在于自主开源的模式，这让用户相信其领先的技术，并且无风险。全球大型客户的部署案例和多云部署经验对于中国企业的出海也是重要的参考。同时，多云部署模式的出现，如将 OLTP 放在 A 云，OLAP 分析放在 B 云，以及全球化的社区支持，都是全球化带来的价值。\n\n最后也是最重要的一个方向是友好的上下游技术生态。基于开源的多云技术生态，很容易与数据湖、大数据技术栈以及应用开发技术栈、低代码人工智能技术栈形成良好的融合。现在数字技术中最重要的云原生、数据技术、人工智能技术、低代码技术，以及新一代的 SaaS 都是开源的，TiDB 在北美、印度等地也与多家技术厂商形成多元化的技术合作关系，包括云厂商 AWS、Google、阿里云等。这些合作经验使得作为一家数字原生企业不必担心未来集成的成本，因为都已在技术厂商内部进行了预集成和消化。\n\n**只有真正全球化的公司才能服务全球化客户**\n\n![640-3.png](https://img1.www.pingcap.com/prod/640_3_53ac452caa.png)\n\nPingCAP 相信，只有全球化的公司才能服务好全球化的客户，中国的企业海外扩张仅仅是第一步，最终的目标是成为一家全球化的公司。以 TiDB 为例，它已经拥有超过 3000 家全球用户，其中大多数是数字原生企业，涵盖了金融、互联网、物流、游戏、智能制造等领域，这些全球化用户的部署经验可以成为中国企业海外扩张的重要参考和支持。此外，PingCAP 自身的全球化也处于中国技术公司中较为领先的水平，从早期的全球化开源到现在的多云架构，再到与云厂商的合作，它所积累的全球化经验可以与中国企业共享。\n\n团结协作，共同走向一个数字原生企业全球化的目标，虽然前路艰难，但 PingCAP 希望与中国出海企业长期保持一起共创共赢的关系，通过共同努力，赢得全球化用户的尊重，为全球化用户企业带来更多价值。\n\n<div class=\"is-flex is-flex-direction-row is-justify-content-center\">\n  <div class=\"is-flex is-flex-direction-column\">\n    <a target=\"_blank\" class=\"button is-link mx-5\"\n       href=\"/product-community/\"\n       style=\"background-color: #4fc172;\">\n      下载 TiDB 社区版\n    </a>\n  </div>\n  <div class=\"is-flex is-flex-direction-column\">\n    <a target=\"_blank\" class=\"button is-link mx-5\"\n       href=\"https://pingcap.com.cn\"\n       style=\"background-color: #3a40e1;\">\n      了解 TiDB 企业版\n    </a>\n  </div>\n  <div class=\"is-flex is-flex-direction-column\">\n    <a target=\"_blank\" class=\"button is-link mx-5\"\n       href=\"https://tidbcloud.com/free-trial?utm_source=website-zh&utm_medium=referral&utm_campaign=blog-digital-native-enterprise\"\n       referrerpolicy=\"no-referrer-when-downgrade\" style=\"background-color: #3a40e1;\">\n      免费试用 TiDB Cloud\n    </a>\n    <div style=\"font-size:12px; text-align:center\">适用于中国出海企业和开发者</div>\n  </div>\n</div>","date":"2023-02-21","author":"PingCAP","fillInMethod":"writeDirectly","customUrl":"the-trend-and-technology-choice-of-digital-native-enterprise","file":null,"relatedBlogs":[{"relatedBlog":{"body":"券商是一个古老的行业，发展至今已经历了三个时代：第一代券商为传统券商，在线下交易大厅进行买卖；第二代券商开始了电子化进程，从线下到线上进行了浅层服务的转移，改善了用户体验，提高了金融服务的效率；**第三代券商更多强调“科技赋能”，在功能业务上更创新、更多样，且存在完整的互联网基因，业务依靠线上平台，拥有底层自研能力，如交易、风控等系统。**\n\n老虎国际作为第三代券商的代表，是一家全球知名的国际化券商，在新加坡、美国、中国香港、澳大利亚等地持有 59 张牌照或资质，在全球多地开展业务。投资者在老虎国际可通过一个账户交易美股、港股、A 股（沪港通/深港通）、星股（新加坡股）、澳股（澳大利亚股）、期货、基金等全球主要市场的金融产品，享受一流的投资体验。\n\n老虎国际自主研发的交易平台 TigerTrade，累计交易规模在三年内突破 10000 亿人民币，创下互联网券商冲击万亿交易规模最短用时。2019 年 3 月，老虎国际在美国纳斯达克挂牌上市，目前拥有全球近 900 万用户，年交易规模超 2000 亿美元。\n\n## 业务挑战\n\n作为一家全球化的券商，每个国家证券行业发展情况不同，数据合规要求也存在差异，比如新加坡有 PDPA，欧盟有 GDPR，美国有 CCPA 等，甚至不同国家业务特点也大为迥异。**在每个国家/地区都本地部署业务系统显然并不现实，老虎国际采用跨地区的混合云架构为全球用户提供支撑，解决在数据架构、数据安全、数据合规等方面所面临的的全球挑战。**\n\n同时，老虎国际的数据架构复杂度非常高，底层系统包含 Java、Python、Go 等不同的语言，**中间件、数据库、大数据等都是异构场景，导致维护成本和研发效能都大打折扣。**\n\n此外，在老虎国际证券业务发展过程中，**业务波动性是常态**，这也使得其核心业务--后台账本系统，经常面临数据库的性能挑战。后台账本是用户在老虎国际参与证券交易时，如产品购买、出入金、IPO 打新、公司行动、被收费等各个业务版块，针对用户行为明细数据记录的系统。账本每天需要记录大量的用户流水，并根据用户行为生成用户每日账单。如果账本出现问题，直接关系到用户体验和投资收入。\n\n2020 年 3 月，美股遭遇了前所未有的震荡，开盘即暴跌，触发一级熔断机制，暂停交易 15 分钟。老虎国际的数据库也经历了前所未有的数据查询量，查询数量曲线呈指数级增长，原有的 MySQL 遇到了极大瓶颈。证券交易还要求数据库具有金融级数据强一致性，并具备灾备能力，一旦某个机房宕机，另一个机房可以立刻启用。\n\n**数据安全性、数据可用性和数据架构复杂度成为老虎国际国际化业务的三大挑战**。出于对开源技术的信任和认同，老虎国际很早就在数据中台业务中应用了 TiDB 3.0 版本，此后一路升级到 TiDB 5.0，解决了业务挑战与数据安全挑战。\n\n## 后台账本数据库迁移\n\n老虎国际的后台账本底层数据架构由多套集群组成，单集群数据量接近 2TB，MySQL 数据库虽然具有较好的稳定性和负载能力，但为了应对不断增长的数据量只能采取分库分表方案，难以保证跨分片的事务一致性，跨库的 Join 关联查询性能较差，数据库多次扩展难度和维护量极大。2021 年，老虎国际的运维与研发团队对主流的冷热数据分离、分库分表、分布式数据库等方案进行选型与性能压测。**在压测中，TiDB 在 P95 延迟、TPS 事务指标、QPS 等方面整体性能都强于 MySQL，并且 TiDB 的性能可以随着节点水平扩展线性提升，解决性能和单机资源瓶颈问题**。压测增强了老虎国际技术团队的信心，最终决定将后台账本的 MySQL 集群也迁移到分布式数据库 TiDB 上。\n\n![1.png](https://img1.www.pingcap.com/prod/1_a58bbd14db.png)\n\n![2.png](https://img1.www.pingcap.com/prod/2_e3f05f3e78.png)\n\n**由于 TiDB 拥有非常丰富的生态组件，整个迁移过程十分顺利**。为了保障业务稳定，老虎国际采用了新旧数据库同时写入的方式，通过 DM 将 MySQL 数据同步至 TiDB 集群，逐渐切换一部分读流量到 TiDB，整个迁移历经近 3 个月，最终全部切换到 TiDB。同时，老虎国际也制定了“逃生方案”，通过 TiCDC 将数据同步到下游的一个 MySQL 集群，一旦发现 TiDB 有问题可以随时切换。在经过半年多业务的考验后，最终技术团队将该 MySQL 集群关闭。\n\n![3.png](https://img1.www.pingcap.com/prod/3_495dd8df9f.png)\n\n不同国家对于监管、数据可用性，以及 SLA（服务级别协议）要求非常高。**在同城，老虎国际还利用 TiDB 的灾备架构，通过 TiCDC 在灾备机房部署了一个 TiDB 集群作为灾备方案**，当主机房发生故障时，服务器负载均衡自动切换到备用机房，保证数据服务高可用，整体延迟达到分钟级甚至更低。\n\n## 为什么选择 TiDB？\n\n**对于券商而言，数据处理速度与成本是紧密相关的**。MySQL 的分库分表维护成本较高，对业务的限制也比较多。而 TiDB 的分布式架构无需分库分表，大大简化技术栈，降低了运维难度，通过在线水平扩展有效解决底层数据存储扩容难题；TiDB 的金融级高可用特性，可靠的灾备、数据恢复方案保障了老虎国际证券业务稳定运行；TiDB 高度兼容 MySQL，有着成熟的 MySQL 迁移方案，研发侧大部分代码无需改动，即可顺利完成整个迁移工作，大大降低迁移成本。\n\n## 业务收益\n\n现在，老虎国际的数据架构整体可以分为三部分：**第一，将分布在各业务系统甚至 APP 内的数据进行收集；第二，进行数据处理；第三，将数据持久化存储**。非敏感数据通过 DM 和 CDC 快速同步到 TiDB，敏感数据通过 Flink 进行脱敏后输入 TiDB，利用 TiDB HTAP 的能力构建数据中台和实时数仓，既保证 OLTP 查询时系统的稳定性，又保证 OLAP 的快速分析，两者同时存在又保证隔离，兼顾安全和稳定。最后，老虎国际还将 TiDB 作为类似数据湖的概念提供数据源给下游的 HDFS 使用，对外提供更多数据服务。\n\n![4.png](https://img1.www.pingcap.com/prod/4_fa7f31dbc7.png)\n\n过去，老虎国际的数仓只能满足 T+1 的数据分析，**通过 TiDB ，老虎国际实现了实时同步、实时分析**，将延迟降低到了 5 秒钟；同时，**TiDB 的性能实现了比较快的数据接入**，之前 Hbase 中只有 4,000+ 表，TiDB 目前已经达到 80,000+ 表；此外，使用 TiDB 后，老虎国际将数据的全量同步变成增量同步，**极大减少了网络带宽压力。TiDB 统一了两个大数据分析场景，提升了易用性，并节省了 40% 的资源，实现了降本增效**。","author":"PingCAP","category":4,"customUrl":"tiger-brokers-and-tidb","fillInMethod":"writeDirectly","id":441,"summary":"数据安全性、数据可用性和数据架构复杂度成为老虎国际国际化业务的三大挑战。出于对开源技术的信任和认同，老虎国际很早就在数据中台业务中应用了 TiDB 3.0 版本，此后一路升级到 TiDB 5.0，解决了业务挑战与数据安全挑战。","tags":["TiDB","技术出海"],"title":"案例故事丨老虎国际 x TiDB ，降低架构复杂性，保障全球用户安全可靠投资"}},{"relatedBlog":{"body":"近些年，由于互联网的快速发展以及线上需求的爆发，**直播在国内已经成为一个非常成熟的商业模式**。在娱乐、教育、办公等场景中涌现出许多优秀的视频直播产品。随着国内市场竞争日益白热化，加之企业出海渐成趋势，越来越多的直播公司选择走出去，寻找新的海外直播市场，借鉴国内成熟的产品、运营以及商业模式，让全球的用户都用上中国人创造的产品，LiveMe 便是成功的出海直播产品之一。\n\nLiveMe 是一个全球直播和社交平台，于 2016 年 4 月推出。LiveMe 的产品功能包括 H2H、多人聊天、虚拟形象直播、蹦迪房等，它使用户能够随时随地直播、并观看其他精彩的直播以及与世界各地的朋友进行视频聊天。**目前 LiveMe 已在全球积累了超过 1 亿用户和超过 300 万的主播。它已成为美国最受欢迎的社交应用程序之一，并已在 200 多个国家和地区推出。**\n\n## 业务痛点\n\n与其他行业出海一样，直播产品的出海也面临着许多全球化挑战。如各地的合规监管、本地化运营、持续创新、政治文化差异等，都为直播产品出海带来巨大挑战。**而在出海的过程中，底层的技术能力帮助 LiveMe 在成本节约、用户增长、金融风控、提升研发效率等方面不断实现精细化运营与业务创新。**\n\n经过了多年的沉淀，LiveMe 在业务上已经形成了线上微服务主导，线下计算中心主导的技术架构。线上业务是通过 Go 语言开发的一套微服务架构，每个服务根据不同业务特性具有自己独立的存储。线下业务是由数据研发团队来维护，通过 sqoop 和 MySQL Binlog 同步等方式从数据库层面抓取数据到数据仓库，完成一系列业务相关的支持。\n\n这套业务架构中线上业务主要面临着以下痛点：\n\n第一，虽然完成了微服务分库的设计，每个服务都有自己独立的数据库，**但是每个业务中又存在很多业务上的大表**，都存在 MySQL 分表的现象。在典型的分表场景中，数据库表会按照用户的 UID 尾号经过 MD5 后分到 256 张表，但是日积月累后又需要再根据时间日期做一个垂直的分表，导致数据库表无法完成聚合查询，再加上跨时间段的分表需求，很多场景无法满足线上需求。\n\n第二，**对于分析型业务数据而言，需要保证数据的实时性，并保留数据细节**。实时的数据分析，可以在业务上更快做出决策，例如在一些活动运营场景中，业务团队需要快速从各个数据维度来分组统计观察活动效果；在金融相关风控业务中，需要根据各个维度快速聚合来判断各项数据是否达到风控模型的阈值。如果使用离线计算的方式，数据的实时性根本无法得到保证；此外，经过离线计算或者实时计算过的数据，如果用户反馈数据有问题，需要查看数据的细节也很难实现。\n\n第三，各种精细化运营需求，例如推荐、个性化运营等场景不断增加，**对于数据的实时要求越来越高**。因此，LiveMe 急需一种更简单，同时让线上线下业务做好平衡的方案。\n\n此时，如果 LiveMe 继续选择大数据技术栈解决痛点就会面临以下挑战：1）大数据技术栈的架构非常复杂，中间件过多；2）需要额外的技术栈学习成本，比如如果使用数据同步，就需要 sqoop、scala、kafka 等中间件，会大幅增加整个业务的复杂性；3）希望线上业务以及架构非常简单，能够简化到普通开发人员只要能够 CRUD（增加(Create)、读取(Read)、更新(Update)和删除(Delete)） 数据库就可以上手开发。\n\n## 为什么选择 TiDB ？\n\n基于以上业务挑战，**LiveMe 经过一系列技术选型后最终选择了 TiDB 数据库**。TiDB 的以下特性可以帮助 LiveMe 很好的应对挑战：\n\n1. TiDB 的性能大于等于 MySQL ；\n\n2. TiDB 的 HTAP 特性能够解决线上大表的问题，在后台或者一些实时分析场景中，其 OLAP 分析能力能够保证实时数据报表；\n\n3. TiDB 引入的 MPP 架构分析能力，使得 OLAP 查询速度非常快，这也是 OLAP 数据库架构上的技术方向；\n\n4. TiDB 团队有着完善和专业的技术支持，在过程中可以帮助 LiveMe 解决很多问题，在线上大规模使用后也没有后顾之忧。\n\n## 如何利用 TiDB 实现实时聚合查询\n\n鉴于 LiveMe 的微服务架构，如果将数据源全部替换，工程量大且不能一蹴而就，因此就需要一种兼容性的方案，在保证线上业务不受影响的同时也能使用 TiDB 的特性来解决 LiveMe 的业务痛点。因此，对于需要聚合查询的业务， LiveMe 通过消息队列广播的方式，在业务层订阅相关事件再补充业务侧需要的宽表信息写入 TiDB，基于 TiFlash 就可以做到实时的运营报表。业务开发人员只需要编写对应的 SQL 查询，就可以轻松完成需求。**没有了复杂的 ETL 过程，大大简化了开发流程。**\n\n**对于业务数据， LiveMe 使用 AWS SQS 消息队列**，相比 Kafka 的优势在于每条数据都是原子性的，每条数据都可以用来做幂等重试，来保证数据的最终一致性。目前，这套技术方案已经支撑了 LiveMe 的活动运营和金融风控等多个业务场景，满足了 LiveMe 对于线上大量数据实时聚合查询的要求。\n\n![20221226-162737.jpg](https://img1.www.pingcap.com/prod/20221226_162737_a33d69ea3a.jpg)\n\n## 如何使用 TiDB 简化技术架构\n\nLiveMe 有一个类似朋友圈功能的场景，这个业务中存在两个技术难点：**第一是对于数据的无限量增长存储如何实现扩容；第二是数据的冷热分离，这又涉及到数据成本的问题。**\n\n以用户发 Twitter 的场景举例：如果用户发了一条 Twitter，它会写入到自己所有的关注列表，比如有 100 个粉丝，就写入 100 条，如果有 10 万粉丝就需要写入 10 万条数据，这是一个典型的写扩散场景。这个场景带来的效果是数据爆炸半径非常大，如果某流量网红发一条 Twitter ，数据写入量会非常大，因此需要一个能够接近于无限扩容的存储机制才可以实现这个场景。\n\n![20221226-162747.jpg](https://img1.www.pingcap.com/prod/20221226_162747_90f8291510.jpg)\n\n<center>Twitter 的技术实现</center>\n\nTwitter 是通过维护一个 redis-cluster 来解决 feed 分发的存储。LiveMe 的技术团队也想到使用这种技术架构，技术团队经过选型考虑使用 codis 集群来做存储，但通过对成本的考量，认为这个方案是不可行的，大量的 feed 冷数据存储在 codis 这样的内存密集型数据库中，成本非常高。因此，技术团队面临的挑战是如何用低成本的方式去实现一个写扩散的场景。\n\n![20221226-162751.jpg](https://img1.www.pingcap.com/prod/20221226_162751_44d420064b.jpg)\n\n<center>Twitter 的解决方案</center>\n\n基于 TiDB 解决方案，LiveMe 技术团队在上述写扩散场景中，把扩散写入的部分替换成了 TiDB，使用一张数据库表来存储所有 feed 的写入关系，比如用户有 100 万粉丝，就在数据库里插入 100 万条数据。**基于 TiDB 的分布式数据库特性，帮助 LiveMe 简单高效地解决了数据增长扩容问题。**\n\n基于此技术架构，技术团队简化了一个典型的 redis 缓存设计问题，热数据放在 redis 中，用 mget 来获取。冷数据放在 TiDB 中，用 select in 查询，这样做数据冷热区分就非常容易，甚至可以实现一个简单的布隆过滤器来了解哪些数据在热数据，哪些数据在冷数据里。以此减少无效数据的回源，更高效获取数据。\n\nLiveMe 的朋友圈功能基于 TiDB 的分布式存储特性进行技术改造后，**feed 表从 2021 年中旬上线至今已经达到数十亿数据写入**，现在的数据量单表 39 亿条。因为这些数据是永久保留不会删除的，所以该数据也会一直增长。\n\n## 未来规划\n\n未来， LiveMe 将会继续尝试 TiDB 在更多业务中，一方面会做数据库管理开发；另一方面将对于强事务依赖交易型的业务尝试使用 TiDB，为直播电商场景做技术储备。","author":"张龙","category":4,"customUrl":"tidb-in-liveme","fillInMethod":"writeDirectly","id":449,"summary":"LiveMe 是一个全球直播和社交平台，目前已在全球积累了超过 1 亿用户和超过 300 万的主播，面临新的业务挑战，LiveMe 经过一系列技术选型后最终选择了 TiDB 数据库。","tags":["TiDB","技术出海"],"title":"LiveMe x TiDB丨单表数据量 39 亿条，简化架构新体验"}},{"relatedBlog":{"body":"同盾科技是中国领先的人工智能科技企业。为了确保服务的低延迟和高可用性，同盾的技术团队不断寻找最佳的技术架构。经过长时间调研，他们最终选择了新一代分布式数据库 TiDB 作为离线层的核心数据库，**基于 TiDB 打造的实时数据架构为风控智能决策保驾护航**。\n\n同盾科技是中国领先的人工智能科技企业，专注决策智能领域，致力于帮助政企客户防范风险、提升决策效率。同盾科技坚持自主科技创新，多项算法和软件系统已达全球领先水平，并形成了“基于隐私计算的共享智能平台-智邦”和“基于人工智能的决策智能平台-智策”两大平台，聚焦于金融风险、安全风险、政府治理风险三大场景，业务覆盖全球数十个国家，为 22 大行业、118 个细分场景的上万家客户提供了领先且独具特色的决策智能解决方案。\n\n## 风控业务场景对数据库的需求与挑战\n\n作为一家第三方风控公司，客户经常需要调用同盾的智能决策服务去做业务决策，如电商大促期间防范黑产薅羊毛，个人信贷杜绝多头借贷老赖行为等。因此，**同盾服务调用常常呈现出非常大的 TPS 请求**。同时，为了不影响客户调用服务的质量与体验，**同盾对低延迟和高可用有着硬性要求**。\n\n基于这样的特征，同盾日均过亿的决策服务调用，会产生包括非结构化/结构化多种数据结构类型在内的海量数据入库。丰富的数据类型与多样的细分场景，使得同盾科技必须使用多种数据库去满足不同的业务场景需求，在同盾的数据架构中包含了 Cassandra、MySQL、HBase、Redis、Mongo 等数据库。\n\n在同盾的数据架构中，大多数初始落库的数据还比较原始，为了提供优质的数据服务用于智能决策，**技术团队构建了成熟的大数据平台**，用 T+1 离线数据分析的方式去进行日常的离线数据分析作业，利用数据二次加工赋能上层的风控智能决策。\n\n但面对复杂的数据基础架构，同盾在业务增长中也遭遇了如下挑战：\n\n- 同盾拥有在线数千个大大小小的 MySQL 工作实例，**数据十分分散**，有一些是核心的风控业务系统数据，有一些是后台基础架构平台的数据，还有一些是集团 IT 系统数据，同盾希望通过集中化的方式对这些数据进行分析管理；\n- 最开始同盾将上游 MySQL 数据同步到下游进行分析，但整个过程中**数据交换工作效率非常低**，整体作业分析的 SLA 无法得到保证；\n- 由于上下游数据同步的阻塞问题，导致了离线数据同步实时性很差，**上下游数据经常出现数据不一致的情况**，非常影响提供给作业的数据质量。\n\n其实同盾科技的业务场景并不复杂，只需要同步生产环境中数千个 MySQL 实例至下游的离线系统，提供给作业开发人员通过大数据平台进行离线分析加工。**项目的核心目标是在海量数据落库下，保障在线到离线数据的数据库的准实时性和一致性，并提供优质的数据服务给内部的风控系统开发人员、算法模型工程师和运营人员加工数据。**\n\n## 为什么选择 TiDB？\n\n经过长时间调研，同盾科技的技术团队最后选择了新一代分布式数据库 TiDB 作为离线层的核心数据库。同盾科技数据库运维梁高升表示，主要有以下几点原因最终促成同盾选择 TiDB ：\n\n首先，**TiDB 高度兼容 MySQL 协议**，在 TiDB 的使用和运维过程中大大减轻了运维和开发人员的使用成本；\n\n第二，TiDB 作为**分布式数据库**，同盾可以把它看成一个大的数据库实例，可以汇聚上游所有的MySQL实例数据；\n\n第三，TiDB 具备**存算分离**的架构，可以让同盾非常灵活地控制硬件成本，而不用一味堆砌服务器；\n\n最后，TiDB 拥有**非常活跃的社区**。即使在使用 TiDB 的过程中遇到一些问题也马上能在社区得到解决。\n\n## 解决方案\n\n![1.png](https://img1.www.pingcap.com/prod/1_c850faa621.png)\n\n最终，同盾科技数据库团队构建了一整套基于 TiDB 的数据流转架构，该架构共分为三层：\n\n### 实时数据层\n\n同盾内部有 3000+ MySQL 实例，在实时数据库层通过 MySQL Cloud 管控上游数千个 MySQL。\n\n### 传输层\n\n在传输层，从 MySQL Cloud 对接实时数据同步任务到内部 Otter，Otter 可以实现准实时同步 MySQL 数据，然后再由 Otter 实时同步数据到 TiDB。\n\n上下游同步组件决定了数据在下游离线场景的整体数据质量，同盾对数千个 MySQL 实例同步数据的同时，需要保证其稳定性、低延迟及整体可控的管理成本。虽然 PingCAP 数据迁移工具 DM 支持全量/增量灵活的数据导入场景，并具有较快的导入速率，但目前单个 DM worker 只支持绑定一个数据源，这限制了管理大量 MySQL 同步任务的需求。同盾最后选择使用 Otter 作为常态化的数据增量同步平台，但 Otter 只支持增量数据同步，且单任务吞吐有上限，同盾通过使用其支持 spark streaming 来进一步保障同步的吞吐和准实时性。未来在 TiDB 推出一个 DM worker 支持多个数据源的特性后，同盾会再考虑进行替换。\n\n### 离线数据层\n\n离线数据层中的大数据平台主要管控 TiDB 的元数据和实际到下游的同步情况。在 Spark 运行作业的过程中通过 TiSpark 去访问 TiDB，最后接入 Hadoop 进行分析作业。\n\n## 业务收益\n\n通过打造 TiDB 数据产品链，同盾科技实现了数千个 MySQL 数据的离线汇聚管理。TiDB 有着便捷易操作的 Dashboard 管理界面，运维无心智负担，大大提升了数据库运维团队的管理运维和使用数据的便捷性与效率。同时，TiDB 的高性能保障提供高质量的数据服务，实现了准实时同步数据。\n\n同盾科技数据库运维梁高升介绍，同盾刚开始上线的是 TiDB 2.0 早期版本，在上下游数据同步过程中遇到了一些 TiDB 和 MySQL 不那么兼容的情况，如果在上游有大量数据更新的情况下，会出现同步阻塞的情况，导致同步的实时性、一致性出现问题。但 TiDB 版本迭代速度非常快，每个版本都会对性能及稳定性做出大量改进和优化，**在升级到 5.4 版本后，同盾就已经解决了大部分的兼容问题**。而且在基准测试中，TiDB 的性能也得到了质的飞跃。\n\n## 未来规划\n\n同盾科技是 TiDB 非常早期的用户，多年的使用让同盾确信 TiDB 是一款非常好的产品，**未来也会继续致力于在更多的场景依靠 TiDB 生态落地赋能一些业务场景**。例如，虽然同盾的大部分作业是 T+1，但内部也有很多实实在在的实时分析场景，比如实时展示的 BI 系统，通过TiFlash 实时分析查询引擎可以进一步提升分析效率，更及时地满足实时分析需求；同盾国内在线业务针对海量关系型数据库初始使用的是 MyCAT，但是 MyCAT 的运维非常困难，对开发也不是很友好，更像是上一代的分布式数据库产品。后续，类似 MyCAT 这样的场景也很有必要使用 TiDB 进行替换。\n\n近几年，随着出海趋势愈发火热，同盾科技在出海业务势头也非常迅猛，业务涉及东南亚、北美、欧洲等多个区域，这就需要在谷歌云、AWS、阿里云等通用公有云上，有一款标准的分布式数据库服务，帮助其在全球快速布局业务。**而 TiDB Cloud 已经在各大主流公有云上提供服务，这也给同盾科技构建坚实的技术底座提供了更好的选择。**","author":"PingCAP","category":4,"customUrl":"tidb-in-tongdun","fillInMethod":"writeDirectly","id":452,"summary":"同盾科技是中国领先的人工智能科技企业。为了确保服务的低延迟和高可用性，同盾的技术团队不断寻找最佳的技术架构。经过长时间调研，他们最终选择了新一代分布式数据库 TiDB 作为离线层的核心数据库，基于 TiDB 打造的实时数据架构为风控智能决策保驾护航。","tags":["TiDB","技术出海"],"title":"同盾科技 x TiDB丨实时数据架构为风控智能决策保驾护航"}}]},{"id":"Blogs_456","title":"PingCAP 黄东旭万字长文剖析数据库发展新趋势：脱离应用开发者的数据库，不会成功","tags":["HTAP","Serverless","TiDB"],"category":{"name":"观点洞察"},"summary":"本文由 PingCAP 联合创始人兼 CTO 黄东旭撰写，基于亲身经历的数据库行业，深度总结过去一年数据库发展的重要趋势，以及展望 2023 年数据库新方向，希望对更多的行业从业者有所启发。","body":"本文由 PingCAP 联合创始人兼 CTO 黄东旭撰写，基于亲身经历的数据库行业，深度总结过去一年数据库发展的重要趋势，以及展望 2023 年数据库新方向，希望对更多的行业从业者有所启发。\n\n在他看来，数据库未来的发展趋势必然是以「省人、省时、省事、省钱」为主要目标，在云原生趋势下，其不单单是作为一种软件，而是一种服务来成为加快科技发展的重要引擎。\n\n2022 年，我们被太多的技术热词所围绕，也让很多企业和开发者对未来的科技世界越来越迷茫。  \n\n今年我有很长一段时间在北美技术圈，有一些切身感受：**一个是大环境下影响下的经济变差**。经济不好的时候就要去省钱，会采取比如降低 Infra 投入等措施，这多少都会影响公司的决策。如果你是一个解决方案提供商，要去卖产品时，倘若在产品的价值或者故事中没有体现能帮客户省多少钱，基本上对方可能看都不会看你一眼；**第二个是缺人**。用另外一个说法表达就是“从业者门槛降低”。比如说你原来可能是一个 Infra 工程师，现在可能要被迫变成一个全栈工程师，就相当于一专多能，或者说对于开发业务应用的门槛需要被降得更低。现在大家都希望用更少的人，更快的时间去进入市场。  \n\n那针对上面痛点，映射到数据库技术上有哪些趋势变化？  \n\n1. 对于新一代的数据库来说，HTAP 是必选的技术路线，我有一个预言：**未来的数据库都会是 HTAP 数据库**。只有纯 AP 对于业务来说是不完整的，TP 非常重要。\n2. 数据库要用云原生的方式进行架构改造，不仅是存算分离，而是能分离的都分离，因为**现在数据库要做的已经不再是一个软件，而是一个服务**，用户也不会关心服务背后的东西。用户希望使用起来越简单越好，最好把所有基础设施的细节都隐藏掉，极低的心智负担带来极低的上手体验和价值确认。\n3. Serverless 将成为数据库最终的产品形态（注意：Serverless 并不是技术，而是产品形态）。\n\n## 未来的数据库都会是 HTAP 数据库\n\n2022 年，HTAP 一词越来越火。虽然从考古上来讲， HTAP 最早是在 2014 年由分析机构 Gartner 提出，但直到现在其实它还是一个很新的概念，不少人还是持有偏怀疑的态度，然而，这个需求又是存在的。大家未必会去定义它到底是哪个名词，但是大家都会去用。很多人现在还不太想说把 HTAP 变成一个专有的类别，而是想先用一些新型的数据库或者新型的产品解决业务问题。我认为 HTAP 的普及还需要一定的时间，不过，当前已经能够看到星星之火开始成燎原之势。  \n\n2022 年 5 月，Google Cloud 发布了最新的数据库产品 AlloyDB，HTAP 能力便是其中最显著的亮点；6月，当红 Data Cloud 厂商 Snowflake 首次发布了 HTAP 产品 Unistore 。  \n\n至此，全球三大云厂商 AWS、微软、GCP 和 Data Cloud 领导者 Snowflake，以及正在加速云转型的数据库巨头 Oracle （MySQL Heatwave）都已经发布了以 HTAP 为主要架构亮点的数据库产品。  \n\n如果细看这些产品，你会发现 MySQL 在 2021 年发布的 Heatwave 虽然在分析能力上是个 MPP 的架构，但 MySQL 本身还是单机版的，Google AlloyDB 参考了 AWS Aurora 的架构，做到了青出于蓝的效果。NewSQL 的分支鼻祖是 Google Spanner，但同为 NewSQL 架构的 TiDB 持续在 Real Time HTAP 投入巨大，TiDB 早期解决了 MySQL 分库分表的问题，就面临用户的在线分析需求。在 2018 年 TiSpark 的引入，2020 年 TiFlash 架构完成了 HTAP 架构的闭环，再到 2021 年 TiDB 5.0 版本的 MPP 能力，这个能力也通过 TiDB Cloud 向所有云上用户输出，在 5 年时间 TiDB 完成了 Real Time HTAP 产品能力的四连跳。  \n\n总体来看，虽然各产品的具体实现有所不同，但新一代 HTAP 架构有一些明显的共性追求：以开源打底，借助了云端扩展性，追求一个入口，一套数据栈，可以将 OLTP 数据和 OLAP 数据实时同步，部分厂商 OLAP 的实现采用了类似 MPP 下推方式，达到 No Application Change、No Schema Change、No ETL，No data move 的四不效果，最大化减少对应用程序的改动。  \n\n任何一种数据库潮流都是“**需求变化✖️技术变革✖️架构创新**” 三者融合的产物，HTAP 也不例外。  \n\n首先，在需求变化侧，推动新一代 HTAP 的数据库厂商在提到 HTAP 的时候都不约而同地用到 **Operation** 这个词，借助热数据实现运营级别的实时分析，获得实时的洞察以支持运营动作的反馈，这是推动新一代 HTAP 走上舞台中央的最大需求侧变化。  \n\n其次，在技术变革与架构创新侧，云基础设施的发展带来了存算分离更为彻底的变化，这是技术变革带来的新可能性。分布式理论与云计算、AI 算法的融合带来了新一代的架构创新，这些都使得 HTAP 在云端可以支持不同的云存储，AI 等新技术，打造更有成本竞争力的创新。  \n\n我认为**真正 HTAP 的形态其实在云上做意义才大，因为 it's all about balance，只有在云上才能去打破 AP 跟 TP 之间对于资源的不平衡**。比如像 TP，其实要求的是一个稳定、高性能、低延迟的一些硬件资源，但对于 AP，可能是短时间海量的计算资源，因为要做高性能的 AP，你会发现在云下这个东西怎么摆都别扭，我为什么要去买这么高配的服务器，我为什么每天就跑三次大的全表扫描，但是 99% 的时间 CPU 都压不上去。云原生已经开始进入下一个阶段。今年在北美看到的情况是几乎所有公司都在做云 / 云原生方向的转型，这并不是需要讨论的事情，而是已经完备的状态。  \n\n第三，这一轮 HTAP 的用户群体和上一代内存数据库 HTAP 的小众贵族非常不同，这一代 HTAP 的用户非常大众化，**几乎采用 MySQL 和 PG 开源数据库的所有企业都可以借助新一代 HTAP 架构拓展 OLTP 和 OLAP 的能力范围**，都能用上一种不用修改应用，不用增加额外数据系统且拥有强大分析能力的数据库。\n\n## 要用云原生的方式进行架构改造\n\n今天做数据库，如果不提供云服务，出门都不太好意思和人打“招呼”（很快就会是 Serverless）。有很多人（尤其是数据库内核开发者）会低估做一个云服务的复杂性，经典的论调：“不就是在云上的自动化部署吗？”或者“支持一下 Kubernetes Operator？”\n\n其实并不是，甚至目标都应该反过来：**我们要做的并不是一个数据库软件，而是一个数据库服务**，当我们用更长的眼光去看的时候就会发现，后者是包含前者的。这个认知的转变是做好数据库云服务第一步，也是最重要的一步。  \n\n过去我们开发程序，不同的模块看到的环境是同构且确定的，例如：开发一个单机上运行的软件，不同的模块虽然可以有逻辑上的边界，但是链接到一起之后，运行起来看到的还是这台计算机的一亩三分地，「Everything is a trade-off」。即使近几年分布式系统的兴起，但对于经典的分布式软件而言，大致还是单机软件设计思路的延伸，只是通过 RPC 将多台计算机连接在一起，环境是相对确定的，尽管很多软件对于底层的环境变化做了一些适配：例如分布式数据库的动态扩容，数据重均衡 Re-balance 等，但是本质并未变化，只是能够操控和调度的资源变多了。  \n\n然而，在云上，这些假设都发生了变化：  \n\n1. 多样且几乎无限的资源通过 Service API 的形式提供，对于资源的调度和分配可以通过代码完成，这是革命性的变革。\n2. 一切资源明码标价，所以程序优化的方向从过去的一维的榨取最好的性能（因为硬件的成本已经事先支付），变成一个动态的问题：尽量花小钱办大事。\n\n假设的变化带来技术上的变化：**云上的数据库，首先应该是多个自治的微服务组成的网络**。这里的微服务并非一定是在不同的机器上，在物理上可能在一台机器上，但是需要能在远程访问，另外这些服务应该是无状态的（无副作用），方便快速的弹性扩展，这个带来对于开发者的转变就是：**放弃对于同步语义的坚持，这个世界是异步化且不可靠的**。我很高兴我的偶像 Amazon 的 CTO Werner Vogels 在 2022 年 ReInvent Keynote 上也强调了这一点。  \n\n放弃掉对于同步和单机的幻想，得到了什么？我们看一些例子：  \n\n第一，**最近几年被“聊烂”的存算分离**。在云上，计算的单位价格比存储要高得多，如果计算和存储绑定，那么就没有办法利用存储的价格优势，另外对于一些特定的请求，如对计算的需求很可能与存储节点的物理资源是完全不对等的（想象一下重型的 OLAP 请求的 Resuffle 和分布式聚合）。另外，对于分布式数据库来说，扩容速度是一个重要的用户体验指标，当存算分离后，原则上扩容速度是能做到极快的，因为扩容变成了：一是启动新的计算节点，二是缓存预热；反之亦然。  \n\n第二，**对于数据库来说，一些内部组件的微服务化**，例如：DDL-as-a-Service。传统数据库的 DDL 对于在线业务是有影响的（即使用了 Online DDL），例如添加索引时候，不可避免的需要进行数据回填，这对于正在服务 OLTP 负载存储节点来说会引起抖动。如果我们仔细思考一下 DDL 就会发现它是一个：全局的、偶发的、重计算、可离线进行，可重入的模块，如果有一个共享的存储层（例如 S3），这类模块非常适合剥离出来变成一个 Serverless 的服务，通过 S3 与 OLTP 的存储引擎共享数据。带来的好处毋庸置疑：  \n\n- 对在线业务也是几乎没有性能影响。\n- 因为按需运行，带来成本下降。\n\n类似的例子还有很多：日志（CPU 使用少，但是对于存储要求高）、LSM-Tree 存储引擎的 Compaction、数据压缩、元信息服务、连接池、CDC等等，都是可以且很适合被剥离的对象。在新的 Cloud-native 版本的 TiDB 中，我们使用了 Spot Instances 进行存储引擎的 Remote Compaction，带来的成本下降是惊人的。  \n\n在设计云数据库的时候，另一个重要的要思考的问题是：QoS(Quality of service)，具体到细节大概是：\n\n- 需要定义 WCU 和 RCU，作为控制的单位，如果没有办法定义它，你将没办法进行资源的分配和调度，乃至定价。\n- 多租户是必选项，租户之间一定要可以共享硬件甚至集群资源，大租户也可以独占资源（单租户模式是多租户的一种特化），带来的问题：如何避免 Noisy Neiberhood 问题？如何设计 Throttling 策略？如何避免共享的元信息服务 Overwhelm？如何应对极端的热点？\n- 挑战还有很多，我就不一一列举了。\n\n另一个很重要的话题是：云上哪些服务可以依赖？这是因为对于一个第三方厂商来说，跨云（甚至是跨云下，类似混合云）的产品体验是天然的优势，如果对于特定的云服务依赖得太深太紧，将会让你丧失这份灵活性。所以选择依赖的时候需要非常小心，下面是一些原则：  \n\n- **依赖接口和协议** ，而不是具体实现，服务内部可以随便自己搞，但是给其他服务暴露的接口要通用且不要做过多假设，简单来说，就是被调用者心智负担最小化（UNIX 时代留存下来的古老智慧）。一个很好的例子是：VPC Peering 和 PrivateLink，如果按照这个原则，肯定选择 PrivateLink，因为 VPC Peering 倾向于暴露更多的细节给被使用者。\n- **有行业标准就 Follow 行业标准**（S3，POSIX 文件系统），每个云上都有对象存储，而且每个云的对象存储 API 大概都会兼容 S3 协议，这就是好的。\n- 唯一的例外是安全。**如果没办法做到跨云的抽象，也别自己强行造轮子，云有什么就用什么**，例如密钥管理、IAM 等，千万不要自己发明。\n\n下面举几个例子说明一下，对于 Cloud-Native TiDB 来说，在选择依赖的时候做出如下选择：  \n\n**存储**\n\nS3，就像上面提到的，每个云都会有 S3 协议的对象存储服务。在数据库中使用类似 LSM-Tree 的分层存储，带来的好处是能够通过一套 API 来利用不同层次的存储介质，例如上层的热数据可以使用本地磁盘，下层的数据在 S3 上，通过异步的 Compaction 来将上层的数据交换到 S3 上。这是 TiDB 存算分离的基础，只有数据在 S3 之后，才能解锁 Remote Compaction 等操作。但是带来的问题是：S3 的高延迟注定了它不能出现在主要的读写链路上（上层缓存失效，会带来极高的长尾延迟）。对于这个问题，我是比较乐观的：  \n\n- 如果我们考虑 100% 本地缓存的场景，就退化成经典的 Shared-Nothing 的设计，用于支撑最极端的 OLTP 场景我认为是没问题的（参考现在的 TiKV），额外付出代价只是 S3 上的存储成本哪一个是很低。\n- 如果分片做得足够细，缓存和热点问题是好解决的。\n- 分层存储中还可以加入 EBS（分布式块存储）来作为二级缓存，进一步削峰（削弱本地缓存失效带来的延迟突变）\n\n我在 2020 年的一次分享中提到，**对于云原生的数据库而言，如何能利用好 S3 会是关键**。这个观点到现在还没有变化。  \n\n**计算**\n\n容器 + Kubernetes，和 S3 一样，每个云都有 K8s 的服务，就像 Linux 一样，K8s 是云的操作系统，虽然存算分离做完后，计算相对好管理一点，但是像一些计算资源池的管理，例如 Serverless 集群需要的快速启动（冬眠唤醒），从 0 开始启动建新 Pod 肯定来不及，需要有一些预留的资源，又例如使用 Spot Instance 来处理 Compaction 任务，万一某个 Spot Instance 被回收，能否再快速找个机器继续工作，又例如负载均衡和 Service Mesh…  \n\n虽然 S3 帮你把最难搞的状态问题解决了，但是这些纯计算节点的调度问题是很琐碎的，如果你选择自己造轮子，那么大概率最后你会重新发明一个 K8s，所以不如直接拥抱。  \n\n在云上，还有一个很大的设计问题：**文件系统是一个好抽象吗**？这个问题来自于在哪层抽象之下屏蔽云的基础设施。在 S3 普及之前，各个大型的分布式系统存储系统，尤其是 Google 的 BigTable、Spanner 等都选择了一个分布式文件系统作为底座（我认为这里面有很深的 Plan9 的痕迹，毕竟 Google 内部这些 Infra 大神很多都是从贝尔实验室来的）。  \n\n那么问题来了，如果有了 S3，我们还需不需要一层文件系统的抽象？我目前还没有想清楚，我倾向于有，理由仍然是存储的缓存，如果有一层文件系统，在文件系统层能够根据文件的访问热度做进行一层缓存，提升扩容时候的预热速度；另一个好处是基于文件系统，生态工具兼容性会更好，很多 UNIX 的工具能直接复用，运维复杂度降低。  \n\n我在 2022 年的 PingCAP DevCon 的 Keynote 中提到了一点：云上的数据库如何与现代的开发者体验融合？这个是一个很有意思的话题，因为数据库那么多年了，几乎还是这个样子，**SQL is still the king**。但是另一方面现在开发者开发的应用以及使用的工具已经和几十年前大不一样了，作为一个从 UNIX 时代过来的老程序员，看到现在年轻一代的开发者使用的眼花缭乱的先进开发工具和理念，只能感叹一代比一代强，虽然操作数据 SQL 仍然是标准，但是数据库软件能否做更多，去融入这些现代的应用开发体验中？\n\n## Serverless 将成为数据库最终的产品形态\n\n我认为云原生的下一个阶段，其本身会越来越自洽，并会逐渐形成全栈的云原生，这种全栈的云原生将会催生 Serverless 的发展。Serverless 的本质其实很简单，依旧是帮助开发者更进一步地隐藏基础设施的复杂性。**总结来看，未来几乎所有在云上的软件都会形成一个自洽的 Serverless 生态**。  \n\nServerless ，很多人认为的 Serverless 是一个技术名词。我认为不是，Serverless 更重要的是从用户体验角度定义了什么是更好的云上软件的产品形态。或者这本来就应该是理所应当的：为什么作为用户需要关心你有几个节点？为什么需要关心内部的参数和配置？为什么我点了启动，你要让我再等半小时？  \n\n这些在我们行业里面过去看起来似乎理所应当的事情，其实仔细想想都觉得挺可笑的，举个例子：假设你去买个车，卖车的先送给你一本发动机维修指南，告诉你读完才能上路，车跑得不快，然后告诉你某个发动机参数需要你调一下，每次启动汽车都要等半小时…这是不是很奇怪？  \n\n对于 Serverless 的产品来说，从用户体验来说，最大的意义在于三件事情：  \n\n1. 屏蔽掉配置，降低了使用者的心智负担；\n2. 极其快速的启动时间，这点扩展了使用场景和易用性；\n3. Scale-to-Zero，在多数场景中降低了使用的成本（当有明显波峰波谷，且你没法预测的场景），在小规模时甚至可以免费。\n\n有了以上三点，才能很好地将数据库嵌入到其他的应用开发框架中，这是构建更大的生态的基础。  \n\n除了 Serverless 之外，现代的开发者体验（DX）中还包含很多其他的关键要素，例如：  \n\n- **Modern CLI**：对于开发者来说，CLI 的效率比图形界面高得多，而且更容易通过 Shell 脚本组合其他工具实现自动化。\n- **云端 - 本地统一的开发 / 调试 / 部署体验**：没有人想天天碰服务器，本地能搞定的事情，就不要让人 SSH。尤其对于云服务来说，如何在云下开发和调试，目前是一个有很多痛点的市场。\n- **Example Code / Demo / 脚手架**：新一代的偏向 PLG 的服务提供商。例如：Vercel、Supabase 这一套玩的很溜，想想这也是合理的，对于普通的 CRUD 应用来说，基本的代码框架都是相似的，提供一些快速上手的例子，能够让开发者更快的体会到你的产品价值，也帮助开发者更快的构建他们的应用。\n\n因此，通常而言 Serverless 数据库应该具备如下四点关键特性：\n1. **按量计费且费用透明**。在 Serverless 数据库服务形态下，用户仅需为每次事务处理或查询分析所消耗的 CPU、存储、网络带宽、磁盘 I/O 等资源使用量而付费，不用则不产生费用。这为用户节约了大量成本，尤其是在运行负载不稳定或不可预测的应用程序时。此外， Serverless 数据库的计费方式完全透明，用户可以清晰了解资源消耗量，并计算准确的投入产出比，即 ROI。\n2. **极致弹性**。Serverless 数据库可以跟随业务复杂变化自动匹配所需资源，在很短的时间内大幅扩展应对流量和负载高峰，也可以在没有需求时缩到 0。从而帮助用户的应用程序总是能拥有合适的资源以保持最佳运行状态，而不用过度配置。\n3. **使用简单**。Serverless 数据库屏蔽了基础设施的复杂性，用户使用时不用做资源选型和容量预估，也不用再去关心底层的基础设施的管理维护。用户因此可以从繁琐的资源管理工作中彻底解放出来。\n4. **高可用**。Serverless 数据库能够在任何计算实例、网络，或者硬件发生故障时，通过多副本以及自动故障切换能力，保障用户的的数据始终可用，并且数据总是正确无误。\n\n听起来很美好，Does it even possible？经过大半年的时间，我们终于把首个原型做出来了，并在 11 月 1 号上线公测，它就是 TiDB Serverless Tier。  \n\n我自己写了一个小程序，在一个全新的环境下，通过代码启动一个 TiDB 的 Serverless Tier 实例。在整个过程里，我只是告诉这个程序，要启动一个集群，这个集群叫什么名字，然后把密码一输，20 秒之后可以直接拿一个 MySQL 客户端连上去了，这个时间未来会进一步缩短。想象一下，如果缩短到三五秒钟，这会极大地改变开发应用的使用流程和体验。而且不用关心它的扩展性，即使上线以后，业务流量变得巨大无比的时候，它也能够很好地扩容上去，没有流量的时候，它还能缩回来。  \n\n它背后其实有很多很多的技术细节，本文就不一一细说了。其中我们有一个原则，就是怎么利用好云提供的不同的服务，比如 Spot Instances、S3、EBS、弹性的 Load Balancer。TiDB 的 Serverless Tier 背后对于云上所有的弹性资源都进行了很好的整合，以及巧妙的调度，提供了一个极致弹性的用户体验。这个用户体验比原来的云原生数据库更往前跨越了一步，细节更少，抽象程度更高。  \n\n我几乎可以很肯定的说，**对于新创的所有数据库公司，如果说前两年你的门票是云原生的话，你今年的门票就变成 Serverless**，没有 Serverless 基本上不了牌桌。现在，Serverless 数据库也成了国内外各家公有云厂商，以及独立数据库厂商开始争相布局的领域。如 AWS、Azure、GCP、阿里云、腾讯云，以及 MongoDB、PingCAP、CockroachDB、Snowflake，最近一年来都在加速投入 Serverless 数据库服务。\n\n## 2023 年展望：新产品形态、商业模式、研发组织、AI 体验\n\n未来，数据库技术还是有很多事情可以做。不过，我个人觉得有一条主线，这条主线就是贴着**应用开发者**，最后不管是企业级应用还是其他各种应用，这些应用都是程序员写出来的，都是代码开发者开发出来的。  \n\n在 ChatGPT 出来之前，我一直认为 AI 存在过度炒作的成分，但 ChatGPT 真的让我感到惊喜，让我体会到 AI 的价值，它并非直接取代工程师，而是提升工程师的生产效率。这类工具与企业内部现有业务的结合将会是接下来非常值得关注的趋势。  \n\n本质上，行业如何提升应用开发者的效率，这可能是一个大的发展方向，有可能这个主线发展到未来，会发现数据库技术在做很多事情上都不是数据库技术了，比如一个更好用的 Serveless 数据库怎么做？我用一大堆负载均衡或者弹性计算的技术，甚至接下来我在想是不是 SQL 对于应用开发者来说还是太复杂了，有没有更好的离用户更近的数据产品表现形态？TiDB Cloud Serverless Tier 最近推出了一个 AI 工具 Chat2 Query beta 版，它可以让用户用自然语言生成 SQL 去做相应的数据查询，从而让每一个用户都可以以非常容易的方式从数据中获取洞察。  \n\n我觉得接下来未来的数据库技术，**技术本身不重要，最后的方向是提升每一个应用开发者的幸福指数**。数据库技术一定会往更简单、更加好用、更加方便地让大家写出新的应用，向加速进入市场的方向去努力。  \n\n以下面一段作为结尾，列一部分有意思的挑战，虽然肯定不完备，希望能对你有所启发：  \n\n1. **新的产品形态**。当不同租户的存储引擎上的数据都在 S3 之后，理论上可以解锁一个更大的基于数据共享和交换的市场（想象一下 Google Docs），又或者在 S3 上 + MVCC 理论上可以实现类似 Git 似的对于数据的版本控制，想象一下 git checkout 的顺滑体验，只是不同的是，你切换的是你的数据库镜像（我知道已经有云上的数据库产品开始探索该种产品形态），这会带来很多新的应用场景和独特的价值。\n2. **新的商业模式**。云是新的计算机，但世界上应该不会只有几台计算机，除了标准的 SaaS 模式外，还有没有可能将 DBaaS 作为一个整体进行输出，这可能又是一种全新的商业模式（尤其是在和一些二线或者私有云合作的时候），此时数据库厂商会变成输出数据库服务产品的厂商（有点绕）。\n3. **新的研发组织**。对于一个数据库厂商来说，过去研发和产品的需求几乎只限于内核开发，但是在做云服务的过程中，你不仅是开发者，还会是运维和运营者，而且开发云服务对于研发人员的技术栈的要求和数据库内核是完全不一样的，其中里面必然涉及巨大的组织变革和人事调整。\n4. **数据库的交互体验会被 AI 完全重塑**。当我们把 Serverless、HTAP、AI 结合在一起时，它们会完全改变我们与数据库互动方式的可能性。现在我们已经可以利用 AI 的能力将自然语言转化为标准的 SQL 代码，任何人，即使他不怎么懂 SQL 也可以轻松实现复杂的数据查询分析，让人人都有机会成为数据分析师，这就是未来数据库的样子，而这一天即将到来。  \n\n最后，过去一年，我们已经看到中国的很多技术、项目、开发者在全球产生了一定影响力，我也看到了广阔的全球市场在向中国企业招手。未来，越来越多来自中国的技术会逐渐走向全球，构建属于自己的全球影响力。","date":"2023-01-30","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"new-trend-of-database-development","file":null,"relatedBlogs":[]},{"id":"Blogs_442","title":"圆桌实录：技术无感化成为 2023 年最值得开发者和企业用户关注的技术趋势丨PingCAP DevCon 2022","tags":["TiDB","DevCon"],"category":{"name":"观点洞察"},"summary":"在 2022 年中，HTAP、Serverless、云原生、智能化成为全球数据技术的热门趋势。在刚刚结束的 PingCAP DevCon 2022 上，PingCAP 联合创始人兼 CTO 黄东旭、中国信息通信研究院云计算与大数据研究所副所长魏凯、云和恩墨创始人& CTO 盖国强、联易融副总裁沈旸、云启资本合伙人陈昱等嘉宾，与主持人 PingCAP 副总裁刘松进行了圆桌讨论。","body":"在 2022 年中，HTAP、Serverless、云原生、智能化成为全球数据技术的热门趋势。在刚刚结束的 PingCAP DevCon 2022 上，PingCAP 联合创始人兼 CTO 黄东旭、中国信息通信研究院云计算与大数据研究所副所长魏凯、云和恩墨创始人& CTO 盖国强、联易融副总裁沈旸、云启资本合伙人陈昱等嘉宾，与主持人 PingCAP 副总裁刘松进行了圆桌讨论。**分别从产业、资本、技术、媒体等视角出发，共同探讨了 2023 年最值得开发者和企业用户关注的技术趋势，开源、云架构、平台化成为他们对中国数据库的三大共识。未来，技术无感化将成为基础软件的终极目标，让应用开发者提升开发幸福指数**。\n\n以下为圆桌实录。\n\n## 全球数据技术和创新产品的前沿趋势\n\n**刘松**：2022 年，数据库领域或者整个 Infra 领域最重要的技术趋势或应用趋势有哪些？\n\n**陈昱**：我这次刚去了美国，有几个感受。一个就是美国特别缺人，缺人到什么程度呢？我去到咖啡馆，下午三四点钟就打烊了，因为根本就没有人来上班。第二个就是经济不好。经济不好的时候就要去省钱，会采取比如裁员、降低 Infra 投入等措施，这多多少少都会影响公司的决策。\n\n但是在数据库层面上，如果性价比足够高，那在现在的阶段就更可能会被采用。所以 PingCAP 现在去做的 HTAP 或者 Serverless，是处在这个正确的大方向上。\n\n**黄东旭**：我非常认同陈昱总刚才抓的重点，一个是省钱。因为现在包括各个企业，包括你是一个解决方案提供商，你要去卖你的产品的时候，如果你的 value 或者说你的 story 里面没有说我能帮你省多少钱，其实基本上大家可能都不会看你一眼。第二个我觉得是缺人，其实用另外一个说法大概就是从业者门槛的降低。相当于你原来可能是一个 Infra Engineer，现在没办法了，你可能被迫自己要变成一个 Full Stack，所以就相当于一专多能，或者说对于开发业务应用的门槛需要被降的更低。现在大家都希望用更少的人，更快的时间去 go to market，我举几个例子吧。\n\n第一，有几个我特别感兴趣的，或者说很有代表性的公司，一个是 Retool，最近其实可能大家也都听说过它的融资故事。Retool 其实是一个有点像低代码的平台，但是他专门 focus 给一些企业内部去构建 dashboard 或者说内部的一些工具。它的特点就是很简单，拖拖拽拽就能把这个活给干了。这个切入点非常巧妙，因为原来可能对于一个企业来说，开发内部工具可能都要一个团队，现在可能用这个工具很快就能省掉一个团队的事情，而且很简单就能够做出来。\n\n第二个我觉得很有意思的公司是 Vercel，它其实是一个前端的或者说网站托管平台。你可以认为它是一个更易用，更简单版本的 AWS。它的理念就是相当于帮你从应用开发、测试、发布以及到最后的运营，全都帮你一站式地去托管。它的整体模式也是走边缘 + Serverless 的模式。你会看到它的增长非常非常快，而且真正的使用起来，非常简单。\n\n所以我觉得刚才举到的两个例子，都是印证了那一点，就是省人，省时间，简单。我觉得这是可能整个行业，或者说在北美这边技术圈在发生的最新的一些事情。\n\n**刘松**：像 HTAP、Serverless，在北美目前的被谈论的程度和接受度，现在大概是怎么样的？还有 Serverless 是不是在硅谷已经变成了一个门票，做数据库、应用架构时已经变成了必选项？\n\n**黄东旭**：第一个问题，关于 HTAP。我觉得 HTAP 现在还是一个很新的概念，大家还是持一个偏怀疑的态度，但是这个需求又是存在的。大家不一定会去定义它到底是哪个名词，但是大家都会去用。大家现在还不太想说把 HTAP 变成一个专有的 category，而是说我先用一些新型的数据库或者新型的产品解决业务问题。我觉得 HTAP 的普及还需要一定的时间。但是，已经能够看到星星之火开始在燎原的状态。\n\n第二个关于 Serverless 是不是门票，我几乎可以很肯定的说，对于新创的所有数据库公司，如果说前两年你的门票是云原生的话，你今年的门票就变成 Serverless，没有 Serverless 你基本上不了牌桌。\n\n## 数据库技术有哪些关注点？（HTAP/Severless/\"DBless\"/智能化）\n\n**刘松**：视野回到国内，数据库技术在国内的发展，这一年有什么变化和关注点？HTAP、Serverless 等技术今年在国内市场上有哪些发生了一些变化？或者还有哪类的技术特别值得关注？\n\n**魏凯**：我刚才听了陈昱和东旭两位专家关于硅谷的分享，我也非常认同，国内同样也有省成本，节流的动力。客户肯定希望以更低的成本，更高的效率来管理他日益增长的数据资产。而且现在上云是一个大趋势，云已经普及到一个阶段了，下一步是更好地用云。其实企业在用云上的数据库，发现成本还是要更精细地去管理。我们所里最近也在盘点 2022 年云和大数据这个行业的主题词。一个共同的主题词就是怎么去更精细的使用云上的基础设施服务，更好地使用软件。一个主题是从上云变成高质量的用云。那么这个趋势就很明显的提示出，包括数据库在内的云上的软件，都需要满足用户的精细用云的需求，Serverless 就是这个方向。我觉得这个是一个趋势，总的来说是更好地使用基础设施，让用户更省钱，同时支持业务正常的运转，应对突发的流量。\n\n还有一个我看到的数据基础设施的需求就是怎么更好地支持数据资产化，怎么更好地支持数据的保护，内生的保护、权力的确定、后续的内部数据和外部数据的融合。所以我们看到了全密态、隐私计算、机器学习等这些技术怎么跟基础设施去结合。国内现在不仅在节流，而且在开源。怎么让数据变成一种生产要素，在社会上去广泛地跟别人的数据去连接，去碰撞，从而发挥更大的价值，就是往外扩，也是一个数据技术的发展方向。那么我们的基础设施可能也需要思考，怎么去更好地支持这个方向，而不只是节流。\n\n**沈旸**：从用户角度来讲，首先是要把价值描述得清楚。但是价值是很难通过技术本身来体现出来的，价值一定要通过场景来体现出来。不同的技术亮点在不同的场景下，节省的成本或者带来的效益是不一样的。\n\n比如说做基础架构的，或者说做应用开发的，首先还是得了解客户的业务和真正的使用场景，然后再把这个场景拆分成每个技术的组件，甚至拆分成技术里面的一个细分的技术点，从这个角度上去打动客户。我们讲的很多东西，为什么说有的时候要降本增效？使用一个技术、买一个产品是不是有价值，本质上还是要看客户使用这个东西能不能赚到钱，或者说给客户产生更多的价值。\n\n**盖国强**：我也一直在思考，未来的数据库，终极的数据库应该是什么样？大家都提到了 Serverless，其实我们是希望我们的数据库能够更弹性的，甚至是无感的伸缩，这个是在架构层面来解决问题。\n\n在数据库的内涵上，我们是不是也能实现优化？在今年大规模的国内的核酸检测上，我们曾经帮几个省去优化数据库，当面临这种并发负载的时候，我们发现，这个问题还远远没到我们现在所谈论的 Serverless 等等这样的话题上。往往这些数据库，通过简单的 SQL 的优化，数据库内部的热点表的拆分拆解，就能够解决问题。\n\n所以我认为未来我们所谈论的 Serverless，还应该极大地包含数据库内涵上的智能化。数据库可以在内部通过智能的、自动的热点拆解去解决这样的问题。所以在 Serverless上，我们可能还要讨论“DBless”，我以前讨论过“DBAless”。我们以前搞 Oracle 的时代，其实大家面临着一个很大的，很多年的一个困扰，就是一个 DBA，他要花费很多力气，才能把一个 Oracle 的集群安装起来。我们今天在使用分布式数据库的时候，很多 DBA 面临的挑战是我怎么样把一个分布式数据库，十个节点，一百个节点，把他部署运行起来。随着云原生或者 Serverless 技术的演进，我觉得它越来越简化了，理想状态未来可能不需要 DBA 去介入这样的场景了，当然，这包括的是说在 server 端做了很多的工作。我认为在应用端，我们要在 DB 内部，要去做很多很多的智能化的探索，去消解内涵上存在的一些问题。\n\n所以，我觉得在中国今天的这种大规模的数据应用场景下，可能会促使一些根本性的创新涌现出来。我是 DBA 出身，从 DBA 的视角来看，我认为 20 年前我入行的时候，我们所处置的那些问题跟今天我们使用一个数据库处置的问题没有两样。所以这是一个最大的痛点。我们可能在架构上投出了特别大的关注，但是在 DB 内部所做的事情不足够。\n\n## 20 年来数据库内涵的变化\n\n**刘松**：我觉得盖总提了一个很重要的新的关键词是“智能化”。东旭能不能简单地给听众讲讲，从分布式到云原生，再到现在的所谓的 Serverless，还有智能化，里面用了一些 AI、Machine Learning 这一条线，为什么走到今天还没有达到盖总说的“有那么明显的区别”？\n\n**黄东旭**：我现在最大的感受就是 Oracle 可能花了很长时间，很多很多年把用户积累下来的经验，全都弄到产品里边了，这是一条路。但是对于新一代的这些在云上的数据库，我觉得几个东西发生变化了。\n\n第一个，就是 workload 发生变化了。以前可能传统的单机型的数据库，他没有这么大的数据量的要求。当时设计出这个关系模型的时候，可能根本没想过，居然有一个数据库能有几百亿条数据，这个可能没想过这些。但现在运营商，或者说在分布式系统的加持之下，我觉得关系型数据库理论可能会有些修订。所以这个里边，包括到现在我们优化的方向是什么样子，可能跟前辈，像 Oracle 这样可能不太一样。盖总说到的一个优化的方案就是我怎么去确定好分区，或者分片，或者选择怎么去做 partition。一看就感觉这个东西是面向分布式或者大的数据量去做的优化，像这种优化，其实我觉得未来可能是应该做在数据库里面，其实是更好的。\n\n第二个，刚才其实也是像我说到的智能化这一块，Machine Learning 的这些技术，机器学习这样的技术最适合的就是人类的经验。比如说我这些东西见多了，我大概感觉往这个方向走一走就行了，这种事情其实最适合的是机器来做。当然，我刚才说到的像 Serverless，其实这些更多的是一种基础架构，或者说构建这个数据库的方式发生了变化，以至于我们终于可以去提供一个更简单的接口。从古到今都是，大家永远喜欢简单的东西，Serverless 是去实现更简单这一步里边会用到的一个技术的流派方向而已。\n\n## 从产业界看 HTAP 的应用场景和趋势\n\n**刘松**：东旭其实提到了几点，虽然数据库有了这么多年，但是最近有三个大的变化，一个是数据量，成百上千倍的增长，第二数据的负载越来越混合，第三就是对于怎么把数据库和人工智能结合，让数据库自己运行得更智能，更有易用性。这几点，可能这是几年发生的变化。\n\n那从需求侧看，这几个趋势是不是大家觉得未来也是数据技术领域最热门的？\n\n**魏凯**：自动驾驶的数据库，现在是大家梦寐以求的，用户都需要有这样的一个数据库。我也特别同意刚才盖总说的，内涵式的创新。刚才提到 Serverless，包括之前的上 Docker，上容器，这都是数据库部署方式的一种变迁。内涵式的变化，我觉得确实是一个趋势，而且有可能是未来创新的一个洼地。\n\n不光是小企业希望简化他们的数据栈，从业务系统到分析系统的管理，大企业也需要，大企业也苦于这几年他们要做 ETL，要做数仓，现在又要做数据湖，中间这个 Gap 又特别的大，他们花了大量的金钱去请咨询公司，去做数据治理，然后再建一个第二平面，这两个系统之间还经常还有数据质量的问题等等，他可能也需要一个融合。从宏观来看，可能未来我们的数据基础设施，我觉得不仅要照顾到交易的处理，还需要考虑到分析的处理，而且更好地支持这两个系统，让数据管理、后续的运维更加简单。这可能不只是一个 HTAP 数据库能搞定的，可能是一个更大的数据架构的再造。\n\n**刘松**：大多数客户都希望有一个简化的方式来处理这种混合负载，有可能你不知道到底是正在写入还是正在查询，这个尤其对于很多小企业来说，他没有大量的工程师团队去搞 ETL，搞数仓，尤其是一些现在新的系统。那么沈总，您从之前的经历和最近的金融经历来看，这种实时数据分析，类似于 HTAP 这种场景，你看到哪些？\n\n**沈旸**：HTAP 还蛮熟悉的，因为我从 2013 年就开始做 SAP HANA。SAP HANA 算是蛮早的一批做 HTAP 数据库，我一开始从做数仓起来的，做了很多年，当时零几年就通过 ETL 工具导到数仓，再做分析，从 ERP 系统导到 DW 数仓里面去做数据库的分析，一般来说延迟至少半个小时或者整个晚上的时间。这是一个比较传统的架构，其实这种架构到今天为止也基本上能支撑大部分企业的业务，因为我们讲所有的基础架构最终还是要为业务服务，我们看到所谓的业务主要分两种，第一个业务场景是互联网公司，互联网公司是对实时性要求非常高，他们做的一些决策其实也是有很多临时决策，比如做双十一的时候你看到很多订单过来是不是马上要做一些优惠，做一些促销？是这样一个场景。还有另外一种是比较传统的，尤其是制造业或者说不跟客户发生直接关系的零售行业，因为有些零售行业是通过分销或者代理的方式，大部分零售并不是实时的，比如在阿根廷的某个店卖出了一双鞋，是不会马上推送到总部那里去做实时分析？所以说我觉得企业会分两种，对于传统的企业，比如制造业或者非直客的零售业，其实用数仓的方式是能够解决问题的。\n\n还有对云的概念，现在我们想要用 HTAP 数据库的话，我们希望在云上有一款数据库能够快速提供服务的，不要让我知道底层所有的逻辑，在 AP 和 TP 之间做一个平衡，针对我这种场景做得还不错的。等到哪一天量特别大了，这时候我要去做一个更优化的场景，有可能会往回走，会要求我的数据从云上能回来，要提供能上得去又能下得来的便利性。\n\n**黄东旭**：稍微补充一下，我觉得沈总的观察还挺敏锐的。我就提一个点，对于一个 HTAP 为什么我们一定要在云上做，刚刚我觉得沈总回答到精髓了，我发现真正 HTAP 的形态基本上在云上做意义才大，因为 it's all about balance，你只有在云上才能去打破 AP 跟 TP 之间对于资源的不平衡，比如像 TP，其实要求的是一个稳定的、高性能的、低延迟的一些硬件资源，但对于 AP，可能是短时间大量海量的计算资源，因为你要做高性能的 AP，你会发现在云下这个东西怎么摆都别扭，我为什么要去买这么高配的服务器，我为什么每天就跑三次大的全表扫描，但是 99% 的时间 CPU 都压不上去。这件事情如果要达到沈总刚才描绘的那个理想的状态，有可能不一定是说你量大了要往回搬，反而可能是量大了在云上其实可能才能更省钱或者用云的技术才能更好解决。\n\n**刘松**：刚才沈总讲了他对 HTAP 的看法是以他从当年 SAP 的经验来看，这种存量的、稳态的应用其实数据仓库依然有很大价值，但是对于创新的、敏态的、追求实时性反馈的应用，HTAP 有它的空间。\n\n再往下，HTAP 恰好是在云上可能更能发挥负载均衡的效率和它的价值。这又延伸到了之前在私有部署情况下服务器的限制。所以其实是一步一步过来的，从负载，从场景，越来越多的场景部署到云上，HTAP 的部署对资源的要求也越来越多，发现云才能解决。\n\n## 中国数据库产业的三大共识\n\n**刘松**：目前有一个差异，国内的公有云离硅谷的还是有差距的。但我们国内的技术人大多数人都相信公有云或者是新一代云的技术还是会逐步因为技术的演进带来更大的空间，是不是这些技术未来也能够有部分的反向，比如云原生的技术，K8s 的技术反向回到了私有部署的空间，这个不知道盖总有没有什么思考？\n\n**盖国强**：我稍微再补充一下，我们从国内看整个数据库产业的状态大体上是一个什么样子呢？上半年我曾经写过一篇文章来讨论中国数据库的产业格局，第一个洞察是说开源在国内也成为主流了，开源数据库，所以从墨天轮的排行榜上来看，TiDB 长期在榜首。从 TiDB 到华为的 openGauss 再到 OceanBase 的开源，其实开源成为了国内数据库的一个关键的驱动力量。其实跟刚才陈昱总讲的非常相似，其实全球是一样的，大家都缺人，大家都希望省钱。缺人的一个解决方案就是通过开源能够汇聚众智，大家共同创造，比如我们知道 GitHub 上有 800 万的中国的程序员在贡献代码，这个力量是庞大的。\n\n第二是说开源能够为很多用户提供比较自由的使用方式，开源又在成本上提供了很大的优势，当然从全球看，从 DB-Engines 上来看开源数据库超越商业数据库的时间是在 2021 年 1 月份。我们比较乐观地看到在中国开源数据库的走势超越商业数据库其实已经也有大约一年时间，我觉得跟全球的格局是接近的。\n\n刚才讨论的 serveless，再到我们大家刚才探讨的 HTAP 在国内又呈现一个什么样的格局？这些探索从云上到云下会不会形成联动，或者是说成为一个共识？我们一直在观察和思考这件事情，中国市场如果从云的角度来看，他远远比北美更复杂，我们有公有云、行业云、政务云等等不同的形态，不同的形态在基础架构上其实就有很大的差异，在数据库上我们看到的差异性会更大。但是有几点共识我觉得是达成的：开源成为中国数据库里面的一个核心驱动力，大家围绕开源去构建生态，去构建核心应用；不管是数据平台还是整个企业级 IT 的基础设施也都已经梳理成了云模式，随之而来的就是以云架构去建设数据库，我们过去谈云原生，现在我认为 serveless 其实是云原生向前又更进了一步。所以开源、平台化、云架构，我认为不管是从公有云还是从行业云上这都是共识。\n\n再到刚才大家探讨的 HTAP，我一直在思考这件事情，有一些不同的看法。我始终认为未来的数据库应该对用户来说是无感的，你不要告诉用户我是什么样的数据应该去选择在 100 种时序里去挑一种，我又要在 100 种图里面挑一种，我要在 100 种 HTAP 里挑一种，我觉得未来不要给用户这种复杂性，只要这个数据来了，那我后端自动去匹配跟他最适合的，不管是存储场景还是计算场景。\n\n首先我认为 HTAP 其实是 OLTP 在发展过程中所衍生出来的一个概念，这个概念其实是不断将 OLTP 的场景在做放大化，从而去为用户提供简化的数据库应用场景。Oracle 在他 23C 里面提出的一个名词也叫 App simple，就是让用户简化、简单，我觉得这也是 TiDB 的一直以来的理念。站在这个出发点上我觉得不管我们是谈 HTAP 还是谈什么，他一定是正确的，只不过我们是如何让他做到更高效，让用户更无感。或者将来不需要再谈 HTAP，我们已经创作了太多的词汇。我记得爱因斯坦想做的一个事情叫统一场论，就是想把不同的概念力统一起来，他觉得太难理解了，如果我们将来把数据库的词汇也统一起来，把他简化，让名词“less”掉。\n\n## 云原生、开源成为企业基础软件的入场券\n\n**刘松**：我们先换一个视角，陈昱总从投资人的角度你对开源也很熟悉，对云也很熟悉，包括现在的平台化。你看这两年从企业服务也好，整个的技术来看，是不是最重要的、新的软件技术都要遵循，一个是开源技术，而且是真正的国际化开源，另外一个都是面向云架构的。你投资项目的时候会不会看项目对云原生架构的支持、是否开源、开发者生态是否活跃等，你怎么看待这三个趋势？\n\n**陈昱**：因为我们基金也是双币基金，做美元基金投资的时候和做人民币基金投资的时候还是蛮不一样的，day one 就得想清楚说你到底做的是国产化市场还是想去投资一个更大的全球市场。\n\n在国内，金融、政企去用的时候，肯定不会把云原生放到这么重要的地方。另外这么多花里胡哨的 serveless、HTAP 这些名词也并不重要，你给他一个数据库就好了。\n\n但是在全球市场来说，这些就可能也是个数据库 101 里面的东西，大家已经接受了，因为讲了十几年了，或者大家从一开始接触数据库的时候可能就会在公有云上面去玩，他也可能没有在自己本地上去装过一个 MySQL 或者 PostgreSQL，新一代的海外程序员可能对他来说数据库就应该跑在云上面，这可能就有很大的不一样。所以在做美元投资的时候肯定是开源、云原生，这肯定是绕不开的两个要素。\n\n**黄东旭**：这个地方我从技术角度稍微评论一下。我觉得云原生跟 cloud only 或 public cloud only 这两个不一定是等价的，你在私有部署的环境下，刚才说的云原生的架构也好，serveless 的架构也好，技术层面上都是可以应用到私有环境。第二，在这种私有环境下的 cloud native 以及 serveless 他带来的价值是不一样的，这个价值其实很传统的那些纯 OP 的产品比，他确实有自己独特的价值。\n\n## 2023 年最值得开发者和企业用户关注的技术趋势\n\n**刘松**：2022 年底我们往下看 2023 年，你认为最值得用户，包括开发者和企业用户关注的技术趋势和场景的趋势会是什么？\n\n**魏凯**：确实云是一个大家高度共识的，中国市场其实也在全面上云，大企业自己在建私有云，因为不管从什么角度，从监管的要求，从成本经济性的考虑，像中国头部银行他们从自己成本控制上，从自己业务的合规的要求上，都不得不自建云。但不管怎么样都是云，可能有很多差别，但整体上趋势都是在往云上迁，这个是一个大的背景，我是高度同意的，只不过他们不是完全用公有云。\n\n要说整个的趋势的话，我觉得可能还是回到刚才那个观点，我们要看怎么更好的让数据的存储、管理更高效，同时让上层数据的资产价值发挥更加地便捷，节流和开源都同等重要，我们的技术创新肯定也是朝着这两个方向去努力。\n\n**沈旸**：大家开头讲 OP 模式，中国的 OP 会是长期存在的，这个 OP 跟公有云还是有很大区别，比如说私有云的投资周期，可能投资三到五年中间是不会经常迭代的，但是公有云其实每年都会有大量新的投入跟投资，每年都会涌现很多新的技术。但是我觉得未来可能会有一种混合模式，就类似于我们现在大家看到的，既不是燃油车也不是电动车，而是是混动车在中国占的份额越来越高。因为中国也不能到处装充电桩，如果全部用石油可能资源又耗不起，最终用了一种所谓的混合模式。在国内如果说公有云和私有云之间的带宽跟延迟能降到足够低的程度的话，我觉得未来在国内这种混合模式也可能变得有可能。\n\n另外一个趋势，我觉得无论是 serveless 还是 databaseless，未来过几年大家可能会更关注“dataless”，因为大家去用数据，或者搭建应用的时候，其实把数据库搭完才实现了第一步，剩下还要大量时间找数据，做数据分析，最终为了得到一个很小的结论，你从前到后花了很多很多时间，在找数据上也花了很多时间。今年参加 TiDB Hackathon，大家把 TiDB cloud 拿来做很多的 public data 的共享机制，这个未来大家可以关注。因为没有数据，你根本无法做分析，也不是所有的数据都是你个人产生或者企业内部的数据，我觉得未来 20% 是企业自己内部的数据，80% 应该是社会或者其他各种数据拿来一起做分析，而且一个云上的数据库天生从 create 以后，就应该带有各种各样的 demo 场景的数据，否则 create 这个数据库我进去玩什么，我没什么可以看的，也没什么可以用的，这个对应用开发者和数据开发者不是一件非常友好的事情。而且这件事情也是 cloud only 的事情，就是在线下不可能做这件事情。\n\n**盖国强**：我概括几个词，第一个是开源，我特别希望说中国的数据库产业界能更加地走向开源开放，也要从中国走向世界，当然 PingCAP 已经作出了一个示范，在中国诞生的一个数据库今天在北美去征战市场。我们相信中国技术会越来越多走向全世界，在每一个角落里找到应用场景。让开源更开放，中国技术才能走向世界。\n\n第二，让应用更深入，更广泛。虽然国产数据库出现了一个蓬勃发展的生态格局，我们在墨天轮排行榜上有超过 200 个国产数据库品牌，但是整体上大家的市场占有率仍然很有限。在国产化的浪潮之下，其实我们能够预测或者感受到 2023 年会是国产数据库蓬勃发展、广泛应用的一年。\n\n第三，我希望产业界的同仁们能够携手协作，东旭刚才也讲了在很长时间内数据库的开发者和 DBA 是两个世界，开发者干一套活，DBA 是这样在用，在整个行业市场我们看到其实从学术界到产业界再到用户，其实都存在很多的壁垒，如何能够在国产化的浪潮里加速打破这个壁垒，让大家能够携起手来让用户真正的需求能进入到数据库内核，让学术界的科研成果也加入到数据库内核里面去，这样的话会加速发展。我看到 PingCAP 在跟 CCF 做了很多合作，我希望能够加速融合的态势。\n\n最后我有一句话作为总结：开源莫畏征途远，开源这个事是非常漫长的，需要坚持，需要大家共同投入聚焦，还有一句话：耕获菑畬又一春，只有不断的耕耘才能最终获得收获，数据库绝对是一个长期主义者。\n\n**陈昱**：从投资人角度，我更希望看到数据库发展往一种技术无感化的趋势去发展，无论 HTAP 也好还是 serveless 也好，其实他都在尝试着去降低用户的使用门槛，我希望有一天作为一个程序员不用再关心 TP 和 AP 使用起来有什么样的差异，你不用去关心怎么才能够把我的数据库在云上部署，然后能够把各种存算分离、各种弹性扩展的东西给用起来，我不需要花一天把数据库部署上去，再花一个月做数据库调优。我希望以后这些东西就全部都消失，对于程序员来说你只需要两行或者三行代码把你的商业逻辑写清楚就好了，你不需要去了解数据库底层到底是怎么实现，到底怎么才能够用好，我希望长远来说数据库能够往这个方向去发展，技术无感化。\n\n**黄东旭**：首先数据库技术还是有很多事情可以做，包括像刚才魏所和沈旸提到的数据共享，包括盖老师这边讲到的各种各样的应用场景，陈昱这边提到的门槛降低，其实还有很多事情可以干。但很多事情我个人觉得有一条主线，这条主线就是贴着应用开发者，到最后不管是企业级应用还是其他各种应用，这些应用都是程序员写出来的，都是代码的开发者开发出来的。\n\n本质上来说你怎么去提升这些应用开发者的效率，这点可能是一个大的主线，有可能这个主线发展到未来，会发现数据库技术在做很多事情上都不是数据库技术了，比如一个更好用的 serveless 数据库怎么做？我用一大堆负载均衡或者弹性计算的技术，甚至接下来我在想是不是 SQL 对于应用开发者来说还是太复杂了，有没有更好的离用户更近的数据产品表现形态？包括刚才说的数据共享，现在有大量的 web3 公共数据集，也有其他各种公共数据集，我能不能快速在启动数据库的时候自动加载上去，在云上这一切其实都是可能的。我觉得接下来未来的数据库技术，技术本身不重要，最后的方向是提升每一个应用开发者的幸福指数。数据库技术一定会往更简单、更加好用、更加方便地让大家写出新的应用，加速 go to market 速度这个方向去努力。","date":"2022-12-08","author":"PingCAP","fillInMethod":"writeDirectly","customUrl":"round-table-conversation","file":null,"relatedBlogs":[]},{"id":"Blogs_430","title":"中国赛宝实验室李冬：中国数据库产业发展研究丨PingCAP 用户峰会回顾","tags":["HTAP"],"category":{"name":"观点洞察"},"summary":"在 9 月 22 日举办的 PingCAP 用户峰会上，中国赛宝实验室李冬（博士）分享了主题为「中国数据库产业发展研究」的议题，本文为分享实录。","body":"在 9 月 22 日举办的 PingCAP 用户峰会上，中国赛宝实验室李冬（博士）分享了主题为「中国数据库产业发展研究」的议题。他指出，当前数据库技术融合发展趋势明显，云原生和多云的需求进一步增强，数据库与大数据正在深度融合应用，存算分离成为发展的主流，HTAP 也成为新的关注方向。PingCAP 通过分布式和云等自主创新技术，实现了架构式的跃迁，是我国数据库产业值得借鉴和思考的突围途径。  \n\n以下为分享实录。  \n\n![李冬.jpeg](https://img1.www.pingcap.com/prod/_510e147ddb.jpeg)\n<center>李冬（博士）分享现场</center>\n\n各位在场的嘉宾大家好，我是中国赛宝实验室的李冬。感谢大会的邀请，我很荣幸来到这里与大家分享赛宝实验室对中国数据库产业发展的一些研究心得。  \n\n数据库作为 IT 行业最重要的核心产品之一，近年来正发生着巨大的变革。**过去十年，从技术到市场，从产品到业务，数据库产品和产业发生着重大的变化**。我们认为来自各类客户的业务需求升级拉动了数据库产品的功能扩展和能力升级，进而推动了整个数据库产业的变革。  \n\n众所周知，用户的抽象需求包括：**第一是海量数据的存储**，预计到 2025 年，全球的数据量将达到 175 ZB，中国在 2025 年将达到 48.6 ZB ，成为全球第一；**第二是海量并发的访问**，从企业内部的数百、数千个并发，到互联网模式下的百万级到亿万级的并发的支持能力，都是数据库需要去支持的；**第三个方面是灵活部署的需求**，为了提升数据库的高可用，各行业都在加速信息化基础设施的分布式建设；**第四个方面是弹性伸缩的需求**，新的应用场景需要数据库具备弹性伸缩的能力；此外，还有一些其他的新需求，过去 20 年，数据的生产主体经历了从企业到个人的转变，个人电脑、手机移动应用成为数据创造的动力源，同时带来了端边云协同、AI 融合、软硬结合、数据安全、隐私保护等带来了一系列的挑战，**需求的升级对数据库产业带来的影响是确实可见的**。  \n\n从全球数据库产业的变化来看全球数据库市场的格局发生了巨大的变化。2017 年来，Oracle 的市场占有率从 36% 下滑到了 20% ，市场空间基本上被云数据库取代，Oracle 一枝独大的格局已经发生了改变。**基于开源模式的数据库的市占率已经超越了闭源数据库产品**。根据 DB-Engines 的数据显示：截止到 2022 年 8 月，全球 383 款数据库中，开源数据库占比 52.2%，超过了商业数据库，远高于 2013 年的 35.5%；在最受欢迎的排名前十的数据库中，开源数据库占据了六席，在中国的情况也非常相似。根据墨天轮的数据显示，截止到今年 8 月份，中国数据库流行度排行榜前 4 位的数据库中有 3 款是开源数据库，TiDB 、openGauss 都是开源数据库，第四位的 OceanBase 也是开源不久。  \n\n![全球数据库发展趋势.png](https://img1.www.pingcap.com/prod/_e23abefc03.png)\n\n行业用户的选择也更加多样化，阿里、亚马逊等互联网企业还有一些金融机构，他们从传统数据库转向了云数据库。**数据库产品的品类丰富，创新活跃，呈现百花齐放的态势**。这主要表现在数据模型的关系型和非关系型在不断地发生变化，数据架构从单机集中式到分布式演进，部署形态从本地到云部署的创新，还有多模态数据库创新也非常活跃。数据库技术融合发展关键趋势更加明显，云原生和多云的需求进一步增强，数据库与大数据的深度融合应用，以及存算分离也成为发展的主流，HTAP 数据库成为新的关注方向。  \n\n通过对全球数据库产业发展情况的分析，我们认为**传统数据库是无法满足当前数字化需求的**，各行业纷纷探索跨越型的解决方案。Gartner 在其发布的《原生分布式数据库引领数据管理技术发展趋势》白皮书中指出，传统的数据库技术难以满足存储与计算海量数据的要求，数字化浪潮带来更多业务种类及更长服务时间，都对数据库系统提出更严峻的挑战。传统数据库处理能力与用户实际需求的剪刀差在不断拉大。  \n\n![经验分析.png](https://img1.www.pingcap.com/prod/_a54273dcff.png)\n\n以金融行业为例，大数据处理分析的需求交织着普惠金融、数字金融进程的快速推进，数据能力已经成为金融企业在新时代业务能力的重要抓手。与此同时，移动互联网和电子支付业务的蓬勃发展，给金融行业的典型应用场景，如核心账户与账务交易、在线支付、移动支付交易业务、实时交易监控与指标分析等业务都提出了新的需求。金融行业的数据急剧增长态势对数据的存储和管理也提出了更高的要求。**金融行业对业务连续性能力更加重视，需要面临高并发业务和高用户量带来的系统压力，对移动应用的响应速度要求更快，从技术来源层面也面临着新的选择**。这些需求叠加在一起，传统以大型机、小型机加上 Oracle/DB2 为主构建的集中式金融数据库系统显得愈发力不从心：管理弹性不足、处理性能跟不上、安全保障能力有待提升、支持处理的数据类型单一、开发运维能力差、难以全面掌控产品核心技术等矛盾愈发突出。  \n\n各行业都在探索满足行业特征的新型数据库，从近年来数据库的发展趋势看到，寻求更好的根本性的解决方案已经成为了业界的共识。**云原生、分布式数据库以及诸多特性，成为互联网与金融用户成功解决业务场景需求，并正在引领数据库管理技术的发展趋势**。这种架构的跃迁不是数据库之间的恶性竞争，而是源自于用户对数据量爆发增长、对数据立体化分析、实现数据资产积累与发挥数据资产效能的需求本身。开源作为基础软件最主流的生产协作模式，聚合了全球开发者的创新能力，并通过持续流动的社区形成产品的迭代创新，基于网络生态的大规模协作以提高迭代效率。同时，开源社区最接近产品的实际需求，能够更好地吸纳最终用户、收集反馈，增强通用性和可用性。  \n\n中国数据库经过 20 多年的发展，目前呈现出了百花齐放的局面。根据墨天轮 2022 年 8 月的中国数据库流行度排行，共有 228 款数据库参与其中，排名前九名的分别是三款开源数据库、三款闭源数据库和三款云数据库。在 228 款的数据库里面，关系型数据库有 150 款，分布式数据库有 113 款，**分布数据库已经超越了集中数据库成为中国数据库的标配**。  \n\n![国产数据库.png](https://img1.www.pingcap.com/prod/_81118a23de.png)\n\n伴随着我国科技的快速发展以及产业数字化转型的快速推进，各行各业的数据使用场景也呈现了多元化趋势，越来越多的业务数据被企业存储、分析和利用。**各行业的核心业务数据体现出明显的差异化，也对数据库提出了不同的需求**：  \n\n- **互联网行业**对数据库的业务需求复杂性高，主要业务包括在线商城业务、订单系统、合同管理系统、实时风控系统、后台数据管理系统、智能推荐系统、VIP 会员系统、小程序业务系统等，其数据特点是海量数据存储、高并发读写需求、高峰业务弹性需求大。且互联网企业对成本控制需求高，但面临 IT 监管审查一般要求不高。\n- **政企领域**对数据库的业务需求复杂性不高，业务多为事务性分析，对数据关联分析能力与可用性需求高。一般对 IT 环境安全性要求高，但对成本不敏感。\n- **金融业务**的业务数据爆发式增长、反洗钱等新型业务分析需求不断提高，对信息系统高并发请求、海量数据的高性能存取及多维数据的关联分析提出了极高的要求。同时金融业务的特点也要求数据库具有高安全、高可靠、高性能、高扩展的能力。金融用户面对合规监管要求高，对成本敏感度不高。\n- **工业互联网领域**，在产业数字化转型过程中，从工业互联网对数据库的需求看，数据库应满足工业数据海量增长、高并发、低时延、高可靠与实时分析的需求。  \n\n按照我们的科学分类法，赛宝实验室为中国数据库绘制了一个蓝图，将 100 多款中国数据库品牌容纳进来，我们也期望各厂商能够通过良性的、高质量竞争，共同推动中国数据库无死角、高质量的发展，为我国基础软件领域的自立自强作出贡献。  \n\n![国产数据库图谱.png](https://img1.www.pingcap.com/prod/_b777f9eeb5.png)\n\n数字化转型的不断深入推动了数据库产业的蓬勃发展，据初步统计，目前中国已经有数据库厂商近 200 家，随着这个领域的创新企业的不断涌现，产业格局正在向核心技术和关键场景纵深突破。这张表展示了国产数据库采用了多种的实现途径，像 TiDB、openGauss、TD-Engines 等扎根国内的根社区和根生态正在形成，引领和超越的破局产品处于酝酿和爆发的前夜。  \n\n![国产数据库发展路径.png](https://img1.www.pingcap.com/prod/_6063cdc019.png)\n\n虽然当前中国数据库产业是百花齐放、百家争鸣的局面，但是无论是产业规模还是产业能力，跟国外的主流公司和产品还有不小的差距。**在政策体系，标准统一、产品能力提升、关键技术攻关、服务体系建立、企业管理规范等方面的问题还亟待解决**。数据库产业中的战略人才、生态、知识产权保护与竞争等问题依然严峻。  \n\n我们看到中国数据库虽然在过去 20 年取得了很大的发展，但是通过我们的产品测评和用户需求的洞察，我们看到中国数据库同样还存在很多的挑战，**在这个挑战中，我觉得最关键的是生态和人才方面的挑战**。  \n\n在商业数据库产品层面，像甲骨文公司还有一些其他的数据库公司，他们有很深的护城河，构筑了数据库产品的壁垒，主要是得益于生态。**今天中国数据库最迫切的是加快体系化的生态建设，我们的服务体系、知识体系、社区体系都需要建设，而且迫在眉睫**。我们还应该看到中国数据库研发的人才也十分稀缺，据说是 Oracle 有 4000 多个内核研发人员，而我们中国数据库厂商可能合计加起来可能也只有这么多研发，那么这就对我们的规模、速度都提出了挑战。从这个角度看，中国数据库的发展趋势之一应当是开源，只有通过开源才能快速的集聚区人员团队上的优势。  \n\n**此外，非常严峻的挑战还包括降低产品的同质化竞争，提高知识产权的意识等等方面**。结合前述的各种情况，赛宝实验室认为中国数据库产业的发展途径可以从以下四个方面进行探索：  \n\n![中国数据库产业发展途径.png](https://img1.www.pingcap.com/prod/_1f9c87ab97.png)\n\n**第一，全面深刻理解数据库的分类体系和发展格局，探索多元化的发展途径**。在当前的情况下，海量高并发、异构、多模、混合负载、智能分析等需求在不断地驱动数据库的发展。云与云原生，分布式、AI &DB 等又反过来推动数据库的技术转型。数据库的内涵与外延明显的正在发生不断的丰富和变革，重新定义数据库的概念，重新归纳数据库的分类体系，重新划分数据库的赛道格局，探索多元化的发展路径是一件非常重要的事情。  \n\n**第二，细分赛道差异竞争，引领新赛道创新格局**。那么在新的细分的数据库赛道，我国的数据场景丰富，数据库产品起步早，应用广，具备国际领先性。在关系型数据库之外，应加强对于 NoSQL 领域数据库的关注，鼓励差异化竞争，通过在时序、图、文档等品类方向上的投入和引导，实现在新方向上的创新引领产业格局。  \n\n**第三，重视场景驱动的技术升级，通过架构跃迁实现变道超车**。可以预见的是在不远的未来，云数据库取代传统数据库的趋势是不可逆转的，这种趋势的变化类似于互联网从电商开始对传统行业的渗透，也正如电动车吞噬燃油车的市场。这说明像 PingCAP 这类数据库企业，通过分布式和云等自主创新的技术实现架构式跃迁的方式，是中国数据库产业值得借鉴和思考的突围途径。  \n\n**第四，打造繁荣的开源生态，借助开源实现技术溢出与供需结合**。由于数据库技术的门槛高，发展难度也比较大，需要充分借力开源实现弯道超车。通过开源吸纳更多的数据库厂商、用户单位和开发者，汇聚全产业力量，打造有影响力的开源社区。发挥头部企业技术溢出作用，鼓励头部企业自主开源，开放软件源代码和持续贡献，才能推动中国数据库实现跨越式发展，保持自主开源的创新动力源源不断。  \n\n以上就是我今天报告的全部内容，更详细的信息可以参考赛宝实验室即将发布的《中国数据库产业发展研究报告》，谢谢大家。","date":"2022-10-12","author":"李冬","fillInMethod":"writeDirectly","customUrl":"research-on-the-development-of-china-database-industry","file":null,"relatedBlogs":[{"relatedBlog":{"body":"本文回顾了 PingCAP 创始人兼 CEO 刘奇在 9 月 22 日的用户峰会上以《现在决定未来》为主题的演讲，**分享了 PingCAP 在技术演进、用户价值、数据库技术趋势、国际化、社会价值等方面的思考**，同时也记录了建信金科、百胜中国、传音控股、老虎国际等用户在刘奇的演讲中分享的最佳实践。全文字数约 8,800，预计阅读时间 20 分钟。\n\n![刘奇.png](https://img1.www.pingcap.com/prod/_6c926b4679.png)\n\nPingCAP 到今天已经成立 7 年了，在全球拥有 3,000 多家大中型用户，其中很多还参与到 TiDB 开源社区的建设中，这些情况如果放到创业之初很难想象。\n\n**今天，我们认识到做一个真正广泛应用的数据库，是一个需要以十年为时间单位进行投入的基础工程**。这一路走来离不开关心和支持 PingCAP、喜欢 TiDB 的每个人。\n\n## 与客户对话，客户眼中的 TiDB\n\n过去一段时间，在和包括日本、美国、印度、欧洲等全球客户交流时，我们试图从更多不同客户的视角去了解他们到底是怎么看待 TiDB 的。\n\n在 TiDB 的设计里，有很多设计是从第一天就开始的，我们甚至完全不觉得这个设计有什么特别之处。直到我问一些专家型用户“你到底为什么选择 TiDB ？”时，他们告诉我：**因为 TiDB 的开放式架构可以管理复杂性**。我当时挺诧异，因为这个东西第一天就是这样设计的，已经融入 PingCAP 的血液当中，所以我们自身已经无感。但对这些专家来说，他们当中很多人在各个大公司本身就做过数据库，甚至是大型分布式系统，做过这些系统的人都会产生一个心态，那就是对“复杂性”会无比敬畏。\n\n![与专家型客户对话.png](https://img1.www.pingcap.com/prod/_b7cdaa3e30.png)\n\n一个数据库，哪怕它是一个小型数据库，通常代码规模都会有几十万行，上百万行，如果是一个传统的成熟型商业数据库，那更是一个以千万行代码为单位的系统。**面对如此复杂的系统，用户在考虑未来的迭代时，通常要做 3-5 年的规划**。如果用户需要花 3-5 年来替换一个 PB 级数据库，很大程度上意味着接下来 5-10 年的时间他就不想再动了，这也是本次峰会的主题为什么是“现在决定未来”。\n\n**今天我们做一个数据库替换的决定，它的影响周期很可能是接下来的 10-20 年**。在这个较长的周期中，大家看系统价值的时候就会看到完全不一样的价值。比如最近我意外地发现 TiDB 在 CFO 眼里其实很受欢迎，他们表示，在现有实践中，TiDB 至少可以降低一半的成本，所以 CFO 很快就会批下来对 TiDB 的部署和应用。大家可以试想一下，如果用户有 PB 级的数据，用 TiDB 替换能够省一半的成本，是不是非常有吸引力？\n\n今天的世界充满了不确定性，在此前提下如何能更好地生存下去？省钱自然会变成一个全世界都关注的话题。\n\n但所有这些价值的前提是接下来 5-10 年，甚至 10-20 年这个系统不能死，能持续支撑业务。这时候问题就来了，**凭什么一个系统在接下来 10-20 年间还能够支撑用户的业务？用户做架构选择最重要的标准是什么？**\n\n是整个设计团队是不是具备掌控复杂性的能力，是不是能够看到未来 10-20 年企业中的系统复杂性会朝什么方向迭代，今天在系统里做好设计，可以应对未来的高速演进和迭代，而不只是一个过渡方案，过两年还要再换。**虽然我们在设计 TiDB 的过程中，已经做了高度分离式架构，开放式 API ，但有些东西融入血液时就会无感，而在用户看来这恰恰是他们最看重的，这给了我们很大启发**。\n\n一个专家型用户跟我说：“**人类几千年来应对复杂性只学会了一个道理，就是分而治之**”。这听起来好像是一个很简单的道理，回想一下会觉得他说得太对了，这也是人类几千年来应对复杂性的唯一办法。分而治之落在软件或者数据库的复杂性上面，应该是什么样的？这就是 TiDB 未来的演进方向，也是整个行业未来的演进方向。\n\n![与应用型客户对话.png](https://img1.www.pingcap.com/prod/_0e4e2d2a4a.png)\n\n与专家型用户不同，应用型客户又是完全不一样的观点。有些用户是做创业公司，能不能活过两三年自己也不知道。**如果选择一个东西需要花 2-3 年才能看到足够大的价值，肯定等不起，他需要更快地兑现价值**。事实上，这些应用型客户不仅仅是那些创业公司，还有很多是大公司里面的新项目。大家知道在一个大公司里经常出现一种情况，当做一个新业务时，每个人心里都清楚时间很有限，公司可能等不了用 5 年时间来做一个创新，所以怎么才能更快地释放数据价值才是他们关心的话题。\n\n今天的数据库是一个百花齐放的状态，甚至在国内的一些场景出现了数据库“四世同堂”的局面，同时跑着大型机、小型机、x86，接下来甚至还要引入分布式数据库、云数据库，对用户而言选择一个数据库其实非常困难。\n\n**世界变化太快，很多时候用户可能是在项目进行的过程中突然有了一个新的想法**。怎么用最快的速度把这个东西做出来，并且做出来之后不用操心它是不是能扛更高的并发？如果快速把第一个原型推到线上，用户是不是可以不用操心后面的并发问题？当推到市场时立刻就能获得新的反馈，新反馈作为新需求加进来后，能不能在当天就直接提供服务？这个时候非常依赖数据库的能力，特别是当我们和越来越多的年轻人聊时，会发现他们今天已经不再关心数据库任何底层的东西。**他们只关心你有没有能力让他用最快的速度将产品或服务推向市场，在推向市场后有没有能力支持业务高速发展**，有些用户甚至连 SQL 都不想写了。\n\n## 重新思考：如何以敏捷性应对未来\n\n所有这些对数据库的能力要求非常高，本质上我们要用数据库的能力支撑业务的敏捷性：如果要支持一个敏捷业务，那数据库本身的迭代能力是不是足够敏捷？**这让我们对敏捷产生了全新的思考**。\n\n有两个用户让我觉得特别震撼，其中一个是区块链领域的用户，通过使用区块链技术追踪区块链里的每一笔交易，如果是相同的人还可以追踪跨链的交易。这个用户在不到一年的时间里，单个集群数据量从几 TB 上涨到一百多 TB。因为 TiDB 太好用了，他会把更多的数据往 TiDB 里放，把 TiDB 作为在线服务。当你有这个想法时就会发现，你根本找不到一个其他数据库能满足这个需求；它需要在线服务、低延迟，需要从不同角度查询数据，你可以用索引、HTAP 能力，还必须要有非常强大的 SQL 能力，因为用户会不停往里面塞数据。\n\n![客户感受.png](https://img1.www.pingcap.com/prod/_c02e4a56a0.png)\n\n前两天在 Hacker News 上有一个热帖，微软云的 CTO 发了一个推特，引起了轩然大波，他说现在 C 和 C++ 这类语言被标识为过时的语言，如果大家用 Java 或者其他软件，经常会把过时的不再支持的 API 标记成过时数据。他的建议是我们应该把 C++ 标记成过时，任何项目不再用 C++ 写，应该全面使用 Rust。可能有人有印象，TiDB 在 2015 年就开始用 Rust 写存储层。但对于新用户来说，当知道我们用 Rust 和 GO 作为编程语言时，他们就会说你们好时尚，实际上这是我们 7 年前的决策。当初，Rust 还没有发布 1.0 版本，拿这个东西来写数据库简直是开玩笑。\n\n**很多时候，我们的一点创新，一点激进的动作，很可能在当初饱受非议，但在未来却可能成为主流**。PingCAP 在技术、架构上面一直会选择非常积极的创新，非常具有前瞻性的创新，这些创新甚至要在 5-7 年后才能感受到当初的选择是非常正确的。\n\n![客户成功范式.png](https://img1.www.pingcap.com/prod/_0b64827dd5.png)\n\n总结来说，如果用几个词来形容 PingCAP 的成功范式，那就是自主开源+持续引领+面向未来的创新，都服务于客户成功，不管是专家型的客户还是应用型的客户，TiDB 都能够很好地去支持他们的业务更好、更敏捷地迭代发展。TiDB 也因此成为众多行业头部用户的共同选择，助力用户业务敏捷增长。\n\n### 用户分享：建信金科为什么选择与 TiDB 同行？\n\n![建信金科.png](https://img1.www.pingcap.com/prod/_8915b47379.png)\n\n**建信金科基础技术中心副总裁邢磊分享了建信金科如何借助 TiDB 实现业务增长敏捷性**。建信金科自关注分布式数据库以来，PingCAP 一直未离开过其视线。与大多数用户不同，建信金科与 PingCAP 的接触不是从 TiDB 开始，而是 TiKV，为什么是这样的选择？\n\n建信金科的微服务、分布式，要求对数据做拆分，需要在现有业务不做大调整的情况下，去开启业务应对未来不确定性的能力。在这个过程中有一个绕不过去的问题，这么多传统渠道、传统业务和交易，如何在不影响现有交易模式的前提下改造后端的服务能力？TiKV 在这样的场景下进入视野，以前建信金科用的是国外开源软件，整个历程中遇到的问题和挑战非常大，也给自己的安全稳定运行带来很大挑战。\n\n建信金科一直在思考怎么去找一个自己能掌控的技术，去解决后续将在这个领域上面对的问题。从 2020 年开始接触 TiKV，做业务场景适配，包括早期的技术、产品验证，以及双方在 TiKV 上投入研发的资源和精力，一起努力了差不多一年时间。这是建信金科做过的所有案例里耗时最长、投入最大的项目。2021 年 10 月，建信金科第一次把 TiKV 5.0.4 版接入到全行分布式体系当中，顺利扛住 4 万多 TPS 压力稳定运行，开启 TiKV 在建信金科分布式体系中的重要作用。**随着核心业务的改造，建信金科去年底将整个核心业务在分布式平台上进行切换，TiKV 起到了非常关键的作用。自 2022 年开始，建信金科更进一步借助 TiKV 的高可用体系构建了跨地域、跨中心的灾备能力**。\n\n**HTAP 在金融场景的验证**\n\n传统金融企业在交易业务线、数据分析业务线的处理其实都会分开，多维查询和管理类分析业务倾向于用大数据业务处理，但随着自己的数字化转型逐步深入以及各种平台生态建设，所有的关键业务、核心业务都面临着新的挑战，这恰恰就是 HTAP 要解决的问题。这个场景用传统的大数据技术很难在数据实时更新场景下同时提供多维的分析和查询能力。在这个场景下，当时建信金科遇到非常大的挑战，留给 PingCAP 的时间非常短，从 4 月底提出到 5 月底验证，只有一个月的时间。去年 10 月正式投产进入稳定的迭代。现在，建信金科每个新的场景都会有 TiDB 的身影。\n\n**当前，建信金科正在尝试将系统升级到最新的 TiDB 6.1 版本。同时，也在将更多的统一视图、全量资产、反洗钱业务在 HTAP 上做验证和迁移**。未来，建信金科与 PingCAP 将进行联合技术创新攻关，在金融场景下更大规模业务模式的创新以及未来数据库如何更好的适应云计算趋势等方面进行更多探索。\n\n回顾来看，为什么 PingCAP 能够在众多分布式数据库厂商中受到建信金科的持续关注？主要有三点：  \n\n**第一，服务于客户成功**。数据库是一个服务于应用的产品，只有关注客户的成功，关注客户遇到的实际问题，才能够赢得更好的发展；  \n\n**第二，PingCAP 的开放性**。PingCAP 从出生开始就一直以开源开放的特征存在于数据库行业，正是这一点使得建信金科更倾向于选择它，相信开源和开放的力量会成为未来企业技术重要的组成部分；  \n\n**第三，成长性**。所有的技术不能光看它在当前已经取得的成就，以及当前表现出来的状态，更重要的是关注它的成长性。技术从当前的里程碑到下一个里程碑，加速度是不是足够快，如果有更快的加速度，现在所有存在的困难和差距都会在短时间内得到突破。与 PingCAP 一起，与优秀的开发者和专家一起，将取得更大的成长。\n\n### 百胜中国：拥抱开源，加速创新\n\n百胜中国首席技术官张雷分享到，百胜中国是中国最大的餐饮企业，致力于成为全球最创新的餐饮先锋。百胜中国获受肯德基、必胜客和塔可贝尔在中国内地的独家运营和授权经营权，并完全拥有小肥羊、黄记煌和 COFFii & JOY 餐饮品牌，也和意大利咖啡企业 Lavazza 合作，在中国探索和发展 Lavazza 咖啡店品牌概念。截止 2022 年 6 月底，百胜中国在中国的足迹遍布除港、澳、台之外的所有省市自治区，在 1,700 多座城镇，有 40 多万员工经营着 12,000 多家餐厅，全年客流量超 20 亿次。  \n\n2021 年，百胜中国正式启用了位于上海、南京、西安三地的数字化研发中心，这是公司打造一个充满活力的数字化生态系统的重要里程碑。由数字化研发中心、合资公司以及第三方合作伙伴组成的多层次研发体系，为公司品牌和业务进一步创新发展，加速扩张，抓住市场机遇奠定了坚实的基础。**在数字化不断发展的今天，打造敏捷高效的数字化能力，成为了餐饮企业的立身之本**。  \n\n百胜中国在业内率先推出了手机点餐业务，在全国范围门店推出了数字支付，疫情期间也落地了大规模的无接触配送，百胜中国不仅持续地完善从线上点餐、外卖到会员计划、礼品卡等消费者场景，同时在餐厅内也构建了百胜自主研发的点餐和收银系统，持续打造餐饮业领先的端到端的数字化生态。  \n\n截止 2022 年 6 月底，百胜中国的线上会员数量超过了 3.85 亿，2022 年第二季度，数字化订单占比达到了 89%，会员营销额也约占到了系统销售额的 62%。百胜中国也不断利用数字化能力赋能门店运营，例如基于数据和 AI 能力，构建了餐饮行业特有的营运大脑以及口袋经理，为门店运营效能的提升提供了数据以及系统支撑。同时也聚焦自动化、IoT 及智能餐厅等领域，基于当前不断蓬勃发展的大数据、云计算等基础能力，借助于百胜中国自己的研发中心、合资公司以及第三方合作伙伴，共同为百胜中国两万家餐厅的目标夯实牢固的数字化基础。  \n\n**百胜的生态环境中拥有丰富的应用场景，让各种技术能力有生根落地的机会**。同时随着企业数字化转型进入了深水区，对于数字化基础设施的自主可控性和灵活性的要求也进一步在提升。开源软件起到了越来越重要的作用，成为企业创新实践的催化剂。  \n\n![百胜中国.png](https://img1.www.pingcap.com/prod/_4cdb5f9900.png)\n\n基于开源基础软件体系，可以提升企业 IT 技术的标准化；活跃的开源社区，也可以有效帮助企业降低试错成本。当企业投入一定的资源协助开源社区建设时，能够同步提升自主的技术品牌和技术人才的能力以及影响力。TiDB 是业内开源分布式数据库的翘楚，百胜中国在 2019 年就开始了前期研究，以尝试替代传统的商业数据库产品。**百胜中国非常看重核心数据的处理主权，开源数据库恰恰能够帮助掌握这一主权，同时借助活跃的开源社区，进行企业内部创新性的架构研究以及落地**。  \n\n**经过大概一年的探索，TiDB 最终在百胜的业务中台，例如消息中台、用户中台以及支付中台中得以落地实施，用于支撑百胜中国的线上交易**。TiDB 对于百胜中国的海量数据提供了稳定可靠的系统支持。众所周知，由于餐饮行业存在着明显的高低峰场景，目前像肯德基“疯狂星期四”，它的交易量是远超平常的，TiDB 的灵活水平扩展能力，使得百胜中国可以根据业务的需求进行计算资源实时调整，助力降本增效。  \n\n同时，在社群营销、ERP 报表等典型分析场景中 TiDB 的 HTAP 特性，也使得百胜中国可以以较小的代价进行海量数据的在线融合分析，以实现敏捷的业务支撑，百胜中国将 ERP 中的交易数据同步到 TiDB 中，再与 BI 工具进行集成，大幅缩短了企业内部的财务报表生成时间，极大提升了内部的工作效率。随着云原生和开源技术的持续发展，百胜中国不断加强各种新型开源技术的深度探索、应用以及融合，从而更有力地推动餐饮垂直行业云能力以及自我创新的发展。  \n\n![分布式数据库联合实验室.png](https://img1.www.pingcap.com/prod/_55e5ecc5a8.png)\n\n本次峰会中，**PingCAP 与百胜中国强强联合，成立“百胜中国 ✖️ PingCAP 分布式数据库联合实验室”**。联合实验室立足于双方的技术和生态优势，共同探索前瞻技术的创新和落地实践，提升餐饮行业的数字化服务水平和能力。  \n\n![数字生活 24 小时.png](https://img1.www.pingcap.com/prod/24_8ab85a9704.png)\n\n其实不只是建信金科与百胜中国，今天 TiDB 已经支撑了很多人一天 24 小时各种各样的生活需求，融入了人们的日常生活中。  \n\n![业务敏捷.png](https://img1.www.pingcap.com/prod/_ec97814792.png)\n\n在软件领域有一句经典的话，“Make it work, make it right, make it fast”，TiDB 今天就在 make it fast 的阶段。随着 TiDB 架构本身的分离做得越来越好，TiDB 架构的正确性会让性能提升和改进非常惊人。一个正确的内核才有成长的可能和更高的成长性。在过去一年的时间里，PingCAP 在核心场景 OLTP 领域获得了显著的性能提升。\n\n## 新物种：聊聊 HTAP\n\n![新物种 HTAP.png](https://img1.www.pingcap.com/prod/HTAP_9d37dafa2a.png)\n\n我在和客户聊的时候发现，HTAP 是一个很难讲明白的技术，它和 Hadoop 有什么区别？原来的大数据非常重，像是一只大象，相较之下 OLTP 数据库就像一条蛇，很灵活很快速，它不是加法，而是融合，是一个全新的物种。  \n\n但关于 HTAP 的挑战并没有解决，到底什么叫 HTAP？有没有一个例子能让用户一下子明白？TiDB 能干什么别人干不了的事吗？我们做了一个 DEMO，试图在 5 分钟内讲明白到底什么是 HTAP，到底 HTAP 能带来什么样的价值。\n\n![OSS Insight demo 简介.mp4](https://img1.www.pingcap.com/prod/OSS_Insight_demo_11f2a32fab.mp4)\n  \n\n一个好的 DEMO 应该具备什么特点？第一得好看，第二得好用，我们的 DEMO 除了好看、好用，还得好玩。这个 DEMO 所有数据都是真实的，并且一秒就能体验。我们也希望将这个 DEMO 开源出来分享给其他伙伴，这也非常符合 PingCAP 开源的理念。\n\n![OSS Insight 价值启发.png](https://img1.www.pingcap.com/prod/OSS_Insight_45d7bdad71.png)\n\n有一位用户曾经问我们 “用 HTAP 前后有什么差别？”，有一个非常直观的体验：OSS Insight 第一版只用了两个人，一个周末就做出来了。如果是传统方案，通常要用 4-6 个人，花半年时间。  \n\n![Insight.jpeg](https://img1.www.pingcap.com/prod/Insight_ddd6ff75b5.jpeg)\n\n这个事情给了我们另外一个启发，**每个人都有好奇心，每个人都有自己洞察的视角，每个好奇的灵魂都值得用 Insight 去激发**。这之前，我们只能看非常冰冷的 TPCC、TPCH 等和业务看起来一点关系都没有的东西，对新一代程序员来说这简直是上古语言。产品的价值能不能和用户的挑战结合起来？业务创新的敏捷性又依赖于数据敏捷。  \n\n最近一段时间脱口秀比较火，人人都能说 5 分钟的脱口秀。通过 OSS Insight ，我们可以让人人都能在 5 秒钟内获得 Insight 。我们设想每一个组织、每一个企业、每一个人都可以获得这个能力，都有这个好奇心去获取 Insight，像我们 700 人的企业就有 700 个脑袋。OSS Insight 中都是开源数据，任何一个人去看都能提出自己的 idea。  \n\n通常情况下，用户接下来的问题会是：到底有什么场景不是你的舒适区？我们根据所有线上用户真实的情况，画了下面这张图，大致描述了 TiDB 的舒适区到底在哪里。  \n\n![TiDB的数据敏捷区间.png](https://img1.www.pingcap.com/prod/Ti_DB_25b538382e.png)\n\n\n### HTAP 已死？\n\n在我们和用户聊的时候，经常有用户说 HTAP 这个概念已经听了 8-9 年，为什么一直没有火？甚至以为 HTAP 已经死了。**如果按照它原来的定义，HTAP 确实已经死了**。  \n\nHTAP 原来的形态基于两个基础假设：一个是内存即硬盘。十年前，“内存是新一代的磁盘”这一说法被炒得火热，如果真是这样，每台机器上现在都可以拥有 1 PB 以上的内存。但现在大家看到内存依然很贵，这意味着当时 HTAP 的第一个假设，内存足够大足够便宜，被证明是不现实的；另外一个是摩尔定律，过去当 CPU 高速发展的时候，我们对摩尔定律充满期待，而显然过去十年 CPU 发展速度让我们很失望，所以当时的两个基础到今天都不存在了。  \n\n但有一句话说得好， “科学的每一次进步都是在葬礼上取得的”；**上一个 HTAP 已经死了，为什么 PingCAP 还在坚持 HTAP ？最近 HTAP 又很火的样子，这是为什么呢**？  \n\n实际上，关于足够大的内存和硬盘，足够多的 CPU 和算力，如今都可以通过云的方式来得到，在云上你可以拥有近乎无限的内存。今天用户的使用习惯也产生了改变，用户希望在一个系统里面能存储足够多的数据，足够快地处理事务。所以，**一个强大的 OLTP 能力是 HTAP 的基础，但凡不具备这个基础就不能称之为 HTAP**。  \n\n![HTAP 重生.png](https://img1.www.pingcap.com/prod/HTAP_7fe55562d3.png)\n\n**在这个背景下，HTAP 重生了**。过去一年里， MySQL 发布了 HeatWave 作为 MySQL 的 HTAP 解决方案，Google 也在今年发布了 AlloyDB ，不久前 Snowflake 也发布了它的 HTAP 引擎 Unistore。  \n\n![HTAP 特性.png](https://img1.www.pingcap.com/prod/HTAP_14cf0a5239.png)\n\n**我们认为 HTAP 带给用户的体验就是简单 + 实时，同时还要求整个系统具备非常强的隔离性**。共享一份资源会面临较大挑战，因为它会吃掉大量的 OLTP 资源，所以物理隔离是 HTAP 的基础。TiDB 的架构很直接地展示了这个能力，当我们完全是物理隔离的时候，TiDB 的执行计划会很智能地从 OLTP 中选择这部分数据。TiDB 在过去发展过程中，最早是作为一个业务数据库在用，随着里面数据越来越多，一定程度上它就变成了一个实时数据服务层。各种各样的业务系统开始把 TiDB 作为中间层提供彼此交互的能力，比如 CRM 不能和 ERP 直接对话，但通过 TiDB 把数据聚集在一起，它们就可以直接对话了。  \n\n![TiDB 典型应用场景.png](https://img1.www.pingcap.com/prod/Ti_DB_2711011985.png)\n\n\n## 持续引领数据服务的敏捷性\n\n![持续引领.png](https://img1.www.pingcap.com/prod/_a47b16f178.png)\n\nTiDB 在持续引领数据库的演进方向，我们相信在接下来 2-3 年的时间里，会有越来越多的数据库加入这个队伍，朝着共同的方向去迭代和演进。  \n\n![DB 微服务化.png](https://img1.www.pingcap.com/prod/DB_8a0c4a6007.png)\n\n**未来的方向一定是数据库微服务化**。这表面看起来有点奇怪，为什么数据库要微服务化？微服务和数据库有什么关系？我们认为，今天的数据库不仅仅是数据库的一个内核，它已经是一套复杂系统，前面提到的掌控复杂性的方法只有一个，那就是分而治之。  \n\n**微服务化本质上会达到一个效果，让规模化效应开始掌控一切，最后带来的结果和用户的价值，可以大幅压低用户使用成本**。目前，TiDB Cloud 在过去一年中通过持续孵化改造，成本已经降到了原来的 1/10。一个很简单的例子，今天每一个数据库都有一个能力叫 GC，如果每一台服务器都去配这样一个能力，要么压力大的时候不够用，要么完全浪费了，但是这个功能又不得不配上。比较好的办法是让这个 GC 也能够规模化，使它本身变成微服务。数据压缩、持续后台优化都是这样，我们不能用原来的系统资源去做，用户希望花钱买的每一份计算资源都是为他服务，而不是用 1/3 来做后台服务。\n\n## 连接中国与世界\n\n**在全球，TiDB 一直发挥着连接中国和全世界的作用**。为什么那么多的用户、合作伙伴会选择我们？开源、云中立以及全球合规，就是 TiDB 起到的连接作用。\n\n![应用场景连接中国与世界.png](https://img1.www.pingcap.com/prod/_7113459090.png)\n\n同时，PingCAP 有大量的应用场景也是连接全球的，上图可以看到今天 TiDB 已经被用到了全球各行各业。每一个场景里都有中国的用户，也有来自美国、日本、新加坡、欧洲和印度的用户。  \n\n基于中国全球领先的场景，基于开源非常高效透明的传播与协作模式，基于开源汇聚全球的智慧，最终使得 PingCAP 得到全球更多的客户与合作伙伴的信任。  \n\n### 用户分享：传音携手 PingCAP 打造全新数字化非洲土壤\n\n传音控股是一家致力于成为新兴市场消费者最喜爱的智能终端产品和移动互联服务提供商，在与 PingCAP 的合作中，将其移动商店的整体服务架构迁移到了 TiDB 上。传音控股移动互联 CTO 史团委表示，**PingCAP 使得传音控股可以将更多资源投入在业务的推进上，从中后台工作中解放出来，大幅降低成本**。TiDB 的水平扩展、故障自恢复、数据强一致性、高度兼容性等特点，帮助传音控股实现了技术进阶，提升了用户体验，加速了技术架构平台化与垂直化的演进。\n\n![传音移动互联.png](https://img1.www.pingcap.com/prod/_79a61abd29.png)\n\n### 用户分享：老虎国际 - 只有真正的全球化公司 才能服务全球化客户\n\n老虎国际作为全球知名的国际化券商，在新加坡、美国、中国香港、澳大利亚等地持有 59 张牌照或资质，在全球多地开展业务。老虎国际技术副总裁柳锴表示，只有真正的全球化公司才能服务全球化客户。基于全球化的业务，老虎国际的数据架构、数据安全等也面临着全球化的挑战。**TiDB 可以解决系统架构的复杂度，同时通过低延迟、数据强一致性，解决业务挑战与数据安全挑战**。  \n\n![老虎国际.png](https://img1.www.pingcap.com/prod/_47275021c8.png)\n\n## 技术人如何创造社会价值？\n\n作为一个技术人员，我们一直在想一个问题，**作为一家企业怎么创造社会价值，怎么做更多的贡献**？PingCAP 最早从开源起家，把所有一切能开源的东西都开源了，开源始终融在我们的基因里。  \n\n作为数据库从业人员，作为数据库的开发者，我记得上大学时还没有一个非常好的数据库教程。那时数据库依然没有办法做到足够的平民化，并不是每一个人、每一个开发者都能拥有一个永远在线的数据库。所以当时我就有一个想法，以后一定要让数据库变得触手可及，让每个人都可以拥有自己的数据库。为了让 TiDB 触手可及，我们做了很多事情，推出了自己的 Talent Plan，与 VLDB 合作，所有的一切都是希望让数据库变得触手可及。同时这也帮我们带来了非常繁荣、多样化的社区， 目前已有 1,895 位 Contributor，覆盖 45 个国家与地区。  \n\n![TiDB让开发者触手可及.png](https://img1.www.pingcap.com/prod/Ti_DB_44c8aff85e.png)\n\n说到触手可及，最要紧的一件事情就是成本。随着 TiDB 的新一代分布式架构和规模化效应，今天我们终于能够让每一个开发者都可以拥有一个永远在线的免费的数据库，我们可以随时去体验这个数据库，这就是新的架构带来的成本优势。  \n\n![与开源同行.jpeg](https://img1.www.pingcap.com/prod/_3f21f3105e.jpeg)\n\n在过去的 7 年中，PingCAP 一路走来磕磕绊绊，我一直在想能不能把这些经验教训也都开源出来？今天我们非常高兴地宣布，经过半年多的集体创作，我们将过去 7 年的那些经历、经验和教训，也开源出来，首发《与开源同行》这本书，希望大家喜欢，继续与 PingCAP 同行。  \n\n最后，[TiDB Hackathon](https://tidb.net/events/hackathon2022?utm_source=website-zh&utm_medium=referral&utm_campaign=blog-keynote) 是我最期待的一年一度的技术盛会，也期待你的加入。  \n\n![Hackathon 2022.jpeg](https://img1.www.pingcap.com/prod/Hackathon_2022_d7a6299f4a.jpeg)\n","author":"刘奇","category":5,"customUrl":"the-future-is-now-by-max-liu","fillInMethod":"writeDirectly","id":420,"summary":"9 月 22 日 PingCAP 用户峰会上，PingCAP 创始人兼 CEO 刘奇和来自建信金科、百胜中国、传音控股、老虎国际的用户共同分享了 PingCAP 在技术演进、用户价值、数据库技术趋势、国际化、社会价值等方面的思考与实践。","tags":["TiDB"],"title":"刘奇：能否掌控复杂性，决定着分布式数据库的生死存亡"}},{"relatedBlog":{"body":"在刚刚结束的「 PingCAP 用户峰会」中，PingCAP 研发副总裁唐刘、PingCAP 中国区技术服务总经理李超群从 PingCAP 的**自主开源、工程研发体系、产品未来技术演进方向等方面，分享了 PingCAP 如何通过产品研发和服务体系将产品价值“又快又稳”地交付给客户，获得客户的信任，并帮助客户实现成功**。以下为分享实录。\n\n![唐刘.jpeg](https://img1.www.pingcap.com/prod/_21a492c193.jpeg)\n\n服务对于数据库公司来说是一个沉甸甸的词汇。对于产研团队来说，只有做出产品，并把产品交付客户，才会有后面的服务。但 PingCAP 作为一家非常年轻的公司，所做的是一个非常有挑战性的数据库产品，如何让客户选择相信 PingCAP？如何让客户放心地将他们的数据存放到 TiDB 数据库？\n图片\n\n## “透明”建立信任\n\n开源是 PingCAP 的基因，PingCAP 从一开始就将源代码开放出来，让所有人都能看到 TiDB 到底是什么样子。但仅仅只有代码的开源是远远不够的，经过 7 年多的发展，**我们深知开源有着不同的阶段**。当把源代码开放后，客户和用户就能够自行下载 TiDB 源代码进行编译，发布到自己的生产环境中，服务于自己的客户；当他们遇到问题时，可以选择自己修复 bug，或与 PingCAP 一起探索，共同完善 TiDB 功能；有一些用户、企业甚至将 TiDB 作为自己的上游版本，通过 TiDB 构建自己的发行版，服务于客户。我们也希望能有越来越多的用户构建自己的 TiDB 发行版创造更多价值。  \n\n面对不确定的经济环境，我们如何从当前的复杂环境中生存下来？**开源是建立信任的最佳途径，但只有开源也是远远不够的，PingCAP 认为唯有透明才能解决问题，透明一切能透明的事情**。为什么透明对 PingCAP 和用户都如此重要？一方面，PingCAP 到目前为止有 3000 家用户、 1800 多位开发者分布在全球 45 个国家和地区，同时 PingCAP 内部有 300 多位研发工程师。PingCAP 和开发者、用户之间形成了一个非常多元的网状结构。所以我们开源了源代码、设计文档。  \n\n为了更加透明，我们还将 TiDB 未来 1-3 个月的产品路线图开放，让大家了解 TiDB 即将发布的功能。有一些朋友可能会问：你们把所有东西都开源，都透明了，友商看到会有什么动作？其实比起担心这个问题，**我们更希望让客户清楚地了解 PingCAP 到底在做什么以及 TiDB 未来的方向，并因此更加相信 PingCAP，共同走向未来**。\n\n## 让客户“又快又稳”感知到产品的价值\n\n作为一家做数据库产品的公司，仅仅只有开源与透明也是不够的，如果 TiDB 不能给客户带来价值，如果客户不能使用 TiDB，其实就建立不了任何信任，我们需要让客户又快又稳地感受到 TiDB  的价值。PingCAP 是一家非常年轻的公司，一方面产品需要快速地迭代，不断将产品价值快速交付客户；另一方面，面对许多核心场景，我们需要打磨一个更加稳定的产品，让客户非常高效非常放心地使用。所以， **PingCAP 采用了一个“稳态+敏态”双轨并行的研发机制，保证产品更新对用户触手可及，同时在核心场景也能稳定放心的使用**。\n\n![又快又稳感知产品的价值.png](https://img1.www.pingcap.com/prod/_134ef9fa8b.png)\n\n那么，PingCAP 是如何实现“稳态+敏态”双轨并行的研发机制呢？  \n\n- 一是开放式架构，分离一切能分离的，从物理上保证隔离性；\n- 二是 TiDB 有着非常丰富的应用场景，用户在 TiDB 社区持续参与产品共创。\n\n下面通过几个小例子讲讲 PingCAP 如何与客户进行共创：  \n\n第一个例子是中通快递。快递物流行业在双十一或者 618 时面临的挑战是非常巨大的，中通快递实时数据业务需要将全国 3 万多网点产生的实时物流信息写入到数据库中，然后动态分析业务状况。双十一等物流高峰期间，日写入 / 更新流量超 30 亿条，分析库总量在百亿级。中通快递很早就拥抱了 HTAP ，通过实际业务场景的打磨，**TiDB 帮助中通快递抗住了双十一的流量高峰，HTAP 分析引擎配合分区表动态裁剪的高效数据过滤，支持了中通快递双十一 20 多个报表系统秒级查询**。通过业务场景的深入应用，中通快递将 HTAP 读写混合的极限负载能力提升了 100% 以上。\n\n![中通快递案例.png](https://img1.www.pingcap.com/prod/_46d41fcb8e.png)\n\n第二个例子是 [OSS Insight](https://ossinsight.io)。这是一个非常有代表性的业务场景，首先它是一个从 0 到 1 快速打造的产品，适合当前很多公司的敏态业务。这个产品的主要产品经理就是我们的 CEO 刘奇，需求天天变，今天提的需求明天就要交付，对于研发工程师来说是非常大的压力和挑战。但 OSS Insight 有将近 50 亿条数据，很多查询条件非常复杂，面对这样高度复杂的情况，一方面要实现快速迭代，另一方面还要保证查询稳定高效运行。之前我们通过加很多 HINT 的方式来保证查询计划的稳定，但当业务不断变化时会增加很多索引，调整 DDL ，导致之前的 HINT 失效，为了解决这样的问题我们和 OSS Insight 研发工程师一起，不停打磨重构 TiDB 的优化器，现在不光研发工程师不再需要写 HINT ，我们发现 TiDB 的智能优化水平比人工写 HINT 提速了 20-30%。\n\n![OSS Insight 案例.png](https://img1.www.pingcap.com/prod/OSS_Insight_2b438696c0.png)\n\n第三个例子是某头部股份制银行。该行一直坚信 TiDB 能应用到银行核心系统上，与 PingCAP 协力持续打磨 TiDB 的内核能力，在 7×24 小时性能测试过程中，将整个延迟抖动控制在 2% 以内。在互联网交易系统上，更将整个延迟缩短了 4 倍，满足了互联网业务线上交易的核心述求。\n\n![银行案例.png](https://img1.www.pingcap.com/prod/_10de7b9511.png)\n\n## 平滑升级，让客户又快又稳地感知到产品价值\n\n由于 TiDB 不断打磨，快速发布新版本，许多用户会面临一个非常大的选择问题：新产品是非常好，但我的数据库跑得好好的，为什么要升级？数据库在企业数字化系统中是非常核心的组件，版本升级往往面临着着很大的风险，能不能不升级？  \n\n我们的答案是，要升级：**一方面客户通过升级到最新版本，在延迟和性能方面都得到了大幅提升，同时也更有信心将注意力聚焦于自己的业务逻辑开发上**，另一方面，PingCAP 研发工程师与服务团队一起打造了一套完善的数据库升级体系，支持客户的平滑升级。  \n\n在技术、产品之外，PingCAP 还在产研内部专门成立了保障企业级客户成功的组织，比如金融架构师团队。它由 PingCAP 的资深架构师组成，致力于重要金融客户的共创、功能研发和项目支持。\n\n## 未来，与客户持续户共创，携手成长\n\n**很多企业级客户选择 TiDB 的理由，就在于它的可生长性**。未来， TiDB 仍然会在这方面不断地努力。首先，我们会聚焦于 TiDB 的内核，不断打磨。我们相信，无论怎么生长，如果没有坚固的底座是不可能向外更好生长的。在这个基础之上，TiDB 会在 DB 微服务化、云原生、智能化上不断拓展产品的边界和能力，与各种各样的生态结合，为客户提供更多价值。  \n\n这些年来，TiDB 一直持续不断地专注于 OLTP 核心能力提升，以银行交易核心为抓手，在优化系统、细粒度资源控制以及长尾延迟等各方面实现了突破，让 TiDB 变得更快更好用，在大表快速添加索引方面性能提升 10 倍， 在 Real-time HTAP 提速 1-2 倍。  \n\n![Serverless.png](https://img1.www.pingcap.com/prod/Serverless_8b1a211b76.png)\n\n**当前，无论国内还是在海外，云都是技术演化的未来**。而恰恰云能够将整个 PB 级别的数据库服务平台价值无限放大，未来 PingCAP 会提供一种全新的数据处理和访问形式—— Serverless。PingCAP 提供非常方便易用的 Data API，让企业级用户只需关注自己的业务，不用在意数据在哪里，底层长什么样。  \n\n**我们有一个梦想，当 TiDB 具备 Serverless 能力的时候，每个开发者都可以拥有自己的数据服务**。这个数据服务能做到秒级别的创建速度，亚秒级别的唤醒启动，毫秒级别的访问延迟。当一个数据库具备这样能力时，对于用户的价值其实是非常大的。一方面，所有开发者都拥有数据库，关于 TiDB 人才培养再也不需要担心；另一方面，用户只需要关注于自己的业务逻辑开发，以及如何更快将业务推向市场。  \n\n![TiDB 技术方向战略清单.png](https://img1.www.pingcap.com/prod/Ti_DB_d3e1c1bca5.png)\n\n上图是 TiDB 整个产品的技术演进方向，包含 TiDB 内核、DB 微服务化、云原生、智能化以及生态。在智能化方面，TiDB 在不断打磨自动诊断服务 Clinic ，通过自动诊断服务可以让每个用户都拥有一个 TiDB 性能调优专家，让每个用户都可以更好地使用 TiDB 。\n\n## PingCAP 服务体系\n\n客户成功这件事，不仅仅是产品研发团队的事情，也是整个 PingCAP 公司一起努力的结果。PingCAP 中国区技术服务总经理李超群在用户峰会上分享了 PingCAP 服务体系。  \n\n目前为止， PingCAP 技术服务人员的总人数已经占到了公司总人数的 25% ，成为继产研之后的第二大团队。可以说，**PingCAP 既是一家产品型公司，也是一家服务型公司**。  \n\n![李超群.jpeg](https://img1.www.pingcap.com/prod/_7b7bb3b034.jpeg)\n\nPingCAP 服务体系包含三个方面——**订阅服务、专家服务和培训认证**：  \n\n**订阅服务**：过去一年，PingCAP 实现了用工单系统做客户技术服务，可以非常容易地跟踪工单进展；我们开通了产研直通渠道，客户如有紧急问题可以第一时间拉通产研；第三，基于庞大的社区，我们把社区以及工单里的所有问题都整理出来，建立了 TiDB 知识库，在今年 12 月份会向所有企业客户开放。\n\n![订阅服务.png](https://img1.www.pingcap.com/prod/_1245be8752.png)\n\n**专家服务**：PingCAP 按照应用构建的全生命周期构建了一张服务体系大图。TiDB 所面对的场景和遇到的挑战与其他数据库有所不同，有数据库替换场景，有大数据替换场景，如何帮助客户在这些场景里用好 TiDB ，是 PingCAP 首要解决的问题。所以 PingCAP 推出了架构咨询服务，我们希望帮助客户做真正的场景调研，做可行性分析与架构设计。专家服务除了要有体系，还依赖于真正的经验积累。我们通过一套服务标准化的流程，把所有的实践，所有的经验汇聚起来变成一套可以复用的资产和工具体系。\n\n![专家服务.png](https://img1.www.pingcap.com/prod/_4889c13d83.png)\n\n**培训认证**：TiDB 的培训认证体系进行了全新升级。我们把初级课程的门槛降低，让更多人可以接触到 TiDB ，同时把高级课程变得多路并行，除了以前的数据库管理方向，还添加了性能调优、数据迁移、故障排查和运营管理方向。\n\n![DBA 培训.png](https://img1.www.pingcap.com/prod/DBA_98c68686fb.png)\n\n此外，今年 PingCAP 还推出了**专门针对应用开发者的培训认证**，帮助应用开发者用好其实能让 TiDB 跑得更快也更稳定，这门课程已经正式向所有商业客户和合作伙伴开放。\n\n![开发者培训.png](https://img1.www.pingcap.com/prod/_90a1e21c71.png)\n\n最后，回到本文的主题，**PingCAP 为什么能够服务好企业级用户**？答案并不复杂：PingCAP 以开源为基础，与客户建立了牢固的信任体系；与此同时，PingCAP 持续引领技术趋势，打造面向未来的数据库产品；最关键的一点，PingCAP 从开始到现在，始终保持以客户成功为核心的企业文化，从产品研发到技术服务，与用户共同面对不确定性的挑战。","author":"唐刘","category":5,"customUrl":"transparency-is-the-best-way-to-build-trust-with-our-customers","fillInMethod":"writeDirectly","id":428,"summary":"PingCAP 研发副总裁唐刘、PingCAP 中国区技术服务总经理李超群分享了 PingCAP 如何通过产品研发和服务体系将产品价值“又快又稳”地交付给客户，获得客户的信任，并帮助客户实现成功。","tags":["TiDB"],"title":"唐刘：透明一切，是我们在复杂环境下与客户建立信任的最佳途径"}},{"relatedBlog":{"body":"作为数据库服务商， PingCAP 肩负着一项重要使命：找到一条深耕行业场景，构建多元生态的路径。9 月 22 日的用户峰会上，PingCAP 副总裁陈煜琦发表了以“深耕行业场景，构建多元生态”为主题的演讲，工商银行、杭州银行、中国人寿财险、平安科技分享了在他们的关键业务中如何借助 TiDB 深挖行业场景，来自神州数码、中电金信、天翼云、东软集团、云徙科技、嘉和美康的生态伙伴分享了他们与 TiDB 的共建经验。以下为分享回顾。\n\n在传统的体系下， 原厂商和渠道商往往处于供应链上下游的位置， 彼此之间是通过商业利益进行连接的。在这种体系下，原厂商往往处于主导地位， 如果用太阳系来比喻这套合作体系， 那么处于太阳系中心的就是原厂商， 各个渠道商就像一颗颗行星， 被吸引着围绕原厂商转动、 产生连接、创造商业价值。但是这样的引力是不可持续的，并且黏性是不够的。\n\n![陈煜琦.jpeg](https://img1.www.pingcap.com/prod/_0cf67761cd.jpeg)\n<center>PingCAP 副总裁陈煜琦</center>\n\nPingCAP 副总裁陈煜琦介绍，我们有非常好的社区文化、开源基因，以及散布在各行各业中的开发者、使用者、源代码贡献者。**通过开源模式，PingCAP 打造出一套“友邻式”的生态体系，任何个人、公司、数据平台、云基础设施都可以通过 TiDB 开源社区连接在一起，持续挖掘和创造商业价值**。\n\n在过去这些年中，基于这样的“友邻式”生态，PingCAP 从研发、产品到服务，积累了非常多体系化的能力，在金融、保险、物流、互联网等行业的深度客户中积累了非常多的场景和经验，与众多生态伙伴共同挖掘 TiDB 的行业场景能力。\n\n## 与深度用户共同挖掘行业场景\n\n> 金融机构尤其是银行，信息化开始都比较早，信息技术已经成为银行经营的主要支柱。银行业务的特殊性是和钱打交道，因此对系统可靠性要求比较高。TiDB 的分布式架构、金融级数据强一致性都为金融用户提供了坚实的数据底座能力。\n\n### 杭州银行：关键业务类系统数据库的选择\n\n杭州银行作为金融企业，为保证系统运行的可靠性、安全性和稳定性，以往比较偏爱国外厂商的高端成熟系统。\n\n随着数字经济发展和新一代技术崛起，以互联网厂商为代表，通过分布式、微服务、云计算等技术也构建出了可以满足业务发展的技术架构，并且在人才体系、业务模式和用户习惯上能够实现多个维度不断破圈。银行也从自身的金融科技发展角度看到了新技术在性能、弹性和成本管理上的优势。**在架构转变过程中，金融科技的自主发展已经成为银行业的发展共识，越来越多的银行同业开始应用分布式技术，在业务发展变革中通过场景实践来带动发展**。\n\n杭州银行坚持自主研发、自主建设、自主可控的系统建设思路。在基础软件领域，杭州银行从 2015 年开始使用 MySQL 等开源软件；2018 年引入私有云建设，在云上所有的业务系统数据库都使用了 RDS ；2020 年，采购单独的分布式数据库产品也投入了生产环节；2021 年随着云原生技术的发展，杭州银行进一步在生产环境引入了容器云平台，在客户关系管理、办公自动化系统等金融分析系统中引入了 TiDB，并在多种业务场景对 HTAP 架构进行验证，了解掌握它的技术特点。\n\n![刘峥.jpeg](https://img1.www.pingcap.com/prod/_e749a0b808.jpeg)\n<center>刘峥 杭州银行 信息技术部副总经理</center>\n\n银行业务交易类系统尤其是关键业务系统，是金融行业中要求最为苛刻的系统。“钱不能错，服务不能停”，这是监管基本要求。作为交易系统的数据承载、服务底座，这种系统的数据库必须满足四个基本要求，**杭州银行信息技术部副总经理刘峥**把它总结为“SAPE”：一是 Safe （安全），数据安全是要绝对保证的，在任何情况下数据不能丢，数据不能错；二是 Availability （高可用），保证业务连续性不仅要符合监管要求底线，也要完善整个体系的可用性；三是 Performance （性能），使用分布式数据库替代传统数据库后，除了自然而然带来的横向扩展能力外，系统性能不能因此而产生降级；四是 Ecology （生态），这是当前背景下的一个特定要求，当前数据库产品众多，产品技术生态一定要有多方支持，由多方共建，对开发者和开发商要有强大吸引力，产品才能持续发展。\n\n杭州银行组织多方参照监管单位发布的关于分布式数据库的技术架构、灾难恢复、安全技术的行业标准，共同设计了产品的测试场景，结合 TiDB 的产品特性在关键业务系统的仿真场景下进行更为详细的测试验证。TiDB 在开发应用、双中心多活、HTAP 等场景下体现出了较大优势，对测试过程中新增的一些产品需求也能及时改进和反馈。从开放性上来讲，TiDB 在人才培养、开发平台的适配、开源生态都有比较明显的优势，**下一步杭州银行将在更多重要业务系统应用 TiDB，进行持续探索和磨合**。\n\n### 工商银行：国产分布式数据库的探索实践\n\n工商银行从 2017 年就开始关注、研究和使用 TiDB。工商银行技术专家王君轶依稀还记得做第一个 TiDB 变更时的情景，那时还是 TiDB 2.0 版本，做一个服务器的置换一做就到第二天天亮。上个月工商银行把所有机型升到 TiDB 5.4 版本，所有升级动作仅在一个小时内就能全部搞定。**近几年 TiDB 的更新迭代非常快，用户体验已经不可同日而语了**。\n\n![王君轶.jpeg](https://img1.www.pingcap.com/prod/_e6bd45b92f.jpeg)\n\n<center>王君轶 工商银行 基础技术实验室 技术专家</center>\n\n王君轶介绍使用 TiDB 的契机是自主可控，当时人行和工信部都提出银行核心系统的国产化替代，工行也积极响应，直到现在也是重点工作之一。同时工行也提出了在分布式数据库技术领域要提前进行技术储备和布局。虽然 TiDB 是当时一款比较火的产品，但是当时业界也不乏其他一些优秀产品，为什么最终工行还是选用了 TiDB？最主要的一个原因就是开源，开源为工行深入研究一款产品提供了可能。同时，跨行业的丰富使用案例，也给工行提供了很多借鉴。社区化的开发模式、版本的快速迭代，可以更快地完善所需功能。后续多家国产数据库陆续开源，也从侧面印证了 TiDB 坚持的开源战略受到了行业的认可。最后一点原因是工行对分布式数据库技术的研究需要。工行在分布式数据库技术领域也是多驾马车并行的，TiDB 可以作为这个技术领域的有益补充。\n\n工行从 2017 年开始对 TiDB 进行研究论证，2018 年开始落地。刚开始上线的时候 TiDB 性能并不是太好，在进行了一系列优化，包括物理机置换，搬迁到万兆网络机房以后，性能肉眼可见地获得了很大提升。在高可用方面，工行进行了负载均衡以及同城双活的改造。整个过程并不是一蹴而就，其实是一个慢慢摸索的发展状态。直到 2020 年后 TiDB 开始慢慢走向成熟，4.0 版本也具备了 HTAP 的能力，工行随之开始寻找合适的试验场景。同时工行也在不断完善集群的一些配套功能，包括报警监控、安全审计等。再之后，工行开始研究 TiDB 上容器，这也顺应了基础设施云化的发展趋势。今年，工行会继续通过 TiDB 国产开源的特性，助力运维数据库的自主可控建设。\n\n**TiDB 在工行前后共投入了四五套集群，主要分为两类：一种是传统的部署架构，另一种是云上多租户，也就是容器集群架构**。传统的部署架构可以支持更大负载的应用，而且具备稳定性和性能两方面的优势，比较适合应用等级比较高，数据规模比较大的应用；容器集群可以通过容器来提高租户间的安全隔离，借助开发的调度编排，实现资源投入和人力成本的降低，比较适合应用等级稍低，数据规模没那么大的应用。两种架构正好形成互补。\n\n![TiDB 在工行的部署.png](https://img1.www.pingcap.com/prod/Ti_DB_92721544ca.png)\n\n上图是一个同城两中心部署架构，具备同城双活高可用能力，通过 F5 实现园区间的流量转发。同时根据服务器的资源配置，将 DB 节点和 KV 节点进行多实例部署，兼具性能、稳定性以及资源利用率两方面的均衡。\n\n工行去年开始试点容器集群，现在还处于摸索阶段。容器集群最大的优势除了能够降低资源投入外，还能节约人力成本。出现故障灾难恢复时，不需要人工干预，能够实现自愈，通过 TiDB  Operator 能够实现集群的全生命周期管理。\n\nTiDB 在工行最初是以运维领域作为研究的切入点。运维应用所使用的数据库也在面临很多挑战，像业务应用基本每个应用都会单独设一套数据库，资源投入多不说还比较难管理。但绝大部分运维应用都不会太大，属于中小型的应用，不过也有极个别的比较复杂，加上人工智能、模型训练等，如果随便找一个业务数据库来跑的话，在分析计算方面还不一定能够搞得定，同时随着业务应用的不断扩张，与之相对应的运维数据呈几何增长，扩容也是一个问题。此外，在多数据中心的情况下如何高可用部署？其实行内的业务系统高可用已经比较成熟，但运维应用的高可用相对比较薄弱，近几年行内对运维应用容灾能力越来越重视。\n\n因此，**工行基于分布式数据库 TiDB 构建了一个多租户 DBaaS 云，能够为多个运维应用提供数据库服务，根据业务的需求进行弹性伸缩**。同时工行进行了同城高可用的部署，在应用上进行试点验证。以工行的智能算法门户应用为例，这个应用是面向运维的，能够提供数据的加工处理，以及运维集成的端到端的运维服务。它一方面会对数据库捞取大量的数据做模型训练，而且实时性要求还不低。另外一方面，它会将运维数据异常检测的一些结果数据对数据库进行高频的读写更新，这比较贴合 HTAP 场景，因此工行以 Spark 作为分布式计算引擎，以 TiDB 作为底层数据存储引擎，来构建高效的流批一体处理框架。\n\n> 数据库也是保险公司信息系统中关键的基础设施，因此，产品优秀，服务到位是保险信息系统稳定运行的前提， PingCAP 与中国人寿财险建立了良好合作，一起打造出分布式数据库在财险行业核心应用的典范。\n\n### 中国人寿财险：“核心系统分布式数据库”改造实践\n\n中国人寿财险是中国人寿集团重要成员单位，成立 16 年以来成果颇丰，目前在中国财险行业排名第四，累计服务了 1.1 亿个人用户，470 万个组织客户。该公司高度重视科技投入，科技应用在公司发展历程上起到了至关重要作用，从最初的技术支撑到逐步引领业务的方向，科技创新成为中国人寿财险最重要的核心竞争力之一。\n\n![陈彬.jpeg](https://img1.www.pingcap.com/prod/_f6006e6148.jpeg)\n\n陈彬 中国人寿财险 金融科技中心系统运行部负责人\n\n**中国人寿财险充分利用两条科技途径推进科技创新，一是利用大数据、云计算、人工智能等新一代技术来改造传统保险业务，二是直接面向互联网、移动化构建新的服务架构和运营模式**。在数字化转型道路上，数据库是最重要的核心基础设施，支持大规模数据、高并发、敏捷响应成为其关键能力，也是保险业务高质量发展的技术保障。\n\n近几年来，中国人寿财险主动应对车险综合改革，业务规模持续上升，盈利能力水平稳步提高，2021 年实现保费收入约 915 亿元。历时三年，中国人寿财险在 2020 年完成了新一代核心业务系统的建设，为深入推进数字化转型打下坚实基础。但是，随着业务规模的不断扩大及保单件数的激增，仍面临一些在应用层面解决不了的痛点，例如，投保业务激增导致高并发，实时数据写入、时效性、可靠性得不到保障。**担心业务高峰期出现单点故障，基础软件做不到完全掌控，而这些痛点正好是分布式数据库善于解决的问题**。\n\n分布式数据库支持横向扩展，满足金融应用系统海量数据存储和百万级 TPS 高并发要求，提高了吞吐能力，降低了响应时间，实现小机向 X86 迁移，摆脱对专有硬件依赖，分布式数据库是解决以上问题的最佳方案。\n\n鉴于分布式数据库金融行业的应用案例相对较少，**中国人寿财险采用四步走策略，包括公开招标、PoC 测试、上线试用、外部评审，尽最大可能选择最适合业务发展的数据库产品**。2020 年，中国人寿财险通过对市场上主流分布式数据库进行深入考察和评估，最后选择 TiDB 4.0 作为核心业务系统分布式数据库的试点。\n\n2020 年 11 月，经过详细的技术验证，应用优化和投产保障规划，中国人寿财险数据库及中间件团队成功上线了单证系统。2021 年，陆续实现了承保辅助决策系统、天财车险、特殊车险承保系统的上线。今年，中国人寿财险已经完成了报价中心的切换上线，后续还会完成非车险承保系统的切换上线。TiDB 大幅提升海量数据和高并发下的性能问题，提供灵活的弹性扩容能力，并符合未来云架构的趋势。目前，TiDB 集群稳定支撑非车险及电子投保系统的客户身份认证、投保、对接银行保单处理、电子发票开具等业务，提供了异构数据库的灾备能力，实现了 RPO=0，RTO<30 秒的金融生产级高等级运行保障要求。\n\n**在整个实践过程中，中国人寿财险和 PingCAP 密切合作，初步形成了分布式数据库自主创新的能力，验证了分布式数据库在核心业务系统的可行性**。中国人寿财险基于 TiDB 实现了核心业务系统的分布式改造，第一次在保险行业联机交易和批量业务场景引入 NewSQL 分布式数据库架构，推动中国人寿财险核心业务系统实现了进一步技术演进迭代和整体降本增效的目标。\n\nTiDB 分布式数据库在中国人寿财险核心业务的成功应用，首先节省了成本，通过 X86 通用服务器代替 IBM 小型机，硬件投入成本降低了 75%；其次，用先进的分布式数据库替换集中式数据库，改造完成之后，OLTP 和 OLAP 性能较原来的 Oracle 数据库均有了明显上升，其中全量状态统计报表的处理时效提升 80 多倍，并具备了更强的数据汇聚和查询能力；最后，通过开放架构实现了安全可控，初步打造了中国人寿财险的自主创新体系，并不断演进，为后续异地双活改造奠定了坚实的技术基础。\n\n## 与行业科技公司共创新型合作模式\n\n> PingCAP 在拓展场景时常常会碰到多种多样的各类需求，而这些需求来自于各个企业所属的竞争环境，这些挑战无论是业务还是技术上，都不是一家企业能够独自完成的，要想深耕行业，就需要各种行业的垂直解决方案、服务能力， PingCAP 在与平安科技的合作中尝试出一种新的生态合作模式，为行业领域用户提供更深入的行业解决方案。\n\n### 平安科技 - 携手共建的发行版战略\n\n平安科技总工程师汪洋分享了 TiDB 发行版 UbiSQL 的前世今生。UbiSQL 是平安基于 TiDB 基础的数据库引擎自研的数据库发行版，定位是金融级分布式数据库，能够覆盖金融全场景，并满足国家信息自主可控和一行两会对于数据库技术的要求。\n\n![汪洋.png](https://img1.www.pingcap.com/prod/_7ba23426e1.png)\n\n<center>汪洋 平安科技 总工程师</center>\n\nUbiSQL 前三个字母 Ubi 是英语 ubiquitous （无处不在）的缩写。在发音上，汪洋称 UbiSQL 为“无比 SQL”，希望这个数据库具有良好的扩展性，非常强的高可用性，能够做到无与伦比，无处不在。\n\n![UbiSQL 的前世今生.png](https://img1.www.pingcap.com/prod/Ubi_SQL_3a1b112b9b.png)\n\n**过去一年来，平安科技与 PingCAP 进一步加强了合作关系，探索出了从产研到交付到服务的全新合作模式**。在该模式转变前，双方各自有一个内循环，围绕着平安、PingCAP 自己的核心场景转动。平安作为一个综合性金融集团，涵盖了全牌照的金融服务，包括银行、基金、保险、投资，甚至包括一些互联网金融，非常丰富。围绕这些核心场景，平安有自己的 UbiSQL 产研团队、解决方案团队、运维团队，这些之间形成了一个内循环。当产品发布之后，平安可以通过自己的数据库架构师或者产品解决方案师，给应用系统做出一些建议，提出一些架构选型方面的建议，还有一些系统的使用性建议。在系统上线后，还可以根据线上问题提供一些售后的运维支持，包括整体系统的优化，定期 review ，健康检查，在这个过程中平安能够发现产品所需要提升的地方，形成了一个闭环。\n\nPingCAP 同样有三种角色，但是唯一不同的是缺少这样的金融场景。所以之前这两个环是相对独立的。\n\n在这种模式运行一段时间后，双方发现在很多方面还没有打通，没有产生 1+1>2 的效果，而是 1+1=2，甚至于可能是小于等于 2 。**现在，通过双方合作的进一步加强，平安和 PingCAP 形成了内循环 + 外循环模式，内循环与外循环是打通的：双方的产研团队打通**，形成产研方面的联合团队；在交付方面打通，形成了解决方案师的联合团队；在售后方面打通，形成了技术服务的联合团队。通过将这些团队角色打通后，双方发现在问题的解决效率、产品新特性的发布、产品问题的修复等方面，都得到了非常大的提升。\n\n这种新模式就是开放合作和共赢。当线上 UbiSQL 的一个应用系统发现问题后，双方组建的运维团队可以迅速介入分析问题，诊断问题。一方面能够快速解决问题，恢复生产，恢复服务；另一方面可以继续去寻找产品产生问题的根本原因，并制定对应的解决方案，让问题不再发生。在查找问题原因、制定解决方案的同时，也会看到一些对产品方面的提升建议，平安会提交给产研联合团队，进一步了解产品的实现机制。\n\n![平安科技与 PingCAP的合作.png](https://img1.www.pingcap.com/prod/Ping_CAP_b180f967a3.png)\n\nPingCAP 的产研团队则更聚焦在 TiDB 最新的版本或者未来的版本上，能够进行产品特性方面的增强或者 bug 修复，而平安的团队也能够把这些方案在产品方面的一些实现，快速应用到现网运行上的一些系统中，快速进行现网产品的提升，这是双方合作的意义所在。**通过组建这些联合团队，可以看到覆盖的应用系统从设计到开发到上线到售后到销售整个生命周期**，覆盖了驻场运维服务、问题咨询、功能申请、技术支持、系统优化、故障上报等端到端服务能力。通过这种全新的合作模式，平安与 PingCAP 形成了共赢的基础。\n\n共赢还使得双方无论在研发能力、运维能力，还是解决方案能力方面，都得以提升。可能连 PingCAP 的研发也没有意识到，在某些特定场景和负载下产品会出现的问题，通过双方合作可以发现和修正。这种模式不仅可以极大程度上帮助 TiDB 打磨金融场景的基础能力，同时还能帮助平安 UbiSQL 的研发团队加深对代码的理解，能够更迅速地从代码级定位问题，修复问题。当产品发生问题后，双方团队可以对问题诊断分析，能够发现一些以前包括研发、运维团队所不知道的特性与机制。**从这些方面来看，合作不光使平安科技的交付团队、运维团队能力得以提升，就连 PingCAP 的售后工程师技能也得以提升**。\n\nPingCAP 与平安就是通过这样更加开放的态度进行更加深入的合作，从而达到双方共赢，实现能力、产品的提升，进一步适配金融场景需要，实现 1+1>2 的效果。**相信通过这种全新的合作模式，PingCAP 和平安，包括 UbiSQL，都可以走得更远，越做越好**。\n\n### 加乘创新 智简未来，构建友邻多元生态\n\n![多元生态.png](https://img1.www.pingcap.com/prod/_e1c1965f70.png)\n\n除平安科技外，PingCAP 的整个生态体系也会涉及到各行各业非常核心的场景，除了前面讲到的社区、技术、人才、共赢生态，还需要有更多传统企业级解决方案加进生态中，融合开源、多源和行业解决方案，将 PingCAP 的整个生态体系进化为“友邻式”的多元生态。\n\n**用户峰会上，陈煜琦与神州数码、中电金信、天翼云、东软集团、云徙科技、嘉和美康等生态合作伙伴共同启动了“加乘创新 智简未来”的共创仪式**，将合力为银行、保险、证券、电信、政企、零售餐饮、制造、医疗等数字转型企业，以及 SaaS、金融科技、游戏、电商等数字原生企业，提供更加丰富的企业级解决方案及服务。\n\n![共创仪式.png](https://img1.www.pingcap.com/prod/_a902132bd9.png)\n\n**赵琳 神州数码企业业务集团软件本部总经理**\n\n“神州数码与 PingCAP 在面向数据库企业服务市场、面向技术人才及开源运营生态、面向双方战略合作共赢上一直有着深入合作，神州数码的数云融合技术战略致力于为企业形成数据洞见及敏捷应对变化和创新的能力，拥抱云和开源，与TiDB 等开源厂商就云原生的分布式架构、Dataops、定制化通用聚合平台等进行解决方案整合，为企业提供一站式企业数字化转型解决方案。”\n\n**邵建军 中电金信副总裁**\n\n“中电金信和 PingCAP 在杭州银行等越来越多的金融机构领域成功合作，我们认为未来与 TiDB 的合作层级会越来越广阔，不断加强合作的深度和广度。”\n\n**侯圣文 天翼云大数据 AI 首席专家**\n\n“天翼云在 2018 年开始参与了 TiDB 开源项目，我们有很多开发者一起探索在云原生当中的 HTAP 场景，在多个行业领域落地，都取得了非常良好的效果。天翼云团队一直在践行着中国人真正的担当，走向了一个自主可控的路径，未来和 TiDB 一起，希望我们能把自研数据库做得越来越好。”\n\n**郭晓龙 东软集团股份有限公司医疗保障事业部开发中心主任**\n\n“东软集团成立于 1991 年，在汽车互联，软件国际化服务都属于领先领域。我们和 PingCAP 是在医疗保障行业里深度合作，通过产品选型和技术认证，我们选择了 PingCAP 的 TiDB，并打造了山东临沂千万级别人口城市标杆的医保项目，这个项目解决了传统的分布式数据库的适配成本高，管理成本大，性能优化难的问题，受到了医保，山东医保的高度肯定。接下来我们想和 PingCAP 公司携手共进，开展更加全面深入多元化的合作。”\n\n**江威 云徙科技副总裁**\n\n“云徙科技主要在企业服务里做基于中台的营销数字化服务，帮企业构建一体化的数字增长服务。我们和 TiDB 面向大数据的营销场景、业务中台应用落地，未来希望在越来越多企业应用中与 TiDB 一起共同提供更好的服务。”\n\n**潘状 嘉和美康平台数据中心产品总监**\n\n“嘉和美康是国内比较早从事医疗软件研发和产业化的公司，公司主营业务是医疗软件，在这个行业内深耕了 11 年，目前已经形成具有自主知识产权，包括临床医疗，医患互动，医养一体，医疗大数据相关产业链。我们与 TiDB 合作的主要方向是在医疗大数据方向，看重 TiDB 优秀的在线数据分析能力，数据处理能力，未来我们希望与 PingCAP 一起在医疗行业内秉承合作共赢、开放的理念，加速我国医疗信息化数字化转型。”\n\n未来，相信将有更多的企业用户和合作伙伴加入 PingCAP 这个“友邻式的多元生态”，共同助力数字转型企业和数字原生企业的业务敏捷创新。","author":"PingCAP","category":2,"customUrl":"create-a-friendly-and-diversified-ecosystem","fillInMethod":"writeDirectly","id":423,"summary":"9 月 22 日的用户峰会上，PingCAP 副总裁陈煜琦发表了以“深耕行业场景，构建多元生态”为主题的演讲，工商银行、杭州银行、中国人寿财险、平安科技分享了在他们的关键业务中如何借助 TiDB 深挖行业场景，来自神州数码、中电金信、天翼云、东软集团、云徙科技、嘉和美康的生态伙伴分享了他们与 TiDB 的共建经验。本文为分享回顾。","tags":["TiDB"],"title":"打造友邻式多元生态，支撑工商银行、平安科技、中国人寿财险、杭州银行的创新实践"}}]},{"id":"Blogs_428","title":"唐刘：透明一切，是我们在复杂环境下与客户建立信任的最佳途径","tags":["TiDB"],"category":{"name":"观点洞察"},"summary":"PingCAP 研发副总裁唐刘、PingCAP 中国区技术服务总经理李超群分享了 PingCAP 如何通过产品研发和服务体系将产品价值“又快又稳”地交付给客户，获得客户的信任，并帮助客户实现成功。","body":"在刚刚结束的「 PingCAP 用户峰会」中，PingCAP 研发副总裁唐刘、PingCAP 中国区技术服务总经理李超群从 PingCAP 的**自主开源、工程研发体系、产品未来技术演进方向等方面，分享了 PingCAP 如何通过产品研发和服务体系将产品价值“又快又稳”地交付给客户，获得客户的信任，并帮助客户实现成功**。以下为分享实录。\n\n![唐刘.jpeg](https://img1.www.pingcap.com/prod/_21a492c193.jpeg)\n\n服务对于数据库公司来说是一个沉甸甸的词汇。对于产研团队来说，只有做出产品，并把产品交付客户，才会有后面的服务。但 PingCAP 作为一家非常年轻的公司，所做的是一个非常有挑战性的数据库产品，如何让客户选择相信 PingCAP？如何让客户放心地将他们的数据存放到 TiDB 数据库？\n图片\n\n## “透明”建立信任\n\n开源是 PingCAP 的基因，PingCAP 从一开始就将源代码开放出来，让所有人都能看到 TiDB 到底是什么样子。但仅仅只有代码的开源是远远不够的，经过 7 年多的发展，**我们深知开源有着不同的阶段**。当把源代码开放后，客户和用户就能够自行下载 TiDB 源代码进行编译，发布到自己的生产环境中，服务于自己的客户；当他们遇到问题时，可以选择自己修复 bug，或与 PingCAP 一起探索，共同完善 TiDB 功能；有一些用户、企业甚至将 TiDB 作为自己的上游版本，通过 TiDB 构建自己的发行版，服务于客户。我们也希望能有越来越多的用户构建自己的 TiDB 发行版创造更多价值。  \n\n面对不确定的经济环境，我们如何从当前的复杂环境中生存下来？**开源是建立信任的最佳途径，但只有开源也是远远不够的，PingCAP 认为唯有透明才能解决问题，透明一切能透明的事情**。为什么透明对 PingCAP 和用户都如此重要？一方面，PingCAP 到目前为止有 3000 家用户、 1800 多位开发者分布在全球 45 个国家和地区，同时 PingCAP 内部有 300 多位研发工程师。PingCAP 和开发者、用户之间形成了一个非常多元的网状结构。所以我们开源了源代码、设计文档。  \n\n为了更加透明，我们还将 TiDB 未来 1-3 个月的产品路线图开放，让大家了解 TiDB 即将发布的功能。有一些朋友可能会问：你们把所有东西都开源，都透明了，友商看到会有什么动作？其实比起担心这个问题，**我们更希望让客户清楚地了解 PingCAP 到底在做什么以及 TiDB 未来的方向，并因此更加相信 PingCAP，共同走向未来**。\n\n## 让客户“又快又稳”感知到产品的价值\n\n作为一家做数据库产品的公司，仅仅只有开源与透明也是不够的，如果 TiDB 不能给客户带来价值，如果客户不能使用 TiDB，其实就建立不了任何信任，我们需要让客户又快又稳地感受到 TiDB  的价值。PingCAP 是一家非常年轻的公司，一方面产品需要快速地迭代，不断将产品价值快速交付客户；另一方面，面对许多核心场景，我们需要打磨一个更加稳定的产品，让客户非常高效非常放心地使用。所以， **PingCAP 采用了一个“稳态+敏态”双轨并行的研发机制，保证产品更新对用户触手可及，同时在核心场景也能稳定放心的使用**。\n\n![又快又稳感知产品的价值.png](https://img1.www.pingcap.com/prod/_134ef9fa8b.png)\n\n那么，PingCAP 是如何实现“稳态+敏态”双轨并行的研发机制呢？  \n\n- 一是开放式架构，分离一切能分离的，从物理上保证隔离性；\n- 二是 TiDB 有着非常丰富的应用场景，用户在 TiDB 社区持续参与产品共创。\n\n下面通过几个小例子讲讲 PingCAP 如何与客户进行共创：  \n\n第一个例子是中通快递。快递物流行业在双十一或者 618 时面临的挑战是非常巨大的，中通快递实时数据业务需要将全国 3 万多网点产生的实时物流信息写入到数据库中，然后动态分析业务状况。双十一等物流高峰期间，日写入 / 更新流量超 30 亿条，分析库总量在百亿级。中通快递很早就拥抱了 HTAP ，通过实际业务场景的打磨，**TiDB 帮助中通快递抗住了双十一的流量高峰，HTAP 分析引擎配合分区表动态裁剪的高效数据过滤，支持了中通快递双十一 20 多个报表系统秒级查询**。通过业务场景的深入应用，中通快递将 HTAP 读写混合的极限负载能力提升了 100% 以上。\n\n![中通快递案例.png](https://img1.www.pingcap.com/prod/_46d41fcb8e.png)\n\n第二个例子是 [OSS Insight](https://ossinsight.io)。这是一个非常有代表性的业务场景，首先它是一个从 0 到 1 快速打造的产品，适合当前很多公司的敏态业务。这个产品的主要产品经理就是我们的 CEO 刘奇，需求天天变，今天提的需求明天就要交付，对于研发工程师来说是非常大的压力和挑战。但 OSS Insight 有将近 50 亿条数据，很多查询条件非常复杂，面对这样高度复杂的情况，一方面要实现快速迭代，另一方面还要保证查询稳定高效运行。之前我们通过加很多 HINT 的方式来保证查询计划的稳定，但当业务不断变化时会增加很多索引，调整 DDL ，导致之前的 HINT 失效，为了解决这样的问题我们和 OSS Insight 研发工程师一起，不停打磨重构 TiDB 的优化器，现在不光研发工程师不再需要写 HINT ，我们发现 TiDB 的智能优化水平比人工写 HINT 提速了 20-30%。\n\n![OSS Insight 案例.png](https://img1.www.pingcap.com/prod/OSS_Insight_2b438696c0.png)\n\n第三个例子是某头部股份制银行。该行一直坚信 TiDB 能应用到银行核心系统上，与 PingCAP 协力持续打磨 TiDB 的内核能力，在 7×24 小时性能测试过程中，将整个延迟抖动控制在 2% 以内。在互联网交易系统上，更将整个延迟缩短了 4 倍，满足了互联网业务线上交易的核心述求。\n\n![银行案例.png](https://img1.www.pingcap.com/prod/_10de7b9511.png)\n\n## 平滑升级，让客户又快又稳地感知到产品价值\n\n由于 TiDB 不断打磨，快速发布新版本，许多用户会面临一个非常大的选择问题：新产品是非常好，但我的数据库跑得好好的，为什么要升级？数据库在企业数字化系统中是非常核心的组件，版本升级往往面临着着很大的风险，能不能不升级？  \n\n我们的答案是，要升级：**一方面客户通过升级到最新版本，在延迟和性能方面都得到了大幅提升，同时也更有信心将注意力聚焦于自己的业务逻辑开发上**，另一方面，PingCAP 研发工程师与服务团队一起打造了一套完善的数据库升级体系，支持客户的平滑升级。  \n\n在技术、产品之外，PingCAP 还在产研内部专门成立了保障企业级客户成功的组织，比如金融架构师团队。它由 PingCAP 的资深架构师组成，致力于重要金融客户的共创、功能研发和项目支持。\n\n## 未来，与客户持续户共创，携手成长\n\n**很多企业级客户选择 TiDB 的理由，就在于它的可生长性**。未来， TiDB 仍然会在这方面不断地努力。首先，我们会聚焦于 TiDB 的内核，不断打磨。我们相信，无论怎么生长，如果没有坚固的底座是不可能向外更好生长的。在这个基础之上，TiDB 会在 DB 微服务化、云原生、智能化上不断拓展产品的边界和能力，与各种各样的生态结合，为客户提供更多价值。  \n\n这些年来，TiDB 一直持续不断地专注于 OLTP 核心能力提升，以银行交易核心为抓手，在优化系统、细粒度资源控制以及长尾延迟等各方面实现了突破，让 TiDB 变得更快更好用，在大表快速添加索引方面性能提升 10 倍， 在 Real-time HTAP 提速 1-2 倍。  \n\n![Serverless.png](https://img1.www.pingcap.com/prod/Serverless_8b1a211b76.png)\n\n**当前，无论国内还是在海外，云都是技术演化的未来**。而恰恰云能够将整个 PB 级别的数据库服务平台价值无限放大，未来 PingCAP 会提供一种全新的数据处理和访问形式—— Serverless。PingCAP 提供非常方便易用的 Data API，让企业级用户只需关注自己的业务，不用在意数据在哪里，底层长什么样。  \n\n**我们有一个梦想，当 TiDB 具备 Serverless 能力的时候，每个开发者都可以拥有自己的数据服务**。这个数据服务能做到秒级别的创建速度，亚秒级别的唤醒启动，毫秒级别的访问延迟。当一个数据库具备这样能力时，对于用户的价值其实是非常大的。一方面，所有开发者都拥有数据库，关于 TiDB 人才培养再也不需要担心；另一方面，用户只需要关注于自己的业务逻辑开发，以及如何更快将业务推向市场。  \n\n![TiDB 技术方向战略清单.png](https://img1.www.pingcap.com/prod/Ti_DB_d3e1c1bca5.png)\n\n上图是 TiDB 整个产品的技术演进方向，包含 TiDB 内核、DB 微服务化、云原生、智能化以及生态。在智能化方面，TiDB 在不断打磨自动诊断服务 Clinic ，通过自动诊断服务可以让每个用户都拥有一个 TiDB 性能调优专家，让每个用户都可以更好地使用 TiDB 。\n\n## PingCAP 服务体系\n\n客户成功这件事，不仅仅是产品研发团队的事情，也是整个 PingCAP 公司一起努力的结果。PingCAP 中国区技术服务总经理李超群在用户峰会上分享了 PingCAP 服务体系。  \n\n目前为止， PingCAP 技术服务人员的总人数已经占到了公司总人数的 25% ，成为继产研之后的第二大团队。可以说，**PingCAP 既是一家产品型公司，也是一家服务型公司**。  \n\n![李超群.jpeg](https://img1.www.pingcap.com/prod/_7b7bb3b034.jpeg)\n\nPingCAP 服务体系包含三个方面——**订阅服务、专家服务和培训认证**：  \n\n**订阅服务**：过去一年，PingCAP 实现了用工单系统做客户技术服务，可以非常容易地跟踪工单进展；我们开通了产研直通渠道，客户如有紧急问题可以第一时间拉通产研；第三，基于庞大的社区，我们把社区以及工单里的所有问题都整理出来，建立了 TiDB 知识库，在今年 12 月份会向所有企业客户开放。\n\n![订阅服务.png](https://img1.www.pingcap.com/prod/_1245be8752.png)\n\n**专家服务**：PingCAP 按照应用构建的全生命周期构建了一张服务体系大图。TiDB 所面对的场景和遇到的挑战与其他数据库有所不同，有数据库替换场景，有大数据替换场景，如何帮助客户在这些场景里用好 TiDB ，是 PingCAP 首要解决的问题。所以 PingCAP 推出了架构咨询服务，我们希望帮助客户做真正的场景调研，做可行性分析与架构设计。专家服务除了要有体系，还依赖于真正的经验积累。我们通过一套服务标准化的流程，把所有的实践，所有的经验汇聚起来变成一套可以复用的资产和工具体系。\n\n![专家服务.png](https://img1.www.pingcap.com/prod/_4889c13d83.png)\n\n**培训认证**：TiDB 的培训认证体系进行了全新升级。我们把初级课程的门槛降低，让更多人可以接触到 TiDB ，同时把高级课程变得多路并行，除了以前的数据库管理方向，还添加了性能调优、数据迁移、故障排查和运营管理方向。\n\n![DBA 培训.png](https://img1.www.pingcap.com/prod/DBA_98c68686fb.png)\n\n此外，今年 PingCAP 还推出了**专门针对应用开发者的培训认证**，帮助应用开发者用好其实能让 TiDB 跑得更快也更稳定，这门课程已经正式向所有商业客户和合作伙伴开放。\n\n![开发者培训.png](https://img1.www.pingcap.com/prod/_90a1e21c71.png)\n\n最后，回到本文的主题，**PingCAP 为什么能够服务好企业级用户**？答案并不复杂：PingCAP 以开源为基础，与客户建立了牢固的信任体系；与此同时，PingCAP 持续引领技术趋势，打造面向未来的数据库产品；最关键的一点，PingCAP 从开始到现在，始终保持以客户成功为核心的企业文化，从产品研发到技术服务，与用户共同面对不确定性的挑战。","date":"2022-10-10","author":"唐刘","fillInMethod":"writeDirectly","customUrl":"transparency-is-the-best-way-to-build-trust-with-our-customers","file":null,"relatedBlogs":[{"relatedBlog":{"body":"本文回顾了 PingCAP 创始人兼 CEO 刘奇在 9 月 22 日的用户峰会上以《现在决定未来》为主题的演讲，**分享了 PingCAP 在技术演进、用户价值、数据库技术趋势、国际化、社会价值等方面的思考**，同时也记录了建信金科、百胜中国、传音控股、老虎国际等用户在刘奇的演讲中分享的最佳实践。全文字数约 8,800，预计阅读时间 20 分钟。\n\n![刘奇.png](https://img1.www.pingcap.com/prod/_6c926b4679.png)\n\nPingCAP 到今天已经成立 7 年了，在全球拥有 3,000 多家大中型用户，其中很多还参与到 TiDB 开源社区的建设中，这些情况如果放到创业之初很难想象。\n\n**今天，我们认识到做一个真正广泛应用的数据库，是一个需要以十年为时间单位进行投入的基础工程**。这一路走来离不开关心和支持 PingCAP、喜欢 TiDB 的每个人。\n\n## 与客户对话，客户眼中的 TiDB\n\n过去一段时间，在和包括日本、美国、印度、欧洲等全球客户交流时，我们试图从更多不同客户的视角去了解他们到底是怎么看待 TiDB 的。\n\n在 TiDB 的设计里，有很多设计是从第一天就开始的，我们甚至完全不觉得这个设计有什么特别之处。直到我问一些专家型用户“你到底为什么选择 TiDB ？”时，他们告诉我：**因为 TiDB 的开放式架构可以管理复杂性**。我当时挺诧异，因为这个东西第一天就是这样设计的，已经融入 PingCAP 的血液当中，所以我们自身已经无感。但对这些专家来说，他们当中很多人在各个大公司本身就做过数据库，甚至是大型分布式系统，做过这些系统的人都会产生一个心态，那就是对“复杂性”会无比敬畏。\n\n![与专家型客户对话.png](https://img1.www.pingcap.com/prod/_b7cdaa3e30.png)\n\n一个数据库，哪怕它是一个小型数据库，通常代码规模都会有几十万行，上百万行，如果是一个传统的成熟型商业数据库，那更是一个以千万行代码为单位的系统。**面对如此复杂的系统，用户在考虑未来的迭代时，通常要做 3-5 年的规划**。如果用户需要花 3-5 年来替换一个 PB 级数据库，很大程度上意味着接下来 5-10 年的时间他就不想再动了，这也是本次峰会的主题为什么是“现在决定未来”。\n\n**今天我们做一个数据库替换的决定，它的影响周期很可能是接下来的 10-20 年**。在这个较长的周期中，大家看系统价值的时候就会看到完全不一样的价值。比如最近我意外地发现 TiDB 在 CFO 眼里其实很受欢迎，他们表示，在现有实践中，TiDB 至少可以降低一半的成本，所以 CFO 很快就会批下来对 TiDB 的部署和应用。大家可以试想一下，如果用户有 PB 级的数据，用 TiDB 替换能够省一半的成本，是不是非常有吸引力？\n\n今天的世界充满了不确定性，在此前提下如何能更好地生存下去？省钱自然会变成一个全世界都关注的话题。\n\n但所有这些价值的前提是接下来 5-10 年，甚至 10-20 年这个系统不能死，能持续支撑业务。这时候问题就来了，**凭什么一个系统在接下来 10-20 年间还能够支撑用户的业务？用户做架构选择最重要的标准是什么？**\n\n是整个设计团队是不是具备掌控复杂性的能力，是不是能够看到未来 10-20 年企业中的系统复杂性会朝什么方向迭代，今天在系统里做好设计，可以应对未来的高速演进和迭代，而不只是一个过渡方案，过两年还要再换。**虽然我们在设计 TiDB 的过程中，已经做了高度分离式架构，开放式 API ，但有些东西融入血液时就会无感，而在用户看来这恰恰是他们最看重的，这给了我们很大启发**。\n\n一个专家型用户跟我说：“**人类几千年来应对复杂性只学会了一个道理，就是分而治之**”。这听起来好像是一个很简单的道理，回想一下会觉得他说得太对了，这也是人类几千年来应对复杂性的唯一办法。分而治之落在软件或者数据库的复杂性上面，应该是什么样的？这就是 TiDB 未来的演进方向，也是整个行业未来的演进方向。\n\n![与应用型客户对话.png](https://img1.www.pingcap.com/prod/_0e4e2d2a4a.png)\n\n与专家型用户不同，应用型客户又是完全不一样的观点。有些用户是做创业公司，能不能活过两三年自己也不知道。**如果选择一个东西需要花 2-3 年才能看到足够大的价值，肯定等不起，他需要更快地兑现价值**。事实上，这些应用型客户不仅仅是那些创业公司，还有很多是大公司里面的新项目。大家知道在一个大公司里经常出现一种情况，当做一个新业务时，每个人心里都清楚时间很有限，公司可能等不了用 5 年时间来做一个创新，所以怎么才能更快地释放数据价值才是他们关心的话题。\n\n今天的数据库是一个百花齐放的状态，甚至在国内的一些场景出现了数据库“四世同堂”的局面，同时跑着大型机、小型机、x86，接下来甚至还要引入分布式数据库、云数据库，对用户而言选择一个数据库其实非常困难。\n\n**世界变化太快，很多时候用户可能是在项目进行的过程中突然有了一个新的想法**。怎么用最快的速度把这个东西做出来，并且做出来之后不用操心它是不是能扛更高的并发？如果快速把第一个原型推到线上，用户是不是可以不用操心后面的并发问题？当推到市场时立刻就能获得新的反馈，新反馈作为新需求加进来后，能不能在当天就直接提供服务？这个时候非常依赖数据库的能力，特别是当我们和越来越多的年轻人聊时，会发现他们今天已经不再关心数据库任何底层的东西。**他们只关心你有没有能力让他用最快的速度将产品或服务推向市场，在推向市场后有没有能力支持业务高速发展**，有些用户甚至连 SQL 都不想写了。\n\n## 重新思考：如何以敏捷性应对未来\n\n所有这些对数据库的能力要求非常高，本质上我们要用数据库的能力支撑业务的敏捷性：如果要支持一个敏捷业务，那数据库本身的迭代能力是不是足够敏捷？**这让我们对敏捷产生了全新的思考**。\n\n有两个用户让我觉得特别震撼，其中一个是区块链领域的用户，通过使用区块链技术追踪区块链里的每一笔交易，如果是相同的人还可以追踪跨链的交易。这个用户在不到一年的时间里，单个集群数据量从几 TB 上涨到一百多 TB。因为 TiDB 太好用了，他会把更多的数据往 TiDB 里放，把 TiDB 作为在线服务。当你有这个想法时就会发现，你根本找不到一个其他数据库能满足这个需求；它需要在线服务、低延迟，需要从不同角度查询数据，你可以用索引、HTAP 能力，还必须要有非常强大的 SQL 能力，因为用户会不停往里面塞数据。\n\n![客户感受.png](https://img1.www.pingcap.com/prod/_c02e4a56a0.png)\n\n前两天在 Hacker News 上有一个热帖，微软云的 CTO 发了一个推特，引起了轩然大波，他说现在 C 和 C++ 这类语言被标识为过时的语言，如果大家用 Java 或者其他软件，经常会把过时的不再支持的 API 标记成过时数据。他的建议是我们应该把 C++ 标记成过时，任何项目不再用 C++ 写，应该全面使用 Rust。可能有人有印象，TiDB 在 2015 年就开始用 Rust 写存储层。但对于新用户来说，当知道我们用 Rust 和 GO 作为编程语言时，他们就会说你们好时尚，实际上这是我们 7 年前的决策。当初，Rust 还没有发布 1.0 版本，拿这个东西来写数据库简直是开玩笑。\n\n**很多时候，我们的一点创新，一点激进的动作，很可能在当初饱受非议，但在未来却可能成为主流**。PingCAP 在技术、架构上面一直会选择非常积极的创新，非常具有前瞻性的创新，这些创新甚至要在 5-7 年后才能感受到当初的选择是非常正确的。\n\n![客户成功范式.png](https://img1.www.pingcap.com/prod/_0b64827dd5.png)\n\n总结来说，如果用几个词来形容 PingCAP 的成功范式，那就是自主开源+持续引领+面向未来的创新，都服务于客户成功，不管是专家型的客户还是应用型的客户，TiDB 都能够很好地去支持他们的业务更好、更敏捷地迭代发展。TiDB 也因此成为众多行业头部用户的共同选择，助力用户业务敏捷增长。\n\n### 用户分享：建信金科为什么选择与 TiDB 同行？\n\n![建信金科.png](https://img1.www.pingcap.com/prod/_8915b47379.png)\n\n**建信金科基础技术中心副总裁邢磊分享了建信金科如何借助 TiDB 实现业务增长敏捷性**。建信金科自关注分布式数据库以来，PingCAP 一直未离开过其视线。与大多数用户不同，建信金科与 PingCAP 的接触不是从 TiDB 开始，而是 TiKV，为什么是这样的选择？\n\n建信金科的微服务、分布式，要求对数据做拆分，需要在现有业务不做大调整的情况下，去开启业务应对未来不确定性的能力。在这个过程中有一个绕不过去的问题，这么多传统渠道、传统业务和交易，如何在不影响现有交易模式的前提下改造后端的服务能力？TiKV 在这样的场景下进入视野，以前建信金科用的是国外开源软件，整个历程中遇到的问题和挑战非常大，也给自己的安全稳定运行带来很大挑战。\n\n建信金科一直在思考怎么去找一个自己能掌控的技术，去解决后续将在这个领域上面对的问题。从 2020 年开始接触 TiKV，做业务场景适配，包括早期的技术、产品验证，以及双方在 TiKV 上投入研发的资源和精力，一起努力了差不多一年时间。这是建信金科做过的所有案例里耗时最长、投入最大的项目。2021 年 10 月，建信金科第一次把 TiKV 5.0.4 版接入到全行分布式体系当中，顺利扛住 4 万多 TPS 压力稳定运行，开启 TiKV 在建信金科分布式体系中的重要作用。**随着核心业务的改造，建信金科去年底将整个核心业务在分布式平台上进行切换，TiKV 起到了非常关键的作用。自 2022 年开始，建信金科更进一步借助 TiKV 的高可用体系构建了跨地域、跨中心的灾备能力**。\n\n**HTAP 在金融场景的验证**\n\n传统金融企业在交易业务线、数据分析业务线的处理其实都会分开，多维查询和管理类分析业务倾向于用大数据业务处理，但随着自己的数字化转型逐步深入以及各种平台生态建设，所有的关键业务、核心业务都面临着新的挑战，这恰恰就是 HTAP 要解决的问题。这个场景用传统的大数据技术很难在数据实时更新场景下同时提供多维的分析和查询能力。在这个场景下，当时建信金科遇到非常大的挑战，留给 PingCAP 的时间非常短，从 4 月底提出到 5 月底验证，只有一个月的时间。去年 10 月正式投产进入稳定的迭代。现在，建信金科每个新的场景都会有 TiDB 的身影。\n\n**当前，建信金科正在尝试将系统升级到最新的 TiDB 6.1 版本。同时，也在将更多的统一视图、全量资产、反洗钱业务在 HTAP 上做验证和迁移**。未来，建信金科与 PingCAP 将进行联合技术创新攻关，在金融场景下更大规模业务模式的创新以及未来数据库如何更好的适应云计算趋势等方面进行更多探索。\n\n回顾来看，为什么 PingCAP 能够在众多分布式数据库厂商中受到建信金科的持续关注？主要有三点：  \n\n**第一，服务于客户成功**。数据库是一个服务于应用的产品，只有关注客户的成功，关注客户遇到的实际问题，才能够赢得更好的发展；  \n\n**第二，PingCAP 的开放性**。PingCAP 从出生开始就一直以开源开放的特征存在于数据库行业，正是这一点使得建信金科更倾向于选择它，相信开源和开放的力量会成为未来企业技术重要的组成部分；  \n\n**第三，成长性**。所有的技术不能光看它在当前已经取得的成就，以及当前表现出来的状态，更重要的是关注它的成长性。技术从当前的里程碑到下一个里程碑，加速度是不是足够快，如果有更快的加速度，现在所有存在的困难和差距都会在短时间内得到突破。与 PingCAP 一起，与优秀的开发者和专家一起，将取得更大的成长。\n\n### 百胜中国：拥抱开源，加速创新\n\n百胜中国首席技术官张雷分享到，百胜中国是中国最大的餐饮企业，致力于成为全球最创新的餐饮先锋。百胜中国获受肯德基、必胜客和塔可贝尔在中国内地的独家运营和授权经营权，并完全拥有小肥羊、黄记煌和 COFFii & JOY 餐饮品牌，也和意大利咖啡企业 Lavazza 合作，在中国探索和发展 Lavazza 咖啡店品牌概念。截止 2022 年 6 月底，百胜中国在中国的足迹遍布除港、澳、台之外的所有省市自治区，在 1,700 多座城镇，有 40 多万员工经营着 12,000 多家餐厅，全年客流量超 20 亿次。  \n\n2021 年，百胜中国正式启用了位于上海、南京、西安三地的数字化研发中心，这是公司打造一个充满活力的数字化生态系统的重要里程碑。由数字化研发中心、合资公司以及第三方合作伙伴组成的多层次研发体系，为公司品牌和业务进一步创新发展，加速扩张，抓住市场机遇奠定了坚实的基础。**在数字化不断发展的今天，打造敏捷高效的数字化能力，成为了餐饮企业的立身之本**。  \n\n百胜中国在业内率先推出了手机点餐业务，在全国范围门店推出了数字支付，疫情期间也落地了大规模的无接触配送，百胜中国不仅持续地完善从线上点餐、外卖到会员计划、礼品卡等消费者场景，同时在餐厅内也构建了百胜自主研发的点餐和收银系统，持续打造餐饮业领先的端到端的数字化生态。  \n\n截止 2022 年 6 月底，百胜中国的线上会员数量超过了 3.85 亿，2022 年第二季度，数字化订单占比达到了 89%，会员营销额也约占到了系统销售额的 62%。百胜中国也不断利用数字化能力赋能门店运营，例如基于数据和 AI 能力，构建了餐饮行业特有的营运大脑以及口袋经理，为门店运营效能的提升提供了数据以及系统支撑。同时也聚焦自动化、IoT 及智能餐厅等领域，基于当前不断蓬勃发展的大数据、云计算等基础能力，借助于百胜中国自己的研发中心、合资公司以及第三方合作伙伴，共同为百胜中国两万家餐厅的目标夯实牢固的数字化基础。  \n\n**百胜的生态环境中拥有丰富的应用场景，让各种技术能力有生根落地的机会**。同时随着企业数字化转型进入了深水区，对于数字化基础设施的自主可控性和灵活性的要求也进一步在提升。开源软件起到了越来越重要的作用，成为企业创新实践的催化剂。  \n\n![百胜中国.png](https://img1.www.pingcap.com/prod/_4cdb5f9900.png)\n\n基于开源基础软件体系，可以提升企业 IT 技术的标准化；活跃的开源社区，也可以有效帮助企业降低试错成本。当企业投入一定的资源协助开源社区建设时，能够同步提升自主的技术品牌和技术人才的能力以及影响力。TiDB 是业内开源分布式数据库的翘楚，百胜中国在 2019 年就开始了前期研究，以尝试替代传统的商业数据库产品。**百胜中国非常看重核心数据的处理主权，开源数据库恰恰能够帮助掌握这一主权，同时借助活跃的开源社区，进行企业内部创新性的架构研究以及落地**。  \n\n**经过大概一年的探索，TiDB 最终在百胜的业务中台，例如消息中台、用户中台以及支付中台中得以落地实施，用于支撑百胜中国的线上交易**。TiDB 对于百胜中国的海量数据提供了稳定可靠的系统支持。众所周知，由于餐饮行业存在着明显的高低峰场景，目前像肯德基“疯狂星期四”，它的交易量是远超平常的，TiDB 的灵活水平扩展能力，使得百胜中国可以根据业务的需求进行计算资源实时调整，助力降本增效。  \n\n同时，在社群营销、ERP 报表等典型分析场景中 TiDB 的 HTAP 特性，也使得百胜中国可以以较小的代价进行海量数据的在线融合分析，以实现敏捷的业务支撑，百胜中国将 ERP 中的交易数据同步到 TiDB 中，再与 BI 工具进行集成，大幅缩短了企业内部的财务报表生成时间，极大提升了内部的工作效率。随着云原生和开源技术的持续发展，百胜中国不断加强各种新型开源技术的深度探索、应用以及融合，从而更有力地推动餐饮垂直行业云能力以及自我创新的发展。  \n\n![分布式数据库联合实验室.png](https://img1.www.pingcap.com/prod/_55e5ecc5a8.png)\n\n本次峰会中，**PingCAP 与百胜中国强强联合，成立“百胜中国 ✖️ PingCAP 分布式数据库联合实验室”**。联合实验室立足于双方的技术和生态优势，共同探索前瞻技术的创新和落地实践，提升餐饮行业的数字化服务水平和能力。  \n\n![数字生活 24 小时.png](https://img1.www.pingcap.com/prod/24_8ab85a9704.png)\n\n其实不只是建信金科与百胜中国，今天 TiDB 已经支撑了很多人一天 24 小时各种各样的生活需求，融入了人们的日常生活中。  \n\n![业务敏捷.png](https://img1.www.pingcap.com/prod/_ec97814792.png)\n\n在软件领域有一句经典的话，“Make it work, make it right, make it fast”，TiDB 今天就在 make it fast 的阶段。随着 TiDB 架构本身的分离做得越来越好，TiDB 架构的正确性会让性能提升和改进非常惊人。一个正确的内核才有成长的可能和更高的成长性。在过去一年的时间里，PingCAP 在核心场景 OLTP 领域获得了显著的性能提升。\n\n## 新物种：聊聊 HTAP\n\n![新物种 HTAP.png](https://img1.www.pingcap.com/prod/HTAP_9d37dafa2a.png)\n\n我在和客户聊的时候发现，HTAP 是一个很难讲明白的技术，它和 Hadoop 有什么区别？原来的大数据非常重，像是一只大象，相较之下 OLTP 数据库就像一条蛇，很灵活很快速，它不是加法，而是融合，是一个全新的物种。  \n\n但关于 HTAP 的挑战并没有解决，到底什么叫 HTAP？有没有一个例子能让用户一下子明白？TiDB 能干什么别人干不了的事吗？我们做了一个 DEMO，试图在 5 分钟内讲明白到底什么是 HTAP，到底 HTAP 能带来什么样的价值。\n\n![OSS Insight demo 简介.mp4](https://img1.www.pingcap.com/prod/OSS_Insight_demo_11f2a32fab.mp4)\n  \n\n一个好的 DEMO 应该具备什么特点？第一得好看，第二得好用，我们的 DEMO 除了好看、好用，还得好玩。这个 DEMO 所有数据都是真实的，并且一秒就能体验。我们也希望将这个 DEMO 开源出来分享给其他伙伴，这也非常符合 PingCAP 开源的理念。\n\n![OSS Insight 价值启发.png](https://img1.www.pingcap.com/prod/OSS_Insight_45d7bdad71.png)\n\n有一位用户曾经问我们 “用 HTAP 前后有什么差别？”，有一个非常直观的体验：OSS Insight 第一版只用了两个人，一个周末就做出来了。如果是传统方案，通常要用 4-6 个人，花半年时间。  \n\n![Insight.jpeg](https://img1.www.pingcap.com/prod/Insight_ddd6ff75b5.jpeg)\n\n这个事情给了我们另外一个启发，**每个人都有好奇心，每个人都有自己洞察的视角，每个好奇的灵魂都值得用 Insight 去激发**。这之前，我们只能看非常冰冷的 TPCC、TPCH 等和业务看起来一点关系都没有的东西，对新一代程序员来说这简直是上古语言。产品的价值能不能和用户的挑战结合起来？业务创新的敏捷性又依赖于数据敏捷。  \n\n最近一段时间脱口秀比较火，人人都能说 5 分钟的脱口秀。通过 OSS Insight ，我们可以让人人都能在 5 秒钟内获得 Insight 。我们设想每一个组织、每一个企业、每一个人都可以获得这个能力，都有这个好奇心去获取 Insight，像我们 700 人的企业就有 700 个脑袋。OSS Insight 中都是开源数据，任何一个人去看都能提出自己的 idea。  \n\n通常情况下，用户接下来的问题会是：到底有什么场景不是你的舒适区？我们根据所有线上用户真实的情况，画了下面这张图，大致描述了 TiDB 的舒适区到底在哪里。  \n\n![TiDB的数据敏捷区间.png](https://img1.www.pingcap.com/prod/Ti_DB_25b538382e.png)\n\n\n### HTAP 已死？\n\n在我们和用户聊的时候，经常有用户说 HTAP 这个概念已经听了 8-9 年，为什么一直没有火？甚至以为 HTAP 已经死了。**如果按照它原来的定义，HTAP 确实已经死了**。  \n\nHTAP 原来的形态基于两个基础假设：一个是内存即硬盘。十年前，“内存是新一代的磁盘”这一说法被炒得火热，如果真是这样，每台机器上现在都可以拥有 1 PB 以上的内存。但现在大家看到内存依然很贵，这意味着当时 HTAP 的第一个假设，内存足够大足够便宜，被证明是不现实的；另外一个是摩尔定律，过去当 CPU 高速发展的时候，我们对摩尔定律充满期待，而显然过去十年 CPU 发展速度让我们很失望，所以当时的两个基础到今天都不存在了。  \n\n但有一句话说得好， “科学的每一次进步都是在葬礼上取得的”；**上一个 HTAP 已经死了，为什么 PingCAP 还在坚持 HTAP ？最近 HTAP 又很火的样子，这是为什么呢**？  \n\n实际上，关于足够大的内存和硬盘，足够多的 CPU 和算力，如今都可以通过云的方式来得到，在云上你可以拥有近乎无限的内存。今天用户的使用习惯也产生了改变，用户希望在一个系统里面能存储足够多的数据，足够快地处理事务。所以，**一个强大的 OLTP 能力是 HTAP 的基础，但凡不具备这个基础就不能称之为 HTAP**。  \n\n![HTAP 重生.png](https://img1.www.pingcap.com/prod/HTAP_7fe55562d3.png)\n\n**在这个背景下，HTAP 重生了**。过去一年里， MySQL 发布了 HeatWave 作为 MySQL 的 HTAP 解决方案，Google 也在今年发布了 AlloyDB ，不久前 Snowflake 也发布了它的 HTAP 引擎 Unistore。  \n\n![HTAP 特性.png](https://img1.www.pingcap.com/prod/HTAP_14cf0a5239.png)\n\n**我们认为 HTAP 带给用户的体验就是简单 + 实时，同时还要求整个系统具备非常强的隔离性**。共享一份资源会面临较大挑战，因为它会吃掉大量的 OLTP 资源，所以物理隔离是 HTAP 的基础。TiDB 的架构很直接地展示了这个能力，当我们完全是物理隔离的时候，TiDB 的执行计划会很智能地从 OLTP 中选择这部分数据。TiDB 在过去发展过程中，最早是作为一个业务数据库在用，随着里面数据越来越多，一定程度上它就变成了一个实时数据服务层。各种各样的业务系统开始把 TiDB 作为中间层提供彼此交互的能力，比如 CRM 不能和 ERP 直接对话，但通过 TiDB 把数据聚集在一起，它们就可以直接对话了。  \n\n![TiDB 典型应用场景.png](https://img1.www.pingcap.com/prod/Ti_DB_2711011985.png)\n\n\n## 持续引领数据服务的敏捷性\n\n![持续引领.png](https://img1.www.pingcap.com/prod/_a47b16f178.png)\n\nTiDB 在持续引领数据库的演进方向，我们相信在接下来 2-3 年的时间里，会有越来越多的数据库加入这个队伍，朝着共同的方向去迭代和演进。  \n\n![DB 微服务化.png](https://img1.www.pingcap.com/prod/DB_8a0c4a6007.png)\n\n**未来的方向一定是数据库微服务化**。这表面看起来有点奇怪，为什么数据库要微服务化？微服务和数据库有什么关系？我们认为，今天的数据库不仅仅是数据库的一个内核，它已经是一套复杂系统，前面提到的掌控复杂性的方法只有一个，那就是分而治之。  \n\n**微服务化本质上会达到一个效果，让规模化效应开始掌控一切，最后带来的结果和用户的价值，可以大幅压低用户使用成本**。目前，TiDB Cloud 在过去一年中通过持续孵化改造，成本已经降到了原来的 1/10。一个很简单的例子，今天每一个数据库都有一个能力叫 GC，如果每一台服务器都去配这样一个能力，要么压力大的时候不够用，要么完全浪费了，但是这个功能又不得不配上。比较好的办法是让这个 GC 也能够规模化，使它本身变成微服务。数据压缩、持续后台优化都是这样，我们不能用原来的系统资源去做，用户希望花钱买的每一份计算资源都是为他服务，而不是用 1/3 来做后台服务。\n\n## 连接中国与世界\n\n**在全球，TiDB 一直发挥着连接中国和全世界的作用**。为什么那么多的用户、合作伙伴会选择我们？开源、云中立以及全球合规，就是 TiDB 起到的连接作用。\n\n![应用场景连接中国与世界.png](https://img1.www.pingcap.com/prod/_7113459090.png)\n\n同时，PingCAP 有大量的应用场景也是连接全球的，上图可以看到今天 TiDB 已经被用到了全球各行各业。每一个场景里都有中国的用户，也有来自美国、日本、新加坡、欧洲和印度的用户。  \n\n基于中国全球领先的场景，基于开源非常高效透明的传播与协作模式，基于开源汇聚全球的智慧，最终使得 PingCAP 得到全球更多的客户与合作伙伴的信任。  \n\n### 用户分享：传音携手 PingCAP 打造全新数字化非洲土壤\n\n传音控股是一家致力于成为新兴市场消费者最喜爱的智能终端产品和移动互联服务提供商，在与 PingCAP 的合作中，将其移动商店的整体服务架构迁移到了 TiDB 上。传音控股移动互联 CTO 史团委表示，**PingCAP 使得传音控股可以将更多资源投入在业务的推进上，从中后台工作中解放出来，大幅降低成本**。TiDB 的水平扩展、故障自恢复、数据强一致性、高度兼容性等特点，帮助传音控股实现了技术进阶，提升了用户体验，加速了技术架构平台化与垂直化的演进。\n\n![传音移动互联.png](https://img1.www.pingcap.com/prod/_79a61abd29.png)\n\n### 用户分享：老虎国际 - 只有真正的全球化公司 才能服务全球化客户\n\n老虎国际作为全球知名的国际化券商，在新加坡、美国、中国香港、澳大利亚等地持有 59 张牌照或资质，在全球多地开展业务。老虎国际技术副总裁柳锴表示，只有真正的全球化公司才能服务全球化客户。基于全球化的业务，老虎国际的数据架构、数据安全等也面临着全球化的挑战。**TiDB 可以解决系统架构的复杂度，同时通过低延迟、数据强一致性，解决业务挑战与数据安全挑战**。  \n\n![老虎国际.png](https://img1.www.pingcap.com/prod/_47275021c8.png)\n\n## 技术人如何创造社会价值？\n\n作为一个技术人员，我们一直在想一个问题，**作为一家企业怎么创造社会价值，怎么做更多的贡献**？PingCAP 最早从开源起家，把所有一切能开源的东西都开源了，开源始终融在我们的基因里。  \n\n作为数据库从业人员，作为数据库的开发者，我记得上大学时还没有一个非常好的数据库教程。那时数据库依然没有办法做到足够的平民化，并不是每一个人、每一个开发者都能拥有一个永远在线的数据库。所以当时我就有一个想法，以后一定要让数据库变得触手可及，让每个人都可以拥有自己的数据库。为了让 TiDB 触手可及，我们做了很多事情，推出了自己的 Talent Plan，与 VLDB 合作，所有的一切都是希望让数据库变得触手可及。同时这也帮我们带来了非常繁荣、多样化的社区， 目前已有 1,895 位 Contributor，覆盖 45 个国家与地区。  \n\n![TiDB让开发者触手可及.png](https://img1.www.pingcap.com/prod/Ti_DB_44c8aff85e.png)\n\n说到触手可及，最要紧的一件事情就是成本。随着 TiDB 的新一代分布式架构和规模化效应，今天我们终于能够让每一个开发者都可以拥有一个永远在线的免费的数据库，我们可以随时去体验这个数据库，这就是新的架构带来的成本优势。  \n\n![与开源同行.jpeg](https://img1.www.pingcap.com/prod/_3f21f3105e.jpeg)\n\n在过去的 7 年中，PingCAP 一路走来磕磕绊绊，我一直在想能不能把这些经验教训也都开源出来？今天我们非常高兴地宣布，经过半年多的集体创作，我们将过去 7 年的那些经历、经验和教训，也开源出来，首发《与开源同行》这本书，希望大家喜欢，继续与 PingCAP 同行。  \n\n最后，[TiDB Hackathon](https://tidb.net/events/hackathon2022?utm_source=website-zh&utm_medium=referral&utm_campaign=blog-keynote) 是我最期待的一年一度的技术盛会，也期待你的加入。  \n\n![Hackathon 2022.jpeg](https://img1.www.pingcap.com/prod/Hackathon_2022_d7a6299f4a.jpeg)\n","author":"刘奇","category":5,"customUrl":"the-future-is-now-by-max-liu","fillInMethod":"writeDirectly","id":420,"summary":"9 月 22 日 PingCAP 用户峰会上，PingCAP 创始人兼 CEO 刘奇和来自建信金科、百胜中国、传音控股、老虎国际的用户共同分享了 PingCAP 在技术演进、用户价值、数据库技术趋势、国际化、社会价值等方面的思考与实践。","tags":["TiDB"],"title":"刘奇：能否掌控复杂性，决定着分布式数据库的生死存亡"}},{"relatedBlog":{"body":"作为数据库服务商， PingCAP 肩负着一项重要使命：找到一条深耕行业场景，构建多元生态的路径。9 月 22 日的用户峰会上，PingCAP 副总裁陈煜琦发表了以“深耕行业场景，构建多元生态”为主题的演讲，工商银行、杭州银行、中国人寿财险、平安科技分享了在他们的关键业务中如何借助 TiDB 深挖行业场景，来自神州数码、中电金信、天翼云、东软集团、云徙科技、嘉和美康的生态伙伴分享了他们与 TiDB 的共建经验。以下为分享回顾。\n\n在传统的体系下， 原厂商和渠道商往往处于供应链上下游的位置， 彼此之间是通过商业利益进行连接的。在这种体系下，原厂商往往处于主导地位， 如果用太阳系来比喻这套合作体系， 那么处于太阳系中心的就是原厂商， 各个渠道商就像一颗颗行星， 被吸引着围绕原厂商转动、 产生连接、创造商业价值。但是这样的引力是不可持续的，并且黏性是不够的。\n\n![陈煜琦.jpeg](https://img1.www.pingcap.com/prod/_0cf67761cd.jpeg)\n<center>PingCAP 副总裁陈煜琦</center>\n\nPingCAP 副总裁陈煜琦介绍，我们有非常好的社区文化、开源基因，以及散布在各行各业中的开发者、使用者、源代码贡献者。**通过开源模式，PingCAP 打造出一套“友邻式”的生态体系，任何个人、公司、数据平台、云基础设施都可以通过 TiDB 开源社区连接在一起，持续挖掘和创造商业价值**。\n\n在过去这些年中，基于这样的“友邻式”生态，PingCAP 从研发、产品到服务，积累了非常多体系化的能力，在金融、保险、物流、互联网等行业的深度客户中积累了非常多的场景和经验，与众多生态伙伴共同挖掘 TiDB 的行业场景能力。\n\n## 与深度用户共同挖掘行业场景\n\n> 金融机构尤其是银行，信息化开始都比较早，信息技术已经成为银行经营的主要支柱。银行业务的特殊性是和钱打交道，因此对系统可靠性要求比较高。TiDB 的分布式架构、金融级数据强一致性都为金融用户提供了坚实的数据底座能力。\n\n### 杭州银行：关键业务类系统数据库的选择\n\n杭州银行作为金融企业，为保证系统运行的可靠性、安全性和稳定性，以往比较偏爱国外厂商的高端成熟系统。\n\n随着数字经济发展和新一代技术崛起，以互联网厂商为代表，通过分布式、微服务、云计算等技术也构建出了可以满足业务发展的技术架构，并且在人才体系、业务模式和用户习惯上能够实现多个维度不断破圈。银行也从自身的金融科技发展角度看到了新技术在性能、弹性和成本管理上的优势。**在架构转变过程中，金融科技的自主发展已经成为银行业的发展共识，越来越多的银行同业开始应用分布式技术，在业务发展变革中通过场景实践来带动发展**。\n\n杭州银行坚持自主研发、自主建设、自主可控的系统建设思路。在基础软件领域，杭州银行从 2015 年开始使用 MySQL 等开源软件；2018 年引入私有云建设，在云上所有的业务系统数据库都使用了 RDS ；2020 年，采购单独的分布式数据库产品也投入了生产环节；2021 年随着云原生技术的发展，杭州银行进一步在生产环境引入了容器云平台，在客户关系管理、办公自动化系统等金融分析系统中引入了 TiDB，并在多种业务场景对 HTAP 架构进行验证，了解掌握它的技术特点。\n\n![刘峥.jpeg](https://img1.www.pingcap.com/prod/_e749a0b808.jpeg)\n<center>刘峥 杭州银行 信息技术部副总经理</center>\n\n银行业务交易类系统尤其是关键业务系统，是金融行业中要求最为苛刻的系统。“钱不能错，服务不能停”，这是监管基本要求。作为交易系统的数据承载、服务底座，这种系统的数据库必须满足四个基本要求，**杭州银行信息技术部副总经理刘峥**把它总结为“SAPE”：一是 Safe （安全），数据安全是要绝对保证的，在任何情况下数据不能丢，数据不能错；二是 Availability （高可用），保证业务连续性不仅要符合监管要求底线，也要完善整个体系的可用性；三是 Performance （性能），使用分布式数据库替代传统数据库后，除了自然而然带来的横向扩展能力外，系统性能不能因此而产生降级；四是 Ecology （生态），这是当前背景下的一个特定要求，当前数据库产品众多，产品技术生态一定要有多方支持，由多方共建，对开发者和开发商要有强大吸引力，产品才能持续发展。\n\n杭州银行组织多方参照监管单位发布的关于分布式数据库的技术架构、灾难恢复、安全技术的行业标准，共同设计了产品的测试场景，结合 TiDB 的产品特性在关键业务系统的仿真场景下进行更为详细的测试验证。TiDB 在开发应用、双中心多活、HTAP 等场景下体现出了较大优势，对测试过程中新增的一些产品需求也能及时改进和反馈。从开放性上来讲，TiDB 在人才培养、开发平台的适配、开源生态都有比较明显的优势，**下一步杭州银行将在更多重要业务系统应用 TiDB，进行持续探索和磨合**。\n\n### 工商银行：国产分布式数据库的探索实践\n\n工商银行从 2017 年就开始关注、研究和使用 TiDB。工商银行技术专家王君轶依稀还记得做第一个 TiDB 变更时的情景，那时还是 TiDB 2.0 版本，做一个服务器的置换一做就到第二天天亮。上个月工商银行把所有机型升到 TiDB 5.4 版本，所有升级动作仅在一个小时内就能全部搞定。**近几年 TiDB 的更新迭代非常快，用户体验已经不可同日而语了**。\n\n![王君轶.jpeg](https://img1.www.pingcap.com/prod/_e6bd45b92f.jpeg)\n\n<center>王君轶 工商银行 基础技术实验室 技术专家</center>\n\n王君轶介绍使用 TiDB 的契机是自主可控，当时人行和工信部都提出银行核心系统的国产化替代，工行也积极响应，直到现在也是重点工作之一。同时工行也提出了在分布式数据库技术领域要提前进行技术储备和布局。虽然 TiDB 是当时一款比较火的产品，但是当时业界也不乏其他一些优秀产品，为什么最终工行还是选用了 TiDB？最主要的一个原因就是开源，开源为工行深入研究一款产品提供了可能。同时，跨行业的丰富使用案例，也给工行提供了很多借鉴。社区化的开发模式、版本的快速迭代，可以更快地完善所需功能。后续多家国产数据库陆续开源，也从侧面印证了 TiDB 坚持的开源战略受到了行业的认可。最后一点原因是工行对分布式数据库技术的研究需要。工行在分布式数据库技术领域也是多驾马车并行的，TiDB 可以作为这个技术领域的有益补充。\n\n工行从 2017 年开始对 TiDB 进行研究论证，2018 年开始落地。刚开始上线的时候 TiDB 性能并不是太好，在进行了一系列优化，包括物理机置换，搬迁到万兆网络机房以后，性能肉眼可见地获得了很大提升。在高可用方面，工行进行了负载均衡以及同城双活的改造。整个过程并不是一蹴而就，其实是一个慢慢摸索的发展状态。直到 2020 年后 TiDB 开始慢慢走向成熟，4.0 版本也具备了 HTAP 的能力，工行随之开始寻找合适的试验场景。同时工行也在不断完善集群的一些配套功能，包括报警监控、安全审计等。再之后，工行开始研究 TiDB 上容器，这也顺应了基础设施云化的发展趋势。今年，工行会继续通过 TiDB 国产开源的特性，助力运维数据库的自主可控建设。\n\n**TiDB 在工行前后共投入了四五套集群，主要分为两类：一种是传统的部署架构，另一种是云上多租户，也就是容器集群架构**。传统的部署架构可以支持更大负载的应用，而且具备稳定性和性能两方面的优势，比较适合应用等级比较高，数据规模比较大的应用；容器集群可以通过容器来提高租户间的安全隔离，借助开发的调度编排，实现资源投入和人力成本的降低，比较适合应用等级稍低，数据规模没那么大的应用。两种架构正好形成互补。\n\n![TiDB 在工行的部署.png](https://img1.www.pingcap.com/prod/Ti_DB_92721544ca.png)\n\n上图是一个同城两中心部署架构，具备同城双活高可用能力，通过 F5 实现园区间的流量转发。同时根据服务器的资源配置，将 DB 节点和 KV 节点进行多实例部署，兼具性能、稳定性以及资源利用率两方面的均衡。\n\n工行去年开始试点容器集群，现在还处于摸索阶段。容器集群最大的优势除了能够降低资源投入外，还能节约人力成本。出现故障灾难恢复时，不需要人工干预，能够实现自愈，通过 TiDB  Operator 能够实现集群的全生命周期管理。\n\nTiDB 在工行最初是以运维领域作为研究的切入点。运维应用所使用的数据库也在面临很多挑战，像业务应用基本每个应用都会单独设一套数据库，资源投入多不说还比较难管理。但绝大部分运维应用都不会太大，属于中小型的应用，不过也有极个别的比较复杂，加上人工智能、模型训练等，如果随便找一个业务数据库来跑的话，在分析计算方面还不一定能够搞得定，同时随着业务应用的不断扩张，与之相对应的运维数据呈几何增长，扩容也是一个问题。此外，在多数据中心的情况下如何高可用部署？其实行内的业务系统高可用已经比较成熟，但运维应用的高可用相对比较薄弱，近几年行内对运维应用容灾能力越来越重视。\n\n因此，**工行基于分布式数据库 TiDB 构建了一个多租户 DBaaS 云，能够为多个运维应用提供数据库服务，根据业务的需求进行弹性伸缩**。同时工行进行了同城高可用的部署，在应用上进行试点验证。以工行的智能算法门户应用为例，这个应用是面向运维的，能够提供数据的加工处理，以及运维集成的端到端的运维服务。它一方面会对数据库捞取大量的数据做模型训练，而且实时性要求还不低。另外一方面，它会将运维数据异常检测的一些结果数据对数据库进行高频的读写更新，这比较贴合 HTAP 场景，因此工行以 Spark 作为分布式计算引擎，以 TiDB 作为底层数据存储引擎，来构建高效的流批一体处理框架。\n\n> 数据库也是保险公司信息系统中关键的基础设施，因此，产品优秀，服务到位是保险信息系统稳定运行的前提， PingCAP 与中国人寿财险建立了良好合作，一起打造出分布式数据库在财险行业核心应用的典范。\n\n### 中国人寿财险：“核心系统分布式数据库”改造实践\n\n中国人寿财险是中国人寿集团重要成员单位，成立 16 年以来成果颇丰，目前在中国财险行业排名第四，累计服务了 1.1 亿个人用户，470 万个组织客户。该公司高度重视科技投入，科技应用在公司发展历程上起到了至关重要作用，从最初的技术支撑到逐步引领业务的方向，科技创新成为中国人寿财险最重要的核心竞争力之一。\n\n![陈彬.jpeg](https://img1.www.pingcap.com/prod/_f6006e6148.jpeg)\n\n陈彬 中国人寿财险 金融科技中心系统运行部负责人\n\n**中国人寿财险充分利用两条科技途径推进科技创新，一是利用大数据、云计算、人工智能等新一代技术来改造传统保险业务，二是直接面向互联网、移动化构建新的服务架构和运营模式**。在数字化转型道路上，数据库是最重要的核心基础设施，支持大规模数据、高并发、敏捷响应成为其关键能力，也是保险业务高质量发展的技术保障。\n\n近几年来，中国人寿财险主动应对车险综合改革，业务规模持续上升，盈利能力水平稳步提高，2021 年实现保费收入约 915 亿元。历时三年，中国人寿财险在 2020 年完成了新一代核心业务系统的建设，为深入推进数字化转型打下坚实基础。但是，随着业务规模的不断扩大及保单件数的激增，仍面临一些在应用层面解决不了的痛点，例如，投保业务激增导致高并发，实时数据写入、时效性、可靠性得不到保障。**担心业务高峰期出现单点故障，基础软件做不到完全掌控，而这些痛点正好是分布式数据库善于解决的问题**。\n\n分布式数据库支持横向扩展，满足金融应用系统海量数据存储和百万级 TPS 高并发要求，提高了吞吐能力，降低了响应时间，实现小机向 X86 迁移，摆脱对专有硬件依赖，分布式数据库是解决以上问题的最佳方案。\n\n鉴于分布式数据库金融行业的应用案例相对较少，**中国人寿财险采用四步走策略，包括公开招标、PoC 测试、上线试用、外部评审，尽最大可能选择最适合业务发展的数据库产品**。2020 年，中国人寿财险通过对市场上主流分布式数据库进行深入考察和评估，最后选择 TiDB 4.0 作为核心业务系统分布式数据库的试点。\n\n2020 年 11 月，经过详细的技术验证，应用优化和投产保障规划，中国人寿财险数据库及中间件团队成功上线了单证系统。2021 年，陆续实现了承保辅助决策系统、天财车险、特殊车险承保系统的上线。今年，中国人寿财险已经完成了报价中心的切换上线，后续还会完成非车险承保系统的切换上线。TiDB 大幅提升海量数据和高并发下的性能问题，提供灵活的弹性扩容能力，并符合未来云架构的趋势。目前，TiDB 集群稳定支撑非车险及电子投保系统的客户身份认证、投保、对接银行保单处理、电子发票开具等业务，提供了异构数据库的灾备能力，实现了 RPO=0，RTO<30 秒的金融生产级高等级运行保障要求。\n\n**在整个实践过程中，中国人寿财险和 PingCAP 密切合作，初步形成了分布式数据库自主创新的能力，验证了分布式数据库在核心业务系统的可行性**。中国人寿财险基于 TiDB 实现了核心业务系统的分布式改造，第一次在保险行业联机交易和批量业务场景引入 NewSQL 分布式数据库架构，推动中国人寿财险核心业务系统实现了进一步技术演进迭代和整体降本增效的目标。\n\nTiDB 分布式数据库在中国人寿财险核心业务的成功应用，首先节省了成本，通过 X86 通用服务器代替 IBM 小型机，硬件投入成本降低了 75%；其次，用先进的分布式数据库替换集中式数据库，改造完成之后，OLTP 和 OLAP 性能较原来的 Oracle 数据库均有了明显上升，其中全量状态统计报表的处理时效提升 80 多倍，并具备了更强的数据汇聚和查询能力；最后，通过开放架构实现了安全可控，初步打造了中国人寿财险的自主创新体系，并不断演进，为后续异地双活改造奠定了坚实的技术基础。\n\n## 与行业科技公司共创新型合作模式\n\n> PingCAP 在拓展场景时常常会碰到多种多样的各类需求，而这些需求来自于各个企业所属的竞争环境，这些挑战无论是业务还是技术上，都不是一家企业能够独自完成的，要想深耕行业，就需要各种行业的垂直解决方案、服务能力， PingCAP 在与平安科技的合作中尝试出一种新的生态合作模式，为行业领域用户提供更深入的行业解决方案。\n\n### 平安科技 - 携手共建的发行版战略\n\n平安科技总工程师汪洋分享了 TiDB 发行版 UbiSQL 的前世今生。UbiSQL 是平安基于 TiDB 基础的数据库引擎自研的数据库发行版，定位是金融级分布式数据库，能够覆盖金融全场景，并满足国家信息自主可控和一行两会对于数据库技术的要求。\n\n![汪洋.png](https://img1.www.pingcap.com/prod/_7ba23426e1.png)\n\n<center>汪洋 平安科技 总工程师</center>\n\nUbiSQL 前三个字母 Ubi 是英语 ubiquitous （无处不在）的缩写。在发音上，汪洋称 UbiSQL 为“无比 SQL”，希望这个数据库具有良好的扩展性，非常强的高可用性，能够做到无与伦比，无处不在。\n\n![UbiSQL 的前世今生.png](https://img1.www.pingcap.com/prod/Ubi_SQL_3a1b112b9b.png)\n\n**过去一年来，平安科技与 PingCAP 进一步加强了合作关系，探索出了从产研到交付到服务的全新合作模式**。在该模式转变前，双方各自有一个内循环，围绕着平安、PingCAP 自己的核心场景转动。平安作为一个综合性金融集团，涵盖了全牌照的金融服务，包括银行、基金、保险、投资，甚至包括一些互联网金融，非常丰富。围绕这些核心场景，平安有自己的 UbiSQL 产研团队、解决方案团队、运维团队，这些之间形成了一个内循环。当产品发布之后，平安可以通过自己的数据库架构师或者产品解决方案师，给应用系统做出一些建议，提出一些架构选型方面的建议，还有一些系统的使用性建议。在系统上线后，还可以根据线上问题提供一些售后的运维支持，包括整体系统的优化，定期 review ，健康检查，在这个过程中平安能够发现产品所需要提升的地方，形成了一个闭环。\n\nPingCAP 同样有三种角色，但是唯一不同的是缺少这样的金融场景。所以之前这两个环是相对独立的。\n\n在这种模式运行一段时间后，双方发现在很多方面还没有打通，没有产生 1+1>2 的效果，而是 1+1=2，甚至于可能是小于等于 2 。**现在，通过双方合作的进一步加强，平安和 PingCAP 形成了内循环 + 外循环模式，内循环与外循环是打通的：双方的产研团队打通**，形成产研方面的联合团队；在交付方面打通，形成了解决方案师的联合团队；在售后方面打通，形成了技术服务的联合团队。通过将这些团队角色打通后，双方发现在问题的解决效率、产品新特性的发布、产品问题的修复等方面，都得到了非常大的提升。\n\n这种新模式就是开放合作和共赢。当线上 UbiSQL 的一个应用系统发现问题后，双方组建的运维团队可以迅速介入分析问题，诊断问题。一方面能够快速解决问题，恢复生产，恢复服务；另一方面可以继续去寻找产品产生问题的根本原因，并制定对应的解决方案，让问题不再发生。在查找问题原因、制定解决方案的同时，也会看到一些对产品方面的提升建议，平安会提交给产研联合团队，进一步了解产品的实现机制。\n\n![平安科技与 PingCAP的合作.png](https://img1.www.pingcap.com/prod/Ping_CAP_b180f967a3.png)\n\nPingCAP 的产研团队则更聚焦在 TiDB 最新的版本或者未来的版本上，能够进行产品特性方面的增强或者 bug 修复，而平安的团队也能够把这些方案在产品方面的一些实现，快速应用到现网运行上的一些系统中，快速进行现网产品的提升，这是双方合作的意义所在。**通过组建这些联合团队，可以看到覆盖的应用系统从设计到开发到上线到售后到销售整个生命周期**，覆盖了驻场运维服务、问题咨询、功能申请、技术支持、系统优化、故障上报等端到端服务能力。通过这种全新的合作模式，平安与 PingCAP 形成了共赢的基础。\n\n共赢还使得双方无论在研发能力、运维能力，还是解决方案能力方面，都得以提升。可能连 PingCAP 的研发也没有意识到，在某些特定场景和负载下产品会出现的问题，通过双方合作可以发现和修正。这种模式不仅可以极大程度上帮助 TiDB 打磨金融场景的基础能力，同时还能帮助平安 UbiSQL 的研发团队加深对代码的理解，能够更迅速地从代码级定位问题，修复问题。当产品发生问题后，双方团队可以对问题诊断分析，能够发现一些以前包括研发、运维团队所不知道的特性与机制。**从这些方面来看，合作不光使平安科技的交付团队、运维团队能力得以提升，就连 PingCAP 的售后工程师技能也得以提升**。\n\nPingCAP 与平安就是通过这样更加开放的态度进行更加深入的合作，从而达到双方共赢，实现能力、产品的提升，进一步适配金融场景需要，实现 1+1>2 的效果。**相信通过这种全新的合作模式，PingCAP 和平安，包括 UbiSQL，都可以走得更远，越做越好**。\n\n### 加乘创新 智简未来，构建友邻多元生态\n\n![多元生态.png](https://img1.www.pingcap.com/prod/_e1c1965f70.png)\n\n除平安科技外，PingCAP 的整个生态体系也会涉及到各行各业非常核心的场景，除了前面讲到的社区、技术、人才、共赢生态，还需要有更多传统企业级解决方案加进生态中，融合开源、多源和行业解决方案，将 PingCAP 的整个生态体系进化为“友邻式”的多元生态。\n\n**用户峰会上，陈煜琦与神州数码、中电金信、天翼云、东软集团、云徙科技、嘉和美康等生态合作伙伴共同启动了“加乘创新 智简未来”的共创仪式**，将合力为银行、保险、证券、电信、政企、零售餐饮、制造、医疗等数字转型企业，以及 SaaS、金融科技、游戏、电商等数字原生企业，提供更加丰富的企业级解决方案及服务。\n\n![共创仪式.png](https://img1.www.pingcap.com/prod/_a902132bd9.png)\n\n**赵琳 神州数码企业业务集团软件本部总经理**\n\n“神州数码与 PingCAP 在面向数据库企业服务市场、面向技术人才及开源运营生态、面向双方战略合作共赢上一直有着深入合作，神州数码的数云融合技术战略致力于为企业形成数据洞见及敏捷应对变化和创新的能力，拥抱云和开源，与TiDB 等开源厂商就云原生的分布式架构、Dataops、定制化通用聚合平台等进行解决方案整合，为企业提供一站式企业数字化转型解决方案。”\n\n**邵建军 中电金信副总裁**\n\n“中电金信和 PingCAP 在杭州银行等越来越多的金融机构领域成功合作，我们认为未来与 TiDB 的合作层级会越来越广阔，不断加强合作的深度和广度。”\n\n**侯圣文 天翼云大数据 AI 首席专家**\n\n“天翼云在 2018 年开始参与了 TiDB 开源项目，我们有很多开发者一起探索在云原生当中的 HTAP 场景，在多个行业领域落地，都取得了非常良好的效果。天翼云团队一直在践行着中国人真正的担当，走向了一个自主可控的路径，未来和 TiDB 一起，希望我们能把自研数据库做得越来越好。”\n\n**郭晓龙 东软集团股份有限公司医疗保障事业部开发中心主任**\n\n“东软集团成立于 1991 年，在汽车互联，软件国际化服务都属于领先领域。我们和 PingCAP 是在医疗保障行业里深度合作，通过产品选型和技术认证，我们选择了 PingCAP 的 TiDB，并打造了山东临沂千万级别人口城市标杆的医保项目，这个项目解决了传统的分布式数据库的适配成本高，管理成本大，性能优化难的问题，受到了医保，山东医保的高度肯定。接下来我们想和 PingCAP 公司携手共进，开展更加全面深入多元化的合作。”\n\n**江威 云徙科技副总裁**\n\n“云徙科技主要在企业服务里做基于中台的营销数字化服务，帮企业构建一体化的数字增长服务。我们和 TiDB 面向大数据的营销场景、业务中台应用落地，未来希望在越来越多企业应用中与 TiDB 一起共同提供更好的服务。”\n\n**潘状 嘉和美康平台数据中心产品总监**\n\n“嘉和美康是国内比较早从事医疗软件研发和产业化的公司，公司主营业务是医疗软件，在这个行业内深耕了 11 年，目前已经形成具有自主知识产权，包括临床医疗，医患互动，医养一体，医疗大数据相关产业链。我们与 TiDB 合作的主要方向是在医疗大数据方向，看重 TiDB 优秀的在线数据分析能力，数据处理能力，未来我们希望与 PingCAP 一起在医疗行业内秉承合作共赢、开放的理念，加速我国医疗信息化数字化转型。”\n\n未来，相信将有更多的企业用户和合作伙伴加入 PingCAP 这个“友邻式的多元生态”，共同助力数字转型企业和数字原生企业的业务敏捷创新。","author":"PingCAP","category":2,"customUrl":"create-a-friendly-and-diversified-ecosystem","fillInMethod":"writeDirectly","id":423,"summary":"9 月 22 日的用户峰会上，PingCAP 副总裁陈煜琦发表了以“深耕行业场景，构建多元生态”为主题的演讲，工商银行、杭州银行、中国人寿财险、平安科技分享了在他们的关键业务中如何借助 TiDB 深挖行业场景，来自神州数码、中电金信、天翼云、东软集团、云徙科技、嘉和美康的生态伙伴分享了他们与 TiDB 的共建经验。本文为分享回顾。","tags":["TiDB"],"title":"打造友邻式多元生态，支撑工商银行、平安科技、中国人寿财险、杭州银行的创新实践"}}]},{"id":"Blogs_420","title":"刘奇：能否掌控复杂性，决定着分布式数据库的生死存亡","tags":["TiDB"],"category":{"name":"观点洞察"},"summary":"9 月 22 日 PingCAP 用户峰会上，PingCAP 创始人兼 CEO 刘奇和来自建信金科、百胜中国、传音控股、老虎国际的用户共同分享了 PingCAP 在技术演进、用户价值、数据库技术趋势、国际化、社会价值等方面的思考与实践。","body":"本文回顾了 PingCAP 创始人兼 CEO 刘奇在 9 月 22 日的用户峰会上以《现在决定未来》为主题的演讲，**分享了 PingCAP 在技术演进、用户价值、数据库技术趋势、国际化、社会价值等方面的思考**，同时也记录了建信金科、百胜中国、传音控股、老虎国际等用户在刘奇的演讲中分享的最佳实践。全文字数约 8,800，预计阅读时间 20 分钟。\n\n![刘奇.png](https://img1.www.pingcap.com/prod/_6c926b4679.png)\n\nPingCAP 到今天已经成立 7 年了，在全球拥有 3,000 多家大中型用户，其中很多还参与到 TiDB 开源社区的建设中，这些情况如果放到创业之初很难想象。\n\n**今天，我们认识到做一个真正广泛应用的数据库，是一个需要以十年为时间单位进行投入的基础工程**。这一路走来离不开关心和支持 PingCAP、喜欢 TiDB 的每个人。\n\n## 与客户对话，客户眼中的 TiDB\n\n过去一段时间，在和包括日本、美国、印度、欧洲等全球客户交流时，我们试图从更多不同客户的视角去了解他们到底是怎么看待 TiDB 的。\n\n在 TiDB 的设计里，有很多设计是从第一天就开始的，我们甚至完全不觉得这个设计有什么特别之处。直到我问一些专家型用户“你到底为什么选择 TiDB ？”时，他们告诉我：**因为 TiDB 的开放式架构可以管理复杂性**。我当时挺诧异，因为这个东西第一天就是这样设计的，已经融入 PingCAP 的血液当中，所以我们自身已经无感。但对这些专家来说，他们当中很多人在各个大公司本身就做过数据库，甚至是大型分布式系统，做过这些系统的人都会产生一个心态，那就是对“复杂性”会无比敬畏。\n\n![与专家型客户对话.png](https://img1.www.pingcap.com/prod/_b7cdaa3e30.png)\n\n一个数据库，哪怕它是一个小型数据库，通常代码规模都会有几十万行，上百万行，如果是一个传统的成熟型商业数据库，那更是一个以千万行代码为单位的系统。**面对如此复杂的系统，用户在考虑未来的迭代时，通常要做 3-5 年的规划**。如果用户需要花 3-5 年来替换一个 PB 级数据库，很大程度上意味着接下来 5-10 年的时间他就不想再动了，这也是本次峰会的主题为什么是“现在决定未来”。\n\n**今天我们做一个数据库替换的决定，它的影响周期很可能是接下来的 10-20 年**。在这个较长的周期中，大家看系统价值的时候就会看到完全不一样的价值。比如最近我意外地发现 TiDB 在 CFO 眼里其实很受欢迎，他们表示，在现有实践中，TiDB 至少可以降低一半的成本，所以 CFO 很快就会批下来对 TiDB 的部署和应用。大家可以试想一下，如果用户有 PB 级的数据，用 TiDB 替换能够省一半的成本，是不是非常有吸引力？\n\n今天的世界充满了不确定性，在此前提下如何能更好地生存下去？省钱自然会变成一个全世界都关注的话题。\n\n但所有这些价值的前提是接下来 5-10 年，甚至 10-20 年这个系统不能死，能持续支撑业务。这时候问题就来了，**凭什么一个系统在接下来 10-20 年间还能够支撑用户的业务？用户做架构选择最重要的标准是什么？**\n\n是整个设计团队是不是具备掌控复杂性的能力，是不是能够看到未来 10-20 年企业中的系统复杂性会朝什么方向迭代，今天在系统里做好设计，可以应对未来的高速演进和迭代，而不只是一个过渡方案，过两年还要再换。**虽然我们在设计 TiDB 的过程中，已经做了高度分离式架构，开放式 API ，但有些东西融入血液时就会无感，而在用户看来这恰恰是他们最看重的，这给了我们很大启发**。\n\n一个专家型用户跟我说：“**人类几千年来应对复杂性只学会了一个道理，就是分而治之**”。这听起来好像是一个很简单的道理，回想一下会觉得他说得太对了，这也是人类几千年来应对复杂性的唯一办法。分而治之落在软件或者数据库的复杂性上面，应该是什么样的？这就是 TiDB 未来的演进方向，也是整个行业未来的演进方向。\n\n![与应用型客户对话.png](https://img1.www.pingcap.com/prod/_0e4e2d2a4a.png)\n\n与专家型用户不同，应用型客户又是完全不一样的观点。有些用户是做创业公司，能不能活过两三年自己也不知道。**如果选择一个东西需要花 2-3 年才能看到足够大的价值，肯定等不起，他需要更快地兑现价值**。事实上，这些应用型客户不仅仅是那些创业公司，还有很多是大公司里面的新项目。大家知道在一个大公司里经常出现一种情况，当做一个新业务时，每个人心里都清楚时间很有限，公司可能等不了用 5 年时间来做一个创新，所以怎么才能更快地释放数据价值才是他们关心的话题。\n\n今天的数据库是一个百花齐放的状态，甚至在国内的一些场景出现了数据库“四世同堂”的局面，同时跑着大型机、小型机、x86，接下来甚至还要引入分布式数据库、云数据库，对用户而言选择一个数据库其实非常困难。\n\n**世界变化太快，很多时候用户可能是在项目进行的过程中突然有了一个新的想法**。怎么用最快的速度把这个东西做出来，并且做出来之后不用操心它是不是能扛更高的并发？如果快速把第一个原型推到线上，用户是不是可以不用操心后面的并发问题？当推到市场时立刻就能获得新的反馈，新反馈作为新需求加进来后，能不能在当天就直接提供服务？这个时候非常依赖数据库的能力，特别是当我们和越来越多的年轻人聊时，会发现他们今天已经不再关心数据库任何底层的东西。**他们只关心你有没有能力让他用最快的速度将产品或服务推向市场，在推向市场后有没有能力支持业务高速发展**，有些用户甚至连 SQL 都不想写了。\n\n## 重新思考：如何以敏捷性应对未来\n\n所有这些对数据库的能力要求非常高，本质上我们要用数据库的能力支撑业务的敏捷性：如果要支持一个敏捷业务，那数据库本身的迭代能力是不是足够敏捷？**这让我们对敏捷产生了全新的思考**。\n\n有两个用户让我觉得特别震撼，其中一个是区块链领域的用户，通过使用区块链技术追踪区块链里的每一笔交易，如果是相同的人还可以追踪跨链的交易。这个用户在不到一年的时间里，单个集群数据量从几 TB 上涨到一百多 TB。因为 TiDB 太好用了，他会把更多的数据往 TiDB 里放，把 TiDB 作为在线服务。当你有这个想法时就会发现，你根本找不到一个其他数据库能满足这个需求；它需要在线服务、低延迟，需要从不同角度查询数据，你可以用索引、HTAP 能力，还必须要有非常强大的 SQL 能力，因为用户会不停往里面塞数据。\n\n![客户感受.png](https://img1.www.pingcap.com/prod/_c02e4a56a0.png)\n\n前两天在 Hacker News 上有一个热帖，微软云的 CTO 发了一个推特，引起了轩然大波，他说现在 C 和 C++ 这类语言被标识为过时的语言，如果大家用 Java 或者其他软件，经常会把过时的不再支持的 API 标记成过时数据。他的建议是我们应该把 C++ 标记成过时，任何项目不再用 C++ 写，应该全面使用 Rust。可能有人有印象，TiDB 在 2015 年就开始用 Rust 写存储层。但对于新用户来说，当知道我们用 Rust 和 GO 作为编程语言时，他们就会说你们好时尚，实际上这是我们 7 年前的决策。当初，Rust 还没有发布 1.0 版本，拿这个东西来写数据库简直是开玩笑。\n\n**很多时候，我们的一点创新，一点激进的动作，很可能在当初饱受非议，但在未来却可能成为主流**。PingCAP 在技术、架构上面一直会选择非常积极的创新，非常具有前瞻性的创新，这些创新甚至要在 5-7 年后才能感受到当初的选择是非常正确的。\n\n![客户成功范式.png](https://img1.www.pingcap.com/prod/_0b64827dd5.png)\n\n总结来说，如果用几个词来形容 PingCAP 的成功范式，那就是自主开源+持续引领+面向未来的创新，都服务于客户成功，不管是专家型的客户还是应用型的客户，TiDB 都能够很好地去支持他们的业务更好、更敏捷地迭代发展。TiDB 也因此成为众多行业头部用户的共同选择，助力用户业务敏捷增长。\n\n### 用户分享：建信金科为什么选择与 TiDB 同行？\n\n![建信金科.png](https://img1.www.pingcap.com/prod/_8915b47379.png)\n\n**建信金科基础技术中心副总裁邢磊分享了建信金科如何借助 TiDB 实现业务增长敏捷性**。建信金科自关注分布式数据库以来，PingCAP 一直未离开过其视线。与大多数用户不同，建信金科与 PingCAP 的接触不是从 TiDB 开始，而是 TiKV，为什么是这样的选择？\n\n建信金科的微服务、分布式，要求对数据做拆分，需要在现有业务不做大调整的情况下，去开启业务应对未来不确定性的能力。在这个过程中有一个绕不过去的问题，这么多传统渠道、传统业务和交易，如何在不影响现有交易模式的前提下改造后端的服务能力？TiKV 在这样的场景下进入视野，以前建信金科用的是国外开源软件，整个历程中遇到的问题和挑战非常大，也给自己的安全稳定运行带来很大挑战。\n\n建信金科一直在思考怎么去找一个自己能掌控的技术，去解决后续将在这个领域上面对的问题。从 2020 年开始接触 TiKV，做业务场景适配，包括早期的技术、产品验证，以及双方在 TiKV 上投入研发的资源和精力，一起努力了差不多一年时间。这是建信金科做过的所有案例里耗时最长、投入最大的项目。2021 年 10 月，建信金科第一次把 TiKV 5.0.4 版接入到全行分布式体系当中，顺利扛住 4 万多 TPS 压力稳定运行，开启 TiKV 在建信金科分布式体系中的重要作用。**随着核心业务的改造，建信金科去年底将整个核心业务在分布式平台上进行切换，TiKV 起到了非常关键的作用。自 2022 年开始，建信金科更进一步借助 TiKV 的高可用体系构建了跨地域、跨中心的灾备能力**。\n\n**HTAP 在金融场景的验证**\n\n传统金融企业在交易业务线、数据分析业务线的处理其实都会分开，多维查询和管理类分析业务倾向于用大数据业务处理，但随着自己的数字化转型逐步深入以及各种平台生态建设，所有的关键业务、核心业务都面临着新的挑战，这恰恰就是 HTAP 要解决的问题。这个场景用传统的大数据技术很难在数据实时更新场景下同时提供多维的分析和查询能力。在这个场景下，当时建信金科遇到非常大的挑战，留给 PingCAP 的时间非常短，从 4 月底提出到 5 月底验证，只有一个月的时间。去年 10 月正式投产进入稳定的迭代。现在，建信金科每个新的场景都会有 TiDB 的身影。\n\n**当前，建信金科正在尝试将系统升级到最新的 TiDB 6.1 版本。同时，也在将更多的统一视图、全量资产、反洗钱业务在 HTAP 上做验证和迁移**。未来，建信金科与 PingCAP 将进行联合技术创新攻关，在金融场景下更大规模业务模式的创新以及未来数据库如何更好的适应云计算趋势等方面进行更多探索。\n\n回顾来看，为什么 PingCAP 能够在众多分布式数据库厂商中受到建信金科的持续关注？主要有三点：  \n\n**第一，服务于客户成功**。数据库是一个服务于应用的产品，只有关注客户的成功，关注客户遇到的实际问题，才能够赢得更好的发展；  \n\n**第二，PingCAP 的开放性**。PingCAP 从出生开始就一直以开源开放的特征存在于数据库行业，正是这一点使得建信金科更倾向于选择它，相信开源和开放的力量会成为未来企业技术重要的组成部分；  \n\n**第三，成长性**。所有的技术不能光看它在当前已经取得的成就，以及当前表现出来的状态，更重要的是关注它的成长性。技术从当前的里程碑到下一个里程碑，加速度是不是足够快，如果有更快的加速度，现在所有存在的困难和差距都会在短时间内得到突破。与 PingCAP 一起，与优秀的开发者和专家一起，将取得更大的成长。\n\n### 百胜中国：拥抱开源，加速创新\n\n百胜中国首席技术官张雷分享到，百胜中国是中国最大的餐饮企业，致力于成为全球最创新的餐饮先锋。百胜中国获受肯德基、必胜客和塔可贝尔在中国内地的独家运营和授权经营权，并完全拥有小肥羊、黄记煌和 COFFii & JOY 餐饮品牌，也和意大利咖啡企业 Lavazza 合作，在中国探索和发展 Lavazza 咖啡店品牌概念。截止 2022 年 6 月底，百胜中国在中国的足迹遍布除港、澳、台之外的所有省市自治区，在 1,700 多座城镇，有 40 多万员工经营着 12,000 多家餐厅，全年客流量超 20 亿次。  \n\n2021 年，百胜中国正式启用了位于上海、南京、西安三地的数字化研发中心，这是公司打造一个充满活力的数字化生态系统的重要里程碑。由数字化研发中心、合资公司以及第三方合作伙伴组成的多层次研发体系，为公司品牌和业务进一步创新发展，加速扩张，抓住市场机遇奠定了坚实的基础。**在数字化不断发展的今天，打造敏捷高效的数字化能力，成为了餐饮企业的立身之本**。  \n\n百胜中国在业内率先推出了手机点餐业务，在全国范围门店推出了数字支付，疫情期间也落地了大规模的无接触配送，百胜中国不仅持续地完善从线上点餐、外卖到会员计划、礼品卡等消费者场景，同时在餐厅内也构建了百胜自主研发的点餐和收银系统，持续打造餐饮业领先的端到端的数字化生态。  \n\n截止 2022 年 6 月底，百胜中国的线上会员数量超过了 3.85 亿，2022 年第二季度，数字化订单占比达到了 89%，会员营销额也约占到了系统销售额的 62%。百胜中国也不断利用数字化能力赋能门店运营，例如基于数据和 AI 能力，构建了餐饮行业特有的营运大脑以及口袋经理，为门店运营效能的提升提供了数据以及系统支撑。同时也聚焦自动化、IoT 及智能餐厅等领域，基于当前不断蓬勃发展的大数据、云计算等基础能力，借助于百胜中国自己的研发中心、合资公司以及第三方合作伙伴，共同为百胜中国两万家餐厅的目标夯实牢固的数字化基础。  \n\n**百胜的生态环境中拥有丰富的应用场景，让各种技术能力有生根落地的机会**。同时随着企业数字化转型进入了深水区，对于数字化基础设施的自主可控性和灵活性的要求也进一步在提升。开源软件起到了越来越重要的作用，成为企业创新实践的催化剂。  \n\n![百胜中国.png](https://img1.www.pingcap.com/prod/_4cdb5f9900.png)\n\n基于开源基础软件体系，可以提升企业 IT 技术的标准化；活跃的开源社区，也可以有效帮助企业降低试错成本。当企业投入一定的资源协助开源社区建设时，能够同步提升自主的技术品牌和技术人才的能力以及影响力。TiDB 是业内开源分布式数据库的翘楚，百胜中国在 2019 年就开始了前期研究，以尝试替代传统的商业数据库产品。**百胜中国非常看重核心数据的处理主权，开源数据库恰恰能够帮助掌握这一主权，同时借助活跃的开源社区，进行企业内部创新性的架构研究以及落地**。  \n\n**经过大概一年的探索，TiDB 最终在百胜的业务中台，例如消息中台、用户中台以及支付中台中得以落地实施，用于支撑百胜中国的线上交易**。TiDB 对于百胜中国的海量数据提供了稳定可靠的系统支持。众所周知，由于餐饮行业存在着明显的高低峰场景，目前像肯德基“疯狂星期四”，它的交易量是远超平常的，TiDB 的灵活水平扩展能力，使得百胜中国可以根据业务的需求进行计算资源实时调整，助力降本增效。  \n\n同时，在社群营销、ERP 报表等典型分析场景中 TiDB 的 HTAP 特性，也使得百胜中国可以以较小的代价进行海量数据的在线融合分析，以实现敏捷的业务支撑，百胜中国将 ERP 中的交易数据同步到 TiDB 中，再与 BI 工具进行集成，大幅缩短了企业内部的财务报表生成时间，极大提升了内部的工作效率。随着云原生和开源技术的持续发展，百胜中国不断加强各种新型开源技术的深度探索、应用以及融合，从而更有力地推动餐饮垂直行业云能力以及自我创新的发展。  \n\n![分布式数据库联合实验室.png](https://img1.www.pingcap.com/prod/_55e5ecc5a8.png)\n\n本次峰会中，**PingCAP 与百胜中国强强联合，成立“百胜中国 ✖️ PingCAP 分布式数据库联合实验室”**。联合实验室立足于双方的技术和生态优势，共同探索前瞻技术的创新和落地实践，提升餐饮行业的数字化服务水平和能力。  \n\n![数字生活 24 小时.png](https://img1.www.pingcap.com/prod/24_8ab85a9704.png)\n\n其实不只是建信金科与百胜中国，今天 TiDB 已经支撑了很多人一天 24 小时各种各样的生活需求，融入了人们的日常生活中。  \n\n![业务敏捷.png](https://img1.www.pingcap.com/prod/_ec97814792.png)\n\n在软件领域有一句经典的话，“Make it work, make it right, make it fast”，TiDB 今天就在 make it fast 的阶段。随着 TiDB 架构本身的分离做得越来越好，TiDB 架构的正确性会让性能提升和改进非常惊人。一个正确的内核才有成长的可能和更高的成长性。在过去一年的时间里，PingCAP 在核心场景 OLTP 领域获得了显著的性能提升。\n\n## 新物种：聊聊 HTAP\n\n![新物种 HTAP.png](https://img1.www.pingcap.com/prod/HTAP_9d37dafa2a.png)\n\n我在和客户聊的时候发现，HTAP 是一个很难讲明白的技术，它和 Hadoop 有什么区别？原来的大数据非常重，像是一只大象，相较之下 OLTP 数据库就像一条蛇，很灵活很快速，它不是加法，而是融合，是一个全新的物种。  \n\n但关于 HTAP 的挑战并没有解决，到底什么叫 HTAP？有没有一个例子能让用户一下子明白？TiDB 能干什么别人干不了的事吗？我们做了一个 DEMO，试图在 5 分钟内讲明白到底什么是 HTAP，到底 HTAP 能带来什么样的价值。\n\n![OSS Insight demo 简介.mp4](https://img1.www.pingcap.com/prod/OSS_Insight_demo_11f2a32fab.mp4)\n  \n\n一个好的 DEMO 应该具备什么特点？第一得好看，第二得好用，我们的 DEMO 除了好看、好用，还得好玩。这个 DEMO 所有数据都是真实的，并且一秒就能体验。我们也希望将这个 DEMO 开源出来分享给其他伙伴，这也非常符合 PingCAP 开源的理念。\n\n![OSS Insight 价值启发.png](https://img1.www.pingcap.com/prod/OSS_Insight_45d7bdad71.png)\n\n有一位用户曾经问我们 “用 HTAP 前后有什么差别？”，有一个非常直观的体验：OSS Insight 第一版只用了两个人，一个周末就做出来了。如果是传统方案，通常要用 4-6 个人，花半年时间。  \n\n![Insight.jpeg](https://img1.www.pingcap.com/prod/Insight_ddd6ff75b5.jpeg)\n\n这个事情给了我们另外一个启发，**每个人都有好奇心，每个人都有自己洞察的视角，每个好奇的灵魂都值得用 Insight 去激发**。这之前，我们只能看非常冰冷的 TPCC、TPCH 等和业务看起来一点关系都没有的东西，对新一代程序员来说这简直是上古语言。产品的价值能不能和用户的挑战结合起来？业务创新的敏捷性又依赖于数据敏捷。  \n\n最近一段时间脱口秀比较火，人人都能说 5 分钟的脱口秀。通过 OSS Insight ，我们可以让人人都能在 5 秒钟内获得 Insight 。我们设想每一个组织、每一个企业、每一个人都可以获得这个能力，都有这个好奇心去获取 Insight，像我们 700 人的企业就有 700 个脑袋。OSS Insight 中都是开源数据，任何一个人去看都能提出自己的 idea。  \n\n通常情况下，用户接下来的问题会是：到底有什么场景不是你的舒适区？我们根据所有线上用户真实的情况，画了下面这张图，大致描述了 TiDB 的舒适区到底在哪里。  \n\n![TiDB的数据敏捷区间.png](https://img1.www.pingcap.com/prod/Ti_DB_25b538382e.png)\n\n\n### HTAP 已死？\n\n在我们和用户聊的时候，经常有用户说 HTAP 这个概念已经听了 8-9 年，为什么一直没有火？甚至以为 HTAP 已经死了。**如果按照它原来的定义，HTAP 确实已经死了**。  \n\nHTAP 原来的形态基于两个基础假设：一个是内存即硬盘。十年前，“内存是新一代的磁盘”这一说法被炒得火热，如果真是这样，每台机器上现在都可以拥有 1 PB 以上的内存。但现在大家看到内存依然很贵，这意味着当时 HTAP 的第一个假设，内存足够大足够便宜，被证明是不现实的；另外一个是摩尔定律，过去当 CPU 高速发展的时候，我们对摩尔定律充满期待，而显然过去十年 CPU 发展速度让我们很失望，所以当时的两个基础到今天都不存在了。  \n\n但有一句话说得好， “科学的每一次进步都是在葬礼上取得的”；**上一个 HTAP 已经死了，为什么 PingCAP 还在坚持 HTAP ？最近 HTAP 又很火的样子，这是为什么呢**？  \n\n实际上，关于足够大的内存和硬盘，足够多的 CPU 和算力，如今都可以通过云的方式来得到，在云上你可以拥有近乎无限的内存。今天用户的使用习惯也产生了改变，用户希望在一个系统里面能存储足够多的数据，足够快地处理事务。所以，**一个强大的 OLTP 能力是 HTAP 的基础，但凡不具备这个基础就不能称之为 HTAP**。  \n\n![HTAP 重生.png](https://img1.www.pingcap.com/prod/HTAP_7fe55562d3.png)\n\n**在这个背景下，HTAP 重生了**。过去一年里， MySQL 发布了 HeatWave 作为 MySQL 的 HTAP 解决方案，Google 也在今年发布了 AlloyDB ，不久前 Snowflake 也发布了它的 HTAP 引擎 Unistore。  \n\n![HTAP 特性.png](https://img1.www.pingcap.com/prod/HTAP_14cf0a5239.png)\n\n**我们认为 HTAP 带给用户的体验就是简单 + 实时，同时还要求整个系统具备非常强的隔离性**。共享一份资源会面临较大挑战，因为它会吃掉大量的 OLTP 资源，所以物理隔离是 HTAP 的基础。TiDB 的架构很直接地展示了这个能力，当我们完全是物理隔离的时候，TiDB 的执行计划会很智能地从 OLTP 中选择这部分数据。TiDB 在过去发展过程中，最早是作为一个业务数据库在用，随着里面数据越来越多，一定程度上它就变成了一个实时数据服务层。各种各样的业务系统开始把 TiDB 作为中间层提供彼此交互的能力，比如 CRM 不能和 ERP 直接对话，但通过 TiDB 把数据聚集在一起，它们就可以直接对话了。  \n\n![TiDB 典型应用场景.png](https://img1.www.pingcap.com/prod/Ti_DB_2711011985.png)\n\n\n## 持续引领数据服务的敏捷性\n\n![持续引领.png](https://img1.www.pingcap.com/prod/_a47b16f178.png)\n\nTiDB 在持续引领数据库的演进方向，我们相信在接下来 2-3 年的时间里，会有越来越多的数据库加入这个队伍，朝着共同的方向去迭代和演进。  \n\n![DB 微服务化.png](https://img1.www.pingcap.com/prod/DB_8a0c4a6007.png)\n\n**未来的方向一定是数据库微服务化**。这表面看起来有点奇怪，为什么数据库要微服务化？微服务和数据库有什么关系？我们认为，今天的数据库不仅仅是数据库的一个内核，它已经是一套复杂系统，前面提到的掌控复杂性的方法只有一个，那就是分而治之。  \n\n**微服务化本质上会达到一个效果，让规模化效应开始掌控一切，最后带来的结果和用户的价值，可以大幅压低用户使用成本**。目前，TiDB Cloud 在过去一年中通过持续孵化改造，成本已经降到了原来的 1/10。一个很简单的例子，今天每一个数据库都有一个能力叫 GC，如果每一台服务器都去配这样一个能力，要么压力大的时候不够用，要么完全浪费了，但是这个功能又不得不配上。比较好的办法是让这个 GC 也能够规模化，使它本身变成微服务。数据压缩、持续后台优化都是这样，我们不能用原来的系统资源去做，用户希望花钱买的每一份计算资源都是为他服务，而不是用 1/3 来做后台服务。\n\n## 连接中国与世界\n\n**在全球，TiDB 一直发挥着连接中国和全世界的作用**。为什么那么多的用户、合作伙伴会选择我们？开源、云中立以及全球合规，就是 TiDB 起到的连接作用。\n\n![应用场景连接中国与世界.png](https://img1.www.pingcap.com/prod/_7113459090.png)\n\n同时，PingCAP 有大量的应用场景也是连接全球的，上图可以看到今天 TiDB 已经被用到了全球各行各业。每一个场景里都有中国的用户，也有来自美国、日本、新加坡、欧洲和印度的用户。  \n\n基于中国全球领先的场景，基于开源非常高效透明的传播与协作模式，基于开源汇聚全球的智慧，最终使得 PingCAP 得到全球更多的客户与合作伙伴的信任。  \n\n### 用户分享：传音携手 PingCAP 打造全新数字化非洲土壤\n\n传音控股是一家致力于成为新兴市场消费者最喜爱的智能终端产品和移动互联服务提供商，在与 PingCAP 的合作中，将其移动商店的整体服务架构迁移到了 TiDB 上。传音控股移动互联 CTO 史团委表示，**PingCAP 使得传音控股可以将更多资源投入在业务的推进上，从中后台工作中解放出来，大幅降低成本**。TiDB 的水平扩展、故障自恢复、数据强一致性、高度兼容性等特点，帮助传音控股实现了技术进阶，提升了用户体验，加速了技术架构平台化与垂直化的演进。\n\n![传音移动互联.png](https://img1.www.pingcap.com/prod/_79a61abd29.png)\n\n### 用户分享：老虎国际 - 只有真正的全球化公司 才能服务全球化客户\n\n老虎国际作为全球知名的国际化券商，在新加坡、美国、中国香港、澳大利亚等地持有 59 张牌照或资质，在全球多地开展业务。老虎国际技术副总裁柳锴表示，只有真正的全球化公司才能服务全球化客户。基于全球化的业务，老虎国际的数据架构、数据安全等也面临着全球化的挑战。**TiDB 可以解决系统架构的复杂度，同时通过低延迟、数据强一致性，解决业务挑战与数据安全挑战**。  \n\n![老虎国际.png](https://img1.www.pingcap.com/prod/_47275021c8.png)\n\n## 技术人如何创造社会价值？\n\n作为一个技术人员，我们一直在想一个问题，**作为一家企业怎么创造社会价值，怎么做更多的贡献**？PingCAP 最早从开源起家，把所有一切能开源的东西都开源了，开源始终融在我们的基因里。  \n\n作为数据库从业人员，作为数据库的开发者，我记得上大学时还没有一个非常好的数据库教程。那时数据库依然没有办法做到足够的平民化，并不是每一个人、每一个开发者都能拥有一个永远在线的数据库。所以当时我就有一个想法，以后一定要让数据库变得触手可及，让每个人都可以拥有自己的数据库。为了让 TiDB 触手可及，我们做了很多事情，推出了自己的 Talent Plan，与 VLDB 合作，所有的一切都是希望让数据库变得触手可及。同时这也帮我们带来了非常繁荣、多样化的社区， 目前已有 1,895 位 Contributor，覆盖 45 个国家与地区。  \n\n![TiDB让开发者触手可及.png](https://img1.www.pingcap.com/prod/Ti_DB_44c8aff85e.png)\n\n说到触手可及，最要紧的一件事情就是成本。随着 TiDB 的新一代分布式架构和规模化效应，今天我们终于能够让每一个开发者都可以拥有一个永远在线的免费的数据库，我们可以随时去体验这个数据库，这就是新的架构带来的成本优势。  \n\n![与开源同行.jpeg](https://img1.www.pingcap.com/prod/_3f21f3105e.jpeg)\n\n在过去的 7 年中，PingCAP 一路走来磕磕绊绊，我一直在想能不能把这些经验教训也都开源出来？今天我们非常高兴地宣布，经过半年多的集体创作，我们将过去 7 年的那些经历、经验和教训，也开源出来，首发《与开源同行》这本书，希望大家喜欢，继续与 PingCAP 同行。  \n\n最后，[TiDB Hackathon](https://tidb.net/events/hackathon2022?utm_source=website-zh&utm_medium=referral&utm_campaign=blog-keynote) 是我最期待的一年一度的技术盛会，也期待你的加入。  \n\n![Hackathon 2022.jpeg](https://img1.www.pingcap.com/prod/Hackathon_2022_d7a6299f4a.jpeg)\n","date":"2022-09-27","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"the-future-is-now-by-max-liu","file":null,"relatedBlogs":[]},{"id":"Blogs_414","title":"DynamoDB 2022 论文解读","tags":["TiDB","TiDB Cloud"],"category":{"name":"观点洞察"},"summary":"本文是 PingCAP 联合创始人兼 CTO 黄东旭对论文 Amazon DynamoDB: A Scalable, Predictably\nPerformant, and Fully Managed NoSQL\nDatabase Service 的解读，同时也对比了 TiDB 的一些设计。","body":"> 本文是 PingCAP 联合创始人兼 CTO 黄东旭对论文 [Amazon DynamoDB: A Scalable, Predictably\nPerformant, and Fully Managed NoSQL\nDatabase Service](https://www.usenix.org/system/files/atc22-elhemali.pdf) 的解读，同时也对比了 TiDB 的一些设计。\n\n很久没看到这么平铺直叙的论文了，可能是最近几年对于大规模分布式系统最具实操意义的论文之一，全文并没有任何一条公式，除了为数不多的 Micro Benchmark 图以外，就是一个简单的架构图（对于分布式数据库开发者来说，也是一张非常“没有”意外的图），甚至都没有解释太多架构设计（因为不需要，全世界 Shared Nothing 的系统都长得差不多），文字虽然多，但是基本都是大白话。毕竟 DynamoDB 已经不用试图“证明”什么，它在过去的 10 年已经充分证明了自己，不管是规模还是稳定性，这篇论文如果不出意外的话，大概会成为接下来很多云数据库厂商在构建各自的云服务的一个很重要的参考，因为论文比较新，我发现在网上也没有什么解读的文章，于是趁今天有空稍微斗胆解读一下，也会对比一下 TiDB 的一些设计，也许对于其它的读者有所启发。\n\n## 可预测的性能 > 极致性能\n\n这点我放在第一条，也是这几年做 TiDB 的云服务，让我感触最深的一点，我经常在不同的场合提到过：**稳定的慢比不稳定的快更好**，.99 Latency 比 Avg Latency 更加体现系统的设计功力。不知道是否有意为之，在 DynamoDB 2022 这篇论文中也是在第一个章节提出，可以见重要性。\n\n可预测的性能意味着首先要可衡，我常常面对一些有点哭笑不得的场景，经常有人问我：TiDB 能支持多少 QPS/TPS？这个问题实在没办法回答，因为不谈 Workload 的前提下，这个问题是没办法回答的。\n\n所以 DynamoDB 如果要做到提供可预测的性能，第一步是对 Workload 本身进行抽象，这就引入了 RCU，WCU 的概念，其实 RCU 和 WCU 和传统意义的 QPS 很接近，只是增加了操作的对象的大小，这样一来就可以做相对精准的 Workload 规划，例如：1 WCU = 1KB 对象 1 OPS，那么如果你操作的对象大小是 10K，那么在一个的能提供 1000 WCU 的机器上，你的总 OPS 就是 100。当业务能够使用 RCU 和 WCU 描述自己的 Workload 的时候，可预测性的第一步就完成了，至少 DynamoDB 的调度器可以做很多 Pre-partitioning 和预分配机器之类的事情，因为对于不同机型的硬件能力也可能简单的抽象成 WCU 和 RCU 的组合。\n\n当你知道的每个 Partition 的配额后，对于调度系统来说，这大概就是一个背包问题。值得注意的是 DynamoDB 在分配 Partioin 的配额时候会考虑同一台机器的 Partition 的配额的总和要小于这台机器的能提供的极限 RCU/WCU ，从论文给的例子来看，大概是 20%～30% 左右余量。设计过大系统的同学看到这里肯定会心一笑了，没有经验的系统设计者或者系统管理员，通常会为了追求‘极致’的性能（或者成本），通常会榨干机器的最后一点 CPU 和 IO，非要看到 100% 的 CPU Usage 才满意，但是这种情况下，机器其实已经处于非常不健康的状态，体现是请求的长尾延迟会变得很高，即使可能吞吐能有提升，但是因为这个不稳定的长尾对于客户端来说就是“不可预期”。在生产环境中，我们通常推荐超配 30% 左右的机器，是同样的道理。\n\n但是这样简单强行的限流确实有点粗暴，DynamoDB 引入了 Burst 和自适应配额（Adaptive Capacity）的概念。Burst 思路很简单，在分配配额的时候， DynamoDB 会给各个 Partition 预留一部分 Capacity，就是在短期流量 spike 的时候，用这些预留的 Capacity 扛一扛；Adaptive Capacity 就是在用户的 Workload 在其 Partitions 上出现倾斜后，动态的调整不同 Partition 的配额（但是总量不能超过原来的总配额）。\n\n要注意到，上述提到的方案都是基于一个假设：用户的 Workload 不怎么变化，而且假设一估就准，而且流控的手段都集中在 Partition 级别（也就是几乎在 Storage Node 的级别），也就是局部调度。\n\n在大规模存储系统上，流量控制其实就是一个全局的问题，用 TiDB 举例子，TiDB 的 SQL 层是一层入无状态的计算层，实际数据的请求会转发给 TiKV，按照 DynamoDB 这篇论文的说法，TiDB SQL 层就是某种意义上的“Request Router”，想象一下如果有多个 TiDB SQL 节点部署，但是只把流控做到 TiKV（存储层）的话，在极端情况下，不明真相的 TiDB SQL 节点仍然会不停的将请求打到过载的 TiKV Node 上，为了解决的这个问题，其实在 TiDB 层就需要做流控，直接返回错误给上层，不要穿透到 TiKV Node 上。\n\nDynamoDB 的论文中关于这部分的描述有点模糊，我个人的理解的策略大致是 Request Router 定期向 GAC 申请请求配额，GAC 会维护一个全局分配策略，如果某些 Partition 已经过载了，相应的 Request Router 就可以直接对客户拒绝服务，以保护系统，另外在 Node 级别也保留了 Partition 级别的流控作为最后防线。\n\n对于 Shared Nothing 的存储系统来说，Scale-out 的关键是分片的切分策略（分库分表就是一种最简单的静态切分），DynamoDB 很显然是选择动态切分的策略，就和 TiKV 一样，也是使用 Range Split，不一样的是 TiKV 的 Region （类似 DynamoDB 的 Partition 的概念）默认是按照 Size 作为切分阈值，后在 TiDB 6.0 引入了 Load-based Split 的策略，DynamoDB 直接采用的是 Load-based Split，首先 Partition 会有一个默认吞吐阈值，超过这个值后就会触发分裂（Split），现在想想，使用 Load 或者吞吐作为分裂的阈值，可能是一个更接近本质的选择🤔。而且当开始监控 Load 在 Key Range 上的分布状态后，很容易得到最优的分裂点（并非永远是中点）。另外关于 Split 的一个有意思的事情是，什么情况下 Split 是无效的，论文提到：1. 单行热点，这个很好理解。2. 按照 Key 的顺序访问的 Pattern，我猜想是类似顺序扫描的模式（类似 Key 上的迭代器），这种情况下 DynamoDB 会拒绝 Split。\n\n总结一下，DynamoDB 的可预测性能的核心在于：\n\n1. 对 Workload 准确抽象（WCU/RCU）\n2. 对 Partition 预分配配额，并严格限流\n3. 在 Node 上留出余量作为应对突发场景的临时资源池（Burst）\n4. 使用全局信息进行流量调度，在各个层面上都流控\n\n## 抖动尽可能小的 Failover\n\n关于 WAL 的处理，DynamoDB 和 TiKV 一样，也是通过 Distributed Consensus 算法（DynamoDB 是 Multi-Paxos，TiKV 是 Raft），同步到多个副本中（论文中暗示默认是 3），但是 DynamoDB 为了追求更高的 Durability，还会周期性的将 WAL （注意不仅仅是 DB Snapshot）同步到 S3，我理解这也不仅仅是为了更高的可靠性，同时也是 PITR（Point-in-time-recovery）必要动作。DynamoDB 实现 PITR 的当时也没啥特别的，就是定期将 DB Snapshot 传到 S3，然后配合 WAL 让用户恢复到指定时间，我发现这个不就是我在去年 TiDB Hackathon 上实现的项目吗！这里让我有点感慨，在过去如果我们是按照做云下的数据库软件的思路来设计类似的功能时，我们会倾向把这些和运维相关的能力做在数据库内核外围，然后通过额外的工具来提供相关的能力，因为从传统意义上讲，数据库内核对于外部环境的依赖越少越好（例如：在云下我们可没有 S3 用），但很显然云改变了这个假设。\n\n另外关于 Failover 的一个有意思的细节，当 DynamoDB 的 Replication Group 有节点故障的时候，例如 3 副本中有一个副本挂了，Group Leader 会马上添加一个 Log Replica 到复制组中，Log Replica 其实就是我们常说的 Witness（我下面也会用 Witness 来代替 Log Replica），也就是只存储日志，不提供服务的节点。其实这个做法非常聪明，对于 3 缺 1 的情况，虽然也满足多数派，但是这个时候的系统是很脆弱的，而要完整恢复一个新的成员的时间通常是比较长的（先拷贝 Snapshot 然后 Apply 最新的日志），尤其是 Partition Snapshot 比较大的情况，而且拷贝副本的过程可能会对本就不健康的 Group member 造成更多的压力，所以这个时候以很低的代价（论文中提到的时间是秒级）先添加一个 Witeness，至少保证恢复数据的过程中日志的安全性，而且对于跨中心部署的场景，这个优化还能降低异常状态下的写延迟，我们思考一个场景：假设我们有两个数据中心，其中一个主数据中心 A 承载主要写入流量，B 中心在远端承载一部分本地 stale read 的流量或灾备什么的，TiDB 跨两个中心部署，并让 Leader 和多数派集中在 A 中心（2 副本），另一个副本在 B 中心。这个时候 A 中心的某个节点挂掉了，这个节点负责的数据的 Raft Group 虽然不会停止写入，但是如果按照经典的 Raft，为了满足多数派的要求，这个时候必须需要要求 B 中心的副本写入成功才能返回客户端成功，这就意味着从客户端观察到了性能抖动（直到 A 中心的副本修复完成），如果在 A 中心的这个 Node 挂掉的时候，马上在 A 中心找台健康的 Node 作为 witness，添加到这个不健康的组中，这时候对于写入来说，只需要完成 A 中心的副本（Leader） + A 中心的 Witness，即可达到多数派，就省去了同步到 B 中心走一圈的延迟，从客户端的观察来说，系统并不会出现明显的抖动。\n\n![1.png](https://img1.www.pingcap.com/prod/1_fa988ebb38.png)\n\n为了降低在 Failover 时候的用户可见抖动，DynamoDB 还对复制组的 Leader Election 做了改进，对于大规模系统来说，网络抖动和局部的网络分区基本是家常便饭，假设一种情况：某个 Peer X 联系不上 Leader 但是仍然能和其它 Peer 通信，另一方面，Leader 此时和其它的 Peer 仍然能正常通信，这个时候如果这个 Peer X 按照传统的 Election 协议，会贸然发起一次 Term 更大的选举，然后其它的 Peer 会停下来给它投票，这个过程中，其实老 Leader 并没有问题，然后从用户侧观察到就是这部分数据的短暂不可用（选举期间不会对外提供服务）。这个是一个老生常谈的问题，在 TiKV 2.1 就引入了一个叫 Pre-Vote 的优化：新 Peer 想要发起选举的时候会先的问一下其它 Peer 是否会投票给自己，同时通过这个机制确认老的 Leader 的状态，确保大家都认为老 Leader 失联，同时会把票投给自己的前提下，才会发起投票，这个是避免在选举阶段死锁的一个常规优化。在 DynamoDB 中，论文中也提到了类似的机制：在 Peer 发起投票前，先问问其它 Peer 是否也觉得老 Leader 挂掉了，如果没有（或者多数派 Peer 联系不上），那就说明是自己的问题，就不影响正常的节点了，以减小客户端观察的系统抖动时间。\n\n![2.png](https://img1.www.pingcap.com/prod/2_98bdf13756.png)\n\n另外，对于大型系统来说，最可怕的故障就是雪崩（级联故障），例如 2015 年 DynamoDB 的故障（[https://aws.amazon.com/message/5467D2/](https://aws.amazon.com/cn/message/5467D2/)）就是一个典型的因为对元信息（Metadata Service）服务查询过多（路由信息），然后挂了，导致更多的客户端重试让情况更加恶化。在这篇论文里面提到对于元信息服务的改进让我想起了那次故障（我猜想很可能就是因为那次故障做的改进），解决的思路也很有智慧，我稍微解读一下。\n\nDynamoDB 观察到造成级联故障的根源之一在于：流量突变，而造成流量突变的常见因素之一就是缓存失效，虽然我们大多数时候认为缓存命中率越高越好（论文中大概提到路由表的缓存命中率大概是 99.75%）但是这么高的缓存命中率意味着：当出现缓存异常的情况（或者大量新节点加入时的缓存预热阶段），元信息服务要能承载 400 倍（最坏情况, 0.25% → 100%）的流量暴涨。DynamoDB 为解决这个问题使用了两个手段：\n\n1. 在 Request Router 和 Metadata Service 中间加了一级分布式内存缓存 MemDS，Router 的本地缓存失效后，并不直接访问 Meta Service，而是先访问 MemDS，然后 MemDS 在后台批量的访问 Metadata Service 填充数据。通过添加一层缓存进行削峰操作，相当于再加一层保险，属于常见的手段。\n\n2. 第二个手段比较巧妙，刚才提到 Router 事实上是通过 MemDS 获取元信息，当请求在 MemDS 的时候没命中的时候好理解，但是 MemDS 巧妙地方在于：**即使缓存命中，MemDS 也会异步访问 Meta Service**。这个操作我理解带来两个好处：\n\n  - 尽可能保证 MemDS 中已有缓存能被及时更新\n  - 给 MetaService 带来一个’稳定‘的流量（虽然可能更大）\n\n其中带来“稳定”但是更大的流量这个做法，举个例子：一直在演练，洪峰到来就不会措手不及。\n\n另外基于总量限制的令牌的 GAC 在某些程度上也降低了级联故障的影响。\n\n另外对于云上服务来说，一个优势是更新发布的节奏会比传统的企业软件快，而且微服务的架构能实现局部更新，但是部署更新通常是系统最脆弱的时候，而且像 DynamoDB 这么大规模的系统不太可能做全部停机更新，只能滚动更新，对于滚动更新来说，唯一要注意的点是：在更新过程中新老版本的 RPC 会共存，所以新的版本需要能够和运行老版本节点通信，然后在某个时刻（所有节点都部署新的节点后）切换新协议。\n\nDynamoDB 的对于系统在脆弱环境下的稳定性的工作总结成一句话就是：**尽可能降低客户端的可观察影响**，我认为其实也是“可预测的”性能的一部分。\n\n## 数据库 ≠ 数据库服务\n\n总的来说，DynamoDB 这篇论文和十多年前的 Dynamo 的论文相比，其实十几年前那篇论文更像个 DB，而这个 DynamoDB 其实是一个真正的 DBaaS (Database as a Service)，你可能好奇这两者之间有啥区别，我认为构建一个 DBaaS 和构建一个数据库完全是两回事，并不是简单的将多个 DB 部署放到云上托管就叫做 Service 了，很有可能一个成熟的 DBaaS 服务，除了给用户的感觉通过 endpoint 连上去用着像个 DB，至于这个 endpoint 后边长成什么样子，用户不用关心，甚至都不需要长成个数据库模样。举个极端点的例子：如果一个提供 SQLite 服务的 DBaaS，我觉得大概率它不会真的每个用户上来都傻傻的创建一个新的容器，装好操作系统，然后真的启动一个 SQLite 进程暴露出来，很可能是一个共享的大型服务，只是对外的表现的行为和 SQLite 一致即可，这样能更好的利用资源，从用户角度大概也感觉不出来。\n\n所以要构建一个 DBaaS，首先要考虑的是多租户，DynamoDB 之所以要重新设计，很重要原因就是老 Dynamo 不支持多租户，还是个传统的单租户 NoSQL 系统，这个对于云服务来说是不可接受的。这个在 TiDB 进行云原生转型的时候，**我们深刻地体会到，所谓云原生并不是简单的将一个云下的数据库搬到云上自动部署就叫 DBaaS，而是需要从内核到管控平台针对云提供的能力和环境进行深层次的改造，否则一个直观的代价就是：在云上的成本降不下来**。另外一个 DBaaS 和 DB 的显著区别就是 DBaaS 通常很难进行私有化部署，一个现代的 DBaaS 事实上充斥着大量的微服务，或者重度依赖了很多云厂商提供的特性（尤其是存储和安全相关的服务）。这点在 DynamoDB 的论文中体现的很明显：Request Router 是一个独立于所有租户前端的接入层（接入服务），全局流控 GAC 是一个服务，鉴权系统是个服务， 元信息是个服务，存储也是个服务，更不用说依赖的其它的服务如 S3/IAM 什么的…不过有意思的是：论文里面并没有提到任何的 EC2 和 EBS，让我不禁猜想 DynamoDB 的 Hardware Infra 很可能是自己维护的，也就是跑在 Bare metal 上。\n\n### 一些工程上的 Takeaway\n\n对于 TiDB 来说，面临的问题比 DynamoDB 更加复杂，毕竟 TiDB Cloud 提供的是 SQL 的服务，例如用户来一个 SELECT * FROM table 就会让计算 RCU 变得很困难（尤其是 TiDB 有 Co-processor，进行计算下推），但是也并非没办法，未来有机会可以写写这个话题，而且对 Workload 的抽象也会成为在云上计价和 Serverless 化的关键。TiDB Cloud 最近已经完成了管控平台的服务化，以及最近正在拆分的 Session Management 服务（类似 DynamoDB 的 Request Router）等很重要的工作，所以对我来说， DynamoDB 这篇论文更加确定了我们对于拆分和微服务化改造这条道路的对于云数据库的重要性的判断。\n\n最后下面是一点这篇论文的 Takeaways：\n\n1. 越了解 Workload 的抽象，越有利于构建出可预测系统，另外对 Workload 的衡量越精细，你能挣钱的空间越大。\n2. 从一开始，从全局考虑多租户，越早考虑越省事。\n3. 在云上，接入层的重要性很高，不要想 P2P 似的系统，直连存储节点是不靠谱的，Proxy 引入的一点点延迟对于带来的系统的可预测性提升来说，是可以接受的（流控，高可用，租户隔离，不停机更新…）\n4. 对调度进行抽象（将流控也考虑在调度模块里），层层流控，避免缓存失效带来的级联故障。\n5. 全局的微服务化构建的平台实现多租户，而不是在独立租户内拆分微服务。\n6. 利用云基础设施，将节省很多工作，例如 S3\n\n看完这篇论文后，其实有点意犹未尽的感觉，感觉还有很多东西没有写到，例如 Serverless 存储的 GC 策略 ，分布式事务等等，但是不妨碍这篇文章已经是一篇经典，想到这几年走的这些弯路，同行也是这么走过来的，竟然有一丝丝的共情，真是想互道一声不容易。","date":"2022-08-19","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"dynamodb-2022-paper-interpretation","file":null,"relatedBlogs":[]},{"id":"Blogs_398","title":"观点丨从 TiDB 上线阿里云的背后，如何看待云数据库的变革趋势","tags":["TiDB"],"category":{"name":"观点洞察"},"summary":"本文转载自公众号“全球云观察”。作者从 TiDB 上线阿里云这一事件，分析了云和数据库领域的三个重要趋势变化。","body":"> 本文转载自公众号“全球云观察”，作者 Aming\n\n上周，\n\n公有云圈子又热闹起来，\n\n阿里云、华为云\n\n先后举办了年度重要峰会，\n\n许久没有大事发生的云圈，\n\n又平添了一些谈资。\n\n而在这中间，\n\n有一件事\n\n引起了全球云观察的关注。\n\n**TiDB 上线阿里云**\n\n6 月 15 日，PingCAP 宣布与阿里云达成合作，集双方技术优势而打造的云数据库 TiDB 上线阿里云云市场心选商城。这次合作也使得 TiDB 成为目前屈指可数的全球横跨 AWS、谷歌云、阿里云三朵云的数据库。\n\n其实 to B 圈里的合作时常发生，很多人并不会给予过多关注。但从多年对云计算领域的观察分析，全球云观察认为这看似一个很普通的事件，背后却蕴含着云和数据库领域的三个重要趋势变化。 \n\n\n## 01 全球云数据库发展渐成大势所趋，开源数据库与云服务的联姻正在加速拓展\n\n毋庸置疑，这是大势所趋，云数据库发展不可阻挡。2023 年全球四分之三的数据库都将跑在云上，这是来自全球专业分析机构 Gartner 的预测分析。\n\n云数据库为千行百业的用户带来了更便捷快速的应用落地，更关键的在于云数据库为用户实现云原生、微服务化、智能运维等数据快速流动的需求带来了很好的支撑，需求所在即是发展所在，从而也加速了云数据库整体市场的壮大。\n\n![云数据库.jpeg](https://img1.www.pingcap.com/prod/_b66f80d4af.jpeg)\n\n在 AWS、谷歌、微软、阿里云等云厂商也进入 Gartner 数据库魔力象限的领导者象限之时，就已经标志着云数据库成为全球数据库行业的发展大潮了。况且，正处于新数据时代下的企业用户，不仅数据量持续爆发增长，而且数据结构也呈现出多元化、复杂化，云数据库带来更快速的技术迭代，更贴合用户业务快速变化的需求支撑，自然可以彰显出新数据时代的魅力，助力用户数字化，使得数据的巨大潜力不断释放。\n\n在云数据库不断发展的同时，开源数据库的发展也正在面临新的发展机遇。MongoDB CTO Mark Porter 公开认为，当前开源厂商和云厂商之间的关系发生了重大变化，正在从亦敌亦友的关系转为朋友关系。\n\n一切服务上云成为加速企业数字化的主要驱动力之一，开源数据库厂商与公有云厂商之间的合作必然也将得以加强。全球云观察分析认为，开源与云之间正在形成“你中有我、我中有你”的互补共赢关系。开源有着开放的全球生态，技术创新与产品迭代速度快，非常有利于让产品保持技术领先。公有云的蓬勃发展加速了开源软件商业化变现的进程，通过对基础设施和软件的云化创新，实现了开源数据库在云上的标准化交付，降低了用户对开源软件使用的门槛，也加快了开源数据库的规模化应用。\n\n特别是在新一代云基础设施面向云原生、多云、跨云等领域开创性发展之时，一个更利于开源创新技术组合使用、部署运行的云底座已经形成，云基础设施可以更好地促成用户的业务实现云交付。由此而言，云与开源技术体系的互补性将变得更强了。\n\nDatabricks、MongoDB、PingCAP 等开源数据技术厂商纷纷通过与公有云的合作，将开源技术融合进云服务产品，加速了开源厂商的商业化，满足了企业用户新数据时代的数据处理需求。TiDB 也成为其中的受益者，PingCAP 发布了 TiDB Cloud，这是一种全托管的数据库即服务（DBaaS）产品，为企业用户提供开箱即用的 TiDB 服务。随后 TiDB 还陆续上线了亚马逊云科技与谷歌云的 Marketplace，以及这次上线阿里云云市场心选商城。\n\n开源数据库上云为企业用户带来了不一样的价值。公有云的弹性资源支撑，可以满足遍布全球各地的企业用户云基础设施灵活部署。并且无需预付款或签约，根据企业用户自身的使用量按需付费购买即可。比如这次上线阿里云的云数据库 TiDB 就省去了企业用户对数据库部署、运维和性能调优的复杂工作，通过在公有云服务界面上点击几下，就可以快速创建和管理 TiDB 实例。以前从采购服务器到部署、调试，需要几个月时间，现在在云上只需一天即可搞定一切。同时，经过优化的配置版本，还可以帮助用户将部署 TiDB 的起始成本降低一个量级。\n\n这不仅可以帮助企业用户降低总体拥有成本，也降低了对开源数据库应用的技术门槛，带来更便捷的云端体验。同时，企业用户还可以享受到来自开源厂商的原厂服务。开源数据库提供原厂工程师的专家级服务，公有云的专业服务和成熟体系也将帮助开源数据库触达更多有 DBaaS 需求的企业用户，助力用户数字化成功。\n\n开源也增强了开放性，与之前云厂商直接基于开源自研的模式有很大不同，开源数据库厂商更开放的多云支持，破除了被某一个公有云厂商锁定的麻烦。\n\n此外，整个云数据库的市场规模也在不断扩大。Gartner 数据显示，2021 年，托管云服务（DBaaS）的收入增至 392 亿美元，占整体数据库管理系统(DBMS)收入 800 亿美元的 49% 以上，增长十分惊人。随着开源数据库厂商与公有云进入更广泛的合作阶段，云数据库整体市场还有很大潜力可挖，这一点是值得关注的。\n\n\n## 02 IaaS 增长放缓，云计算的增长重心向多云环境的 PaaS 和 SaaS 层移动，第三方生态成为云厂商竞争的胜负手\n\n现阶段，中国的公有云厂商 IaaS 增长明显放缓。企业该上云的基本都已经上了，上云必然会进入到一个新阶段。云计算的增长重心向多云环境的 PaaS 和  SaaS 层移动，公有云厂商不得不将下一步的发展目标聚焦在了 PaaS 和 SaaS 领域，通过更高价值的 PaaS 层和 SaaS 层拉动整体用云量的增长和云底层的消耗，而在这种形态下，以 Marketplace 为代表的第三方生态繁荣度成为云厂商新一代竞争的胜负手，可以说，谁赢了第三方生态的主导权，谁有赢得了云的未来，数据技术生态，无疑是这里面最重要的生态。\n\n![公有云示例.jpeg](https://img1.www.pingcap.com/prod/_fcc05c3c59.jpeg)\n\n来自 Gartner 对全球云计算整体支出包括了 IaaS、PaaS 和 SaaS 的数据分析显示，IaaS 支出占比接近3成，PaaS 和 SaaS 总共支出占比超过 7 成。然而这组数据在中国市场表现却完全不同，IaaS 支出占比约为 7 成，PaaS 和 SaaS 总共支出占比约为 3 成。  \n\n云厂商也纷纷推出各自的云市场，方便企业用户可以在云市场中快捷选择第三方应用，当然云厂商更看重第三方应用进一步带来企业用户的用云量增长。这个时候，云厂商与技术创新企业之间的友谊得到进一步增强。  \n\n如果是朋友，当然就得互相帮衬，互相弥补自身的不足。云厂商的角色定位好比房产商与物管公司，构建完善的房屋基础设施与保障房屋的日常安全，数字化企业好比房屋的住户，想要住进房子里，还需要生活所需的家具、厨卫用品等个性化物品，房产商只负责交付房屋，物管公司只负责房屋日常维护与安全，这些个性化的生活家具等用户自然还需要像 Confluent、Datadog、Snowflake、MongoDB、PingCAP、Salesforce 等技术创新企业来提供。  \n\n但是，国内与国外的情况有一些区别，国外 AWS、谷歌云相对更为开放，比较早就建立了云市场，吸引开源数据库等第三方应用入驻。  \n\n国内云厂商不仅自己发展 PaaS，而且持续投入发展自研数据库，如阿里云的 PolarDB、腾讯云的 TDSQL。这次 TiDB 上线阿里云心选商城，意味着以阿里云为代表的国内公有云厂商在激发应用生态方面将变得更为开放，开源厂商和云厂商之间将逐渐形成更为良好的竞合关系。合则开放多赢，开源数据库厂商和公有云厂商都可以从中获益；竞则封闭少赢，不仅如此，用户在云数据库应用领域的选择就十分受限。开放合作也是大势所趋，最终还是用户需求的选择，驱动了当前开源数据库厂商与公有云厂商不断深入合作。\n\n## 03 云上 HTAP 再升级，一栈式数据平台成为云数据库 2.0 的关键特征\n\n随着企业对实时数据分析、实时反馈、实时在线等需求进一步加大，HTAP 数据库开始受到企业更多关注。而结合了云端服务便捷性的新一代HTAP数据库，提供了一种简化而强大的数据库能力，备受企业用户所青睐，秒级实时交易和查询体验让更多的企业用户无法拒绝。这是真的么？\n\n全球云观察分析认为，要满足当前用户更为复杂的应用需求，特别是电商、游戏、数字媒体、金融科技、网络安全等互联网和数字化业务的发展，对于新鲜数据的实时分析能力要求更高，对于低延迟的要求更为苛刻，实时营销、实时风控等业务诉求变得更加普遍，必然催生了第二代云数据库的发展，进军HTAP进而成为云数据库发展的最新趋势。\n\n![全球化示意.png](https://img1.www.pingcap.com/prod/_ed2eca6b3e.png)\n\n值得一提的是，之前主打 HTAP 能力的 TiDB 已经帮助全球超过 2000 家的开源用户和企业用户，通过私有部署的方式享受到了 HTAP 数据库的便利性。这其中还有 40% 的用户已经在阿里云上自己部署了 TiDB。可见，企业用户对于新一代 HTAP 数据库的应用业已成为刚需。现在 TiDB 上线阿里云也让阿里云用户多了一项使用云原生分布式 HTAP 数据库的选择。HTAP 与云的结合不仅让开源数据库与公有云厂商形成广为广泛的合作，而且将进一步加速云数据库的演进。不得不说，云数据库 2.0 时代真的来了。 \n\n上个月，谷歌云正式对外发布了数据库 AlloyDB，这是基于谷歌云的全托管的云数据库服务，采用独特的技术方法，使系统设计能够集成隔离的 OLTP、OLAP 和 HTAP 工作负载，这使得 AlloyDB 在事务性工作负载和分析查询上比标准 PostgreSQL 快 4 倍和 100 倍左右。无独有偶，在最近的 Snowflake 峰会上，Snowflake 宣布发布最新的 UniStore 产品，正式进军 HTAP 市场。UniStore 是一款行存存储引擎，这使得 Snowflake 可以支持 OLTP 事务性处理，结合原来的 OLAP ， Snowflake 从云原生数仓服务转身变为了 HTAP 服务。这一系列事件，自然也进一步引发了业界对于第二代云数据库的关注和讨论。\n\n其实，HTAP 并不是一个很新的概念。之前，对于新一代 HTAP 的发展，全球三大分析机构纷纷给出了专业的关注，Gartner 定义为 Augmented Analytics、IDC称为ATP ( Analytic Transaction Processing),，Forrester 称为 Translytical Data Platform。\n\n谷歌云 AlloyDB、 Snowflake 、TiDB 等新一代 HTAP 数据库玩家阵营的形成，这充分说明了进军 HTAP 赛道是大势所趋，再联想到在此之前，亚马逊，微软，MySQL Heatwave 都推出了不同程度的云端 HTAP 产品，这一趋势到了 2022 年中已经是所有主要云数据库玩家最重要的下注点，市场也将变得越来越火热，云上 HTAP 这个潮流，已经成为数据库领域最重要的潮流。\n\n因此，对于云数据库领域非常感兴趣的朋友来说，新一代 HTAP 架构的共性追求值得一看。以开源打底，借助了云端扩展性，追求一个入口，一套数据栈，可以将 OLTP 数据和 OLAP 数据实时同步。OLAP 的实现采用了类似 MPP 下推方式，达到 No Application Change、 No Schema Change、No ETL，最大化减少对应用程序的改动。最终，让 MySQL 和 PostgreSQL 的用户基于原有的使用习惯，既可以获得超大规模的交易处理能力，又可以获得针对新鲜数据的实时查询能力。\n\n让所有 MySQL 和 PostgreSQL 的海量用户不更改习惯，在云端享受 HTAP 一栈式的实时事务和实时分析数据服务。迎接云数据库 2.0 时代，我们何乐而不为呢？","date":"2022-06-22","author":"Aming","fillInMethod":"writeDirectly","customUrl":"how-to-view-the-trend-of-cloud-database-revolution","file":null,"relatedBlogs":[]},{"id":"Blogs_388","title":"金融业分布式数据库选型及 HTAP 场景实践","tags":["分布式数据库","HTAP","TiDB"],"category":{"name":"观点洞察"},"summary":"本文转载自公众号：韩锋频道（hanfeng_channel）。文章从金融用户角度入手，对如何选择分布式数据库及选型后的最优实践进行了阐述。","body":"> 本文转载自公众号：韩锋频道（hanfeng_channel）  \n> **作者简介**：韩锋，CCIA（中国计算机协会）常务理事，有着丰富的一线数据库架构、软件研发、产品设计、团队管理经验；曾担任多家公司首席 DBA、数据库架构师等职，在云、电商、金融、互联网等行业均有涉猎；精通多种关系型数据库，对 NoSQL 及大数据相关技术也有涉足，实践经验丰富；曾著有数据库相关著作《SQL优化最佳实践》、《数据库高效优化》。\n\n作为数据基础设施的重要组成部分，数据库在其中扮演着重要的角色。近些年来，数据库整体发展也呈现出较之以往很大的不同。 \n  \n其一是开源数据库受到更为广泛的关注，从多家机构的最新报告来看，开源数据库无论从产品数量还是受关注程度都超过商业数据库。开源这一新模式，正成为未来数据库发展的主流。  \n\n其二是云计算成为未来主要资源供给方式得到普遍共识。已经有越来越多的企业选择在云上构建基础环境，包括云上数据库的发展速度也远高于非云环境。据乐观估计，在未来 5~10 年云数据库将占据整体数据库市场的七成以上。此外，对迁移到公有云、使用多云环境等问题，也普遍被企业所接受。  \n\n其三是数据融合趋势，针对数据多场景应用，使用融合技术简化访问，提升效率。作为数据使用高地，金融行业一方面对数据库有着极高的要求，一方面又面临很多来自数据新的挑战，诸如海量规模、高并发、数据安全、实时分析等诉求亟待解决。分布式数据库的出现，迎合这一发展趋势，对于金融企业解决上述问题带来新的解决思路。  \n\n本文从金融用户角度入手，对如何选择分布式数据库及选型后的最优实践进行阐述。\n\n ## 金融业数据库选型背景\n\n随着企业数字化转型深入，对于数据使用场景也呈现多元化趋势，正有越来越多数据被企业利用起来。金融行业作为数据库应用“高地”，这一趋势表现更为明显。同时我们也看到，近些年来数据库领域也发展迅速，有分布式数据库、多模数据库、云数据库为代表的产品不断涌现。这些新兴数据库在特定场景有很好的使用前景。基于上面两种趋势，金融行业很多企业都在面临选择数据库的问题。\n\n### 选型技术层面要素分析\n\n从技术角度来看，在数据库选型中有哪些要素需要考虑呢？下面以近期比较关注的分布式数据库的选型为例，说明下重点考量的技术要素。\n\n**分布式事务**\n\n分布式架构，自然会带来分布式事务的问题。由于需要跨节点的网络交互，因此较单机事务会有很多损耗。随之带来的是事务处理时间较长、事务期间的锁持有时间也会增加，数据库的并发性和扩展性也会受到影响。针对单笔事务来说，分布式事务执行效率是肯定会有降低的，分布式带来的更多是整体处理能力的提升。\n\n**性能**\n\n由于分布式数据库通常使用的二阶段提交和各节点之间的网络交互会有性能损耗，分布式数据库优势不是单个简单 SQL 的性能，而是大数据量的 SQL 查询，每个节点会将过滤之后的数据集进行返回，会提升性能，并且分布式数据库的优势是并发，大量的 SQL 并发也会比单机数据库强大，应用需要做分布式架构的适配，将串行执行机制尽量都改造成并发处理。对于含有需要节点间数据流动的 SQL 语句的事务，OLTP 类的分布式数据库处理效率一般较差，事务处理时间会较长，事务期间的锁持有时间也会增加，数据库的并发性和扩展性也会受到影响。建议尽量改造存在跨节点数据流动的 SQL 语句（主要是多表关联）的事务。\n\n**数据备份**\n\n分布式数据库的一致性保证通过内部时钟机制所提供的全局时间戳，所有节点都会遵循该机制，所以备份恢复的增量也是基于全局时间戳，但是分布式数据库的备份解决方案最重要的标志为是否支持物理级的备份，物理级的备份会比逻辑的备份性能吞吐大很多，还有就是是否支持一些分布式备份方案，比如 S3 协议接口，是否支持压缩等功能。分布式数据库基本都具备备份和恢复方案，通常从备节点进行连续备份（全量+日志），恢复的时候指定节点进行恢复到指定时间点，整个过程可配置自动任务、自动执行。\n\n**高可用**\n\n分布式数据库大多都是基于多数派协议，同城双中心不适合多数派的要求，同城数据级多活建议采用三中心部署。如果同城主备可以采用集群级的异步复制，异地建议采用集群级的 binlog 异步复制，建议实例的主备节点设置在同城两个双活数据中心，仲裁节点三机房部署；异地灾备单独启实例与本地实例进行数据库间同步，也可以将本地备份文件 T+1 恢复到异地灾备。\n\n**数据一致性**\n\n分布式数据库大多都是通过获取全局时钟时间戳，采用二阶段提交，可以实现一致性的保证，分库分表架构对于事务的一致性，需要应用层考虑，比如通过合理的分区键设计来规避。部分分布式数据库对于跨节点事务目前还是实现的最终一致，对于全局一致性读，一般通过引入类似全局时间戳的组件统一管理全局事务，在数据库选型时可以重点关注厂商对这一块的实现。如果目前暂时无法提供全局一致性读的分布式数据库，对于要依赖分布式事务“中间状态”的业务，优先进行业务改造进行规避，其次通过合理的数据分片设计让其在单节点内完成。\n\n**数据分析**\n\n分布式数据库，多采用存算分离架构。针对数据分析场景，需要对数据从下层存储节点上移到计算节点，这对分布式数据库提出了更高的要求。一方面可通过算子下推等技术，减少需传输到计算节点的数量；一方面针对汇聚后的结果需要通过流式处理等方式，规避诸如 OOM 的问题；此外也可采用如 MPP 等并行处理技术，加速数据分析过程。\n\n### 选型过程问题痛点分析\n\n在选型过程中，会遇到来自以下几方面的痛点。  \n\n- 由于分布式数据库整体架构还比较新，也是近十年来逐步发展完善的。针对新型架构的诸多特点，包括厂商和用户还都在不断摸索积累之中，还需要有个长期实践的过程。此外，新架构也需要有个逐步成熟完善的过程。\n- 大量产品来自国内数据库厂商，其发展周期相对较短，还需要在产品成熟度、稳定性、周边生态等方面不断完善。对于用户来说，一方面需面临产品多、技术栈多的现状；另一方面还需面对成熟度不足等问题，存在较多痛点。\n- 近些年金融行业发展迅速，各种新的业态产品不断涌现，这些对作为底层数据基础的数据库也提出了更高的要求。\n\n## 数据库选型技术架构\n\n### 分布式路线分析\n\n针对分布式数据库的发展路线，大体可分为两种：\n\n**分布式中间件**\n\n这种架构是从中间件路线演进而来。其采用存储与计算分离架构，底层采用标准单机数据库，副本间基于数据库主从复制机制。上层承担计算，并可将部分计算下推到存储节点执行。这种架构在分布式事务、全局 MVCC 等方面，往往存在一定难点，各厂商也有各自解决之道。\n\n**原生分布式**\n\n这种架构正是受到 Google 论文影响演进而来。其采用存储与计算分离架构，底层采用单机库(不一定是关系型)，副本间采用分布式一致性协议完成复制，支持多数派提交。上层承担计算，并可将部分计算下推到存储节点执行。\n\n### 重点需求满足情况\n\n针对上述遇到的痛点，两类产品实现逻辑也所有不同：\n\n![001.png](https://img1.www.pingcap.com/prod/001_ce42a10ada.png)\n\n\n### 路线场景分析\n\n从数据使用场景来讲，可大致按下面进行划分：\n\n![002.png](https://img1.www.pingcap.com/prod/002_1f9a938e7e.png)\n\n针对不同的场景，不同分布式数据库路线产品各有所长。\n- 针对事务类场景下，强调高并发联机交易、对分析能力要求不高的场景比较适合分布式中间件路线产品。\n- 针对事务类及事务/分析混合类场景，既要满足常规联机交易场景的同时，还需满足分析类的一部分能力，这种情况比较适合原生分布式产品。基于原生分布式的 HTAP 数据库，用一个数据平台应对规模化交易和实时分析，提升业务决策的时效性，降低数据技术栈的复杂性，越来越多的混合负载需求推动了 HTAP 在金融场景的落地。\n\n## 金融业 HTAP 应用场景实践\n\n### 金融场景下 HTAP 的分析\n\n在金融企业数字化转型的过程中，各类业务对“海量、实时、在线”的数据需求变得愈发迫切。在金融企业运营场景中，实时推荐、精准营销是企业提升竞争力的一大因素。在企业风险控制场景中，实时风控、反欺诈等业务开展可以更早地识别和阻断风险可以让企业减少损失，HTAP 正是基于上述背景诞生出的需求，为各类实时数据处理需求提供了解决方案。\n\n### 某金融用户 HTAP 的架构设计和实践\n\n随着金融市场同业业务的蓬勃发展，业务部门对于交易数据的实时统计分析和展现有了急切的需求。基于大数据技术栈的 T+1 报表模式，已无法满足业务部门通过实时分析交易发生情况来防范风险以及提供决策的需求，迫切的需要找到一种能让数据实时变现的解决方案。结合金融行业特点，在技术选型过程中，重点考察待选产品如下能力：包括承载业务复杂查询处理、海量数据容量存储、应用透明无侵入、开发协议可适配及混合负载下的表现等。经过测试，选择 TiDB 作为基础数据库平台。基于其 HTAP 的特性，打造金融市场实时数据平台，目前已投产了灵活报表和交易对手分析等应用场景。整个处理流程包括：  \n\n- Flink 消费交易系统产生的实时增量数据，对部分事实表进行拉宽处理并写入 TiDB\n- 维表和其他明细表直接写入 TiDB\n- BI 工具直接连接 TiDB，提供秒级的实时计算和分析能力\n\n![003.jpg](https://img1.www.pingcap.com/prod/003_a89e399f30.jpg)\n\n这一案例中，构建千万及以上数据规模、超过五张表的复杂关联实时查询能力，让业务人员在极短的时间内（大部分报表执行时间为几十到几百毫秒、个别报表秒级别）获得实时交易的详情。\n\n### 未来 HTAP 的场景发展\n\n实时数据处理技术还以某些具体的应用场景为主，从现状来看以事件驱动类、流式管道数据计算类为代表的场景，已经开始使用 HTAP 场景的。未来随着 HTAP 计算能力进一步的提升，实时全量数据的计算将带来更多场景。\n\n## 面向未来的架构趋势\n\n### 云原生\n\n从未来的发展趋势来看，云方向是一个大的趋势。\n\n![004.png](https://img1.www.pingcap.com/prod/004_be9d5cac08.png)\n\n从上图可见，云数据库的发展经历了几个阶段，从云托管、云服务、云原生之路。  \n\n- **云托管**，是最接近传统数据库系统的部署模式。本质是将原本部署于 IDC 机房内物理服务器上的传统数据库软件部署在了云主机上。这种模式下，云平台提供诸如高可用、异地灾备、备份恢复、数据安全、SQL 审计、性能优化和状态监测等企业级数据库管理能力，用户可减少运维投入即可享受之前同等的服务水平。\n- **云服务**，之前的托管架构中，受限于传统数据库架构的局限，未能完全发挥云计算的优势。在诸如弹性扩展、高性能、高可用等方面，均有不足。到了云服务时代，充分利用云基础设施的底层能力，提供定制化的数据库产品。\n- **云原生**，与之前的云服务架构不同，这一阶段产品将更为充分地利用云基础设施的能力，通过多层资源解耦，可享受云带来的弹性扩展、按需供给、超大规模能力。真正做到了数据库与云的深度结合。从长期来看，金融机构逐渐把业务和技术向云原生演进，实现传统应用迁移上云和云原生改造是重要的方向。在这个过程中需要考虑分布式数据库对 K8s、微服务应用的支持，提供高效、弹性调度能力，同时需要兼顾开发运维和敏捷度。\n\n### 多云方向\n\n云作为未来主流的资源供给方式，多云必然是企业不得不考虑的问题。多云通常指金融机构同时采用多种不同的云环境组合来满足业务需求的多样性和金融业监管的要求。如何围绕数据打造面向未来的多云 IT 架构，满足在多云之间提供数据服务能力，摆脱单一供应商的弊端，是必须考虑的问题。多云架构对分布式数据库的考察重点聚焦于跨地域、跨公有私有云、跨本地 IDC 和 K8S 的部署、服务提供与统一运维能力等。","date":"2022-05-19","author":"韩锋","fillInMethod":"writeDirectly","customUrl":"distributed-database-selection-and-htap-practice-in-financial-industry","file":null,"relatedBlogs":[]},{"id":"Blogs_363","title":"观点丨新经济 DTC 转型，一个简单而强大的数据平台至关重要","tags":["新经济 DTC 转型"],"category":{"name":"观点洞察"},"summary":"新经济 DTC 转型过程中，大多数企业无法参考大型互联网公司的复杂架构，也没有规模化的技术和运维团队来支撑业务变化，采用一个简单、强大、一栈式的数据服务平台应对 DTC 的挑战是越来越多新经济企业的选择。","body":"> 媒体观点，作者“大数网”\n\n疫情持续已经两年了，改变的有很多。这一点相信每个人都有深刻的体会，其中最直接的一点就是，人们出门少了，吃穿用度很多都转线上了。\n\n由此带来的是，身边的很多店铺因为转变慢，还没来得及去一次就关张了，不信你看看身边这两年有多少店铺都没了。与此同时，我们不难发现很多生存下来的门店经营模式和过去有了很大的分别，即从线下业务场景向全渠道、全场景转型。\n\n**由此也对 IT 架构、对数据处理提出了新的要求，一场轰轰烈烈的技术变革正在快速酝酿、发酵**。\n\n## 没有技术进步就没有业务变革\n\n从线下到全渠道、全场景，看似只是服务模式的一种转变，比如餐饮企业把堂食变为堂食+外卖，但实际上，这是由内而外、由上至下的一次商业重构。\n\n之所以这么说，是因为**线下和线上，商家与消费者的连接、沟通、服务、营销、会员管理等都是完全不同的**。举个例子，线下面对面商家很容易对消费者进行一个直观的判断，线上完成这一过程则需要依赖大量的数据分析。\n\n由此不难理解为什么数字经济、IT 技术这两年如此火爆，说简单点，业务转型需要技术的支撑。**PingCAP 刘松对此深有感触，他在接受采访时就表示，疫情这两年，找 PingCAP 咨询业务转型、数据管理的客户较之前有非常大的增长，包括吃穿用度在内的新经济行业尤为突出**。\n\n以国内某连锁餐饮领头企业为例，旗下拥有众多品牌，名副其实餐饮巨无霸。同时，这家企业也是对数字化嗅觉最敏感、在国内最早提供手机点餐及数字支付选择的连锁餐厅之一，建立了超级 APP 等自有应用程序。\n\n疫情这只黑天鹅，可以说充分验证了该企业先人一步数字化的价值。相关数据显示，2019 年，数字订单占该企业餐厅收入约一半以上，截至 2019 年末，公司旗下的超级 APP 是中国餐饮业下载次数最多的应用程序，并在同行内拥有最高的月活跃用户数目。\n\n强大的数字化及配送能力使该企业在疫情期间展现出相对强大的风险抵御能力，为企业提供了较强的业绩支撑。无独有偶，另一家世界 500 强餐饮巨头（下称“餐饮巨头”）在疫情这两年也依托数字化，实现了会员数量、线上订单量猛增，截至当前，其已拥有近 2 亿会员，每天处理的订单量超千万。\n\n**再举一个例子，商超和餐饮同样的特质是会员多、订单多，不同的是商超还品类多，供应商多**。以多点 Dmall 为例，它是一家为商超提供一站式全渠道数字零售解决方案的服务商，截至 2021 年 6 月，多点 Dmall 已与 120 多家连锁商超和便利店达成合作，覆盖四个国家和地区 15000 家门店，多点 APP 注册用户过亿。一面是客户、一面是供应链，多点 Dmall 这背后的数据量毫无疑问是惊人的。\n\n以上案例不是个案，在新经济领域，大量类似的企业都面临同样的问题。从中也不难看出，业务增长与 IT 技术已是强相关，没有技术进步难谈业务变革。\n\n## 新经济 DTC 转型，核心症结在哪？\n\n线下到线上线下一体化的业务变革，技术瓶颈究竟在哪里？其实就是数据处理。\n\n众所周知，新经济时代，DTC（Direct To Customer，直面消费者）模式已经成为重要的发展趋势。如何理解 DTC？打开现在的直播平台，很多都是厂家自己在推广，而过去一定是中间商。厂家直面消费者，这就是 DTC。\n\n**DTC 意味着厂商从后台走向了前台，而实现这一身份的转变，必须拥有一套能够有力支撑前台工作的技术架构**。这里的技术架构可不止是用来支撑直播的，因为 DTC 看似只是厂商开了个直播间，面向客户直接卖货，但实际上这涉及到订单、库存、客服、物流、财会等一系列问题。\n\n从业务到企业管理全流程变化，这其中就涉及几个核心指标，比如：海量消费者直接下订单，得有足够的数据并发处理能力；业务有峰值峰谷、发展的好需要迅速开新店、效益不好要果断关店，数据平台要满足快速伸缩的需求；毕竟不是专业 IT 厂商，技术架构要足够简单……事实上，这几点也是上文所提餐饮巨头转型时面临的最大困境。\n\n该餐饮巨头可以说是最早一批拥抱云计算的。近些年，其先是用公有云承载全部业务系统，数据库采用公有云提供的分布式数据库，利用分库分表的方式来解决海量数据高速增长的问题，部分查询需要在业务代码逻辑里做聚合，这样做不仅开发复杂度高，而且无法适应业务快速迭代的要求。\n\n如果使用传统数据库意味着读写分离、分库分表、分布式事务需要依靠应用层实现，在开发效率上大打折扣；如果每个业务应用使用独立的数据库，则将会带来数据极度碎片化，在业务服务之间无法共享，运维成本极其高昂等一系列挑战。\n\n**性能、易用性、伸缩性，数据平台如何兼得？应该说，这是新经济转向的核心症结，解决了这个问题，一切都会变得简单。该餐饮巨头是如何解决这一问题的呢？答案是 TiDB**。\n\n## TiDB，从容应对 DTC 时代\n\n简单介绍一下 TiDB，一款定位在线事务处理/在线分析处理的融合型数据库产品，**特点：一键水平伸缩，强一致性的多副本数据安全，分布式事务，实时 OLAP，兼容 MySQL 协议和生态，迁移便捷，运维成本极低**。\n\n在上述餐饮巨头，其通过在私有云数据中心部署 TiDB 分布式数据库，构建起一套可靠、灵活可扩展的数据服务平台，包括订单中心、积分中心、卡券中心和用户中心四大业务模块都是依托 TiDB 来提供稳定的多维数据服务。\n\n今年 6 月，该企业更是将全渠道的流量切到 TiDB 分布式数据库，为近 2 亿会员的订单、支付、积分、会员管理等场景提供数据全生命周期管理。目前，该企业的 TiDB 数据库日均 TPS 超 3000，高峰时期 TPS 超一万，日均交易量接近千万级别，总数据量规模近 10 TB。\n\n用该餐饮巨头相关负责人的话说，通过引入 TiDB，借助无感知的水平扩展能力，**促销活动前进行快速的扩容，促销活动中短时高峰实现应急在线扩容，促销活动完成后，可按需进行缩容，他们的业务变得更轻量、敏捷**；依托出色的 HTAP 能力，一套系统、一个入口、一种体验同时支持 **OLTP 和 OLAP 两种负载**，运营效率更高；TiDB 支持标准 SQL，**高度兼容 MySQL 协议**，开发人员无需学习特殊开发方法，可直接使用原有业务应用的开发框架，学习成本低，总体拥有成本更低；TiDB 能够很好地支持**业界主流的容器及 Kubernetes 云原生基础设施**，支持私有云、公有云和混合云跨云平台部署。\n\n事实上，TiDB 除了能带来以上优势外，还有一点至关重要，那就是**突出的实时分析能力**。这一点在使用多点 Dmall 业财一体化系统的商超体现的淋漓尽致，商超负责人当天甚至小时级就能了解到门店的经营情况，而过去，当月的经营情况只有下个月才能知晓。对于商超这样类目非常大的经营体，早知道和晚知道对于及时补货，总结、改善经营状况是有非常大区别的。\n\n所有这一切要得益于 TiDB 全新理念的设计。市面上的分布式数据库大致分两类：一类是 MySQL 单机版 + 分布式设计；一类如 TiDB，采用的是 NewSQL 架构，真正的原生分布式数据库。\n\n前者相当于给 MySQL 打补丁，来适应新的业务需求，后者则是根据时代需求全新设计的架构，区别立现。打补丁肯定能解决一定程度的问题，但是有上限，TiDB 在 PoC 过程中也曾遇到和传统大厂产品的对比测试，比如某国际大厂的数据库数据量峰值是 30 TB，再往上就无法满足了，TiDB 不仅还能继续提升，而且性能也好于大厂。\n\n## TiDB，成为新经济的数据底座\n\n在资本推动下，新经济行业的许多实体业态，比如餐饮、新零售、高科技制造、商超等行业较前些年有了非常大的变化，过去在全国开几百上千家店，可能需要十数年的发展、累积；如今，这一过程可能只需要一两年。加盟连锁经营方式正在从小众变为主流。换句话说，上文所提餐饮巨头未来只会越来越多，对海量数据处理的需求会越来越旺盛，这个市场会越来越大。\n\n这就是 PingCAP 的底气所在：**只要达到一定数据量，新经济企业就一定会需要一款简单而强大的数据库，这时候 TiDB 往往就会成为首选**。很多过去使用 MySQL 的新经济企业，在业务增长、数据量暴增的时候，可以轻松迁移到 TiDB。TiDB 可以支撑海量在线的业务交易，也可以提供一体化实时的分析能力，为企业中的决策者和每位员工提供一个访问数据的“任意门”，实时地获取个性化的数据服务。企业用户可以通过一套 TiDB 构建各类数字场景应用，而不必关注底层架构。\n\n这也是 TiDB 在新经济行业的定位，即服务行业中的头部企业，成为它们的数据底座。\n\n事实上，**截至当前，TiDB 已经服务包括小红书、多点、龙湖集团、携程等在内众多新经济行业的头部客户，反响良好**。\n\n新经济行业正在迎来新一轮变革，商业模式变革叠加疫情等不确定因素，将彻底改变相关企业的经营形态，技术的重要性变得前所未见。经过互联网行业大规模实践验证的 TiDB 已经给出了新经济技术转型的新范式，相信未来会有更多企业从中受益，实现对新时代的拥抱。\n\n> 延展阅读：  \n[“新经济 DTC 转型背后的数据库”专题 ](https://pingcap.com/zh/events/database-behind-new-economy-digital-transformation/?utm_source=blog&utm_medium=banner&utm_campaign=new-economy-dtc)   \n点击查看更多[新经济 DTC 转型案例实践](https://pingcap.com/zh/blog?tag=%E6%96%B0%E7%BB%8F%E6%B5%8E%20DTC%20%E8%BD%AC%E5%9E%8B)","date":"2022-03-15","author":"大数网","fillInMethod":"writeDirectly","customUrl":"new-economy-dtc-transformation","file":null,"relatedBlogs":[]},{"id":"Blogs_357","title":"我眼中的 TiDB 5.x：关于基础软件产品价值的思考方式","tags":["基础软件","TiDB","云原生"],"category":{"name":"观点洞察"},"summary":"TiDB 让我们第一次得以「设计者」的视角参与其中：每一个功能特性的设置背后的思考，对基础软件产品的价值呈现，体验还是很不一样的。","body":"好久没写东西了, 正好趁着春节的节后综合症发作写写文章热身一下，记得前几年偶尔会写一些关于 TiDB 产品功能解读的文章，TiDB 5.0 发了那么长时间了，也应该写一写了。我其实在多个场合里表达过我对于 5.0 的重视，这个版本可能是对于 TiDB 来说的 MySQL 5.x，熟悉 MySQL 生态的朋友肯定知道我在说什么，MySQL 5.x，尤其是 5.5~5.7 这几个重要的版本基本上为 MySQL 的快速扩张奠定了坚实的基础，也培养了一大批 MySQL 的用户和人才。我认为 TiDB 5.x 尤其在 5.2 之后，也看到了进入快车道的趋势，开始展现出生态统治力。  \n\n对我而言，TiDB 是一个绝佳的样本，**在此之前，中国本土很少有这样从零到一做出来的开源基础软件产品，多数工程师和产品经理都是这些软件的「使用者」，更多的是构建业务系统，而 TiDB 让我们第一次得以「设计者」的视角参与其中** ：每一个功能特性的设置背后的思考，对基础软件产品的价值呈现，体验还是很不一样的，借着这篇文章写点感受，另外的这个文章是春节前我在 PingCAP 内部给 Presales 和 PM 培训上的分享整理而成，不一定正确，仅供参考。\n\n\n\n## 我们做的事情，对于用户意味着什么？\n\n要讲好基础软件的产品价值，首先要克服的第一个关卡：**学会换位思考** 。其实 TiDB 每个版本都带着数十个的特性和修复，但是多数时候我们的 Release note 只是忠实的反映了「我们做了什么」：\n![1.jpg](https://img1.www.pingcap.com/prod/1_2a7417643a.jpg)\n\n\n<center>TiDB 4.0 GA 的 Release Note 截图</center>\n\n各位这里请不要理解错我的意思，这种类型的记录是很有必要存在的，但是仅有这个是远远不够的。例如在 TiDB 5.0~5.5 的版本里面，我们引入了 n 多的新特性：聚簇索引，异步提交事务模型，优化了 SQL 优化器，支持了 CTE，引入了锁视图和持续性能诊断工具，改进了热点调度器，降低了获取 TSO 的延迟，引入 Placement Rules SQL…这些名字在 TiDB 的开发者看来是没问题的，但是请注意，更重要的问题是：**这些对于用户（客户）意味着什么？**\n\n要回答这个问题的思路有两种，我分别讲讲：\n\n1.通过一个假想的目标场景，然后通过产品去满足这个场景来展现价值。  \n\n2.解决现有的方案（包括自己的老版本）那些最恼人的问题来展现价值。\n\n对于第一种思路，通常适用于比较新的特性，尤其是一些过去从来没有的新鲜东西。用一个比较好理解的例子：假如大家都在开马车的时候，你发明了一个汽车，这时候如果你以汽车解决了马儿要吃草的问题作为价值点显然是比较荒谬的，更合理的是描绘高速通勤的场景带来的便利性作为卖点。这种思路有两个关键点：  \n\n1.首先这个场景最初是产品经理假想的（当然肯定也会做过很多访谈和田野调查），所以**如何确保这个场景是「高价值」且「具有普适性」的** ？对于一个成功的基础软件，这点尤其重要，通常在项目早期能抓到一个这样的点，就相当于成功了一半，当然这个对产品经理的要求是非常高的，通常需要有很强的 vision 和推动力，这就是为什么很多产品型公司的 CEO 都是早期的大号产品经理，因为在项目的早期 CEO 需要同时拥有这两样。当然更强的犹如乔布斯这种现实扭曲场，无中生有造出 iPod / iPhone 改变了整个世界，这是何等的魄力和远见（我相信 Jobs 在构思 iPhone 的时候应该能想象到今天的世界）。这个没啥办法，基本就是靠人。  \n\n2.你产品的价值是否在这个场景里有最直接的体现。最好的直接通常是直指人心的，是人直接能体会到的「感受」。对于开发者产品来说，**我通常会选择的锚点是「用户体验」，因为好的体验是不言自明的** ，汽车和马车对比在通勤舒适度和效率的时候，是完胜的；就像 TiDB 和 MySQL 分库分表的方案比弹性扩展能力时候也是一样，体验上也是完胜的。对于这一点倒是有很多方法去参考，有兴趣的可以参考我那篇关于用户体验的文章。\n\n第一种思路本质上来说是 Storytelling，这种方式的好处在于：   \n\n1.非常好验证，当你把故事想明白了，那自然典型的用户旅程就出来了，**这时候你把自己作为一个假想的用户完整的体验一遍即是验证**，这也是我通常使用的检验我们自家产品经理工作的方式😁。  \n\n2.用户很好接受，道理很简单：人人都喜欢听故事，人人都喜欢看 Demo，人人都喜欢抄作业。\n\n对于第二种思路，通常适用于一些改进型的特性，其中的关键点在于：待解决的问题到底多痛？没有完美的软件，在重度用户那边一定会有各种各样的问题，而且这类问题通常这个功能的开发者是难以体会到的，这时候要做的也很简单，就是弯下腰去了解，去使用，去感受。我经常会去和我们的客户交付团队的一线同学聊天，在做这次分享之前也不例外，大致的对话如下： \n\n> **我：关于我们的 SQL 优化器，你觉得日常工作中，让你最头疼的问题是啥**？  \nTa：执行计划突变。  \n**我：对了，那是 hint 不太够用吗？而且 3.0 就引入了 SQL Binding？这些帮上忙了吗**？  \nTa：对于一些疑难杂症来说你很难通过 hint 来指定的特定的执行计划（然后附上了一个真实的业务场景中的例子，一条百行的 SQL，确实无从下手），另外 SQL Binding 问题在于，我绑定了 SQL 执行计划以后，之后如果有更好计划，还需要重新来？  \n\n \n> **我：我们 4.0 不如引入了 SQL Plan Management 吗？里面的自动演进功能不正好是解决这个问题的吗**？  \nTa：没错，但是我们生产环境都不敢开，对于极端重要的 OLTP 场景，不能容忍执行计划自动变更带来的抖动风险。  \n**我：我们的产品做什么事情，能让你觉得日子好过一点**？  \nTa：1. 对于复杂的 SQL 能够选择目标执行计划，让我选择 binding 就好，而不是通过 Hint 构造；2. SPM 发现更好的执行计划，只需要及时通知我，我来做变更，而不是自动决策变更。\n\n\n上面最后一句的两个反馈，我听到以后觉得很有启发，其实这两个需求都是很中肯，而且开发的代价并不大，但是确实节约了很多的时间和 DBA 的心智负担。\n类似的例子还有很多，但是重点是：**找到产品的重度使用者，深入挖掘他最头疼的问题，有时候会有意想不到的收获（例如去 OnCall 的现场观察大家的操作）。** 而且这类问题的解决，通常也会伴随着很好的体感，TiDB 在最近几个版本中的一些关于可观测性的改进，基本都是通过类似的观察得来。\n但是第二种思路的价值展现，一定要找到合适的听众，例如：通常我们为应用开发者（数据库的使用者）解决的问题和数据库运维者（DBA）是不一样的。面对错误的对象，结果有可能会是鸡同鸭讲。\n\n\n\n## 当用户在说：「我要这个」的时候，Ta 其实在说什么？\n\n在中国基础软件的产品经理和解决方案工程师难找，我觉得是有历史原因的，就像上面我提到，过去很长时间，我们通常是站在一个「使用者」的视角去看待软件，这意味着从问题到解决方案通常是明显的，例如，假设我需要做一个高性能，支持亚毫秒低延迟读写的 User Profile 系统，数据量不大，可以容忍数据丢失，那我就用 Redis 好了！但是作为 Redis 的产品经理来说，ta 很难为了 User Profile 这个很特化的场景去设计 Redis 的功能。\n![2.jpg](https://img1.www.pingcap.com/prod/2_29582e6a91.jpg)\n\n优秀的基础软件产品经理通常会选择通用的技能点，用尽可能小的功能集合来包含更大的可能性（这样的灵活性是被鼓励的，例如：UNIX），所以这就对于基础软件厂商的售前和解决方案工程师提出了更高的要求：**很多业务需要的「特性」是需要多个「技术点」**  组合出来的，或者通过引导到正确的问题从而提供更好的解决方案。** 下面我会通过几个例子来说明这个观点：\n\n第一个例子，我们的经常被用户问到：**TiDB 有没有多租户功能？** \n\n这个问题的我的回复并不是简单的「有」或者「没有」，而是会去挖掘用户真正想要解决的问题是什么？潜台词是什么？在多租户的例子中大概逃不出下面几种情况：\n\n1.潜台词1：「每个业务都部署一套 TiDB，太贵了」，价值点：**节约成本**   \n\n2.潜台词2：「我确实有好多套业务使用 TiDB, 对我来说机器成本不是问题，但是配置管理太麻烦，还要挨个升级，监控什么的还不能复用」，价值点：**降低运维复杂度**  \n\n3.潜台词3：「我有些场景特别重要，有些场景没那么重要，需要区别对待，对于不重要的我要共享，但是对于重要的要能隔离」，价值点：**资源隔离+统一管控**  \n\n4.潜台词4：「我有监管要求，例如不同租户的加密和审计」，价值点：**合规**  \n\n搞清楚情况后，对于这几种不同的情况，我就拿其中一个作为例子：节约成本，展开说说。下一步就是思考我们手上有什么菜了。\n\n对于 TiDB 5.x 来说，大致有下面几个**技术点** 和上面这个特性相关：  \n\n1.Placement Rule in SQL（灵活的决定数据放置的功能）  \n\n2.TiDB Operator on K8s  \n\n3.XX（PingCAP 的一个新的产品，暂时还没发布，请期待，大致是一个多集群可视化管控的平台）  \n\n4.TiDB Managed Cloud Service\n\n对于节约成本的诉求，通常的原因是冷热数据比例比较悬殊，我们观察到多数大集群都符合 2/8 原则，也就是 20% 的数据承载 80% 的流量，而且尤其是对于金融类型业务，很多时候数据是永远不能删除的，这就意味着用户也需要为冷数据支付存储成本，这种情况按照统一的硬件标准去部署这其实是不划算的，所以站在用户的角度，是很合理的诉求。\n\n下一步需要思考的是：**世界上没有新鲜事，用户现在是通过什么办法解决这样的问题呢？**\n\n类似冷热分离这样的场景，我见过比较多的方案是冷数据用 HBase 或者其它比较低成本数据库方案（例如 MySQL 分库分表跑在机械磁盘上），热数据仍然放在 OLTP 数据库里，然后定期按照时间索引（或者分区）手动导入到冷数据集群中。这样对于应用层来说，就要知道的哪些数据去哪里查询，相当于需要对接两个数据源，而且这样的架构通常很难应对突发的冷数据读写热点（尤其是 ToC 端业务，偶尔会有一些「挖坟」的突发流量）。\n\n然后下一个问题是：**我们的产品解决这个问题能给用户带来哪些不一样？** 如果还是需要用户手动做数据搬迁，或者搭建两个配置不同的 TiDB 集群，那其实没什么大的区别，在这个场景里面，如果 TiDB 能够支持异构集群，并且自动能将冷热数据固化在特定配置的机器上，同时支持冷数据到热数据自动交换，对用户来说体验是最好的：一个 DB 意味着业务的改动和维护成本最低。在 TiDB 5.4 里面发布了一个新的功能，叫做 Placement Rules in SQL, 这个功能可以让用户使用 SQL 声明式的决定数据的分布策略，自然可以指定冷热数据的分布策略。更进一步， 对于多租户要求的更复杂数据分布方式，例如不同租户的数据放置在不同的物理机上，但是又能通过一个 TiDB 集群统一管控，通过 Placement Rules in SQL 这个功能也能实现。\n\n\n\n## Meta Feature：解决方案架构师的宝藏\n\n说到这里，我想进一步展开一个概念，有一些功能和其它功能不一样，这类功能可以作为构建其它功能的基础，组合出新的特性。这类功能我称之为：Meta Feature，上面提到的 Placement Rule 就是一个很典型的 Meta Feature, 例如：Placment Rule + Follower Read 可以组合成接近传统意义上的数据库一写多读（但是更灵活，更加细粒度，特别适合临时性的捞数或者做临时的查询，保证数据新鲜的情况下，不影响在线业务），Placement Rule + 用户自定义的权限系统 = 支持物理隔离多租户；Placement Rule + Local Transaction + 跨中心部属 = 异地多活（WIP）；Placement Rule 还可以将精心设施数据的放置策略，让 TiDB 避免分布式事务（模拟分库分表），提升 OLTP 性能。\n![3.jpg](https://img1.www.pingcap.com/prod/3_d5f83e3688.jpg)\n\nMeta Feature 通常不太会直接暴露给终端的用户，因为灵活性太强，用户会有一定的学习成本和上手门槛（除非经过精心的 UX 设计），但是这类能力对于架构师/解决方案提供商/生态合作伙伴尤其重要，因为 Meta Feature 越多，一个系统的‘可玩性’越高，造出来的差异化方案也越多。但是通常我们会犯一个错误：**灵活性是否等于产品价值？** 我认为不是的，虽然工程师（尤其是 Geek）对这类开放能力有天生的好感，但是对于终端用户到底能否说好这样的故事，我是存疑的，看看 Windows 和 UNIX 的终端用户的市场占有率就知道了。在这个例子上最近我听到了个绝佳的例子，和大家分享：**你并不能对一个美式的爱好者说拿铁更好，因为你可以灵活的控制含奶量，奶降低到 0 就包含了美式。**\n\n我们再看一个场景，关于批处理。熟悉 TiDB 历史的朋友肯定知道我们最早这个项目的初心其实是从 MySQL Sharding 的替换开始的，后来慢慢的很多用户发现：反正我的数据都已经在 TiDB 里了，为什么不直接在上面做计算？或者原来一些使用 SQL 做的复杂的数据变换工作遇到了单机计算能力瓶颈，而且因为一些业务要求，这些计算还需要保持强一致性甚至 ACID 事务支持，一个典型的场景就是银行的清结算业务，本来年轻的我还不太理解，这类批处理业务直接 Hadoop 跑就好了，后来了解清楚情况以后才发现还是年轻了，对于银行来说，很多传统的清结算业务是直接跑在核心的数据库上的，而且业务也不简单，一个 Job 上百行的 SQL 家常便饭，很可能开发这个 Job 的开发商已经不见了，谁也不敢轻易改写成 MR Job，另外对于批量后结果，可能还要回填到数据库中，而且整个过程需要在短短几个小时内完成，完不成就是生产事故。原本如果数据量没那么大，跑在 Oracle，DB2 小型机上也没啥问题，但是最近这几年随着移动支付和电子商务的兴起，数据量越来越大，增长也越来越快，Scale-Up 一定迟早成为瓶颈。**TiDB 在其中正好切中两个很高的价值点：** \n\n1.SQL 兼容的能力（尤其在 5.0 支持 CTE 后和 5.3 引入的临时表功能，复杂 SQL 的兼容性和性能得到很好提升），也支持金融级的一致性事务能力。  \n\n2.横向的计算扩展能力（尤其在 5.0 支持 TiFlash MPP 模式后，解锁了在列式存储上进行分布式计算的能力），理论上只要有足够多的机器，吞吐能够扩展上去。\n\n对于银行的批量业务来说，令人头疼架构改造问题变成了简单的买机器的问题，你说香不香。但是在 TiDB 早期设计的解决方案中，有几个痛点：  \n\n1.大批量数据导入  \n\n2.分布式计算\n\n对于第一个问题，通常一个典型的 TiDB 做批量任务的流程是：下档（每日的交易记录通过文件的形式发布）-> **将这些记录批量写入到 TiDB 中 -> 计算（通过 SQL）** -> 计算结果回填到 TiDB 的表中。档案记录可能是一大堆文本文件（例如 CSV）格式，最简单的写入方式肯定就是直接一条条记录用 SQL Insert 的方式写入，这个方式处理点小数据量问题不大，但是数据量大的话，其实是比较不划算的，毕竟大多数导入都是离线导入，虽然 TiDB 提供大事务（单个事务最大 10G），但是站在用户的角度有几个问题：\n\n1.批量写入通常是离线的，这种场景用户的核心诉求是：快！ 在这种场景下，完整的走完分布式事务的流程是没必要的。\n\n2.虽然有 10G 的边界，对于用户来说也很难切割得精确。\n\n3.大事务的写入过程中意味着需要更大的内存缓存，这点常常被忽略。\n\n一个更好方式是支持物理导入，直接分布式的生成底层存储引擎的数据文件，分发给存储节点，直接插入物理文件，也就是 TiDB 的 Lightning 做的事情。在最近的一个真实用户的场景观察到，Lightning 使用 3 台机器，大概在 72h 内完成了 ~30T 的原始数据的转码和导入工作，大概导入吞吐能做到 380GB/h。所以在批量的场景中，能使用 Lightning 物理导入模式的话，通常是一个更快且更稳定的解。\n\n另外的一个痛点，计算瓶颈（听起来还听不合理的，哈哈哈），在早期 TiDB 还不支持 MPP 的时代，TiDB 只支持 1 层的算子下推，也就是 Coprocessor 分布在 TiKV 中的计算的结果只能汇总在一台 TiDB 节点上进行聚合，如果中间结果过大，超过了这个 TiDB 节点的内存，就会 OOM，**这也就是为什么过去 TiDB 需要引入 Spark 来进行更复杂的分布式计算的原因** （尤其是大表和大表的 Join），所以在过去对于复杂的批量业务还是需要引入一批 Spark 的机器通过 TiSpark 对 TiDB 的计算能力进行补充。但是在 TiDB 5.0 后引入了 TiFlash 的 MPP 模式，可以通过多个 TiDB 节点进行计算结果聚合，于是计算能力并不再是瓶颈了，这意味着，很有可能在一些 TiDB 的批量计算场景中，5.0 能够节省一批 Spark 的机器，意味着更简单的技术栈和更高的性能。\n\n**更进一步，引入 Spark 还有一个原因，就是在计算结果回填的阶段，由于 TiDB 的事务大小限制，以及提升并发写入的效率，我们会使用 Spark 来对 TiDB 进行分布式的数据插入。** 这个过程理论上也是可以通过 Lightning 改进的，TiFlash MPP 可以将结果数据输出成 CSV，Lightning 是支持 CSV 格式的数据导入的。\n\n所以原来的链路理论上有可能变成：Lightning 导入数据到 TiDB -> TiDB 使用 TiFlash MPP 进行计算结果输出成 CSV -> 再次通过的 Lightning 将 CSV 结果写入到 TiDB 中；有可能比使用 TiSpark + 大事务的方案更快更省资源，也更稳定。\n\n在这个方案上我们可以再延伸一下仔细想想，上面的方案优化其实是利用了 Lightning 的大批量数据写入能力，理论上有‘大写入压力’的数据导入场景，都可以通过这个思路改进。我这里分享一个 TiDB 的用户真实反馈：这个客户业务系统上到 TiDB 后，会有定期大表导入的场景，他们希望先将大空表通过 Placement Rule 指定到特定空闲主机，然后通过 Lightning 快速导入数据，不需要考虑限流等措施也可以降低对整体集群的影响，实现快速导入；相反的，如果 TiDB 没有这个调度能力，客户只能通过限流的方式保持集群稳定，但是导入速度会很慢。这个例子是通过 Placement Rule + Lightning 实现了在线的批量写入，也是很好的呼应了一下前面关于 Meta Feature 的描述。\n\n本来在线下的分享中还有关于‘分库分表’ vs TiDB 的例子，因为篇幅关系就不展开了，感兴趣的可以按照上面的思路去思考。\n\n\n\n## 更隐式，但更大更长期的价值：可观测性和 Troubleshooting 能力\n\n最后一部分，大家也能看到，最近其实我一直在努力的传达这个 Message，对于一个基础软件产品来说，一个重要的长期竞争力和产品价值来自于可观测性和 Troubleshooting 能力。这个世界没有完美的软件，而且对于有经验的开发者来说，快速的发现和定位问题的能力是必备的，对于基础软件的商业化来说，服务支持效率和 Self-serving 也是规模化的基础。我这里说一些我们最近做的一些新的事情，以及未来面临的挑战。\n\n### TiDB Clinic (tiup diag)\n\n为什么要做这个事情？过去我们在做故障诊断的时候，是一个痛苦的过程，除了我在之前的关于可观测性的文章中提到的老司机的经验只在老司机脑子里的问题外，**我观察到其实消耗时间的大头来自于收集信息** ，尤其是部署在用户自己的环境中，用户对于系统诊断并不熟悉，求助我们的服务支持的时候，经常的对话是：\n\n> *服务支持：请运行这个命令 xxx，然后告诉我结果*    \n*客户：（2 小时后才给了结果）*    \n*服务支持：不好意思，麻烦在你们的监控界面上看某个指标的图表*    \n*客户：截图给你了*    \n*服务支持：不好意思的，时间段选错了。。。然后调整一下 grafana 的规则，再来一遍*    \n*客户：！@##￥#￥%*    \n*服务支持（隔了几天换了个人值班）：请运行这个命令 xxx，然后告诉我结果*    \n*客户：之前不是给过了吗*    \n\n这样一来一回异步又低效的问题诊断是很大的痛苦的来源，以及 oncall 没办法 scale 的核心原因之一。用户的痛点是：\n\n1. ‘你就不能一次性要完所有的信息吗？我并不知道给你哪些’\n2. ‘信息太大太多太杂，我怎么给你？’\n3. ‘我的 dashboard 在内网里，你看不到，我也只能截图’\n4. ‘我不能暴露业务信息，但是可以提交诊断信息’\n\n但是反过来，TiDB 的服务支持人员的痛点是：\n\n1. ‘原来猜测的方向不太对，需要另一些 metric 来验证’\n2. ‘无法完整重现故障现场的 metrics 和系统状态，我希望自由的操作Grafana’\n3. ‘不同的服务支持人员对于同一个用户的上下文共享’\n\n于是就有了 Clinic 这个产品了，在用户同意的前提下：\n\n1. 通过 tiup 一键自动收集和系统诊断相关的各种指标\n2. 通过不断学习的规则引擎，自动化诊断一些常见错误\n3. 针对不同租户的诊断信息存储和回放平台（类似 SaaS）\n\n如果熟悉 AskTUG （TiDB 用户论坛）的朋友，可能会看到类似这样的链接：h***s://clinic.pingcap.net/xxx（例如这个case：<https://asktug.com/t/topic/573261/13>）\n\n对于用户来说，只需要在集群内执行一个简单的命令，就会生成上面这样的一个链接，把重要的诊断信息与 PingCAP 的专业服务支持人员共享，我们在后台可以看到：\n\n![4.jpg](https://img1.www.pingcap.com/prod/4_f32b7ae288.jpg)\n\n\n![5.jpg](https://img1.www.pingcap.com/prod/5_f1af85a72f.jpg)\n\n其实 TiDB Clinic 也是对于基础软件的维护性的一个新尝试：诊断能力的 SaaS 化，通过一个在云端不断强化的规则引擎，将故障的诊断和修复建议和本地的运维部署结耦。这样的能力会变成用户选择 TiDB 的一个新的价值点，也是 TiDB 很强的生态护城河。\n\n### TiDB Dashboard 中 Profiling\n\n我心目中对于一个基础软件产品是不是好，我有一个特别的标准：**自带 Profiler 的，基本上都是良心产品，能够把 Profile 体验做 UX 优化的，更是良心中的良心。**\n\n![6.jpg](https://img1.www.pingcap.com/prod/6_e878fb4db9.jpg)\n\n\n![7.jpg](https://img1.www.pingcap.com/prod/7_b9b566ca70.jpg)\n\n其实这个功能来自于几个我们实际处理过的 oncall case，都是一些通过 metric 没法覆盖到的问题，有一大类故障，是遇到硬件瓶颈了，大概逃不过 CPU 和磁盘，磁盘瓶颈相对好查，大致看有没有大的 IO（Update / Delete / Insert）或者  RocksDB 本身的 Compaction 就好，但是 CPU 瓶颈的查找方式就模糊许多，**Profiler 几乎是唯一的方式：** \n\n1. CPU 的关键路径上的 Call Stack 是什么样子\n2. 这些关键路径上的函数调用暗示了什么？\n\n\n\n## 面临的挑战\n\n快结尾了，说点挑战。PingCAP 是在 2015 年成立的，到现在已经马上就要 7 岁了，在这 7 年里，正好经历了一些很重要的行业变革：\n\n1. 数据库技术从分布式系统过渡到云原生；虽然很多人可能觉得这两个词并不是一个层面上的概念，因为云原生也是分布式系统实现的呀？但是我觉得云原生是一种设计系统的思考方式的根本改变，这点我在我其他很多文章里提过，就不赘述了。\n2. 开源的数据库软件公司找到了可规模化商业化的模式：在云上的 Managed Service。\n3. 全球的基础软件领域正在经历从‘能用’变成‘好用’的阶段\n\n这几点分别代表两个方向上的认知改变：\n\n1. 在技术上，需要完成从依赖计算机的操作系统和硬件变成依赖云服务，这一点对于技术的挑战是巨大的，例如：使用 EBS 的话，是否 Data Replication 还是必须的？使用 Serverless 的话，是否能够打破有限的计算资源的限制？如果这个问题再叠加上已有的系统可能有大量的现有用户会变得更加复杂，当然，云原生技术并不等于公有云 Only，但如何设计出一条路径，慢慢的过渡到以云原生技术为基础的新架构上？这会是对于研发和产品团队一个巨大的挑战。\n\n2. 第二个改变会是更大的挑战，因为商业模式在转变，在传统的开源数据库公司，主流的商业模式是以服务支持为主的人力生意，高级一点是类似 Oracle 这样的卖保险的生意，但是这些商业模式都没有办法很好的回答两个问题：\n\n   a. 商业版和开源版的价值差异\n\n   b. 如何规模化，已经靠人力是无法规模化的\n\n而 SaaS 的模式则可以很好回答这两个问题，而且基础设施类的软件和 SaaS 的模式融合后会有更大的放大效应 ，我在《[大教堂终将倒下，但集市永存](https://pingcap.com/zh/insight-detail/the-cathedral-and-the-fair)》一文提及过，但是真正的挑战在于：**一个面向传统软件售卖 + 服务支持导向的软件公司的组织如何调整为一个面向运营的线上服务公司？** 以研发体系为视角，举几个小例子：1. 版本发布，对于传统软件公司来说，一年发布 1～2 个版本就不错了，但是线上服务有可能一个礼拜就升级一次，不要小看这个发版节奏的差异，这个差异决定了整个研发和质量保障体系模式的差异。2. 如果在云上提供服务，那么就需要配套的运营支持系统（计费，审计，故障诊断等）以及相应的 SRE 团队，这些系统可能并不在传统的软件研发体系里面，另外对于用户体验和开发者体验的关注变得尤其重要。\n\n当然挑战也不止这些，也都没有标准答案，不过我还是对未来充满信心的，毕竟这些趋势本质上都是在加速技术到社会价值和商业价值的转化以及降低门槛，都是好的且务实的转变，这对于 PingCAP 这样的公司来说当然是利好，前方是星辰大海，一切都是事在人为，大有可为。\n\n> 延展阅读：  \n[做出让人爱不释手的基础软件：可观测性和可交互性——黄东旭](https://pingcap.com/zh/blog/how-to-develop-an-infrasoft-observability-and-interactivity)\n","date":"2022-03-07","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"tidb-5.x-in-my-eyes","file":null,"relatedBlogs":[]},{"id":"Blogs_308","title":"一文看懂开源许可证丨开源知识科普","tags":["开源知识科普"],"category":{"name":"观点洞察"},"summary":"PingCAP 从第一行代码开源，六年里积累了一些经验和教训，在《开源知识科普》栏目中，我们将与大家分享和交流在开源成长路径中的思考和感受，以及参与开源项目的正确姿势。本期话题就从开源的基础——开源许可证开始，希望对大家了解开源、参与开源有一定帮助。","body":"> **编者按：** \n> 在很多人眼中，「开源」是一个时髦且有情怀的词汇，始终伴随有理想主义色彩，因此不少公司开始给自己贴上“开源”标签。但一个优秀的开源项目远远不止是简单的公开源代码，而是需要将其当作公司战略进行贯彻，才能架设起牢不可破的信任桥梁。\n> PingCAP 从第一行代码开源，六年里积累了一些经验和教训，在《开源知识科普》栏目中，我们将与大家分享和交流在开源成长路径中的思考和感受，以及参与开源项目的正确姿势。本期话题就从开源的基础——开源许可证开始，希望对大家了解开源、参与开源有一定帮助。\n\n\n近年来，开源正在变得越来越火，我们经常会看到 “某企业宣布开源”、“某开源大会召开”、“某开源项目获得融资”。个人开发者与企业比以往任何时候都更愿意参与到开源项目的建设和贡献中，开源在国内 IT 领域获得了前所未有的热度，也获得了产业界和投资圈的广泛关注。\n\n但总有些人听到开源一词时，就会误以为 “开源软件是免费的，因此我可以不受限制地随意使用”。在开源诞生之初，自由软件是当时的主流提法，回顾开源的发展史，从自由软件到开源运动实现了非常大的跨越，前者更多的是一种精神的倡导，而后者着眼于软件的协同开放，因此会有非常严谨的开源许可证的规则和限制。开源软件能走到今天的发展程度，就是因为有了这么一套遵从开源精神的规则体系，才能够健康发展。开源精神的载体之一就是开源许可证，今天我们就来扒一扒开源许可证与开源的关系，以及它背后折射出的问题。\n\n## 什么是开源许可证？（“Open Source License”）\n\n首先需要明确的是，开源软件源代码的著作权既没有被放弃也没有过期，其修改和发行等仍然要受到著作权法或者开源软件许可证的制约。\n\n我们接触到的开源软件一般都有对应的开源许可证（Open Source License）对软件的使用、复制、修改和再发布等进行限制。许可证即授权条款，开源许可证就是保证开源软件这些限制的法律文件，目的在于规范受著作权保护的软件的使用或者分发行为。**开源许可证是开源软件生态系统的基础，可以促进软件的协同开发**。\n\n## 常见开源许可证\n\n常见的开源许可证主要有 Apache、MIT、BSD、GPL、LGPL、MPL、SSPL 等，可以大致分为两大类：**宽松自由软件许可协议（“Permissive free software licence”）和著佐权许可证（“copyleft license”）**。\n\nPermissive free software licence 是一种对软件的使用、修改、传播等方式采用最低限制的自由软件许可协议条款类型。这种类型的软件许可协议将不保证原作品的派生作品会继续保持与原作品完全相同的相关限制条件，从而为原作品的自由使用、修改和传播等提供更大的空间。\n\n而 Copyleft License 是在有限空间内的自由使用、修改和传播，且不得违背原作品的限制条款。如果一款软件使用 Copyleft 类型许可协议规定软件不得用于商业目的，且不得闭源，那么后续的衍生子软件也必须得遵循该条款。\n\n**两者最大的差别在于**：在软件被修改并再发行时， Copyleft License 仍然强制要求公开源代码（衍生软件需要开源），而 Permissive free software licence 不要求公开源代码（衍生软件可以变为专有软件）。\n\n其中，Apache、MIT、BSD 都是宽松许可证，GPL 是典型的强著佐权（copyleft ）许可证，LGPL、MPL 是弱著佐权（copyleft ）许可证。SSPL 则是近年来 MongoDB 创建的一个新许可证，存在较大争议，开放源代码促进会 OSI 甚至认为 SSPL 就不是开源许可协议。\n\n此外，还有一类是 Creative Commons（CC）知识共享协议。严格意义上说该协议并不能说是真正的开源协议，它们大多是被使用于设计类的工程上。CC 协议种类繁多，每一种都授权特定的权利。大多数的比较严格的 CC 协议会声明 “署名权，非商业用途，禁止衍生” 条款，这意味着你可以自由的分享这个作品，但你不能改变它和对其收费，而且必须声明作品的归属。这个许可协议非常的有用，它可以让你的作品传播出去，但又可以对作品的使用保留部分或完全的控制。最少限制的 CC 协议类型当属 “署名” 协议，这意味着只要人们能维护你的名誉，他们对你的作品怎么使用都行。\n\n![协议列表.webp](https://img1.www.pingcap.com/prod/_8670ba8cf1.webp)\n<center>来源：https://moqod.com/mobile-web-software-development/</center>\n\n可以看出，不同许可证之间的差异非常大，你可能会困惑，搞得这么复杂的目的是什么呢？\n这就不得不从**开源的历史**讲起了。\n\n开源这个词最初其实是指开源软件（OSS）。开源软件是源代码可以任意获取的计算机软件，任何人都能查看、修改和分发他们认为合适的代码。**在开源领域中，存在着两大阵营**：FSF（Free Software Foundation，自由软件基金会) 和 OSI（Open Source Initiative，开放源代码促进会），**他们对开源有着不同的理念**。\n\nFSF 是开源泰斗 RMS 创立的重要的开源软件基金会 (1985/10/04), FSF 创立之初主要是为了筹集资金来建设 GNU 的内核 Hurd 项目及工具链，虽然 GNU 项目本身没有完成，但是该过程中创造出的大量软件工具，日后成为了 GNU/Linux 的重要组成部分。为了贯彻 RMS 对 “自由” 和 “开源” 的理解，FSF 建立了开源领域的第一个 “copyleft” 属性的许可证 - GPL (GNU Public License) 。\n\nOSI 由开源界泰斗 Bruce Perens 和 Eric S. Raymond (ESR) 在 1998 年组建，目的是在原教旨主义开源 (最早的开源运动发起和推动者们) 与软件工业/商业之间激烈矛盾中，寻求更平衡的体系和治理机制。OSI 组织批准过的许可大概有 80 种，包括 Apache License v2、GPL v2、MIT/BSD 等。\n\nFSF 与 OSI 是推广和维护开源秩序的非盈利组织，维护着 “开源” 的定义以及主要的开源软件协议递交、讨论与审核。只要条款被审核通过是符合开放源代码定义的，就可以称之为开放源码授权条款，采用开放源码条款散布授权的软件即是开放源码软件，若一份商业产品中包含有开放源码软件，其包装上可以标上开放源码促进会的证明标章，认识这个标章的消费者就可以知道产品中有使用到开放源码软件，进而因为开放源码软件特有的优点而购买产品。\n\n![开源标识.webp](https://img1.www.pingcap.com/prod/_e1f8e1d3bd.webp)\n\n下面，我们通过一张表来简单了解一下常见开源许可证之间的区别：\n\n![常见开源许可证区别.webp](https://img1.www.pingcap.com/prod/_3e07a31375.webp)\n<center>来源：https://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html</center>\n\n其中，Apache 许可证（Apache License）license 是一个由 Apache 软件基金会发布的自由软件许可证，最初为 Apache http 服务器而撰写。此许可证最新版本为 “版本 2”，于 2004 年 1 月发布。**Apache 许可证鼓励代码共享和最终原作者的著作权，允许源代码修改和再发布**。但是需要遵循以下条件：\n\n- 需要给代码的用户一份 Apache Licence；\n- 如果修改了代码，需要在被修改的文件中说明；\n- 在衍生的代码中（修改和有源代码衍生的代码中）需要带有原来代码中的协议，商标，专利声明和其他原来作者规定需要包含的说明；\n- 如果再发布的产品中包含一个 Notice 文件，则在 Notice 文件中需要带有 Apache Licence。你可以在 Notice 中增加自己的许可，但是不可以表现为对 Apache Licence 构成更改；\n- Apache Licence 也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足并作为开源或商业产品发布/销售。\n\n例如，在一个使用 Apache 许可证的开源项目中，其下游 Fork 的企业不仅没有回馈上游开源项目，反而将衍生的代码更改为不受 OSI 认可的 SSPL Licence，另行宣布成为一个新的开源项目，误导了很多不明真相的人，以为又涌现出一个新的开源项目。但该行为其实已经对原开源项目的合法权益造成了侵害，也有背开源精神。\n\n作为从第一天就以开源作为发展基础的开源基础软件公司，PingCAP 鲜明地反对一些在开源软件领域 “**违背开源精神，破坏游戏规则**” 的行为。\n\nPingCAP 目前开源的项目包含 TiDB、TiKV 及 Chaos Mesh，都是基于 Apache 2.0 的协议来开发和运营的，任何个人、公司、云厂商，只要不违反 Apache 2.0 协议的相关规定，都可以自由地去下载、研读、改写、编译原代码，甚至可以发行自己的发行版，进行相应的商业活动。\n\nPingCAP 在设计这个公司的时候，就在为开源做持续贡献的设计作准备，比如在开源治理体系上，我们认为自己就是开源技术体系的一部分，并设有专门的团队持续运营开源社区。\n\n在开源技术体系中，开源社区是整个新技术创新的上游源头，也是创新技术的孵化器。开源社区不断推动各种开源项目，并通过全球协作实现产品的快速迭代。通过这种源头创新的方式，可以不断把创新技术通过全球社区协作的方式 “生产” 出来，**开源社区实际上已经变成了新技术的创新引擎**。\n\n在刚刚发布的《开源社区成熟度研究报告》 2.0 中，TiDB 社区被作为开源社区运营和治理实践典范作为研究对象，探索开源社区的健康可持续发展。报告中还首次提出了**开源社区成熟度模型与开源社区度量体系**，对开源感兴趣的同学可以[点此查看](https://pingcap.com/zh/insight-detail/open-source-community-maturity)。\n\n作为开源生态的一员，我们欢迎任何人参与到开源事业中，共同繁荣开源领域，开源今天的局面来之不易，需要所有参与其中的人共同维护，敬畏游戏规则，遵从开源精神，才能创造开源的美好明天。\n\n<div class=\"is-flex is-flex-direction-row is-justify-content-center\">\n  <div class=\"is-flex is-flex-direction-column\">\n    <a target=\"_blank\" class=\"button is-link mx-5\"\n       href=\"https://tidbcloud.com/free-trial?utm_source=website-zh&utm_medium=referral&utm_campaign=blog-introduction-of-open-source-license\"\n       referrerpolicy=\"no-referrer-when-downgrade\" style=\"background-color: #3a40e1;\">\n      免费试用 TiDB Cloud\n    </a>\n    <div style=\"font-size:12px; text-align:center\">适用于中国出海企业和开发者</div>\n  </div>  \n  <div class=\"is-flex is-flex-direction-column\">\n    <a target=\"_blank\" class=\"button is-link mx-5\"\n       href=\"https://pingcap.com/zh/product-community/\"\n       style=\"background-color: #4fc172;\">\n      下载 TiDB 社区版\n    </a>\n  </div>\n  <div class=\"is-flex is-flex-direction-column\">\n    <a target=\"_blank\" class=\"button is-link mx-5\"\n       href=\"https://pingcap.com.cn\"\n       style=\"background-color: #3a40e1;\">\n      了解 TiDB 企业版\n    </a>\n  </div>\n</div>\n\n**附：常见开源许可证介绍**\n\n- **Apache**：Apache 许可证（Apache License），是一个由 Apache 软件基金会发布的自由软件许可证，最初为 Apache http 服务器而撰写。Apache 许可证要求被授权者保留著作权和放弃权利的声明，但它不是一个反著作权的许可证。此许可证最新版本为 “版本2”，于 2004 年 1 月发布。Apache 许可证是宽松的，因为它不会强制派生和修改作品使用相同的许可证进行发布。\n\n- **MIT**：MIT 许可证之名源自麻省理工学院（Massachusetts Institute of Technology, MIT），又称 “ X 条款”（X License）或 “ X11 条款”（X11 License）。MIT 内容与三条款 BSD 许可证（3-clause BSD license）内容颇为近似，但是赋予软件被授权人更大的权利与更少的限制。有许多团体均采用 MIT 许可证。例如著名的 ssh 连接软件 PuTTY 与 X Window System (X11) 即为例子。Expat 、Mono 开发平台库、Ruby on Rails、 Lua 5.0 onwards 等等也都采用 MIT 授权条款。\n\n- **BSD**：BSD 许可协议（ Berkeley Software Distribution license ）是自由软件中使用广泛的许可协议之一。BSD 就是遵照这个许可证来发布，也因此而得名 BSD 许可协议。BSD 包最初所有者是加州大学的董事会，这是由于 BSD 源自加州大学伯克利分校。BSD 开始后，BSD 许可协议得以修正，使得以后许多 BSD 变种，都采用类似风格的条款。跟其他条款相比，从 GNU 通用公共许可证（GPL）到限制重重的著作权（Copyright），BSD 许可证比较宽松，甚至跟公有领域（Public Domain）更为接近。事实上，BSD 许可证被认为是 copycenter（中间著作权），介乎标准的 copyright 与 GPL 的 copyleft 之间。\"Take it down to the copy center and make as many copies as you want\"。可以说，GPL 强迫后续版本必须一样是自由软件，BSD 的后续版本可以选择要继续是 BSD 或其他自由软件条款或闭源软件等等。\n\n- **GPL**：GPL 协议和 BSD、Apache Licence 等鼓励代码重用的许可很不一样。GPL 的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用，但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。由于 GPL 严格要求使用了 GPL 类库的软件产品必须使用 GPL 协议，对于使用 GPL 协议的开源代码，商业软件或者对代码有保密要求的部门就不适合集成/采用此作为类库和二次开发的基础。\n\n- **LGPL**：LGPL 是 GPL 的一个为主要为类库使用设计的开源协议。和 GPL 要求任何使用/修改/衍生自 GPL 类库的的软件必须采用 GPL 协议不同。LGPL 允许商业软件通过类库引用 (link) 方式使用 LGPL  类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。但是如果修改 采用 LGPL 协议的代码或者对其进行衍生，则所有修改的代码，涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此采用 LGPL 协议的开源代码很适合作为第三方类库被商业软件引用，但不适合希望以采用 LGPL 协议的代码为基础，通过修改和衍生的方式做二次开发的商业软件采用。\n\n- **SSPL**：SSPL 是 MongoDB 创建的一个源码可用的许可证，以体现开源的原则，同时提供保护，防止公有云供应商将开源作品作为服务提供而不回馈此开源作品。SSPL 允许自由和不受限制的使用和修改开源作品，但如果你把此开源作品作为服务提供给别人，你也必须在 SSPL 下公开发布任何修改以及管理层的源代码。开放源代码促进会 OSI 对 SSPL 颇有微词，它认为 SSPL 不是开源许可协议，实际上是一个源代码可用的许可证。\n\n- **Elastic License**：Elastic License 是非商业许可证，核心条款是如果将产品作为 SaaS 使用则需要获得商业授权。","date":"2021-10-20","author":"PingCAP","fillInMethod":"writeDirectly","customUrl":"introduction-of-open-source-license","file":null,"relatedBlogs":[]},{"id":"Blogs_307","title":"做出让人爱不释手的基础软件：可观测性和可交互性","tags":["云原生","分布式","基础软件"],"category":{"name":"观点洞察"},"summary":"很多时候「品味」之所以被称为「品味」，就是因为说不清道不明，这固然是软件开发艺术性的一种体现，但是这也意味着它不可复制，不易被习得。本系列文章会试着总结一下好的基础软件体验到底从哪里来。作为第一篇，本文将围绕可观测性和可交互性两个比较重要的话题来谈。","body":"最近有一件事情让我印象特别深刻，作为引子和大家唠一唠：我们在内部做一些极端的流量回归仿真实验时，在 TiKV（TiDB 的分布式存储组件）上观测到了异常的 CPU 使用率，但是从我们的 Grafana Metrics、日志输出里面并没有看到异常，因此也一度困惑了好几天，最后靠一位老司机盲猜并结合 profiling 才找到真凶，真凶出现在谁都没有想到的地方：Debug 用的日志模块（澄清一下：目前这个 Bug 已经修复了，而且这个 Bug 的触发是在非常极端压力的场景下+日志级别全开才会出现，请各位用户放心）。\n\n这篇文章并不是做 Bug 分析，我觉得更重要的是，找问题过程中我们使用的工具、老司机的思考过程。作为一个观察者，我看到年轻的同事看着老司机熟练地操作 perf 和在各种各样工具和界面中切换那种仰慕的眼神，我隐约觉得事情有点不对：这意味着这门手艺不能复制。\n\n事后，我做了一些关于基础软件用户体验的调研，发现该领域的理论和资料确实挺少（大多数是 ToC 产品的研究，系统软件相关的大概只有 UNIX 哲学流派），而且缺乏系统化，依赖于作者个人「品味」，但是软件体验的好和坏显然存在，例如一个有经验的工程师看到一个命令行工具，敲几下就知道是否好用，是不是一个有「品味」的工具。\n\n很多时候「品味」之所以被称为「品味」，就是因为说不清道不明，这固然是软件开发艺术性的一种体现，但是这也意味着它不可复制，不易被习得。我觉得这也不好，今天这篇以及可能接下来的几篇文章（虽然后几篇我还不知道写啥，但是先立个 Flag）会试着总结一下好的基础软件体验到底从哪里来。\n\n作为第一篇，本文将围绕可观测性和可交互性两个比较重要的话题来谈。至于为什么把这两点放在一起聊，我先卖个关子，最后说。\n\n## 可观测性\n\n可观测性是什么？这可从我两年前发表的[《我眼中的分布式系统可观测性》](https://pingcap.com/zh/blog/observability-of-distributed-system)<sup>[1]</sup>一文中可见一斑，相同的内容我在这里就不赘述。随着在 TiDB 中对可观测性实践的深入，对这个话题有了更深的理解，为了更好的理解，我们首先先明确一个问题：当我们在聊可观测的时候，到底是谁在观测？\n\n## 是谁在观测？\n\n很多朋友可能会一愣，心想：这还用说，肯定是人，总不能是机器。没错，的确是人在观测，但就是这么一个浅显的道理往往会被软件设计者忽略，所以这两者的区别到底是什么？为什么强调人这个主体很重要？\n\n要回答这个问题，需要清楚一个现实：人的短期工作记忆是很有限的。大量的心理学研究表明，人类工作记忆的容量大致只有 4，即在短期同时关注 4 项信息 <sup>[2]</sup>，再多的信息就要靠分模块的方式记忆，如我们快速记忆电话号码的方式，以 13800001111 为例，我们通常不是一个个数字背，而是形如：138-0000-1111 进行分组。\n\n在了解人的心智模型的一些基础假设和带宽后，我想很多系统软件开发者大概不再会炫耀：我的软件有 1000 多个监控项！这不仅不是好事，反而让更多的信息破坏了短期记忆的形成，引入了更多的噪音，让使用者在信息的海洋里花很多时间找关键信息，以及不自觉的分类（我相信大脑的一个不自觉的后台任务就是对信息建索引和分类，注意这同样是消耗带宽的），所以第一个结论：软件应用一屏的界面里面最好只有 4 个关键信息。那么，接下来的一个问题是：哪些是关键信息？什么是噪音？\n\n## 区分关键信息和噪音\n\n这个问题没有标准答案。对于系统软件来说，我的经验是：**跟着关键资源走**。软件其实很简单，本质就是对硬件资源的使用和分配，讲究平衡的艺术。关键的硬件资源无非也就下面几个，对于下面每一个关键资源在某个采样时间段（单点没有太多意义），都可以通过一些简单的问题的询问，得到对系统运行状态的大致图景：\n- CPU：哪些线程在工作？这些线程都在干嘛？这些线程各自消耗了多少 CPU Time？\n- 内存：当前内存中存储了哪些东西？这些东西的命中率情况？（通常我们更关注业务缓存）？\n- 网络 I/O：QPS/TPS 有异常吗？当前主要的网络 I/O 是由什么请求发起的？带宽还够吗？请求延迟？长链接还是短链接（衡量 syscall 的开销）？\n- 磁盘 I/O：磁盘在读写文件吗？读写哪些文件？大多数的读写是什么 Pattern？吞吐多大？一次 I/O 延迟多大？\n- 关键日志：不是所有日志都有用，只有包含特定关键字的日志，人们才会关心。所以，有没有特定关键字的日志出现？\n\n通过以上标准问题的灵魂拷问，必定可以对系统运行状态有一定的了解。\n- 更进一步的关键是，这些系统的指标一定要和业务上下文联系在一起才能好用，举例说明，对于一个支持事务的数据库来说，假设我们看到 CPU 线程和 call stack，发现大量的 CPU 时间花在了 wait / sleep / idle 之类的事情上，同时也没有其他 I/O 资源瓶颈，此时，如果只看这些的数字可能会一脸懵，但是结合事务的冲突率来看可能柳岸花明，甚至能直接给出这些 lock 的等待时间都花在了哪些事务，甚至哪些行的冲突上，这对观测者是更有用的信息。\n\n也并不是说其他的信息就没用，而是相当多的信息的价值是后验的，例如：绝大多数的 debug 日志，或者那些为了证实猜想的辅助信息，其实在解决未知问题时候几乎没有帮助，而且还需要观察者有大量的背景知识，这类信息最好的呈现方式还是折叠起来，眼不见为净的好。\n\n如果打开 TiDB 的内部 Grafana 就会看到大量这样的指标，如 stall-conditions-changed-of-each-cf（虽然我知道这个指标的含义，但是我猜 TiDB 的用户里 99% 的人不知道），而且从名字里面我看到了写下这个名字的工程师内心的挣扎，他一定很想让其他人（或者自己）看懂这个名字指的是什么，但是比较遗憾，至少在我这里没有成功。\n\n观察的下一步是什么？**作出行动**。  \n\n在做出行动之前想想，有行动的前提是什么？我们处理问题的行动大致会遵循下面模式（我自己总结的，但任何一本认知心理学的书都会有类似的概念）：观察—>发现动机—>猜想—>验证猜想—>形成计划—>行动，然后再回到观察，反复循环。\n\n这个里面人（或者是老司机的经验）体现比较重要地方是在从观察到猜想这个环节，至于观察的动机而言无非有两种：\n1. 解决眼前的故障；\n2. 规避潜在的风险（避免未来的故障）。\n\n假设系统没有问题，也不太需要做出改变。  我觉得这两步之所以重要，是因为基本上其他环节都可以用自动化，唯独这两步很难，因为需要用到：**人的知识/经验和直觉**。\n\n对于一个拥有好的可观测性的系统，通常都是能很好利用人直觉的高手，举个小的例子：当打开一个系统后台界面时，我们试着不去关注具体的文字信息，如果界面中的红色黄色的色块比较多，我们的直觉会告诉自己这个系统可能处于不太健康的状态，更进一步如果红色和黄色大致都聚集在屏幕的某个具体位置上，我们的注意力一定会聚焦到这个位置；如果一个界面上全是绿色，那应该是比较健康的状态。\n\n怎么最大化利用人的直觉？或者说要引导到什么地方？我认为最好的点是：**风险的预判**。\n\n## 人的直觉用在哪？风险的预判\n\n此处需要利用一些先验知识。在聊这个话题之前，我想分享一个我之前听过的小故事，当年福特工厂里有个电机坏了，然后找了个老师傅，他听了听声音，看了看机器运转情况，最后用粉笔在电机上画了一条线，说这个地方的线圈多绕了多少多少圈，将信将疑的工人们照做，果然问题解决了，然后老师傅开了个 1 万美元的维修费（当时算是天价），福特的老板问他凭啥画一条线就收那么多钱，老师傅开了个账单：画线 1 美元，知道在哪画这条线 9999 美元。\n\n故事的真假暂且不聊，假设是真的，我们可以看到直觉和经验，真的是能产生很多的价值，我当时听到这个故事的第一反应是，这个老师傅肯定这种情况见的多了（废话），而且这个问题一定是常见问题。\n\n其实解决问题最难部分是通过观察（尤其是一些特征点）排除掉绝大多数不靠谱的方向，另外要相信常见故障的原因是会收敛的。这时一个具有良好可观测性系统的第一步就是能给使用者的直觉指引方向，这个方向就需要前人的知识来给出可能性最大的故障点以及相关的指标（例如 CPU 使用率等）；第二步就是通过一些心理学小技巧把它展现出来。\n\n下面以 TiDB 中即将会引入的一个小功能 TopSQL 加以佐证。这个功能说起来也很简单，我们发现很多用户故障都和少量的 SQL 相关，这类的 SQL 的特征是拥有和别的 SQL 有明显不同的 CPU footprint，但是每一条 SQL 的 footprint 独立看起来还挺正常的，所以 TopSQL 的功能就是回答：CPU 到底消耗了多少？在哪些 SQL 上？我试着不去解读下面这个截图，我猜聪明的你马上就能知道怎么用：\n\n![基础软件可观测性和可交互性-1.png](https://img1.www.pingcap.com/prod/1_dc58865f03.png)\n\n你的直觉会告诉你，后半段那段密集的绿色占比好像和其他有什么不一样，将整体的 CPU 使用率推高了，感觉有问题的样子，没错，这大概就是正确的方向，好的可视化能够利用人的直觉快速定位主要矛盾。\n\n## 什么叫做“一个操作”？识别操作的真正的生命周期\n\n刚才写第一点的时候想到还有一个经常被人忽略的关键资源：**时间**。本来想把时间放到关键资源那节里面，但是想了想放在这里可能更加合适。\n\n稍微形而上一点来看，我们现在的计算机都是图灵机的实现，我小学就知道图灵完备语言的最小功能集合：读/写变量，分支，循环。用文学一点的说法是：所谓程序就是无数个轮回，大轮回嵌套着小轮回（循环），每个轮回中根据现状（变量）不断的做出选择（分支）。\n\n我说到这里可能聪明的读者会猜到我想说什么：**如果我们讨论可观测性脱离了周期，就毫无意义**。而周期的定义又是灵活的，对于人而言，大周期显然是一辈子，小周期可以是一年一日，甚至周期可以不用时间跨度作为单位，比如一份工作的周期…\n\n对于一个数据库软件而言，什么是一个合理的周期？是一条 SQL 的执行周期？还是一个事务从 Begin 到 Commit ？这里没有标准答案，但是我个人建议，**周期越贴近终端用户的使用场景越实用。**\n\n譬如，在数据库中，选择单条 SQL 的执行作为周期不如选择事务的周期，事务周期不如应用程序一个请求全链路的周期。其实 TiDB 在很早就引入了 OpenTracing 来追踪一个 SQL 的执行周期内到底调用了哪些函数，花费多少时间，但最早只应用在了 TiDB 的 SQL 层内部（熟悉我们的朋友应该知道我们的 SQL 和存储是分离的），没有在存储层 TiKV 实现，所以就会出现一条 SQL 语句的执行过程往下追到 TiKV 就到了一个断头路。\n\n后来我们实现了把 TraceID 和 SpanID 传到了 TiKV 内部这个功能才算初步可用，至少把一个周期的图景变得更加完整了，本来我们打算就止步于此，但是后来发生了一个小事情，某天一个客户说：为什么我的应用访问 TiDB 那么慢？然后我一看 TiDB 的监控，没有啊，SQL 到数据库这边基本都是毫秒就返回了，但是客户说：你看我这个请求也没干别的呀，两边怎么对不上？后来我们把 Tracer 加进来以后才知道客户这边的网络出了点问题。\n\n这个案例提醒了我，如果能做到全链路的 Tracing，这里的全链路应该是从业务端请求开始计算，去看待生命周期才有意义。所以在此之后我们在 TiDB 里面通过拓展 Session Variable，能够支持用户将 OpenTracing 协议的 Tracer 信息通过 Session Varible 传入到 TiDB 的体系中，打通业务层和数据库层，能够真正实现的一个全生命周期的跟踪，这个功能也会在很近的未来的版本中和大家见面。\n\n说了这么多，总结几点：\n1. 时间也是重要资源。\n2. 抓 Sample 也好，做 Trace 也好，选对周期很重要。\n3. 周期越贴近业务的周期越有用。\n\n## 可观测性能救命的时刻：事后观测\n\n我相信没有人会没事天天看着监控界面，其实仔细想想，当我们需要可观测性的时候，多数是已经出现了可感知的故障或者很明确的风险。此时的系统可能已经“病入膏肓”，或者在火烧眉毛的时候还不知道啥原因导致，其中的根因或是之前某个时间的一些不太显然的异常变化，这时候发现之前除了正常的 Metrics 外并没有更多的信息，我们当然不会永远开着 CPU Profiler，通常 Profiler 都是手动触发，但是如果是在事后复盘原因的时候，能够有事发之前的 CPU Profile 记录，对于问题的解决和归因会有巨大的帮助，所以一个比较好的方案是：在一个相对短的时间间隔下（比如分钟级）自动的开启 Profiler，自动把诊断结果保存下来，就像定期做一个深度体检记录一样，老的记录定期删除就好了，万一出事，可以快速往前回溯，救命的效率会更高。\n\n另外相信我，做 Profile 其实也不会有什么明显的性能损耗（何况还是间歇性的），这个功能我们叫做：Continuous Profiling，这个功能很实用，也会很快和大家见面。\n\n根据我们的经验，结合上面一节，有了完善的 Tracing 系统，大部分的 Debug 过程在 Tracing + Log 就能找到问题的根因。\n\n## 最好的可观测性是能够指导用户：“我接下来该做什么？”\n\n上文中提到了行动，我在观察老师傅处理问题的时候发现一个特别有意思的现象：有经验的开发者总是能够很快通过观测，决定自己接下来该做什么，不需要查阅资料什么或者等着别人指导，完全处于一个心流的状态（例如在 TiDB 里面看到数据在集群内部分布不均或者有热点，就知道去修改调度策略或者手工 split region），但是新人在这一步总是会卡着，要么去 Google 要么去翻文档，内心OS：「我看到问题了，然后怎么办？」，如果这个时候，系统能够给一些接下来应该观测哪些指标，或者行动建议，会更加友好，目前能做到这一点的系统不多，如果能做到这一点，相信你的系统已经在可观测性上做得很棒了。把这个点放在可观测性的最后其实是想借着这个话题引出可交互性。\n\n## 可交互性\n\n在聊基础软件的可交互性之前，我想先和大家回顾一下计算机的历史，在我看来计算机历史的一个侧写就是人机交互的进化史：从第一张图，看着一堆线我也不知道怎么操作，到现在我从来没看过 iPhone 的说明书就能够熟练使用，这个背后其实是多个学科的进步（包括不限于心理学、认知科学神经科学、哲学、计算机科学）。\n\n![基础软件可观测性和可交互性-2.jpeg](https://img1.www.pingcap.com/prod/2_b382e9c5a0.jpeg)\n\n![基础软件可观测性和可交互性-3.jpeg](https://img1.www.pingcap.com/prod/3_fb9f1bba6f.jpeg)\n\n![基础软件可观测性和可交互性-4.jpeg](https://img1.www.pingcap.com/prod/4_a76af462aa.jpeg)\n\n![基础软件可观测性和可交互性-5.jpeg](https://img1.www.pingcap.com/prod/5_b8d1f75528.jpeg)\n\n![基础软件可观测性和可交互性-6.jpeg](https://img1.www.pingcap.com/prod/6_2835d7092b.jpeg)\n\n![基础软件可观测性和可交互性-7.jpeg](https://img1.www.pingcap.com/prod/7_6908136e59.jpeg)\n\n回到我们这个领域，基础软件这个领域因为离大众确实有点远，过去很多设计是由工程师完成的，我们这类人，普遍有点缺乏对人性的理解（no offense ），一个很典型的逻辑是：“我自己是人，所以我了解人。我的设计自己能理解，因为我是人，所以别的人也能理解。如果别人不会用，就去看看文档就好了（此时还有一个嫌弃脸）”。\n\n![基础软件可观测性和可交互性-8.png](https://img1.www.pingcap.com/prod/8_a085440c23.png)\n\n当我们复盘一些故障时，经常会得出「使用者操作不当」的结论，但是这真的是根因吗？我在之前的公司曾经历过一个事故给我留下了深刻的印象：当时内部有一个自己做的分布式文件系统，就像所有的文件系统一样，它有一个 shell，可以支持一些 UNIX Style 的命令操作。\n\n有一次，一个工程师执行了一行命令：rm -rf /usr /local/...（注意 /usr 后边的空格），然后系统很听话的开始删除自己...最后这件事情的复盘并没有责怪这个操作者，而是惩罚了这个系统的设计者（当时那个公司的老板），因为这是个坏的交互设计，哪怕在删除重要文件夹前确认一下或者通过权限系统保护一下都不至于发生这个事情，机器确实在按照逻辑工作，这个地方也没有 Bug（甚至这个删除还很高效，毕竟分布式系统 LOL）。\n\n在后来作为工程师漫长的岁月中，我渐渐理解到一个道理：**最好的工程师能在逻辑和感性中间找到一个平衡，良好的设计源于对技术和心理的理解，毕竟我们是在为人写程序**。\n\n作为软件的使用者，我们与其说是在使用，不如说我们是在和软件「对话」。那既然是对话，那么就意味着这是一个交互的过程，什么是一个好的交互体验呢？我试着总结一些写给软件设计者的原则，试着第一次干这事，不排除以后会补充。\n\n## 没人读文档：一条命令启动和探索式学习\n\n承认吧，没有人会看说明书。我们拿到一部新的 iPhone 时候，第一反应一定是开机（很神奇吧，我们似乎下意识就知道开机键在哪）肯定不是看说明书找开机按钮，开机就开始通过手指来探索新的世界，很浅显的道理，为什么在系统软件领域就要先熟读文档才能上岗呢？\n\n我经常教育我们年轻的产品经理：**“你的用户充其量会在你的 GitHub 首页或者文档的 Quick Start 部分上停留 10 秒，甚至连看完这个文档的耐心都没有，他们的潜意识会寻找「深色背景的字」（shell 命令），然后把里面东西复制到自己的终端里看会发生什么，除此之外啥都不会做，如果这第一条命令失败了，不会再有后面什么事了，所以记住你只有一次机会”。**\n\n一个小例子就是当时在做 TiUP（TiDB 的安装部署工具）的时候，我反复告诫 TiUP 的产品经理，首页里不要废话，就一句命令，贴进去就能用：\n\n![基础软件可观测性和可交互性-9.png](https://img1.www.pingcap.com/prod/9_09716cd9a0.png)\n\n<center>TiUP 的首页（tiup.io）截图</center>\n\n其实这个例子可以更延展一点，我记得疫情之前有一年我在布鲁塞尔参加 FOSDEM，晚上在会场附近的酒吧和一位来自英国的 DevOps 聊天，可能也是喝多了，他说：**“不能用一个 apt-get install 就安装成功的系统软件不是一个好软件”**，话糙理不糙。\n\n那你可能要问，如果确实有一些信息或者概念需要传递给用户，如果用认知心理学里面的概念，可称之为构建 Mental Model（心智模型），最好的方式是什么呢？我自己的经验是：**探索式的学习**。支持这种认知构建模式的系统通常需要有 Self-Explanatory 的能力，即告诉用户第一步（例如 iPhone 的开机）之后用户的每一步都能够利用上一步行为的输出，决定下一步的行为完成学习。\n\n举个例子：MySQL 的系统表想必 MySQL 的用户都不会陌生，你只要用一个交互式的 mysql-client 链接到一个实例上，也不用等着系统告知 INFORMATION_SCHEMA 里面有什么，只需要用户 SHOW TABLES 一下就知道了，然后再使用 SELECT * FROM 语句就可以一步步探索 INFORMATION_SCHEMA 里面具体表的内容。这就是一个 Self-Explanatory 的绝佳例子（这个例子里面有个前提就是 SQL 作为统一的交互语言）。\n\n另一个特别好的例子是 Telegram 的 Botfather，我相信给 Telegram 写过机器人的朋友一定会对 Botfather 的好用程度印象深刻，我放一张图你就懂了：\n\n![基础软件可观测性和可交互性-10.png](https://img1.www.pingcap.com/prod/10_eee53a8b17.png)\n<center>用 Telegram 的 botfather 创建聊天机器人的过程</center>\n\nTelegram 是一个聊天软件，Botfather 巧妙的利用了 IM 的交互模式应用到了一个相对枯燥的 bot 开发流程里面，而不是冷冰冰的丢给用户一个 URL [https://core.telegram.org/bots/api](https://core.telegram.org/bots/api) ，让用户自己研究去。\n\n这一节最后一句话想送给大家，有一个无从考究的都市传说是这么说的：鱼的记忆时间只有 7s，我想说，人也一样。祝你做出一个“鱼”都能用好的软件。\n\n## 帮用户多想一步，告诉用户半步，让用户自己走半步\n\n我很喜欢看科幻小说，很多科幻小说探索的一个终极哲学话题：我们是否真的有自我意识？尽管我们认为我们有，但是在软件输出 Unknown Error 的时候，你肯定希望有一个声音告诉你接下来该怎么办，对吧？\n一个优秀的基础软件，在输出负向反馈的时候，最好的做法就是建议开发者接下来该干嘛。我举一个很经典的例子，所有的 Rust 开发者都有过被编译器调教的日子，但是这个过程严格来说其实并不痛苦，比如，看下面的截图：\n```\nPlain Text\nerror[E0596]: cannot borrow immutable borrowed content `*some_string` as  mutable\n --> error.rs:8:5\n  |\n7 | fn change(some_string: &String) {\n  |                        ------- use `&mut String` here to make  mutable\n8 |      some_string.push_str(\", world\");\n  |     ^^^^^^^^^^^ cannot borrow as mutable\n```\n之所以不痛苦是因为编译器明确告诉了你哪里有问题、原因，以及下一步应该干嘛，普通编译器可能打印一个 cannot borrow as mutable 就仁至义尽了，但是一个好体验的编译器会多帮你想一步。\n\n回到自我意识的问题，我之前听过一个段子：一个测试工程师走进一家酒吧，要了 NaN 杯 Null，一个测试工程师化装成老板走进一家酒吧，要了500杯啤酒并且不付钱，一万个测试工程师在酒吧门外呼啸而过，一个测试工程师走进一家酒吧，要了一杯啤酒'；DROP TABLE，最后测试工程师们满意地离开了酒吧，然后一名顾客点了一份炒饭，酒吧炸了 LOL。  \n\n这个故事告诉我们，作为软件设计者，你永远没有办法穷举使用者的想法，与其让用户放飞想象力，不如你自己设计好故事线，一步步让用户跟着你的思路走。但是为什么还要留半步？我的答案：\n\n1. 「参与感」会带来幸福感，人有时候挺矛盾的，一边希望机器自动干完所有的事，一边还期待自己有主动权。有时候即软件已经知道下一步一定是做某些事情，但是留下临门一脚让操作者完成相当于把成就感都赋予了操作者。\n\n2. 选择的权利交给操作者，尤其在面对一些单向门的决定时，go or no-go 还是应该交给人。\n\n对于这点，我还有几个小建议：\n\n1. 对于一些操作可能会引发多个连续操作的模式（例如 terraform 的部署脚本，或者集群变更之类的功能），提供一个 Dry Run 模式是必要的，只输出操作，不执行操作。\n\n2. 对于上面这种批处理型的操作，尽可能设计 save point，不用每次都重新来（类似断点续传），体验会好很多。\n\n3. 遇到真的 Unknown Error 要输出各种帮助 Debug 的上下文信息，最后在错误日志里提示用户到哪个链接提 Github Issue，然后最好在 URL Link 里帮用户把 Issue Title 填好（让用户自己决定是不是发 Issue）。\n\n## 统一语言：控制器和控制对象\n\n我访谈过很多系统工程师，我有个必问的问题：你心中最好用的（数据库） cli 工具是哪个？绝大多数几乎下意识的回答 redis-cli。其实我自己也会给出同样的答案，后来我想这是为什么呢？\n\n![基础软件可观测性和可交互性-11.jpeg](https://img1.www.pingcap.com/prod/11_7103442535.jpeg)\n\n「控制器」-「被控制对象」是一个在基础软件中非常常见的模式，就像我们在操作电视机的时候，绝大多数时间是通过遥控器一样，所以可以认为用户对电视机的第一和大多数触点其实是遥控器，所以类比到基础软件中，对于控制器的设计其实非常关键，做好控制器，我觉得关键点是：\n1. 构建统一的交互语言\n2. 自洽且简洁的概念模型\n\n我稍微用 redis-cli 作为例子解读一下。使用过 redis-cli 的朋友都知道，所有的操作都遵循 [CMD] [ARG1] [ARG2] ... 的模式，在 redis-cli 没有例外，不管是操作数据，还是修改配置，所有的一切都在一个统一的交互语言下，而且这个语言一目了然，而且这个语言里面有一些很自然的约定，例如命令（CMD）永远是几个不包含符号的字母组成。\n```\nBash\nredis 127.0.0.1:6379> SET k v\nOK\nredis 127.0.0.1:6379> DEL k\n(integer) 1\nredis 127.0.0.1:6379> CONFIG SET loglevel \"notice\"\nOK\nredis 127.0.0.1:6379> CONFIG GET loglevel\n1) \"loglevel\"\n2) \"notice\"\n```\n<center>redis-cli 的交互例子</center>\n\n其实这点在刚才提到探索式学习那节 MySQL 的例子也是一样的，SQL 本身就是一个统一的交互语言，只是没有 Redis 这么直观。\n\n第二点是概念模型，Redis 的优势在于它是一个 Key-Value 数据库，所以概念很简单：一切都是 Key-Value，观察它的 cli 工具，你仔细品一品就知道，作者在尝试将所有的功能和交互都往这个 Key-Value 的模型上映射，这个是很自然的，因为我们之所以会使用 redis-cli，首先是我们接受了 Redis 是一个 KV 数据库的现实，所以在使用 redis-cli 的时候的一个自动就成立心智假设就是 Key-Value 模式，这在使用 cli 的时候一切的操作都会变得很自然。这一点在很多优秀的数据库软件里面应用的很多，例如 Oracle，理论上可以依赖 SQL 来对软件本身做所有操作，因为用户只要在使用 Oracle 就默认应该是知道关系模型和 SQL。\n\n说了正面的例子，我们聊个反例：大家知道 TiDB 主项目（不包括其他工具，例如 cdc、binlog）至少有 3 个 Controller 工具：tidb-ctl /tikv-ctl / pd-ctl，虽然 TiDB 确实是一个由多个组件组成的分布式系统，但是对于用户来说，多数时候使用对象其实是 TiDB 作为一个整体（数据库软件），但几个 ctl 的使用方式都不太一样，比如说 pd-ctl 是一个可交互式的控制器，而且影响的范围大概是 pd 本身和 tikv，tikv-ctl 的功能上也有一些交集，但是只是针对单个 tikv 实例使用，这点太令人费解了，tikv 明明是一个分布式系统，但是 tikv-ctl 却是一个针对单点的控制器？那么控制 tikv 到底应该用的哪个 ctl 呢？答案：多数时候用 pd-ctl（惊不惊喜，意不意外？）。\n\n就像你有一个电视机，但是需要用三个遥控器来控制，而且真正控制电视的那个遥控器叫做：机顶盒，这种问题在日常生活中大家都认为是一个理所应当的设计问题，但是在基础软件领域大家的容忍度怎么似乎突然就变高了？\n\n## No Surprise: 不怕麻烦，就怕惊喜（惊吓）\n\n我不知道是否是一个普遍现象，基础软件的用户在面对错误（尤其是因为坏交互造成的），通常会先自责和内疚，认为是自己的问题，很少会归因于软件。尤其是当能够比较熟练的操作一些复杂又分裂的软件的时候，很多人会觉得这是一种「技能」，毕竟没有人愿意别人看着自己的笨拙操作。\n\n这背后其实有着很深层次原因（Hacker Culture 里面多少有点崇尚复杂的倾向），但是我想说：这就是的软件的问题！就像我从不避讳说我就不会用 gdb，不是因为我智商不行而是因为这个东西真是太难用了。\n\n但是我见过很多人真的是以熟练使用命令行 gdb 作为炫耀的资本，回到前面提到的那个反例，我在一个 TiDB 的深度用户那边观察他们的操作员做日常的运维，这个操作员非常熟练的在各种 ctl 之间切换和操作，他不觉得有啥问题，甚至觉得有点厉害，后来我想了下，人的适应性还是很强的，真正让人困扰的事其实并不是麻烦，而是当你在对系统做出一个操作的时候，通常会带着一个下意识的假设，例如一个功能的名字叫「xx开关」的时候，用户在打开开关的时候的预期应该是有一个正反馈，但是如果结果并不是这样的话，用户会非常有挫败感。这里有个真实的故事，我们在 TiDB 5.0 里面引入了一个新功能，叫做 MPP (Massively Parallel Processing)，即大规模并行处理，我们有个开关配置叫做：tidb_allow_mpp\n\n![基础软件可观测性和可交互性-12.png](https://img1.www.pingcap.com/prod/12_0423123629.png)\n\n不知道大家有没有注意到问题：作为一个开关型的配置，当设置成 OFF 的时候，是一个 100% 的负反馈，这没有问题，但是问题在设置成 ON 的时候，这个功能是否启用会依赖优化器的判断，也就是有一定概率 MPP 功能不会生效，**这就像一个房间里有个控制灯的开关，当你关的时候，灯一定不会亮，当你开开关的时候，灯不一定亮（灯觉得房间内的光线足够，没必要亮...），你一定不会觉得这个灯智能，你一定会觉得灯坏了**。上面这个配置的一个更好的写法应该是:  \n\n```tidb_mpp_mode = ON | OFF | AUTO```\n\n这个写法我都不用解释，你也不用看文档，是不是一眼就明白怎么用？好配置应该是自解释的。通常来说，配置项是破坏用户体验的重灾区，后边讲反馈的时候展开讲讲。\n\nUNIX 哲学里面有一条「安静原则」，说的是如果程序没什么特别事情要表达，应该保持安静。具体的一个表现就是鼓励命令行程序如果成功执行，不需要输出东西的话，就直接以 0 作为 return code 退出就好了，其实对于这一点我是持保留意见的，用户的行为如果是符合预期的结果，应该用一个明确的正向反馈作为奖励（例如打印一个 Success 都好），不要忘了人性大师巴普洛夫。\n\n## 反馈：暴露进展，不要暴露内部细节\n\n刚才正好提到了反馈，我觉得将反馈称为好体验中最重要的一环都不为过。学过控制论的朋友的都知道反馈是非常重要的概念，前面提到的 Self-Explanatory 之所以是个好体验就是因为反馈的及时性。\n\n但是我惊讶的是，很多基础软件在交互反馈部分设计得糟糕得令人发指，举一个我熟悉的例子，某些数据库软件在接收到一个复杂查询的时候，当敲下回车，通常就 Hang 在那里了，可能确实数据库程序在后边辛苦的检索和扫描数据，然后隔了几分钟直接返回一个结果（或者挂了），过程中并没有反馈扫描了多少数据和预期要扫描多少数据，其实这个体验是很差的，因为这个信息就是进展（这点上 ClickHouse 做得很好）。反馈是需要精心设计的，我的几个经验是：\n\n1.反馈一定要即时，最好是敲完回车后 200ms 内一定要有反馈（人的生理反应时间，超过这个时间反馈人就会有卡顿感），顺滑的感觉是靠反馈创造的。\n\n2.反馈进展，不要反馈细节，不要反馈需要上下文才能读懂的细节（除非是 Debug Mode），这里给出一个我们自己的反例（[https://asktug.com/t/topic/2017](https://asktug.com/t/topic/2017)）：\n```\nBash\nMySQL [test]> SELECT COUNT(1) AS count, SUM(account_balance) AS  amount, trade_desc AS type FROM b_test WHERE member_id = 「22792279001」 AND detail_create_date >= 「2019-11-19 17:00:00」 AND detail_create_date < 「2019-11-28 17:00:00」 group by trade_desc;\nERROR 9005 (HY000): Region is unavailable\n```\n这个 Case 坏在哪里呢？很显然，对用户来说，Region 是一个 TiDB 内部概念，一个很自然的问题是：什么是 Region（我在前面埋了个伏笔，不知道你注意到没有）？为什么 Select 数据和 Region 相关？为什么 Region is unavailable？我该怎么解决这个问题？暴露给用户这个信息是无用的，反而给用户创造了噪音。这个 Case 的原因是 TiKV 太忙，无法返回需要的数据，一个更好反馈应该是：具体的哪台 TiKV 因为哪些数据（用用户能理解的形式，如：哪张表，哪些行）读取不出来是因为 TiKV 太忙，最好还能告诉用户为什么忙，怎么解决，实在解决不了至少贴个 FAQ 的链接（我见过有软件直接贴 StackOverflow 的 Search URL 的 LOL）。\n\n3.对正反馈设置一些 milestone，例如一个服务器程序开始正常对外提供服务的时候，打印一个 Ascii Art，不同日志级别用一些带颜色 Label，这是给用户一个明确信号，这点 redis-server 做得很好。  \n\n通常对于可交互命令行程序的反馈还是容易设计的，一个非常麻烦的事情是，基础软件通常非常依赖配置文件，配置的问题就是修改配置到确认生效的反馈周期通常很长，一个经常的场景是：修改配置 - 重启 - 观察效果，而且通常配置是存储在配置文件里面，这也造成修改文件操作的反馈感是极差的，因为用户也不知道到底这个操作有没有生效，尤其是一些配置的生效并不是太明显，一些比较好的实践如：程序在启动的时候打印一下读取了哪个配置文件以及这个配置文件的内容是什么；设计一个类似 print-default-config 之类的命令行功能，直接输出模板配置，省得用户自己 Google。\n\n另外对于分布式系统来说，配置的问题更加复杂，因为存在并不是本地配置和全局配置的区别，以及更新后的配置分发的问题，包括滚动重启的问题（重启进程才能让配置生效本身就不是一个好设计），老实说目前我还没有特别好的方案，可能的思路是是使用类似 etcd 这样的分布式全局配置中心或者（对于数据库来说）通过一些全局的配置表来实现。但是总体的原则是：集中比分散好；即时生效比重启生效好；统一交互（修改和读取配置的方式）比多种方式交互好。\n\n## 写在最后\n\n终于写得差不多了，但是这篇文章我觉得仅仅是抛砖引玉，一定还有很多好的实践没有总结出来，也希望有想法朋友找我一起探讨，我揭晓一下最开篇留下的一个悬念，为什么要在第一篇文章中将可观测性和可交互性放在一起写，其实这个是来自经典的认知心理学中的人行动的模型<sup>[3]</sup>：\n\n![基础软件可观测性和可交互性-13.png](https://img1.www.pingcap.com/prod/13_30cbc0011d.png)\n\n当用户使用软件时，需要面对的两个鸿沟：一个是执行的鸿沟，在这里，用户要弄清楚如何操作，与软件「对话」；另一个是评估的鸿沟，用户要弄清楚操作的结果。我们作为设计师的使命就是帮助用户消除这两个鸿沟，正是对应到文章中的可观测性和可交互性。\n\n设计出使用起来令人愉悦的软件是一门艺术，也不见的比设计出一个精妙的算法或者健壮的程序简单，从某种意义上来说更加难，因为这要求设计者真的要有对人和软件两者都有深入的理解以及倾注感情，最后送给大家一段来自 Steve Jobs 的话共勉：  \n\n**The design is not just what it looks like and feels like. The design is how it works.**\n\n参考:\n\n[1]: [我眼中的分布式系统可观测性](https://pingcap.com/zh/blog/observability-of-distributed-system), 黄东旭, 2020  \n\n[2]: [Overtaxed Working Memory Knocks the Brain Out of Sync | Quanta Magazine](https://www.quantamagazine.org/overtaxed-working-memory-knocks-the-brain-out-of-sync-20180606/)  \n\n[3]: The Design of Everyday Things, Donald Norman, 1988 ","date":"2021-10-15","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"how-to-develop-an-infrasoft-observability-and-interactivity","file":null,"relatedBlogs":[]},{"id":"Blogs_129","title":"数字化加速，如何做到数据保鲜和数据价值变现？ — TiDB 行业应用场景及案例解读","tags":["TiDB"],"category":{"name":"观点洞察"},"summary":"本文将分享企业级分布式数据库产品 TiDB 如何帮助企业用户完成数字化转型。","body":"​全球经济数字化转型是大势所趋。加快数字经济发展，推动数字化变革已经成为未来十年经济发展的重要推动力。数字化增长带来新机遇，DTC（Direct To Customer）的模式在众多企业成为获取与服务最终客户的新趋势，但据分析机构报告显示，在全球数字化转型中，大数据项目只有 30-40% 的成功率，通过简化基础的数据平台赋能数字化转型成为一个关键话题。\n\n本文为 PingCAP 解决方案事业部总经理余军在 TiDB 5.0 发布会上进行《Insightful User Case - TiDB 行业应用场景解读》演讲的实录整理，**分享企业级分布式数据库产品 TiDB 如何帮助企业用户完成数字化转型。**\n\n## 数字化转型中的数据价值变现\n\n2020 年全球发生了新冠疫情，在疫情的影响下，各种线下经济活动都加速过渡到线上，数字化转型加速，各种在线服务平台，从在线办公、在线医疗、在线教育，到在线娱乐均得到爆发式增长。2020 年之后，越来越多的企业在考虑如何进一步利用数字化的能力帮助企业完成在整个线上移动端、互联网端的业务闭环，DTC（Direct to Customer) 的业务模式成为了趋势，更多的企业都有了数据架构转型升级的需求。\n\n数据处理在历史上曾经经历过几个阶段，到今天在数字化转型大潮崛起的形势下，数字化技术处理要求发生了巨大的变化，这些变化**主要集中在以下三点：**\n\n1. **数据保鲜**：数据量级大且要求处理快，同时需要对实时数据的实时价值进行充分保鲜；\n\n2. **端到端闭环**：从互联网移动端到在线企业级服务中需要一个完全闭环的数据驱动；\n\n3. **数据价值变现**：在数据驱动的趋势下，很多企业级应用已经脱离了传统的数据服务和数据支撑的基础架构，快速转向了以事件驱动、数据驱动为主的数据变现主题。\n\n![1](https://img1.www.pingcap.com/prod/1_35b5ad1cc6.png)\n\n在整个数字化转型的过程中，我们认为数据有两个非常核心的要素：第一，各种各样业务发生之际随之而来就产生了新鲜的数据，如何让新鲜数据一直保有实时性的承载价值；第二，当这些新鲜的数据产生之后，如何及时利用新鲜数据完成业务上的快速变现，比如说帮助企业用更低的成本获得更多的客户、如何更高效的推动企业营销活动、如何通过对数据更进一步的实时的观测和分析，来完成业务上的洞察和实时决策等。\n\n## TiDB 企业级关键能力\n\n我们来看一下 TiDB 在数字化转型过程当中，如何利用它的先进架构和技术的支撑能力，加速企业数字化转型的进程。\n\n### 现有方案在联机及实时处理领域的痛点\n\n我们将在线直接承接业务交易的业务系统称为联机系统，这些联机系统是业务产生新鲜数据的第一个阶段。经过多年的发展，数据管理及数据的使用方式已经发生了很大的变化，但是对于新鲜数据的保有和处理技术还停留在四五十年以前的技术。比如常见的利用一些传统关系型数据库、半结构化数据处理技术来承担新鲜数据的产生及加工工作，在这个过程中不可避免需要利用不同数据技术的支撑能力、在不同的数据技术栈中去做数据处理的情况，进而产生了所谓的”**数据孤岛**”现象。\n\n为了解决”数据孤岛”问题，业界推出了大量的分散的数据技术栈；如数据同步工具、数据加工工具、各种各样的长线管道等方式去解决不同数据栈间的数据打通问题。在这个长链路，复杂链路的数据处理过程当中，新鲜数据虽然产生了但最终已经无法再保鲜了。同时，整个处理链路过长，导致数据与时间维度所绑定的实时性价值丢失。另一方面，从业务的视角来看，要获\n得全局性新鲜数据的统一视图，在如此复杂的管道网络及复杂数据处理链路的交织局面下也变得非常困难。\n\n作为企业来说，**当新鲜数据产生后往往希望采用通过各种各样的手段将数据进行商业价值的变现，换句话说，也就是我们会对这些数据进行业务驱动下的二次加工，来为不同业务系统提供数据消费能力。** 目前在业界，通常不得不采用非常复杂的数据技术栈复合体来支撑，比如对于查询要求较高的联机查询，可能通过 MySQL 或者 Oracle 这类数据库来支撑；对于汇总类的、明细类的，一般会采用如 ClickHouse 或者 Elasticsearch 来分而治之；包括业界很早推出且一直用到今天的传统的 MPP 架构数据仓库产品来进行一些报表和多维离线的分析。这个过程无论从数据的保鲜到数据的价值变现，整个实时性和数据的统一视图对业务的支撑价值的能力都不可避免丢失了。\n\n### TiDB 解决之道\n\n对于 TiDB 来说，**我们从产品设计之初就充分考虑企业级数据处理服务过程中的技术支撑能力**，对于新鲜数据的产生制造，TiDB 通过它的 OLTP Scale 能力，也就是高扩展的面向敏态业务的联机数据处理能力来确保新鲜数据能够实现生产后保鲜，并且能够以极高的效率来完成联机侧的高扩展性的数据支撑服务，同时最重要的就是确保它的实时能力。\n\n![2](https://img1.www.pingcap.com/prod/2_6eece1ff65.png)\n\n当企业需要对新鲜数据进行有效的、快速的价值变现时，TiDB 在技术侧提供了 Realtime HTAP 的实时数据处理及分析的能力，结合行列混合、透明计算服务的能力，可以为企业提供包括实时监控、实时大屏、实时营销、实时风控、实时查询、实时数仓等，既能够保证数据的统一，又能够保证数据消费的实时性，以及通过多样维度来进行数据的价值变现。\n\n## TiDB 助力行业数字化\n\n那么 TiDB 是如何在数字生活的方方面面为企业提供相关服务的呢？\n\n### OLTP Scale：面向金融核心交易场景\n\n![3](https://img1.www.pingcap.com/prod/3_7e54b491ef.png)\n\n亿联银行是国内一家持牌的互联网银行，除了具有传统银行相关的标准业务外，最主要是拥有互联网的属性，有很多业务来自于互联网的流量。对于这类用户来说，TiDB 通过与用户方的深入合作，完成了对亿联银行分布式核心系统项目的建设工作：\n\n- **支撑了亿联银行整个核心的交易系统**\n\n比如核心账务、核心贷款、支付系统、用户中心、资产证券化、人行征信报送、贷款对账等一系列关键交易业务；\n\n- **多中心多活容灾**\n\n北京与长春的两地多中心多活容灾为核心交易保驾护航，以及从 Oracle 系统到 TiDB  迁移的各方面建设的支持工作；\n\n- **为未来就绪**\n\n在未来的互联网场景中，提供高度扩展的业务支撑能力，在 OLTP Scale 方面面向金融核心交易场景的能力，能够帮助金融机构完成核心相关的业务支撑。\n\n### OLTP Scale：面向金融敏态交易场景\n\n平安人寿是国内知名的保险公司，利用 TiDB 完成了“金管家”的在线金融联机交易服务。\n这类业务场景有非常明显的一个特点：**短时高峰交易**。\n\n![4](https://img1.www.pingcap.com/prod/4_184e1d2498.png)\n\n在 2019 年到 2020 年的两年中，平安人寿通过运营“1.08 财神节”活动，构造了单日成交额超过 1000 亿，突破在线保险和理财产品相关的交易记录。这背后是几百个 TiDB 数据库实例在提供运营保障，完成了整个短时高峰交易的支撑。\n\n基于 TiDB 高扩展性、高吞吐量、高联机处理能力等特点，平安人寿的金管家项目顺利完成了整个运营日的交易。\n\n### OLTP Scale：面向金融高增长交易场景\n\n日本排名前列的移动支付公司，在政府推动无现金社会的政策支持下，支付业务正迅速扩张。目前日本大约有 1 亿人口，其中有 2900 万用户和 200 万商家在使用该公司支付服务，近期交易量已达到 10 亿。\n\n![5](https://img1.www.pingcap.com/prod/5_c336149074.png)\n\nTiDB 通过**在线的高吞吐能力和在线扩展能力**，顺利帮助用户从原有的 Amazon Aurora 的数据库转向了 TiDB 的平台，解决了过去以往在高峰支付交易过程当中的性能扩展性问题。\n\n### OLTP Scale : 面向零售高增长交易场景\n\nTiDB 与全球领先的餐饮巨头一起合作，完成了它的订单中心、用户中心、卡券中心以及积分中心相关的关键联机高并发、高扩展系统的核心数据库上线工作。\n\n同时与用户充分研究，如何利用 TiDB 在云原生架构方面的优势，将 **TiDB 和 K8S 的结合**，完美落地在用户的生产环境。同时，通过 TiDB **原生的、高可用、多中心和容灾的**保障能力确保了整个 7×24 小时的业务的支撑。\n\n### Real time HTAP : 面向金融实时数据服务场景\n\n刚才讲完了 TiDB 如何利用 OLTP Scale，也就是高扩展性、敏态的数据联机支撑的能力来为企业提供高并发数据处理服务。我们回头来看，用户如何利用 TiDB 来实现数据价值的快速变现。\n\n![6](https://img1.www.pingcap.com/prod/6_7f433f99ee.png)\n\n我们正在与国内头部的城商行北京银行建设综合数据实时服务平台，这套系统实现了以下**几个重要的功能**：\n\n- **核心系统减负**。从 AS400/DB2 核心环境实时数据同步汇聚到 TiDB，包含手机银行交易等过百亿数据规模交易记录，提供实时联机查询。\n\n- **数据服务化**。规划汇总多样性数据源汇聚到 TiDB 完成综合数据服务能力的搭建。\n\n- **场景多样化**。TiDB 提供的行列混合及 Real time HTAP 能力支撑更多样的数据消费服务。\n\n- **金融级安全**。在北京银行落地包括网联支付，信用贷款等多种关键系统，多年 “0 故障” 运行保障成绩。\n\nTiDB 在北京银行已经落地有两年时间，在这样一套业务平台当中我们也会继续以往这样的零故障的运行保障成绩，继续为北京银行提供安全可靠稳定的服务。\n\n### Real time HTAP : 面向金融的实时数据服务中台\n\n我们在过去的一年当中，也为某金融企业建设了 T+0 的实时数据服务中台，这套 T+0 实时数据服务中台，支撑着整个公司从运营域实时明细数据查询到实时的统计分析查询类相关的数据服务。同时业务支撑也包括对交易数据的查询，比如经常会用到的二维码支付、后端的收单、转接、全渠道服务以及它的国际业务等。\n\n![7](https://img1.www.pingcap.com/prod/7_5e8ab205a6.png)\n\n由于 TiDB 具有在线的扩展以及弹性能力，所以这套 T+0 的实时数据服务中台，在整个扩容的过程当中，都是采用在线的**热扩容方式**。同时如我前面所说，这个例子利用 TiDB 内置的高可用的技术完成一个金融级的 T+0 数据服务实时中台服务。\n\n### Real time HTAP : 贝壳金服的数据服务实时中台\n\n![8](https://img1.www.pingcap.com/prod/8_6f45921f0f.png)\n\n贝壳金服是贝壳集团旗下的金融服务公司，为贝壳的用户提供在租房和买卖房屋过程当中的融资租赁的金融服务。我们与贝壳金服的数据团队一起合作也实现了一套实时数据的服务中台，在这套系统当中我们通过将 TiDB 与包括 Flink、Kafka 之类的流式计算系统成功进行了融合，实现了一套实时的数据处理、数据加工以及数据同步的数据支撑平台。\n\n### Real time HTAP : 面向物流实时数据服务场景\n\n![9](https://img1.www.pingcap.com/prod/9_dea1bb24bd.png)\n\n在 2020 年期间，我们与国内知名的物流快递公司中通快递完成了实时数据分析的处理平台。\n\n通过将中通的十多个数据消息源进行实时的汇聚：通过 TiDB 之上的 TiSpark 的能力来汇聚超过 10 个 Topic 以上的数据消息，再通过 TiSpark 实时写入 TiDB。在 TiDB 端会进行非常复杂的计算，在 TiDB 存储 70+ 列的宽表：汇聚多个消息 Hive 维表 Join 并实时再写入 TiDB ；同时我们整套平台也提供了非常高效的支撑中通快递，包括重要的二次派件的业务场景的支撑，整个 TiDB 平台能够在 10 分钟内处理三亿多条数据，达到差不多每秒钟 50 万左右的 QPS。\n\n在过去的六年中，经过所有 PingCAP 工程师与社区的不懈努力，**在主干产品 TiDB 中实现了面向企业级的 OLTP 规模化、高扩展、敏态的联机交易以及基于 Realtime HTAP 的实时数据服务这样的能力**。通过这些能力的构建，能够帮助企业快速高效地去完成数字化转型工作。TiDB 已经成为数字化加速背景下企业数据保鲜和数据价值变现的关键基础设施。\n\n> 更多 TiDB 5.0 发布会相关内容：  \n[PingCAP 发布 TiDB 5.0 里程碑版本 构建一栈式数据服务平台](https://pingcap.com/zh/blog/what-is-the-next-tidb-5.0)；  \n> [成为一栈式数据服务生态： TiDB 5.0 HTAP 架构设计与场景解析](https://pingcap.com/zh/blog/tidb-5.0-htap-architecture-design-and-become-scenario-analysis)","date":"2021-05-13","author":"余军","fillInMethod":"writeDirectly","customUrl":"how-to-keep-data-fresh-and-how-to-realize-value","file":null,"relatedBlogs":[]},{"id":"Blogs_24","title":"「我的工作是制造混沌」，我与 Chaos Mesh 的故事","tags":["Chaos Mesh"],"category":{"name":"观点洞察"},"summary":"本文将向大家介绍自己与 Chaos Mesh 一起成长的点滴。","body":"> 作者：殷成文，Maintainer of Chaos Mesh\n\n这段时间北京真是冷得可怕，朋友圈晒出各种零下 20 度的照片，在这样一个寒冷的时候，总是想给自己找点温暖的事情去做。这几天闲时就回顾起自己从实习到现在这段时间的经历，前不久是 Chaos Mesh 开源一周年（2020.12.31），于是就将自己与 Chaos Mesh 一起成长的点滴整理出来和大家分享。 一方面为了庆祝，另一方面也希望能够在这个寒冷的冬天给大家带来点温暖。 \n\n## 与 PingCAP 结缘\n\n开始 Chaos Mesh 故事之前，先说点自己和 PingCAP 的故事。\n\n第一次真正接触 PingCAP 是在 2016 年的时候，我参加了一场 PingCAP CTO 黄东旭大佬的技术分享，正好当时在参与一个 Go 语言项目，对 Go 语言生态更加关注，对 Go 圈里的明星项目 TiDB 更是佩服。本以为这会是一个很有深度的分享，会涉及数据库、CAP 定理等等。没想到最后东旭和我们聊了一个小时的 Unix  哲学，说好的数据库？说好的 CAP 定理呢？ 相信当时好多小伙伴和我的心情是一样的——懵逼。但 PingCAP 这个公司却更加吸引我了。 \n\n再次接触 PingCAP 是陪同学一起去北京面试的时候，偶然在 Go 社区看到 PingCAP 的一条实习生招聘信息，一下就被吸引了，在同学的撺掇下就尝试投个简历试一下。 当天晚上八点左右，我就接到秋哥 (PingCAP 创始人崔秋) 的电话，说他们正在 TB，在一家烧烤店撸串看足球，问我要不过去聊聊。当时把我惊到了，哪有大晚上约人去烧烤店面试的！到了烧烤店，他们还真是在看足球，我记得当时还是中国队的比赛，这场神奇的面试就和这场球赛同步进行着。最后球赛结束，中国队输了，但我收到了个 offer，感谢中国队！给了我这次机会！\n\n## Chaos Mesh 前世 \n\n上面聊了一下我与 PingCAP 结缘的故事，下面就是我与 Chaos Mesh 的故事。 \n\n正式来 PingCAP 实习前，我在某个周六的上午去参加了一期 PingCAP 组织的 Meetup。小小的会议室里面挤满了人，大多数人都是站着的。我记得其中一个主题是由 PingCAP 另一位创始人兼 CEO 刘奇带来的《深度探索分布式系统测试》，奇叔的分享给我留下了深刻的印象。我第一次知道测试还可以这样搞，各种故障注入手段层出不穷，目的就是为了去虐我们的系统。现在想想，当初奇叔分享的不正是混沌工程的思想，同样没有想到的是这个主题会成为我后面一段时间内持续耕耘的事情。\n\n![1](https://img1.www.pingcap.com/prod/1_2ba91a04f0.png)\n\n正式开始实习后，我的第一个任务是对 TiDB 进行性能压测。如果只是想简单地跑出一组数字，这就是一个很简单的任务。但是如果需要去找目前集群的性能瓶颈，并找到集群拓扑的优化方案，这个任务就变得不那么简单了。也正是因为这个任务，让我开始学习 TiDB 的架构设计，以及传说中的玄学调参。这里大家可能觉得和我说的和混沌工程无关，其实不然，在混沌工程中，状态检查以及压力模拟是两个必不可少的步骤。同样从这个任务开始，后续我的很多事情都跟测试或者捣蛋有关。\n\n### CTO 捣蛋事件  \n\n大多数情况下，我们都希望系统环境越稳定越好，但是往往情况并不是如此。为了更好地验证系统稳定性以及快速恢复能力，我们的 CTO 东旭大佬，在我们的 IDC 业务测试集群搞起了突然袭击。当时是一个非常重要的用户上线前夕，我们内部有一整套业务测试集群，为了测试系统的可靠性和故障自恢复能力，东旭大佬深夜连上 TiDB 服务器，直接暴力删除物理文件，重启机器各种骚操作，记得当时还真是把许多研发大佬惊出一身冷汗，还好，最后我们的系统抗住了 CTO 的捣蛋。  \n\n程序员都是懒惰的，这个事件之后我们就开始谋划着如何去偷懒，其一是手动实验很难持续，其二是为了更加全面地测试 TiDB ，做一个数据库其实不难，但是如何证明一个分布式系统的正确性和健壮性确是一件很有挑战的事情，而且同时要将这个事情做得高效，自动化就是一个更大的挑战，为了保证每次发出去的版本都是通过各种摧残的版本。我们开始了自动化混沌工程之路，Schrödinger 项目开始登上舞台。\n\n### 开始 Schrödinger 之旅   \n\n![2](https://img1.www.pingcap.com/prod/2_1460f94aee.png)\n\n从项目名字就能看出来我们的设计思想：把待测试集群看作盒子中的猫，然后不断给这个盒子增加各种异常，最后检验这只猫的状态。\n\n用技术的语言来说，Schrödinger 的核心思想很简单，使用 K8s 作为底座，将不同的 TiDB 测试集群以及测试用例跑在一个个受控的容器集群中（盒子），然后对底层的容器平台进行错误注入。\n\n开始 Schrödinger 项目还是 2017 年九月份的时候，遇到的第一个挑战就是如何去管理多 TiDB 集群，那时候我们有两个方案：一是使用已经比较成熟的 tidb-ansible 为底座自己去搞个多集群的管理；二是选择刚刚开始搞没多久的 tidb-operator。在和老大简单沟通后，Schrödinger 就成为了 tidb-operator 的第一个用户，作出这个选择的主要原因是我们坚定不移的云原生方向。 \n\n![3](https://img1.www.pingcap.com/prod/3_6fa6b576d6.png)\n\n### 后 Schrödinger 时期 \n\n经过一年多的时间，Schrödinger 项目逐渐稳定。 同时随着 TiDB 生态的不断成熟，各类周边工具 [TiCDC](https://github.com/pingcap/ticdc)、[TiDB Data Migration](https://github.com/pingcap/dm)、[TiDB Lightning](https://github.com/pingcap/tidb-lightning) 等的出现，测试需求也越来越多。逐渐地，我们发现把这些工具接入 Schrödinger 的困难越来越大。应该是在 19 年初，在和部门老大一起吃饭的时候，聊起这个事情，当时他提了个想法，建议我们可以把故障注入能力单独抽象出来，故障定义成 [CRD](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) 对象，并使用 [controller](https://kubernetes.io/docs/concepts/architecture/controller/) 的方式去监控管理故障对象。听到这个想法后，我顿时感觉一扇新的窗户被打开了。\n\n## Chaos Mesh 这一年\n\n2019 年九月份提交了 Chaos Mesh  迟到半年的第一个 Commit。可能和很多项目一样，Chaos Mesh 第一个 Commit 只有一行，初始化 README 文件。 \n\n![4](https://img1.www.pingcap.com/prod/4_30c454fc4e.png)\n\n经历了一个月的开发，Chaos Mesh 终于具有了最基本的功能，这个时候也迎来了 Chaos Mesh 的第二位开发者[可奥同学](https://github.com/YangKeao)，当时可奥同学还是实习生，可是战斗力十足。在后续的一个月里，可奥同学推动使用 [Kubebuilder](https://github.com/kubernetes-sigs/kubebuilder) 替换之前原生的 controller, 进一步优化了 Chaos Mesh 中多 controller 的逻辑，进一步拥抱生态。看到自己写的代码逐渐被优化掉，刚开始还真是有点不舍。\n\n### 开源之路\n\n经过三个多月的密集开发，期间将很多混沌测试成功迁移到 Chaos Mesh 后，我们决定在年底把这个工具开源出去。希望这个工具能够帮助到有需求的小伙伴，也希望能够借助社区的力量更好地推动 Chaos Mesh 发展。\n\n开源前的几天，是我们几个人(我，强哥，可奥)最忙的时候：测试、文档、视频、文章齐头并进。有些小伙伴可能觉得开源不就是把源码公开就可以了吗？但是从我们以往的经验来看，一个好的开源工具，只开放源码远远不够，想要用户放心快速地使用，必要的测试，入门教程，原理介绍这些都必不可少，完善的文档更是尤为重要。\n\n实现一个功能往往很简单，但是想要用户放心快速地使用，则需要花费更多的精力。有时候，我们经常看到某某用户在使用某些开源工具时，会经历踩坑到弃坑，分析其中原因，往往归结于文档的缺失，如果这样的用户多了，那这个工具将最终被社区所抛弃。为了能够分享给大家一个开源即可用的工具，我们在开源前这几天一直努力查漏补缺，不断测试，完善文档。努力总是会有收获，终于，我们在 2019 的最后一天顺利开源了 Chaos Mesh。\n\nChaos Mesh 开源消息发布的当天，直接登上了 Hacker News 首页，后面连续几天还登顶 Github Go 语言 Treding 项目榜首。Chaos Mesh 的火爆出乎了我的意料，但是开心的同时也多了些压力。\n\n![5](https://img1.www.pingcap.com/prod/5_01d6c94aa1.png)\n\n### 加入 CNCF \n\n云原生从 Chaos Mesh 创立之初就写在项目的基因里，成为云原生混沌事实标准一直是我们坚定不移的目标。为了更好地实现我们的目标，让更多的人，乃至全世界的人都可以享受到 Chaos Mesh 的红利，根据之前 TiKV 项目托管到 CNCF 后快速发展的经验， Chaos Mesh 开源后，我们就开始探索把 Chaos Mesh 托管到 CNCF。\n\n经过调研，CNCF 生态中刚好缺少一个推动混沌工程标准的项目，这更加坚定了我们把 Chaos Mesh 托管到 CNCF 的决心。这里不得不说的是 PingCAP 的理想主义和坚定的全球化战略，让我们在做任何项目的时候，都是毫无保留，考虑的不再是简单的某几个人，而是整个生态，整个世界。这进一步坚定了我们把 Chaos Mesh 去和全世界分享的决心， CNCF 正是一个最佳的选择与平台。在短暂准备后，我们就开始了这段漫长的托管申请之路。\n\n![6](https://img1.www.pingcap.com/prod/6_d4a0b85c0c.png)\n\n在申请期间，也发生了很多故事，惊险不断。期间，CNCF 修改了选择 Sandbox 项目的规则，直接导致我们的申请被延期，甚至还出现了一家和 Chaos Mesh 同名的公司，这些意外都一度让我们紧张。同时，为了更好地适应社区发展，我们构建了更加完善的自动测试流程，建立了 Chaos Mesh 的官方网站，增加了开发者指导等等，为 Chaos Mesh 社区之后的发展打下来坚实的基础。最终在 2020 年七月的 CNCF TOC 会议上，Chaos Mesh 成为 Sandbox 项目的提案通过了。\n\n![7](https://img1.www.pingcap.com/prod/7_b11e86fece.png)\n\n[加入 CNCF](https://chaos-mesh.org/blog/chaos-mesh-join-cncf-sandbox-project) 是 Chaos Mesh 在过去一年里的重要里程碑，这对我个人也产生了深远的影响：第一次进行英文分享，第一次和大家一起组织社区会议，同时我对 Chaos Mesh 项目的目标也有了全新的认识和想法。\n\n### 角色转变 \n\n随着 Chaos Mesh 项目的成长，小小的团队也渐渐扩大起来，不断有新的力量加入我们：有了专业的前端工程师，有了更多有经验的小伙伴，同时我们的社区开始茁壮成长。还记得最初我们开发新功能的时候，就是觉得这个需求有道理，那就开始搞。现在发现，当初的模式虽然效率高，但是缺乏思考，往往会实现一些没有实际用途的功能。社区的发展推动我们必须转换自己的角色，因为 Chaos Mesh 项目不再是几个人的项目，而是一个社区化的项目，我们也只是社区中的普通一员。同时， Chaos Mesh 也逐渐建立起了用户群体，我们每一个 PR 都要对社区和用户负责。为此我们创建了 [RFCs](https://github.com/chaos-mesh/rfcs) 仓库，用来收集和讨论 Chaos Mesh 的需求和设计。如此一来，既保证了我们的设计都经过社区的讨论和认可，也在一定程度上能够吸引更多小伙伴一起帮助 Chaos Mesh 项目成长。 \n\n![8](https://img1.www.pingcap.com/prod/8_20c7882537.png)\n\n我们始终相信一个优秀的开源项目，一个人或者几个人的力量是远远不够的，为了吸引更多的小伙伴加入到 Chaos Mesh 项目中，让更多人能够参与进来，Chaos Mesh 为之做了更多工作和努力。\n\n除了 RFCs 仓库以外，我们对 Issue 进行了更多的分类，把遇到的问题和发版计划都通过 Issues 公开，对于刚接触 Choas Mesh 的小伙伴，带有 “[good first issue](https://github.com/chaos-mesh/chaos-mesh/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)” 标签的 Issues 是一个好的开始，如果有想要在我们后续的版本中加入某些功能，可以在我们的 [Release Issues](https://github.com/chaos-mesh/chaos-mesh/issues/1395) 留下评论，一起讨论。除此之外，我们提供了完善的[开发者文档](https://chaos-mesh.org/docs/development_guides/development_overview)，帮助开发者快速开始 Chaos Mesh 的开发之旅。当然如果想好和我们进行进一步交流沟通，可以加入到 [CNCF Slack](https://slack.cncf.io/) 并搜索 #project-chaos-mesh channel，参与到我们的讨论中来。另外，我们在每个月的最后一个星期四晚上定期举行[社区会议](https://docs.google.com/document/d/1H8IfmhIJiJ1ltg-XLjqR_P_RaMHUGrl1CzvHnKM_9Sc/edit?usp=sharing)，一起讨论 Chaos  Mesh 的问题以及后续计划，并且会定期邀请社区的小伙伴一起分享自己的 Chaos Mesh 经历。期待更多小伙伴加入我们，一起打造更加开放、友好的 Chaos Mesh 社区！\n\n这里我就不多分享 Chaos Mesh 项目本身的成长了，如果有兴趣，可以期待后面我们对 Chaos Mesh 的一周年总结。\n\n## 最后 \n\n从 2016 年底到现在，意外地加入 PingCAP，意外地与混沌工程结缘。在这四年里自己见证了混沌工程在 PingCAP 的探索和应用，也伴随着 Chaos Mesh 从 idea 阶段到落地实现。其实上面的经历算不上轰轰烈烈，只是在这个一周年的特殊时刻，自己的一点小矫情罢了。 \n时间在继续，我和 Chaos Mesh 的故事也才刚刚开始。在接下来的日子里，挑战不止，精彩无限存在！我将与社区一起努力，将 Chaos Mesh 打造成为真正的混沌工程标准！Chaos Mesh，未来可期！ \n\n最后附上 Chaos Mesh 社区调查链接，填写有惊喜哦：[https://bit.ly/2LzES5o](https://bit.ly/2LzES5o)","date":"2021-01-14","author":"殷成文","fillInMethod":"writeDirectly","customUrl":"my-story-with-chaos-mesh","file":null,"relatedBlogs":[]},{"id":"Blogs_84","title":"云原生数据库设计新思路","tags":["TiDB"],"category":{"name":"观点洞察"},"summary":"本文将向大家分享分布式数据库的发展趋势以及云原生数据库设计的新思路。","body":"> 本文作者为 PingCAP 联合创始人兼 CTO 黄东旭，将分享分布式数据库的发展趋势以及云原生数据库设计的新思路。\n\n在讲新的思路之前，先为过去没有关注过数据库技术的朋友们做一个简单的历史回顾，接下来会谈谈未来的数据库领域，在云原生数据库设计方面的新趋势和前沿思考。首先来看看一些主流数据库的设计模式。\n\n## 常见的分布式数据库流派\n\n分布式数据库的发展历程，我按照年代进行了分类，到目前为止分成了四代。第一代是基于简单的分库分表或者中间件来做 Data Sharding 和 水平扩展。第二代系统是以 Cassandra、HBase 或者 MongoDB 为代表的 NoSQL 数据库，一般多为互联网公司在使用，拥有很好的水平扩展能力。\n\n第三代系统我个人认为是以 Google Spanner 和 AWS Aurora 为代表的新一代云数据库，他们的特点是融合了 SQL 和 NoSQL 的扩展能力，对业务层暴露了 SQL 的接口，在使用上可以做到水平的扩展。\n\n第四代系统是以现在 TiDB 的设计为例，开始进入到混合业务负载的时代，一套系统拥有既能做交易也能处理高并发事务的特性，同时又能结合一些数据仓库或者分析型数据库的能力，所以叫 HTAP，就是融合型的数据库产品。\n\n未来是什么样子，后面的分享我会介绍关于未来的一些展望。从整个时间线看，从 1970 年代发展到现在，database 也算是个古老的行业了，具体每个阶段的发展情况，我就不过多展开。\n\n![1](https://img1.www.pingcap.com/prod/1_321e451e99.png)\n\n## 数据库中间件\n\n对于数据库中间件来说，第一代系统是中间件的系统，基本上整个主流模式有两种，一种是在业务层做手动的分库分表，比如数据库的使用者在业务层里告诉你；北京的数据放在一个数据库里，而上海的数据放在另一个数据库或者写到不同的表上，这种就是业务层手动的最简单的分库分表，相信大家操作过数据库的朋友都很熟悉。\n\n第二种通过一个数据库中间件指定 Sharding 的规则。比如像用户的城市、用户的 ID、时间来做为分片的规则，通过中间件来自动的分配，就不用业务层去做。\n\n这种方式的优点就是简单。如果业务在特别简单的情况下，比如说写入或者读取基本能退化成在一个分片上完成，在应用层做充分适配以后，延迟还是比较低的，而整体上，如果 workload 是随机的，业务的 TPS 也能做到线性扩展。\n\n但是缺点也比较明显。对于一些比较复杂的业务，特别是一些跨分片的操作，比如说查询或者写入要保持跨分片之间的数据强一致性的时候就比较麻烦。另外一个比较明显的缺点是它对于大型集群的运维是比较困难的，特别是去做一些类似的表结构变更之类的操作。想象一下如果有一百个分片，要去加一列或者删一列，相当于要在一百台机器上都执行操作，其实很麻烦。\n\n## NoSQL - Not Only SQL\n\n在 2010 年前后，好多互联网公司都发现了这个大的痛点，仔细思考了业务后，他们发现业务很简单，也不需要 SQL 特别复杂的功能，于是就发展出了一个流派就是 NoSQL 数据库。NoSQL 的特点就是放弃到了高级的 SQL 能力，但是有得必有失，或者说放弃掉了东西总能换来一些东西，NoSQL 换来的是一个对业务透明的、强的水平扩展能力，但反过来就意味着你的业务原来是基于 SQL 去写的话，可能会带来比较大的改造成本，代表的系统有刚才我说到的 MongoDB、Cassandra、HBase 等。\n\n最有名的系统就是 MongoDB，MongoDB 虽然也是分布式，但仍然还是像分库分表的方案一样，要选择分片的 key，他的优点大家都比较熟悉，就是没有表结构信息，想写什么就写什么，对于文档型的数据比较友好，但缺点也比较明显，既然选择了 Sharding Key，可能是按照一个固定的规则在做分片，所以当有一些跨分片的聚合需求的时候会比较麻烦，第二是在跨分片的 ACID 事务上没有很好的支持。\n\n![2](https://img1.www.pingcap.com/prod/2_1b07e76211.png)\n\nHBase 是 Hadoop 生态下的比较有名的分布式 NoSQL 数据库，它是构建在 HDFS 之上的一个 NoSQL 数据库。Cassandra 是一个分布式的 KV 数据库，其特点是在 KV 操作上提供多种一致性模型，缺点与很多 NoSQL 的问题一样，包括运维的复杂性， KV 的接口对于原有业务改造的要求等。\n\n## 第三代分布式数据库 NewSQL\n\n刚才说过 Sharding 或者分库分表，NoSQL 也好，都面临着一个业务的侵入性问题，如果你的业务是重度依赖 SQL，那么用这两种方案都是很不舒适的。于是一些技术比较前沿的公司就在思考，能不能结合传统数据库的优点，比如 SQL 表达力，事务一致性等特性，但是又跟 NoSQL 时代好的特性，比如扩展性能够相结合发展出一种新的、可扩展的，但是用起来又像单机数据库一样方便的系统。在这个思路下就诞生出了两个流派，一个是 Spanner，一个是 Aurora，两个都是顶级的互联网公司在面临到这种问题时做出的一个选择。\n\n### Shared Nothing 流派\n\nShared Nothing 这个流派是以 Google Spanner 为代表，好处是在于可以做到几乎无限的水平扩展，整个系统没有端点，不管是 1 个 T、10 个 T 或者 100 个 T，业务层基本上不用担心扩展能力。第二个好处是他的设计目标是提供强 SQL 的支持，不需要指定分片规则、分片策略，系统会自动的帮你做扩展。第三是支持像单机数据库一样的强一致的事务，可以用来支持金融级别的业务。\n\n![3](https://img1.www.pingcap.com/prod/3_050c0b5929.png)\n\n代表产品就是 Spanner 与 TiDB，这类系统也有一些缺点，从本质上来说一个纯分布式数据库，很多行为没有办法跟单机行为一模一样。举个例子，比如说延迟，单机数据库在做交易事务的时候，可能在单机上就完成了，但是在分布式数据库上，如果要去实现同样的一个语义，这个事务需要操作的行可能分布在不同的机器上，需要涉及到多次网络的通信和交互，响应速度和性能肯定不如在单机上一次操作完成，所以在一些兼容性和行为上与单机数据库还是有一些区别的。即使是这样，对于很多业务来说，与分库分表相比，分布式数据库还是具备很多优势，比如在易用性方面还是比分库分表的侵入性小很多。\n\n### Shared Everything 流派\n\n第二种流派就是 Shared Everything 流派，代表有 AWS Aurora、阿里云的 PolarDB，很多数据库都定义自己是 Cloud-Native Database，但我觉得这里的 Cloud-Native 更多是在于通常这些方案都是由公有云服务商来提供的，至于本身的技术是不是云原生，并没有一个统一的标准。从纯技术的角度来去说一个核心的要点，这类系统的计算与存储是彻底分离的，计算节点与存储节点跑在不同机器上，存储相当于把一个 MySQL 跑在云盘上的感觉，我个人认为类似 Aurora 或者 PolarDB 的这种架构并不是一个纯粹的分布式架构。\n\n![4](https://img1.www.pingcap.com/prod/4_e757d1390a.png)\n\n原来 MySQL 的主从复制都走 Binlog，Aurora 作为一种在云上 Share Everything Database 的代表，Aurora 的设计思路是把整个 IO 的 flow 只通过 redo log 的形式来做复制，而不是通过整个 IO 链路打到最后 Binlog，再发到另外一台机器上，然后再 apply 这个 Binlog，所以 Aurora 的 IO 链路减少很多，这是一个很大的创新。\n\n日志复制的单位变小，意味着我发过去的只有 Physical log，不是 Binlog，也不是直接发语句过去，直接发物理的日志能代表着更小的 IO 的路径以及更小的网络包，所以整个数据库系统的吞吐效率会比传统的 MySQL 的部署方案好很多。\n\n![5](https://img1.www.pingcap.com/prod/5_65c36467c6.png)\n\nAurora 的优势是 100% 兼容 MySQL，业务兼容性好，业务基本上不用改就可以用，而且对于一些互联网的场景，对一致性要求不高的话，数据库的读也可以做到水平扩展，不管是 Aurora 也好，PolarDB 也好，读性能是有上限的。\n\nAurora 的短板大家也能看得出来，本质上这还是一个单机数据库，因为所有数据量都是存储在一起的，Aurora 的计算层其实就是一个 MySQL 实例，不关心底下这些数据的分布，如果有大的写入量或者有大的跨分片查询的需求，如果要支持大数据量，还是需要分库分表，所以 Aurora 是一款更好的云上单机数据库。\n\n## 第四代系统：分布式 HTAP 数据库\n\n第四代系统就是新形态的 HTAP 数据库，英文名称是 Hybrid Transactional and Analytical Processing，通过名字也很好理解，既可以做事务，又可以在同一套系统里面做实时分析。HTAP 数据库的优势是可以像 NoSQL 一样具备无限水平扩展能力，像 NewSQL 一样能够去做 SQL 的查询与事务的支持，更重要的是在混合业务等复杂的场景下，OLAP 不会影响到 OLTP 业务，同时省去了在同一个系统里面把数据搬来搬去的烦恼。目前，我看到在工业界基本只有 TiDB 4.0 加上 TiFlash 这个架构能够符合上述要求。\n\n### 分布式 HTAP 数据库：TiDB (with TiFlash)\n\n为什么 TiDB 能够实现 OLAP 和 OLTP 的彻底隔离，互不影响？因为 TiDB 是计算和存储分离的架构，底层的存储是多副本机制，可以把其中一些副本转换成列式存储的副本。OLAP 的请求可以直接打到列式的副本上，也就是 TiFlash 的副本来提供高性能列式的分析服务，做到了同一份数据既可以做实时的交易又做实时的分析，这是 TiDB 在架构层面的巨大创新和突破。\n\n![6](https://img1.www.pingcap.com/prod/6_6e60b51b5d.png)\n\n下图是 TiDB 的测试结果，与 MemSQL 进行了对比，根据用户场景构造了一种 workload，横轴是并发数，纵轴是 OLTP 的性能，蓝色、黄色、绿色这些是 OLAP 的并发数。这个实验的目的就是在一套系统上既跑 OLTP 又跑 OLAP，同时不断提升 OLTP 和 OLAP 的并发压力，从而查看这两种 workload 是否会互相影响。可以看到在 TiDB 这边，同时加大 OLTP 和 OLAP 的并发压力，这两种 workload 的性能表现没有什么明显变化，几乎是差不多的。但是，同样的实验发生在 MemSQL 上，大家可以看到 MemSQL 的性能大幅衰减，随着 OLAP 的并发数变大，OLTP 的性能下降比较明显。\n\n![7](https://img1.www.pingcap.com/prod/7_8d7c98fe3a.png)\n\n接下来是 TiDB 在一个用户实际业务场景的例子，在进行 OLAP 业务的查询的时候，OLTP 业务仍然可以实现平滑的写入操作，延迟一直维持在较低的水平。\n\n![8](https://img1.www.pingcap.com/prod/8_298aab9b5b.png)\n\n## 未来在哪里\n\n### Snowflake\n\nSnowflake 是一个 100% 构建在云上的数据仓库系统，底层的存储依赖 S3，基本上每个公有云都会提供类似 S3 这样的对象存储服务，Snowflake 也是一个纯粹的计算与存储分离的架构，在系统里面定义的计算节点叫 Virtual Warehouse，可以认为就是一个个 EC2 单元，本地的缓存有日志盘，Snowflake 的主要数据存在 S3 上，本地的计算节点是在公有云的虚机上。\n\n![9](https://img1.www.pingcap.com/prod/9_6c0e8aa2e4.png)\n\n这是 Snowflake 在 S3 里面存储的数据格式的特点，每一个 S3 的对象是 10 兆一个文件，只追加，每一个文件里面包含源信息，通过列式的存储落到磁盘上。\n\n![10](https://img1.www.pingcap.com/prod/10_c19862363d.png)\n\nSnowflake 这个系统最重要的一个闪光点就是对于同一份数据可以分配不同的计算资源进行计算，比如某个 query 可能只需要两台机器，另外一个 query 需要更多的计算资源，但是没关系，实际上这些数据都在 S3 上面，简单来说两台机器可以挂载同一块磁盘分别去处理不同的工作负载，这就是一个计算与存储解耦的重要例子。\n\n### Google BigQuery\n\n第二个系统是 BigQuery，BigQuery 是 Google Cloud 上提供的大数据分析服务，架构设计上跟 Snowflake 有点类似。BigQuery 的数据存储在谷歌内部的分布式文件系统 Colossus 上面，Jupiter 是内部的一个高性能网络，上面这个是谷歌的计算节点。\n\n![11](https://img1.www.pingcap.com/prod/11_2123cf045e.png)\n\nBigQuery 的处理性能比较出色，每秒在数据中心内的一个双向的带宽可以达到 1 PB，如果使用 2000 个专属的计算节点单元，大概一个月的费用是四万美金。BigQuery 是一个按需付费的模式，一个 query 可能就用两个 slot，就收取这两个 slot 的费用，BigQuery 的存储成本相对较低，1 TB 的存储大概 20 美金一个月。\n\n### RockSet\n\n第三个系统是 RockSet，大家知道 RocksDB 是一个比较有名的单机 KV 数据库，其存储引擎的数据结构叫 LSM-Tree，LSM-Tree 的核心思想进行分层设计，更冷的数据会在越下层。RockSet 把后面的层放在了 S3 的存储上面，上面的层其实是用 local disk 或者本地的内存来做引擎，天然是一个分层的结构，你的应用感知不到下面是一个云盘还是本地磁盘，通过很好的本地缓存让你感知不到下面云存储的存在。\n\n所以刚才看了这三个系统，我觉得有几个特点，一个是首先都是天然分布式的，第二个是构建在云的标准服务上面的，尤其是 S3 和 EBS，第三是 pay as  you go，在架构里面充分利用了云的弹性能力。我觉得这三点最重要的一点是存储，存储系统决定了云上数据库的设计方向。\n\n## 为什么 S3 是关键？\n\n在存储里边我觉得更关键的可能是 S3。EBS 其实我们也有研究过，TiDB 第一阶段其实已经正在跟 EBS 块存储做融合，但从更长远的角度来看，我觉得更有意思的方向是在 S3 这边。\n\n首先第一点 S3 非常划算，价格远低于 EBS，第二 S3 提供了 9 个 9 很高的可靠性，第三是具备线性扩展的吞吐能力，第四是天然跨云，每一个云上都有 S3 API 的对象存储服务。但是 S3 的问题就是随机写入的延迟非常高，但是吞吐性能不错，所以我们要去利用这个吞吐性能不错的这个特点，规避延迟高的风险。这是 S3 benchmark 的一个测试，可以看到随着机型的提升，吞吐能力也是持续的提升。\n\n![12](https://img1.www.pingcap.com/prod/12_c5d8687236.png)\n\n## 如何解决 Latency 的问题？\n\n如果要解决 S3 的 Latency 问题，这里提供一些思路，比如像 RockSet 那样用 SSD 或者本地磁盘来做 cache，或者通过 kinesis 写入日志，来降低整个写入的延迟。还有数据的复制或者你要去做一些并发处理等，其实可以去做 Zero-copy data cloning，也是降低延迟的一些方式。\n\n上述例子有一些共同点都是数据仓库，不知道大家有没有发现，为什么都是数据仓库？数据仓库对于吞吐的要求其实是更高的，对于延迟并不是那么在意，一个 query 可能跑五秒出结果就行了，不用要求五毫秒之内给出结果，特别是对于一些 Point Lookup 这种场景来说，Shared Nothing 的 database 可能只需要从客户端的一次 rpc，但是对于计算与存储分离的架构，中间无论如何要走两次网络，这是一个核心的问题。\n\n![13](https://img1.www.pingcap.com/prod/13_01c442ce18.png)\n\n你可能会说没有关系，反正计算和存储已经分离了，大力出奇迹，可以加计算节点。但是我觉得新思路没必要这么极端，Aurora 是一个计算存储分离架构，但它是一个单机数据库，Spanner 是一个纯分布式的数据库，纯 Shared Nothing 的架构并没有利用到云基础设施提供的一些优势。\n\n比如说未来我们的数据库可以做这样的设计，在计算层其实带着一点点状态，因为每台 EC2 都会带一个本地磁盘，现在主流的 EC2 都是 SSD，比较热的数据可以在这一层做 Shared Nothing，在这一层去做高可用，在这一层去做随机的读取与写入。热数据一旦 cache miss，才会落到 S3 上面，可以在 S3 只做后面几层的数据存储，这种做法可能会带来问题，一旦穿透了本地 cache，Latency 会有一些抖动。\n\n![14](https://img1.www.pingcap.com/prod/14_f0ade7db68.png)\n\n这种架构设计的好处：首先，拥有对实时业务的数据计算亲和力，在 local disk 上会有很多数据，在这点上很多传统数据库的一些性能优化技巧可以用起来；第二，数据迁移其实会变得很简单，实际上底下的存储是共享的，都在 S3 上面，比如说 A 机器到 B 机器的数据迁移其实不用真的做迁移，只要在 B 机器上读取数据就行了。\n\n这个架构的缺点是：第一，缓存穿透了以后，Latency 会变高；第二，计算节点现在有了状态，如果计算节点挂掉了以后，Failover 要去处理日志回放的问题，这可能会增加一点实现的复杂度。\n\n![15](https://img1.www.pingcap.com/prod/15_5bcbdccabd.png)\n\n## 还有很多值得研究的课题\n\n上面的架构只是一个设想，TiDB 其实还不是这样的架构，但未来可能会在这方向去做一些尝试或者研究，在这个领域里面其实还有很多 open question 我们还没有答案，包括云厂商、包括我们，包括学术界都没有答案。\n\n现在有一些研究的课题，第一，如果我们要利用本地磁盘，应该缓存多少数据，LRU 的策略是什么样子，跟 performance 到底有什么关系，跟 workload 有什么关系。第二，对于网络，刚才我们看到 S3 的网络吞吐做的很好，什么样的性能要配上什么样的吞吐，要配多少个计算节点，特别是对于一些比较复杂查询的 Reshuffle；第三，计算复杂度和计算节点、机型的关系是什么？这些问题其实都是比较复杂的问题，特别是怎么用数学来表达，因为需要自动化地去做这些事情。\n\n即使这些问题都解决了，我觉得也只是云上数据库时代的一个开始。未来在 Serverless，包括 AI-Driven 几大方向上，怎么设计出更好的 database，这是我们努力的方向。最后引用屈原的一句话，就是路漫漫其修远兮，我们还有很多事情需要去做，谢谢大家。","date":"2021-01-14","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"new-ideas-for-designing-cloud-native-database","file":null,"relatedBlogs":[]},{"id":"Blogs_138","title":"TiDB 的现在和未来","tags":["TiDB"],"category":{"name":"观点洞察"},"summary":"本文根据黄东旭在 PingCAP D 轮融资线上发布会的演讲实录进行整理。","body":">本文根据黄东旭在 PingCAP D 轮融资线上发布会的演讲实录进行整理。\n\n![1-thefutureofdatabase](https://img1.www.pingcap.com/prod/1_thefutureofdatabase_aaa27c2888.png)\n\n## TiDB 的现在和未来\n\n大家好，我是黄东旭，是 PingCAP 的联合创始人和 CTO，这是 PingCAP 成立以来的第一次发布会，我想跟大家简单聊聊 TiDB 在产品和技术上的更新。考虑到线上的很多观众不一定是有很强的技术背景，我将尽我所能将技术的部分说得让大家都能够理解。\n\n在讲正题之前有一个小故事，我们做基础软件的产品经理去跟客户聊需求的时候，客户经常都会说：对于数据库，我的要求特别简单、特别基础、非常朴素，我不要求很多功能，安全稳定是必须的，最好能高可用，性能一定要好，如果数据量大了，能实现弹性伸缩就更好了；另外，最好别让我学太多新东西，用起来跟过去使用的产品差不多，这就是一款完美的数据库产品。\n\n就像大家在家里用自来水一样，我们对自来水的需求就是拧开水龙头水就能出来，但是背后自来水厂是怎么处理的大家不用知道，我们只需要根据实际情况使用冷水或者热水就好。但是从技术的角度来说，刚才类似冷热水这个非常朴素的基础需求，类比一下放到数据库的世界这就是一个图灵奖级别的基础需求，稍微解释一下图灵奖是计算机行业学术界最顶级的，相当于计算机界的诺贝尔奖。\n\n这里有两位行业泰斗级的人物，左边 Leslie Lamport 在 2013 年研究相关问题拿了图灵奖，右边这位跟我们挺有缘的，发型跟（我们的 CEO）刘奇同学挺像，他是 UC 伯克利分校的一名教授，也是著名 CAP 定理的提出者，PingCAP 中的 CAP 就是来源于此。虽然看上去这个需求是一个很朴素的需求，但是这是一个值得去花很长时间研究，在技术领域很有挑战，也是一个很前沿的研究领域。\n\n![2-baseneeds](https://img1.www.pingcap.com/prod/2_baseneeds_3c8e1cf930.png)\n\n在聊数据库之前，我想带大家回顾一下十年前的电子产品，回顾一下我们当年的生活，大家回想一下十年前我们手上的数码产品有哪些，比如我们打电话有诺基亚，拍照有数码相机，也有用来做导航的独立设备 GPS，听歌用的 MP3 等等，种类繁多。\n\n我们再来回顾一下这十年，这些东西好像在我们的生活中渐渐消失掉了，一台智能手机把很多这些碎片化的东西统一了起来，我觉得这背后一个很重要的点就是我们对于统一用户体验的追求驱动了整个科技界产品发生翻天覆地的变革，现在一台智能手机基本解决了我们生活中百分之七八十的数字化生活场景的需求。\n\n![3-customersexperience](https://img1.www.pingcap.com/prod/3_customersexperience_3bc325788d.png)\n\n## TiDB 是一个 HTAP 系统\n\n接下来进入正题，PingCAP 是做数据库的厂商，如果我们拉一条数轴来看，左边的业务是更偏实时在线的业务，如果这条数轴的右边是离线业务的话，按照这个数轴来看，数据库这个产品大家可能印象中是在左边的，一些典型场景，比如像 Hadoop 或者一些数据仓库、报表是在右边。\n\n![4-onlinetooffline](https://img1.www.pingcap.com/prod/4_onlinetooffline_8a909fa4dc.png)\n\n再看一个具体的业务场景，假设是一个公司要打造电商平台的 IT 系统，梳理一下现在电商平台内部有各种各样的应用和场景，我们按照这些场景放到这个数轴上，左边是在线，右边是离线，我们看到比如交易、订单管理、明细查询，这可能是偏在线的业务，用户用手机随时可以打开看；右边离线业务更像是内部运营人员，比如老板查看去年赚了多少钱，这种报表可能是一个更偏离线的业务。\n\n![5-acase](https://img1.www.pingcap.com/prod/5_acase_3072d2ba26.png)\n\n大家有没有发现中间有一些实时的报表，实时的促销调价，热销产品的推荐，你放在左边不合适，放在右边好像也不太对，所以中间部分是一个比较模糊的状态，这是一个业务的语言，比如我们把这个业务放到这条轴上去看，比如说我是电商平台的技术人员，业务人员告诉我，我们上面这些需求，这些需求翻译成技术的语言会变成什么样子呢？\n\n就变成了各种各样的 OLTP 数据库和 OLAP 数据库和数据仓库，比如像 ClickHouse、Greenplum，像离线的数据仓库 Hadoop、HIVE，有很多同学不了解这些名词没关系，我只是想展现一下，业务需求翻译成技术语言，通常需要一系列复杂的数据技术栈来支撑。\n\n![6-techlanguage](https://img1.www.pingcap.com/prod/6_techlanguage_e415ed1ac5.png)\n\n可能有很多观众学过计算机技术，我记得我在上大学的时候，我们有一门课是叫数据库系统，老师上课的时候教我数据库就是增删改查，就是存数据、取数据的一个系统、一个软件，几个关键的命令 INSERT\\SELECT\\UPDATE\\DELETE，我回忆了一下好象也没有教哪些场景是 OLTP 的场景，哪些是 OLAP 的系统，并没有这么复杂。 \n\n**数据库应该就是存数据、取数据天经地义，就像水龙头一样一拧开就出水**，我还特地查了一下 database 的定义，在维基百科上面的定义其实并没有说 OLTP 的 database 或者 OLAP 的 database。\n\n我知道这可能是一个细分的领域，但是从数据库这个词的本源来看，本质上像一个容器一样，存储数据和取数据的一个系统，好像也没什么复杂。\n\n为什么今天很多工程师，很多用户就觉得这个数据库或者这个场景一定是个 OLTP，或者是个 OLAP ，要有一个泾渭分明的分类。就像刚才电商的例子，其实有大量中间的场景很难说到底是一个 OLTP 还是 OLAP 。但是现在的现实是对于很多 IT 系统、业务系统来说，对于实时性的要求越来越高，为了解决这个问题，我们构建了各种各样的数据孤岛，构建了各种各样的烟囱式系统。\n\n![7-oltp or olap](https://img1.www.pingcap.com/prod/7_oltporolap_0c7a200b3e.png)\n\n所以过去这种泾渭分明式的分类方式到底适不适用现在有越来越多实时性要求的时代呢？\n\n回过头来思考这个分类是不是有问题的时候，作为一个理工男或者作为一个学理科出身的工程师，我们特别喜欢寻找一个定义或者寻找一个分类。我们找遍了各种各样的定义，从学术界、工业界、到各类咨询机构，发现 HTAP 是一个更加符合或者说更加适合现在 TiDB 应用场景的一个定义。\n\n![8-realtime htap](https://img1.www.pingcap.com/prod/8_realtimehtap_b16fc415b6.png)\n\n**TiDB 的定位是一个 Real-Time 的 HTAP 系统**，有很多朋友后来问我，TiDB 是一个 HTAP 系统，是不是就意味着你不是一个 OLTP 系统，或者说你到底是一个 OLTP 还是 OLAP？\n\n我们回到智能手机的那个例子，首先智能手机一定是一个 100% 的手机，肯定能打电话，在打电话的基础上再加上很多其他的常用功能，比如相机、GPS、MP3等在一个系统里面搞定。我想强调的是 TiDB 的定位就是 Real-Time HTAP 系统，首先是一个 100% 的 OLTP 系统，同时还能支持一些 Real-Time OLAP Query。\n\n![9-tidb100](https://img1.www.pingcap.com/prod/9_tidb100_898e93a537.png)\n\n讲到 TiDB，我其实很感慨，我一直看着这个产品一步步成长起来，最近这一年成长速度尤其快，现在我很高兴地看到 TiDB 4.0 已经成为社区的一个主流版本。\n\n在 4.0 发布的时候，我当时很热情洋溢的发表了一段话，说这是一个非常具有里程碑意义的一个版本，事实上 TiDB 4.0 的表现我觉得是不负众望的，现在大家都非常喜欢，成为了主流。\n\n![10-whathappened](https://img1.www.pingcap.com/prod/10_whathappened_fb2259b4c6.png)\n\n## 展望 TiDB 5.0\n\n我想跟大家展望一下 TiDB 5.0，在讲 5.0 之前我想稍微强调一下 TiDB 做产品的思路。我们都是工程师出身，也比较接地气，不说什么高大上的，用大白话来说就四点：**稳、快、好用和用着放心**。前面提到过用户对于一个数据库产品的朴素需求，我们也是希望按照这种方式来做产品。\n\n但在 TiDB 5.0 里面我们真正把一个具体的目标放到了产品规划的方向里面，那就是 TiDB 要走向各行各业的核心场景。之前，TiDB 从 2.0 到 3.0 和 4.0，已经开始慢慢地走向了各行各业，慢慢地渗透到一些对稳定性、对性能要求非常极致的场景，包括金融、银行的一些核心业务系统。\n\n**在 TiDB 5.0 这个版本，我们第一次明确地提出，至少在产品层面上要达到各行业核心场景对于数据库性能和稳定性的要求**。\n\n![11-产品思路](https://img1.www.pingcap.com/prod/11_f946b52c92.png)\n\n接下来具体谈谈 TiDB 5.0 在这几个方面的进展。\n\n**首先第一点稳定性**，我经常说一句话：把一个东西做对其实是很难的，把一个数据库做出来不难，做对却很难，所以我们构建了各种各样的正确性的测试系统。现在 TiDB 已经做出来了，下一个阶段是更稳，但是要使得 TiDB 更加稳定还有很多的工作要做，这方面没有捷径，道理谁都懂，魔鬼在细节，只有做得越来越深，越来越细，我很高兴的看到，在 TiDB 5.0 中我们和用户一起把 TiDB 的稳定性又往前推进了一个级别。\n\n下图是 5.0 在某个券商机构的测试结果，在 48 小时高压力的测试场景里面 TiDB 5.0 的系统抖动一直小于 5%，同时在性能上跟 4.0 相比有明显的提升。我想强调的是在做稳定性这件事情上，已经开始进入改革深水区，低垂的果实已经摘的差不多了，剩下就是一些场景和技术上比较硬的难题等着我们去攻克，我们很高兴地看到 5.0 对于 4.0 在稳定性上有比较出色的表现。\n\n![12-稳](https://img1.www.pingcap.com/prod/12_52f7214567.png)\n\n**第二，性能快**。天下武功，唯快不破，尤其是对于数据库这样的基础软件来说，特别是在一些核心应用场景，比如像银行的一些核心交易系统，一个毫秒的额外延迟可能就会对整体的系统和用户体验造成影响。\n\n在 TiDB 5.0 里面我们很高兴地看到，对比 4.0 延迟几乎成倍地下降。这让我想到跟开发团队经常开的玩笑，说 TiDB 每个版本有点像摩尔定律，每一个版本比上一个版本性能提升一倍、延迟下降一倍、成本不变，未来成本还会持续下降。我很高兴看到 5.0 还是保持着这个规律，所以，性能快与延迟降低在 5.0 里面会是一个很重要的标签。\n\n![13-快](https://img1.www.pingcap.com/prod/13_5d070bd11d.png)\n\n快的另外一个方面，首先熟悉 TiFlash 的同学看到标题肯定会心一笑，我们之前有提到  TiDB 是一个 Real-Time HTAP 架构，AP 这部分是由 TiFlash 分析加速引擎来提供服务的。在  5.0 里面 TiFlash 将支持分布式的聚合和分布式的计算（MPP），能让整个 TiDB 的 OLAP 能力真正延伸到更多的应用场景，应对更多更复杂的 JOIN 场景。\n\n![14-快tiflash](https://img1.www.pingcap.com/prod/14_tiflash_1eedf93a13.png)\n\n**好用，这个方面我想强调的有两点**。\n\n首先，大家看到跨数据中心、跨地域一个部署，很多做分布式系统的同学会觉得很兴奋，TiDB 终于可以支持做 Geo-Partition（多地多活跨地域数据分布） 。我稍微解释一下，TiDB 是一个分布式数据库，所以有很多用户、很多开发者希望 TiDB 可以实现真正的跨长距离或者跨多个数据中心的部署，可以在全国或者全球都组成一个大的网络。\n\n其次，打通多个流行数据处理栈生态和提供全链路追踪系统，也将使得 TiDB 5.0 变得更加好用。\n\n![15-好用](https://img1.www.pingcap.com/prod/15_9d91fca090.png)\n\n提到 Geo-Partion，实际上，有很多客户有这样的场景需求，特别是对于一些海外客户，比如一家欧洲公司的业务遍布全球，这时候如果有一个数据库系统，能够支持全球跨长距离的区域部署，能够在不同的国家、不同的位置随时提供服务，运维方面也省去了部署多套技术栈和数据库系统的成本，这对于客户来说就是一个理想之选。\n\n举个例子，我们刚才提到多地部署，怎么降低本地的延迟，如果是一个欧洲公司，大家知道欧洲有很严格的 GDPR，企业的数据不能出境，这种场景下 Geo-Partition 就是一个非常实用的特性。\n\n![16-场景](https://img1.www.pingcap.com/prod/16_2c030323f4.png)\n\n如果是现在的 TiDB 去做这件事情，比如说在欧洲、中国、美国同时提供服务，在一些场景下的数据库性能和延迟可能会不太理想，因为需要到一个中央的服务器上去处理，去拿时间戳，然后才能提供服务。\n\n在 TiDB 5.0 里面，我们将中央的授时服务改成了一个分布式授时的服务，能够让这个系统在本地或者在多数据中心场景里面的性能表现更佳。\n\n![17-geo-partitioning](https://img1.www.pingcap.com/prod/17_geo_partitioning_d4da4046cb.png)\n\n第二个方面是 TiDB 的“朋友”越来越多，作为一个基础软件，虽然 TiDB 的目标是尽可能的把很多场景统一，但我觉得 TiDB 跟业界其他生态技术栈的互联互通也是一个非常重要的方面。\n\n现在对于 TiDB 来说，已经能够与 Flink、Kafka、Spark，包括 Hadoop、AWS S3 以及 MySQL、Oracle 这些传统的数据库进行互联互通。\n\n![18-数据处理技术](https://img1.www.pingcap.com/prod/18_bbdd1a96be.png)\n\n举一个具体用户的例子，这是一个在线的实时数仓业务，线上的业务持续在做交易，在做写入，同时这些数据通过 TiDB TiCDC 增量订阅模块输出到 Kafka，同步到 Flink 流式计算引擎去做归纳、聚合与分析，然后再重新写回到 TiDB。写入到 TiDB 的这些数据再去对在线业务进行补充，TiDB 结合 Kafka、Flink 组成了一个简单易用的实时数仓架构。\n\n![19-实时数仓例子](https://img1.www.pingcap.com/prod/19_baeec896d7.png)\n\n说到安全，对于数据库来说，安全其实是非常重要的，在我们的产品规划里面，安全是放在很高优先级的特性。\n\n我想强调，在 4.0 里面 TiKV 存储层已经支持全链路的数据透明加密。在 DBaaS 平台里面，我们正在引入 RBAC，就是基于用户身份的鉴权系统，同时我们会跟 AWS 的身份认证系统进行打通，给用户提供更加安全、更加可靠的产品与服务保障。\n\n在安全合规方面，随着 TiDB 越来越多地应用在国内、国外一些关键的业务场景，不同的国家，不同的应用场景对于合规的要求呈现多样化特点， TiDB 已经通过了 SOC2Type1 认证，这是在美国金融行业里面非常认可的合规标准，未来我们将在合规上面投入更多的精力。\n\n![20-安全](https://img1.www.pingcap.com/prod/20_85710bee7c.png)\n\n## 未来的数据库是什么样子？\n\n前面是对于 TiDB 5.0 在现在这个时间点的进展同步。但是未来在哪里？\n\n我们每一个分享最后的部分会讲讲到底未来应该是什么样子的，我觉得在比较近的未来，TiDB 一个重要的方向是更加云化。为什么云如此重要？数据库云化的背后我觉得可以展开几点：\n\n- 一个是 Serverless；\n\n- 二是智能的调度能力；\n\n- 第三是利用云的基础设施降低成本。\n\n![21-cloudnative tidb](https://img1.www.pingcap.com/prod/21_cloudnativetidb_b9196f48e9.png)\n\n为什么说云如此重要？大家可以看到右边这张图，横轴是数据量和业务需求，纵轴是企业在 IT 上投入的成本，在云诞生之前我们在去做面向不确定性的业务，面向暴涨的数据量，如果采用传统的 IDC 部署方式，成本和投入的曲线跟实际的需求不能完全吻合，其实存在很多资源的浪费。\n\n首先，只有云真正把整个基础软件的商业模式变成了 pay as you go，尽可能地贴合业务的增长曲线，对于数据库这样很重要的基础软件来说，在云上利用云的弹性能够去更合理地满足业务的实际需求。\n\n第二，云很好地屏蔽了底层基础架构实现的复杂性，对于做基础软件的人来说，这具有划时代的意义。比如说利用云的弹性调度能力以及一些 AI 新技术，使得这个系统更好地理解业务的需求，更加智能地规划该把数据放置在什么地方，该建立什么样的索引。\n\n第三，云是很好的基础设施，面向云时代的基础设施如何去设计下一代的基础软件，我觉得是一个很重要的课题。最近关注技术圈的朋友，Snowflake 的消息令大家非常振奋，Snowflake 在技术上的选择也带给我很多启发，怎么通过云的基础设施来打造新一代的基础软件。\n\n![22-原本的样子](https://img1.www.pingcap.com/prod/22_845ca6349a.png)\n\n以上是我对近期未来的一些展望和看法。最后我想强调的是，回归初心我们想做的事情就是让数据库真正回归原本的样子，把复杂性隐藏在背后，为用户提供一个使用门槛很低，解放大家生产力的好产品，谢谢大家！","date":"2020-11-30","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"the-future-and-past-of-tidb","file":null,"relatedBlogs":[]},{"id":"Blogs_11","title":"为什么你需要混沌工程以及 Chaos Mesh","tags":["Chaos Mesh"],"category":{"name":"观点洞察"},"summary":"本文介绍了帮助我们在复杂的分布式系统环境下保证系统正常稳定运行的办法 —— Chaos Engineering，以及基于 Kubernetes 的云原生混沌工程平台 Chaos Mesh。","body":"## 信心的毁灭与重建\n\n在我最开始学习编程的时候，我一直觉得写程序是很简单的事情，程序总是按照我的想法串行的执行，给一个输入，总是有着符合预期的固定输出。那时候写代码，可能大的挑战在于理解分支，循环，但无论怎样，只要控制得当，事情总是确定的。\n\n那段时间可以算是非常快乐的日子，直到我遇到了多线程，人生中第一次有了『自信被打破』的恐慌，在多线程的世界里，事情不会在按照我想的方式来正常的运转，我需要考虑 data racing，需要考虑 memory ordering。幸运的是，在经历了短暂的不适应之后，很快我就能很好的拥抱并发了，毕竟我们这个世界本来就是在并行运转的。虽然写多线程程序相比之前更加的困难，但其实只要掌握了一些多线程的并发原语，知道如何使用 mutex，semaphore，channel 这些，其实会发现多线程的世界也是蛮有意思的。再加上，新一代的编程语言，无论是 Go，还是 Rust，都能让大家更加游刃有余的处理并发问题，只要处理得当，给定一个输入，仍然能得到我们想要的输出。只不过，这时候要保证确定性要比之前困难了很多。\n\n但好景不长，在驾驭了多线程之后，我的『自信再一次被打破』了，因为我进入了分布式系统的世界，在这个世界里面，一切都变得不再确定。给定一个输入，我可能得到的结果是未知，因为我不知道这个执行在远端是否被正常的执行了。而人类对于未知恰恰是最恐慌的。我不知道我的系统什么时候会出现网络异常，或者磁盘什么时候突然坏掉，或者机房是不是突然断掉了，一切的一切，对我来说都是未知的，譬如下面是我们在实际中遇到的一个问题：\n\n![1-cached-mem](https://img1.www.pingcap.com/prod/1_cached_mem_d7978c1cf7.jpg)\n\n我们的用户将 TiDB 运行在国内某云厂商的机器上面，然后跟我们反映，读延迟会不定期的增长，我们看了看监控，发现唯一的异常指标就是 Cached 的 memory 那段时间会突然下降。当时真的就懵了，完全不知道原因是什么。最终发现，云厂商的运维监控脚本里面有个 bug，会不定期的将磁盘热拔插，并且将现有的 page cache 刷到磁盘，所以那段时间 TiDB 的 read 操作很多是从磁盘重新读取数据的。\n\n可以看到，分布式系统真的是一个非常复杂的系统，故障无处不在，那么我们如何在这么复杂的分布式系统的世界里面生存下去呢？现在，一个很好的答案就是 - Chaos Engineering，中文里面叫做混沌工程。\n\n## 混沌工程\n\n相比于我们成天担惊受怕系统会出现什么样的问题，还不如提前就模拟线上环境可能出现的各种情况，来看我们的系统是否能做到容错，仍然能继续对外提供服务。当然，我们并不是简单的就在线上环境上面，把机器给断电，或者把网线给拔掉，在混沌工程领域，有一套指导原则，以及标准的实验步骤，具体的可以参考 [PRINCIPLES OF CHAOS ENGINEERING](https://principlesofchaos.org/?lang=ENcontent) 。\n\n简单来说，要做一次混沌实验，我们只需要做到如下的 4 个步骤:\n\n1. 定义系统的稳态，这个稳态就是系统在正常运行的时候一些指标，譬如当前请求的 QPS，latency 等。\n\n2. 将系统分为实验组以及对照组，做出一个假设，譬如我在实验组引入一个故障，这个稳态仍然能在实验组保持。\n\n3. 执行试验，给实验组引入现实世界中的故障，譬如拔掉网卡。\n\n4. 验证第 2 步的假设是否成立，如果实验组的稳态跟对照组不一样了，证明我们的系统在第 3 步的故障中不能很好的容错，所以我们需要改进。\n\n可以看到，上面的步骤非常的简单，但要在实际中很好的做混沌试验，还是有一些困难的，主要在以下几点：\n\n1. **自动化**。我们需要有一套自动化的系统帮我们进行故障注入，进行假设对比等。\n\n2. **尽可能多的引入不同故障**。现实环境中可能会出现非常多的故障，仅仅不是拔网线这么简单，所以引入的故障越多越好。\n\n3. **业务方无感知**。如果我们每次做混沌试验，都要业务系统去配合，譬如在业务里面写一些混沌相关的代码，让混沌试验调用，或者更改系统的部署逻辑，跟混沌试验配合，这种的就属于紧耦合的。\n\n## 你好，Chaos Mesh！！！\n\n所以，为了让大家更好的做混沌试验，我们开发了 [Chaos Mesh](https://chaos-mesh.org/)，Chaos Mesh 是一套基于 Kubernetes 的云原生混沌工程平台。Chaos Mesh 的架构如下：\n\n![2-架构](https://img1.www.pingcap.com/prod/2_701a586176.jpg)\n\n相比于其他混沌平台，Chaos Mesh 有如下优势：\n\n1. **基于 K8s**。只要你的系统能跑在 K8s 上面，那么就可以无缝的集成 Chaos Mesh，而且不用修改任何业务代码，真正是被测系统无感知。\n\n2. **多种多样的故障注入**。Chaos Mesh 能全方位的帮你对网络，磁盘，文件系统，操作系统等进行故障注入。我们后面也会提供对 K8s，或者云服务自身进行 chaos 的能力。\n\n3. **易于使用**。你无需关注 Chaos Mesh 的底层实现细节，只需用 YAML 配置好混沌试验，就可以实施，后面所有的实验是全自动化的。我们也提供了 Dashboard 能让你在网页上就轻松的进行试验。\n\n4. **可观测性**。Chaos Mesh 的 Dashboard 能很方便的让你观测系统，知道什么时候进行了什么试验，知道你自己的系统当前的运行情况，当然，这里需要一点配置，你需要告诉 Chaos Mesh 如何去获取你系统的稳态指标，譬如你的系统使用 Prometheus，那么就可以告诉 Chaos Mesh 如何去 Prometheus 查询相关的监控指标。\n\n5. **强大的开源社区支持**。Chaos Mesh 的社区成长的非常迅速，我们非常高兴的看到大部分的功能已经由社区支持，并且也有很多用户。你无需担心遇到问题不知道如何解决，当然，你可能要担心下 Chaos Mesh 做实验的时候把你的数据给完全干掉，所以做实验的时候一定要控制好实验半径，这个也是混沌工程的一条原则。\n\n## 来一次 Chaos 实验？\n\n在我们开始一次 Chaos 实验之前，你首先需要满足两个条件：\n\n1. 你自己的业务是跑在 K8s 上面的。\n2. 在 K8s 上面 [安装了 Chaos Mesh](https://chaos-mesh.org/docs/installation/installation)。\n\n另外，在开始实验之前，这里我还是要强调一下 Chaos 实验的一些注意事项，可能你觉得我这个大叔很啰嗦，但小心驶得万年船，因为稍微一不注意，你可能就丢了数据了。\n\n1. 如果你刚准备将你的系统应用 Chaos Mesh，一定要保证首先在测试环境中使用。你的系统应该还非常的脆弱，如果在线上进行试验，会非常的危险。\n\n2. 在生产系统中，一定要控制好试验的爆炸半径，控制好影响范围，譬如我们可以先对某一个街道的用户进行干扰，然后在扩大到某一个区域，或者某一个城市，如果我们一开始的影响半径就很大，一个稍微不留意，你的 boss 就可能让你第二天滚蛋了。\n\n3. 做混沌实验一定不是随机的瞎做实验，我们是带有目的的，是需要规划好的，与其漫无目的的对系统随机进行故障注入，我们还不如先问自己一个问题『为了对系统在混乱状况下的表现更有信心，在哪里做混沌实验最有价值？』也就是我们要熟悉了解我们的系统，做高杠杆价值的混沌实验。\n\n好了，现在你已经完全准备好了，现在就可以踏上混沌之旅了，因为 Chaos Mesh 的使用是如此简单，你只需要参考 [用户指南](https://chaos-mesh.org/docs/user_guides/run_chaos_experiment) 就能上手使用，所以我就不过多介绍了，如果你仍然遇到了问题，欢迎给 Chaos Mesh 提 [issue](https://github.com/pingcap/chaos-mesh/issues)，相信我，Chaos Mesh 社区会很热情的帮你解决问题的。\n\n## 总结\n\n随着 ServiceMesh，Serverless 等理念的兴起，我们的系统真的越来越趋向于分布式，这样虽然简化了我们单个模块的实现，但整体来看，也可能会导致我们的系统因为过于分布式而变得复杂，那么如何在这种复杂的环境下仍然让我们有信心能保证系统的正常稳定运行，混沌工程可以算是一个很不错的选择。\n\n现在市面上面，支持混沌工程的平台已经有很多了，但我这里仍然推荐 Chaos Mesh，毕竟使用它能让你极大提升你对系统的信心。\n\n最后，欢迎来到复杂的分布式系统世界。","date":"2020-07-13","author":"唐刘","fillInMethod":"writeDirectly","customUrl":"why-you-need-chaos-engineering-and-chaos-mesh","file":null,"relatedBlogs":[]},{"id":"Blogs_261","title":"刘奇：当今一切都要更实时、更弹性、更简单，TiDB 就是这样的基础设施","tags":["TiDB 4.0 新特性","TiFlash","Chaos Mesh"],"category":{"name":"观点洞察"},"summary":"TiDB 发展到今天，已经不仅仅是一个数据库产品，它已经是很多系统的基石，作为一个基础设施的存在。","body":">6 月 7 日，TiDB 社区年度技术大会 [TiDB DevCon 2020](https://mp.weixin.qq.com/s/MKNy10fyg2erYyrB_r8I2w) 圆满落幕，本届大会采取线上直播的形式，汇聚了来自全球各地的 **80+** 开发者、TiDB 用户及合作伙伴分享第一手开发及实践经验，议题覆盖金融、电信、电商、物流、视频、资讯、教育、医疗等诸多行业，干货满满，目不暇接。会上我们正式发布了具有里程碑意义的 TiDB 4.0 GA 版本，并分享了技术细节及生产环境的实战效果，并为过去年在 TiDB 社区作出卓越贡献的 Contributor、Committer、Maintainer 授予了荣誉奖杯与证书。本届大会历时 2 天，共设置 7 个论坛，**29 小时**累计分享时长，直播间人气值高达 **2.3 万**。\n\n![0-live](https://img1.www.pingcap.com/prod/0_live_d1ba686a70.jpg)\n\n> **以下是我司联合创始人兼 CEO 刘奇的现场分享实录。**\n\n每年我都有一个时间会特别激动，就是产品大版本发布的时候，通常也是社区年度技术大会 TiDB DevCon 举办的时间。去年 [TiDB DevCon 2019](https://mp.weixin.qq.com/s/MKNy10fyg2erYyrB_r8I2w)，我们发布了 TiDB 3.0 Beta，当然今年 TiDB 4.0 GA 也如约而至。\n\n![1-list](https://img1.www.pingcap.com/prod/1_list_8752bc43bb.png)\n\n## Serverless\n\n很长一段时间 TiDB 用户使用的集群规模都很大，然后就会再提出一个诉求说“怎么降低我的使用成本”。TiDB 4.0 拥有了 Serverless 能力之后，会根据用户的实际业务负载，基于 K8s 自动做弹性伸缩。\n\n![2-cost-effective](https://img1.www.pingcap.com/prod/2_cost_effective_cead3f82c2.png)\n\n从前，当我们在上线一个系统的时候，第一件事就是 Capacity Planning，去评估一下我们大概需要多少台服务器，比如提前准备了 50 台，但是实际上线之后跑了一个月，发现 5 台机器就够了。这就导致了大量的资源浪费。如果整个系统能够在云上全自动弹性伸缩，就能避免这种资源浪费。\n\n**更重要的是，TiDB 的弹性伸缩，意味着你永远不需要按照业务的峰值配备系统资源**。比如大家的业务会有早、晚两个明显的高峰，但实际上每个高峰持续时间通常只有 2 个小时左右，也就是说，为了这 4 个小时的高峰，而我们配置了 24 小时的最高资源配置，并为此付费，但非高峰时间的资源和成本完全是可以节省的，可能算下来，我们能够节省的成本大概在 70% 左右，甚至更高。\n\n![3-workload](https://img1.www.pingcap.com/prod/3_workload_653bbf917f.png)\n\n另外，能够弹性伸缩的 TiDB 可以应对无法预测的 Workload，没有人知道哪一个商品在什么时候会大卖，没有人知道我卖的哪一个基金在什么时候会火，这时如果我们给系统一个权限，让它能够自动根据业务当前的实际情况，扩充服务器，这对某个企业或者某个业务来说，可能是“救命之道”，比如像上图的情况，人为介入往往是太慢了，来不及了。\n\n## Real-Time HTAP\n\n在当今这个世界，大家希望所有的东西都要更快、更简单。但如果大家还是按照传统的方式去运用一个数据库，就不能满足这个“更快、更简单”的需求了，因为传统的方式需要经过一系列非常复杂的过程从数据库里面去提取这些变化的信息、事件、日志，再去做分析，那这个过程往往会带来比较长的延迟，这些「延迟」让我们失去了很多直接的经济价值。\n\n在 TiDB 4.0，我们正式推出了 [TiFlash](https://pingcap.com/blog-cn/tiflash-is-getting-faster/)，TiFlash 是配合 TiDB 体系的列存引擎，它和 TiDB 无缝结合，在线 DDL、无缝扩容、自动容错等等方便运维的特点也在 TiFlash 中得到继承，同时 TiFlash 可以实时与行存保持同步。\n\n有了 TiFlash，TiDB 4.0 在大量的复杂计算场景下，至少能够比上一个版本快 10 倍，并且我们永远不需要去操心“一致性”的问题。**不管，面临的是简单的 OLTP 类型的 Workload，还是复杂的 OLAP 类型的 Workload，它总是一致的、实时的，并且能够自动弹性扩张或伸缩。**\n\n![4-架构图](https://img1.www.pingcap.com/prod/4_733e6766cc.png)\n\n上面的架构图大家应该非常熟悉，几乎每一家拥有一定数据规模的公司都经历过。曾经有一个用户，他们在一个大概只有几十 T 数据规模的场景下，搭建了类似上图那样复杂的系统，就是为了能够做 OLTP 和一个报表查询。这中间不得不接入 Kafka 和 ETL，然后将这个报表查询的结果又重新序列化到 HBase 之类的存储系统里面。有没有办法去简化整个系统呢？\n\n![5-real-time-htap-architecture](https://img1.www.pingcap.com/prod/5_real_time_htap_architecture_8a582f6ce9.png)\n\n当我们用 TiDB 4.0 的视角去看的时候，用户已经给出了他们上线的答案。如上图所示，当我们把 TiDB 放在中间这一层，整个系统的复杂度就降低了非常多。接下来也会有用户分享他们使用 TiFlash 的经验，以及他们在架构上面做了哪些简化。\n\n![6-节省成本](https://img1.www.pingcap.com/prod/6_cf516e1c14.png)\n\n说回来，站在基础架构这一层，用户其实并不想知道这个 Workload 到底是长查询还是短查询，**站在用户的角度，只是希望尽快得到结果，尽可能减少过程的复杂度以节省成本、提高开发速度，创造更多价值。**\n\n## Cloud-Native\n\n我知道大家都非常期待 PingCAP 能够提供 TiDB 的云服务，现在我很高兴发布 **TiDB Cloud**，由 PingCAP 来管理，维护，优化的 TiDB 云。\n\n**我们从四年前就开始做了这个准备，今天 TiDB 可以无缝地在“云端跳舞”。**\n\n![7-cloud-native](https://img1.www.pingcap.com/prod/7_cloud_native_c0e394289a.png)\n\n如果有人说：“我不想安装 TiDB，我不想去维护 TiDB”。那这个事，你也可以选择交给 PingCAP 来做。目前我们已经支持了 AWS、GCP 两个云平台（其它云平台的支持也在稳步推进），如果你正在使用这两个平台，那么你什么都不需要做，点几下鼠标就可以轻松使用 TiDB，真正的「开箱即用」。\n\n![8-out-of-the-box](https://img1.www.pingcap.com/prod/8_out_of_the_box_4f6933ea7a.png)\n\n在 TiDB 4.0 中我们提供了超过 70 个新特性，可以阅读这篇文章《[TiDB 4.0：The Leading Real-Time HTAP Database is Ready for Cloud](https://pingcap.com/blog-cn/tidb-4.0-the-leading-real-time-htap-database-is-ready-for-cloud/)》。\n\n## Dashboard\n\n在 TiDB 4.0 里面内置了 [Dashboard](https://pingcap.com/blog-cn/tidb-4.0-tidb-dashboard/)，非常适合像我这种很久没有写 SQL 的人，通过图形界面解决大多数问题，观察整个系统里的热点数据、慢查询，业务在数据库上具体是什么样子，通过多种不同的视图去理解业务负载等等。我们希望在 10 秒钟内就帮用户定位大部分故障和问题，下面的 Dashboard 满足了我的所有“幻想”。\n\n![9-dashboard](https://img1.www.pingcap.com/prod/9_dashboard_d075cf8307.png)\n\n## 性能：Faster and faster\n\n性能是一个永远都会“令人兴奋”的问题。对比 3.0 版本，TiDB 4.0 整体的性能提升了 50% 左右；如果是跑聚合查询，在很多场景下能做到提升 10 倍，甚至是更高，TPC-H 的性能也提升了一倍。这个成果也来自于整个 TiDB 开源社区的贡献，去年年底我们举办了 TiDB 挑战赛 [第一季“性能挑战赛”](https://pingcap.com/blog-cn/pcp-report-202002/)，总共有 165 位社区开发者参赛，包括 23 支参赛队伍和 122 位个人参赛者，他们的参赛成果都落地到了 TiDB 产品当中。\n\n## TiUP 一键安装部署\n\n之前有同学吐槽说，我安装 TiDB 太麻烦了，花了几十分钟甚至一天，才把整个系统部署起来。\n\n在 TiDB 4.0 中，我们专门写了一个工具，叫 TiUP，它是一个包管理器。通过 TiUP，大家可以在一分钟内本地把 TiDB 跑起来，一分钟就能够体验 TiDB。而部署 15 个节点的生产集群也只需要 45 秒，也就是完全做到 1 分钟内快速体验。TiUP 是一个巨大的易用性体验的提升，欢迎大家去体验。\n\n\n>TiUP: A component manager for the TiDB eco-system\n>\n>Try TiDB (playground) within 1 minute with 1 command\n>\n>$ curl https://tiup-mirrors.pingcap.com/install.sh | sh  && tiup playground nightly --monitor\n>\n>Deploy a production cluster in 45 seconds\n\n**TiUP 对用户来说是一个巨大的易用性体验的提升，欢迎大家去体验。**\n\n## Security matters! \n\n![10-security-matters](https://img1.www.pingcap.com/prod/10_security_matters_a421b644c7.png)\n\n随着 TiDB 在全球的应用规模越来越大，越来越多的用户在更加严肃的场景里使用 TiDB，因此我们也提供了大家非常关注的安全特性，来符合各个国家对安全和隐私的合规要求。目前所有 TiDB 通讯组件的通讯过程都是全部加密的，所有存储的数据都支持透明加密，包括 PingCAP 或者任何一家云厂商，都不能侵犯到 TiDB 用户的数据隐私与安全。当 TiDB 跑在这个云上时，没有人能够看到数据库，没有人能够从中截获到通讯过程的数据。\n\n## 实战效果如何？\n\n相信有人会有疑问，讲了这么多，TiDB 4.0 是否真的准备好了？能不能上生产环境？有没有实战数据分享？\n\n![11-zhihu](https://img1.www.pingcap.com/prod/11_zhihu_da64970d3a.png)\n\n上图知乎的已读服务，前几天知乎刚升级到 TiDB 4.0 的最大的一个内部集群。整个集群容量有 1 PB，目前的存储数据量已经达到了 471TB。\n\n我第一次看到这个数据的时候还是非常震惊的，不仅仅是因为数据规模，还震惊和感动于孙晓光老师（知乎，TiKV Maintainer）对 4.0 的信心，他们在 5 月 28 日 4.0 GA 版本正式发布的第4天，就已升级。当然，看到这个结果，我的信心也更强了，**TiDB 不仅仅支撑这么大数据规模，更重要的是让知乎已读服务的整个系统计算能力有了很大的提升，极大改善了整个系统的延迟。**\n\n![12-deeper](https://img1.www.pingcap.com/prod/12_deeper_17035aa304.png)\n\n从上图可以看到，TiDB 4.0 与上一个版本相比，降低了 40% 的延迟，换句话说，如果在维持相同的延迟的情况下，大约能够降低 40% 的成本。\n\n## Why is TiDB so Popular ?\n\n过去的一年，我也会经常被问到一个问题，为什么 TiDB 如此的流行？为什么 TiDB 能够走遍全世界？为什么能够得到这么多用户的使用和赞赏（当然也有吐槽，用户的吐槽也让我们很积极、很有动力去改进，去快速迭代）？\n\n![13-star-history](https://img1.www.pingcap.com/prod/13_star_history_114543a83c.png)\n\n其实这一切不仅仅是 PingCAP 的功劳，而是整个开源社区的功劳，PingCAP 只是 Community 的一部分。正是因为有全球各地的开发者参与贡献，比如美国的 Square、Azure、Zoom、法国的 Dailymotion、日本的 PayPay 等等，给我们提意见、提需求，提 PR 贡献代码，一起打磨、一起成就了今天的 TiDB ，组成了现在庞大的 TiDB 开源社区。\n\n在 4.0 发布的时候，我们也做了一个词云，看了看 TiDB 代码贡献者所属的组织，并且按照组织的贡献程度，画了一张图出来，我们才发现原来有这么多的组织，在 TiDB Community 中持续贡献：\n\n![14-contributor-cloud](https://img1.www.pingcap.com/prod/14_contributor_cloud_fe4bb576bf.png)\n\n同时，经常会让我感到惊喜的是社区的创造性。比如 TiDB Contributor 刘东坡把贡献排名前 100 的 Contributor 做了可视化的展示：\n\n![15-contributor-gif](https://img1.www.pingcap.com/prod/15_contributor_gif_3277f95458.gif)\n\n<div class=\"caption-center\">https://rustin-liu.github.io/Ti2020/</div>\n\n**这位小伙伴也在本届 TiDB DevCon 的开发者社区专题论坛中分享了参与社区的心路历程，我们也希望更多人能够像这位小伙伴一样，在 TiDB 社区中有所收获，更在贡献中感受到乐趣&归属感。**\n\n另外，不管你是谁，只要你想参与 TiDB 的打造或者想使用 TiDB，我们都为你准备好了：\n\n* 如果你在用 TiDB 过程中，遇到任何问题，你都可以去 [AskTUG](https://asktug.com) 提问，有超过 2700 个会员，他们都在 AskTUG 中分享实战经验或者踩过的坑，或许你遇到的问题，在这里搜索一下就能得到解答。\n\n* 如果你还想进一步再深入的学习 TiDB，我们也推出了 [PingCAP Education](https://education.pingcap.com) 线上及线下的培训课程。最后大家也可以验证一下自己的学习效果，也可以去参加认证考试。\n\n在过去的几个月里，TiDB 社区伙伴们也做了一些比较疯狂的事情。比如，我们花了 48 小时写了一本书[《TiDB 4.0 in Action》](https://pingcap.com/blog-cn/tidb-in-action-finish/)（阅读地址：book.tidb.io）。或许乍一听觉得很神奇，48 小时怎么可能能写一本书呢？但大家去看一下作者的数量就能理解了，这本书有 100 多位作者，每个人写一小节，就是 100 小节，48 小时轻松搞定。**当然这个事情也不是轻松促成的，它的实现其实是整个社区长时间的知识&精神力量的积累。**\n\n如果看到这里，你雄心勃勃，还想再精进一步，想写一个属于自己的分布式数据库。没问题，我们还准备了 Talent Plan 课程，可以根据课程规划一步步 build 一个分布式数据库的计算层、存储层，这门课程还会有来自全球各地的导师帮你 Review 代码和作业，目前暂时支持中文和英文。\n\n## Bonus: Chaos Mesh!\n\n最后聊一聊我们在混沌工程方面的实践，在软件领域有一个常识是，“现实中所有可以预见的故障，最后都必然会发生”，系统的复杂性是无法逃避的、必须要面对的，也是我们必须要去解决的。**在今天，整个系统的复杂性已经不仅仅局限于数据库了，而是延展到了整个业务的全链路，最终落脚在系统为用户提供的服务质量。**\n\n![17-complexcity](https://img1.www.pingcap.com/prod/17_complexcity_0c29f5213b.png)\n\n如上图所示，Amazon 和 Netflix 两家公司的微服务可视化之后的样子，不能简单用蜘蛛网来比喻，它实际上比蜘蛛网还要复杂得多。所以我们需要一套系统，去模拟现实中所有可能发生的故障，并且让这个故障不断的发生，未雨绸缪地增强系统的鲁棒性。\n\n因此，我们在开发 TiDB 的整个过程中，构建了一套系统 **Chaos Mesh**。它会做什么？\n\n比如，它可以模拟磁盘坏掉。在我们的测试环境中，磁盘每分钟坏一次，网络每分钟都会产生隔离。尽管这种情况在现实世界中极少出现，但是一旦出现就会形成灾难性的故障。而模拟磁盘坏掉只是 Chaos Mesh 可以提供的众多功能之一。\n\n![18-chaos-engineering](https://img1.www.pingcap.com/prod/18_chaos_engineering_6a6f8a24bc.png)\n\n[Chaos Mesh](https://github.com/pingcap/chaos-mesh) 将帮助大家在业务的全链路上，做完整的、所有可能出现的故障测试。以往大家凭经验所说的 “有 99.99% 或者有 99.999% 的几率系统能够正常运行”，都包含了一些“运气”成分在其中。因为，我们用 Chaos Mesh 去测试了各种故障情况，会发现某个系统要做到“99.99% 或者 99.999% 正常运行”是非常非常少见的、极其困难的一件事。**在 TiDB 的开发过程中，我们同步使用了 Chaos Mesh 来测试 TiDB，TiDB 4.0 在测试用户中的反馈非常好，一部分也要归功于 Chaos Mesh “疯狂摧残式”的测试。当然我们也非常欢迎大家使用 Chaos Mesh 测试和打磨自己的系统。**\n\n## 结语\n\n**实际上，TiDB 发展到今天，已经不仅仅是一个数据库产品，它已经是很多系统的基石，作为一个基础设施的存在**。大家在使用之前，也可以参考其他人的成熟经验或者解决方案，TiDB DevCon 2020 上有 80+ TiDB 用户&合作伙伴分享一手实践经验，不管你来自哪个行业，比如金融、电商、物流、新零售、出行、电信、医疗、能源、制造业、高科技、教育、视频、资讯；还是应用在不同的使用场景，比如实时分析、数据汇聚、Data Mart，元数据存储、日志审计、日志统计分析，还有 IM 等等。所有你想看了解的行业参考，你想了解的场景实践，我们已经准备好了。后续 TiDB DevCon 2020 部分视频&文字回顾将陆续整理输出，敬请期待。\n\n>TiDB DevCon 是 PingCAP 团队面向 TiDB 社区推出的技术会议，每年在北京举办。本届 DevCon 在 6 月 6 ～ 7 日举办，以线上直播的方式，为大家展示 TiDB 近一年的产品技术蜕变，分享最新的海内外生态进展，并邀请了来自全球的 80+ 位开发者、用户及合作伙伴，分享他们的实战经验和开源思考，覆盖金融、制造业、电信、电商、物流、能源、快消、新零售、云计算等多个领域。","date":"2020-06-10","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"tidb-is-such-a-more-real-time-more-elastic-and-simpler-infrastructure","file":null,"relatedBlogs":[]},{"id":"Blogs_71","title":"未来数据库应具备什么核心能力？","tags":["The Future of Database","TiDB"],"category":{"name":"观点洞察"},"summary":"上周六，我们开启了 The Future of Database 系列的第一期直播，我司 CTO 黄东旭及 Engineering VP 申砾畅聊了“未来的数据库会是什么样？”这个颇具想象力的话题。这是第一期直播的部分文字&视频回顾。","body":">上周六，我们开启了 [The Future of Database 系列](https://mp.weixin.qq.com/s/SiAO0_RcKw2edJj-B8Yu6A) 的第一期直播，我司 CTO 黄东旭及 Engineering VP 申砾畅聊了“未来的数据库会是什么样？”这个颇具想象力的话题。\n>\n>以下是第一期直播的部分文字&视频回顾 Enjoy ~\n\n**视频链接**：<https://www.bilibili.com/video/BV1Ji4y1t7io>\n\n## 目前业界数据存储方案存在的问题？\n\n* 受限的 Scale 能力\n\n\t分库分表和一些「伪分库分表」的方案，仍然有天花板，带来了额外的运维和消耗。\n\n* 碎片化\n\n\t回想一下最近几年后端的技术栈，有 NoSQL、缓存、Kafka、 离线数据仓库、Hadoop、HBase……**不同的工具可能面对的是某些特定、甚至「狭窄」的场景，为了应对一个复杂的业务，大家必然就要多种技术方案组合来覆盖所有的应用场景。这个过程中自然会产生「数据孤岛」**，打通孤岛的成本也是巨大的，Kafka 最近几年这么火也是正因为存储方案的多样导致的「数据孤岛」的问题正在显现。\n\t\n* 在线业务与分析脱节\n\n\t现在大家构建存储系统的时候，默认会让在线业务与离线业务是分开的， 在线业务用 MySQL、MongoDB 等等，离线业务（或者分析系统）用 Hadoop 做数据分析，好像大家都是理所当然的认为：在线和离线就该这样，泾渭分明。\n\t\n\t**但目前有个趋势，分析的场景的需求越来越「实时」，或者说高时效的数据分析带来的业务价值受到重视**，这就与大家惯性认知产生了本质的冲突：业务需要当日甚至实时的数据分析结果，但后端只能说今天的数据明天才能导出。还有一个问题是，各个部分维护团队也是分开的，当业务发生变化时，很难灵活地调整和适应。\n\t\n**导致以上这些问题出现的深层共性是：变化永远比计划快**，你永远没法预测未来需要多少机器？业务会膨胀到多大？到底需要多“实时”的数据来做决策？\n\n**有没有可能存在一个应付更多变化、覆盖更多场景的系统**？从前可能是：我的工具箱里装了各种型号的锤子（工具软件），去应对不同场景、形状的钉子，现在可能追求用一个锤子，快速、低成本的解决不同的钉子（问题），**以不变应万变**。\n\n## Real-Time HTAP 是解药吗？\n\n聊到最近几年数据库领域的变化，申砾提到最近两年很多数据库打出了 HTAP 的标签，黄东旭分享了自己对“一个真正的 Real-Time HTAP 数据库”的理解：\n\n![1-real-time-htap](https://img1.www.pingcap.com/prod/1_real_time_htap_0bf2112420.png)\n\n**那么 Real-Time HTAP 价值在何处？应该在于它是一个简单、灵活的方案——能够将各个系统/团队集中在一个 Real-Time HTAP 系统上，节省成本并灵活应对业务变化。**\n\n## Real-Time HTAP 之后?\n\nReal-Time HTAP  可能是当下厂商们能够看得到的努力方向，那么在 Real-Time HTAP 之后的未来是什么呢？\n\n或许五年之后有以下场景：\n\n![2-several-scenes](https://img1.www.pingcap.com/prod/2_several_scenes_6b4d7f2d2f.png)\n\n基于这些场景，**未来数据库绕不开的核心能力应该是：智能、弹性调度能力**。\n\n最近有个新概念是 Serverless，Severless 是伴随云（Cloud）诞生的概念。当然 Severless 不是没有服务器，通俗地说，Serverless 就是会根据你的实际需求情况，调整数据库的形态，例如业务流量峰值的时候快速的采购弹性的计算资源进行扩容，低峰的时候自动的释放多余的资源。所以可以把 Severless 当做智能、弹性调度的落地形式来理解，同时未来的数据库一定是跑在云上的。","date":"2020-04-15","author":"PingCAP","fillInMethod":"writeDirectly","customUrl":"core-competence-of-future-database","file":null,"relatedBlogs":[]},{"id":"Blogs_128","title":"聊聊数据库的未来，写在 PingCAP 成立五周年之际","tags":["架构"],"category":{"name":"观点洞察"},"summary":"我们要造的是一个真正能作为整个系统的 Single Source of Truth 的基础软件。","body":">我还清楚记得，五年前的这个时候，当时还在豌豆荚，午后与刘奇和崔秋的闲聊关于未来数据库的想象，就像一粒种子一样，到了今天看起来也竟枝繁叶茂郁郁葱葱，有点感慨。按照惯例，五年是一个重要的节点，没有十年那么冗长，也没有一两年的短暂，是一个很好的回顾节点，就在此认真的回顾一下过去，展望一下未来。\n\n五年前创业的出发点其实很朴素：做一个更好的分布式数据库。从学术的角度上看起来，并不是提出了什么惊天地泣鬼神的神奇算法，我们选择的 Shared-nothing 的架构其实在当时的业界也不是什么新鲜的事情了，但真正令我激动的是：**我们要造的是一个真正能作为整个系统的 Single Source of Truth 的基础软件**。这句话怎么理解呢？我在后边会好好聊聊。\n\n## 数据是架构的中心\n\n作为一个互联网行业的架构师，几乎是天天都在和各种类型的数据打交道，这么多年的经验，不同行业不同系统，从技术层面来说，抽象到最高，总结成一句话就是：\n\n**数据是架构的中心。**\n\n仔细想想，我们其实做的一切工作，都是围绕着数据。数据的产生，数据的存储，数据的消费，数据的流动……只不过是根据不同的需求，变化数据的形态和服务方式。计算机系的同学可能还记得老师说过的一句话：程序 = 算法 + 数据结构，我这里斗胆模仿一下这个句式：**系统 = 业务逻辑 x 数据**。可以说很多架构问题都是出在数据层，例如常见的「烟囱式系统」带来的种种问题，特别是数据孤岛问题，其实本质上的原因就出在没有将数据层打通，如果不从数据架构去思考，就可能「头疼医头、脚疼医脚」，费了半天劲还是很别扭，反过来如果将数据层治理好，就像打通「任督二脉」一样，起到四两拨千斤的效果。\n\n但是理想通常很丰满，现实却很骨感。至少在我们五年前出来创业那会儿，我们觉得并没有一个系统能够很好的解决数据的问题。可能好奇的读者就要问了：不是有 Hadoop？还有 NoSQL？再不济关系型数据库也能分库分表啊？其实列出的这几个几乎就是当年处理存储问题的全部候选，这几个方案的共同特点就是：不完美。\n\n**具体一点来说，这几个解决方案对于数据应用的场景覆盖其实都不大，对于复杂一点的业务，可能需要同时使用 n 多个方案才能覆盖完整**。这就是为什么随着近几年互联网业务越来越复杂，类似 Kafka 这样的数据 Pipeline 越来越流行，从数据治理的角度其实很好理解：各种数据平台各负责各的，为了做到场景的全覆盖，必然需要在各个「岛」之间修路呀。\n\n**我们当年就在想，能不能有一个系统以一个统一的接口尽可能大的覆盖到更多场景。**\n\n**我们需要一个 Single Source of Truth**。数据应该是贯穿在应用逻辑各个角落，我理想中的系统中对于任意数据的存取都应该是可以不加限制的（先不考虑权限和安全，这是另一个问题），这里的“不加限制”是更广义的，例如：没有容量上限，只要有足够的物理资源，系统可以无限的扩展；没有访问模型限制，我们可以自由的关联、聚合数据；没有一致性上的限制；运维几乎不需要人工干预……\n\n## 以分布式数据库为统一中心的架构\n\n我当年特别着迷于一个美剧：Person of Interest （疑犯追踪），这个电视剧里面有一个神一样的人工智能 The Machine，收集一切数据加以分析，从而预测或是干预未来人们的行动。虽然这部美剧还是比较正统的行侠仗义之类的主题，但是更让我着迷的是，是否我们能设计一个 The Machine？虽然直到目前我还不是一个 AI 专家，但是给 The Machine 设计一个数据库似乎是可行的。这几年创业过程中，我们发现更令人兴奋的点在于：\n\n**以分布式数据库为统一中心的架构是可能的。**\n\n这个怎么理解呢？举个例子，就像在上面提到的分裂带来的问题，数据层的割裂必然意味着业务层需要更高的复杂度去弥补，其实很多工程师其实偏向于用线性的思维去思考维护系统的成本。但是实际的经验告诉我们，事情并不是这样的。一个系统只有一个数据库和有十个数据库的复杂程度其实并不是的简单的 10x，考虑到数据的流动，维护成本只可能是更多，这里还没有考虑到异构带来的其他问题。\n\n![](https://img1.www.pingcap.com/prod/1_framework_b4f03e7728.png)\n\n以分布式数据库为中心的架构是什么样子的呢？**很好理解，整个架构的中心是一个场景覆盖度足够广，且具有无限的水平伸缩能力的存储系统。大部分数据的流动被限制在这个数据库内部，这样应用层就可以几乎做到无状态，因为这个中心的数据库负责了绝大部分状态，每个应用可以通过自己的缓存来进行加速。\n这里我想提醒的是，为什么我在上面强调水平扩展能力，是因为受限的扩展能力也是导致分裂的一个重要的原因。我们从来都没有办法准确的预测未来，我们很难想象甚至是一年后业务的变化（想想这次疫情），有句老话说的很好：唯一不变的就是变化。**\n\n另外一个经常被问到的问题，为什么要强调缓存层需要离业务层更近，或者说，为什么位于中心的这个巨型数据库不应该承担缓存的责任？我的理解是，只有业务更懂业务，知道应该以什么样的策略缓存什么样的数据，而且出于性能（低延迟）考虑，缓存离业务更近也是有道理的。\n\n![](https://img1.www.pingcap.com/prod/2_distributed_database_7178953c29.png)\n\n对应上面那句话「唯一不变的就是变化」，这个架构带来最大的好处正是「以不变应万变」，或者更简单的一个词：**简洁**。Google 其实在很早就想清楚了这个问题，因为他们很早就明白什么是真正的复杂。\n\n另一个例子是 **HTAP**，如果关注的数据库的发展的话，最近一定对 HTAP 这个词很熟悉，其实在我看来的 HTAP 的本质在于上面提到的覆盖度，下面是一个典型的架构：\n\n![](https://img1.www.pingcap.com/prod/3_htap_framework_1cd6882f23.png)\n\n传统的数据架构通常将 OLTP、OLAP、离线数仓分离，各个系统各司其职，中间通过独立的 Pipeline 进行同步（有时候还会加上 ETL）。\n\n**下面是一个 HTAP 的系统的样子：**\n\n![](https://img1.www.pingcap.com/prod/4_htap_7b37245123.png)\n\n虽然从表面上看，只是简单的将接口层进行整合，但是这个意义其实是深远的，首先数据同步的细节被隐藏了一起来，这意味着数据库层面可以自己决定通过何种方式同步数据，另外由于 OLTP 引擎和 OLAP 引擎在同一个系统内部，使得很多细节信息不会在同步的过程中丢失，比如：事务信息，这就意味着在内部的分析引擎能够做到传统的 OLAP 没办法做的事情。另外对于业务层的使用来说，少一个系统意味着更统一的体验和更小的学习和改造成本，**不要低估统一带来的力量**。\n\n## 未来在哪里？\n\n上面这些是过去五年发生的事情，也几乎按照我们创业时候的设想一步步的变为现实，那么接下来的五年会发什么？随着对于行业和技术的理解的加深，至少有一点我深信不疑的是：\n\n### 弹性调度会是未来的数据库的核心能力\n\n谁都不会否认，最近十年在 IT 技术上，最大的变革是由云带来的，这场革命还在进行时。云的核心能力是什么？我认为是弹性。计算资源分配的粒度变得越来越细，就像从只能买房变成可以租房，甚至可以像住酒店一样灵活。这意味着什么？**本质在于我们可以不用为「想象中」的业务峰值提前支付成本。**\n\n过去我们的采购服务器也好，租赁机柜也好，都是需要设定一个提前量的，当业务峰值没有到来之前，其实这些成本是已经提前支付的了。云的出现将弹性变成了基础设施的一个基础能力，我预计数据库也会发生同样的事情。\n\n可能有很多朋友会有疑问，现在难道不是几乎所有数据库都号称能够支持透明水平扩展嘛？其实这里希望大家不要将**「弹性调度」**狭隘的理解为扩展性，而且这个词的重点在**「调度」**上，我举几个例子以方便大家理解：\n\n1. **数据库能不能够自动识别 workload，根据 workload 进行自动伸缩**？例如：预感到峰值即将来临，自动的采购机器，对热数据创建更多副本并重分布数据，提前扩容。在业务高峰过去后，自动回收机器进行缩容。\n\n2. **数据库能不能感知业务特点，根据访问特点决定分布**？例如：如果数据带有明显的地理特征（比如，中国的用户大概率在中国访问，美国用户在美国），系统将自动的将数据的地理特征在不同的数据中心放置。\n\n3. **数据库能不能感知查询的类型和访问频度，从而自动决定不同类型数据的存储介质**？例如：冷数据自动转移到 S3 之类比较便宜的存储，热数据放在高配的闪存上，而且冷热数据的交换完全是对业务方透明的。\n\n这里提到的一切背后都依赖的是「弹性调度」能力。未来我相信物理资源的成本会持续的降低，计算资源的单价持续下降带来的结果是：当存储成本和计算资源变得不是问题的时候，问题就变成**「如何高效的分配资源」**。如果将高效分配作为目标的话，「能调度」就是显而易见的基础。\n当然就像一切事物发展的客观规律一样，学会跑步之前，先要学会走路，我相信在接下来的一段时间内，我们会看到第一批初步拥有这样能力的新型数据库，让我们拭目以待。\n\n### 下一个阶段是智能\n\n对于更远的未来是怎么样子的？我不知道，但是就像 The Machine 一样，只有足够数据才能诞生出智能，我相信就像我们不了解宇宙和海洋一样，我们现在对于数据的认识一定是肤浅的，甚至大量的数据我们都还没记录下来，一定有更大奥秘隐藏在这海量的数据中，从数据中能获取什么样的洞察，能够怎么样更好的改变我们的生活，我并不知道，但是做这件事情的主角我猜不会是人类。虽然在这个小节我们讨论的东西可能就有点像科幻小说了，不过我愿意相信这样的未来，从数据的海洋中诞生出新的智能体。\n\n## 尾声\n\n创业这五年的时间，回头看看那个最朴素的出发点：写一个更好的数据库彻底解决烦人的 MySQL 分库分表问题。似乎也算没有偏离初心，但是在这个旅途中一步步看到了更大的世界，也越来越有能力和信心将我们相信的东西变为现实：\n\n我有一个梦想，未来的软件工程师不用再为维护数据库加班熬夜，各种数据相关的问题都将被数据库自动且妥善的处理；\n\n我有一个梦想，未来我们对数据的处理将不再碎片化，任何业务系统都能够方便的存储和获取数据；\n\n我有一个梦想，未来的我们在面临数据的洪流时候，能从容地以不变应万变。\n\n最近我听到一句话，我个人很喜欢：**雄心的一半是耐心**。构建一个完美的数据库并不是一朝一夕的工作，但是我相信我们正走在正确的道路上。\n\n**凡所过往，皆为序章。**","date":"2020-04-08","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"talk-about-the-future-of-databese-on-5th-anniversary-of-pingcap","file":null,"relatedBlogs":[]},{"id":"Blogs_167","title":"我眼中的分布式系统可观测性","tags":["Key Visualizer","TiDB 4.0 新特性"],"category":{"name":"观点洞察"},"summary":"在 Cloud Native 和微服务的世界里，大家正在将“系统的可观测性”放在更高的位置。","body":"![位于 M87 中心的特大质量黑洞示意图（© EHT Collaboration）](https://img1.www.pingcap.com/prod/1_black_hole_b3fdec4529.png)\n\n<center>位于 M87 中心的特大质量黑洞示意图（© EHT Collaboration）</center>\n\n今天的文章我想从这张模糊的照片说起。\n\n相信很多小伙伴对这张照片并不陌生，这是去年人类第一次拍摄的 M87 中心黑洞的照片，从1915年，爱因斯坦提出相对论预言黑洞的存在到 2019 年我们终于第一次「**看到**」了黑洞的样子，中间整整相隔了 100 多年，这对于人类认识黑洞乃至认识宇宙都是一个里程碑式的事件。人类是一个感性的动物，所谓「**一图胜千言**」很多时候一张图传达的信息超过千言万语。\n\n关于黑洞我不想展开太多，今天我们聊聊「**望远镜**」。\n\n前几天，在 TiDB 4.0 的开发分支中，我们引入了一个新功能叫做：Key Visualizer（下面简称 KeyViz），说起来这个小工具也并不复杂，就是用不同颜色的方框来显示整个数据库的不同位置数据访问频度和流量。一开始我们只是仅仅将它定位为一个给 DBA 用来解决数据库热点问题的调优辅助小工具，但是从昨晚开始我就一直在把玩这个小东西，突然觉得它对于分布式数据库来说背后的意义远不及此。\n\n**在 CNCF 对 Cloud Native 的定义中，有一条叫做「Observability」，通用的翻译叫系统的「可观测性」。过去我一直苦于寻找一个例子说明什么叫做一个「可观测」的系统，在 KeyViz 这个项目上，我找到了对这点绝佳的体现。**\n\n**举几个直观的小例子。你知道 TPC-C 测试「长」什么样子吗？请看下图：**\n\n![TPC-C](https://img1.www.pingcap.com/prod/2_TPC_C_da4fbe5809.png)\n\n图中横轴是时间，纵轴是数据的分布，左半部分是数据导入的过程，有零星的亮点，可以看到写入分散到多个区块；右边密集的色块是测试在运行时系统的实时读写状态，越暗表示流量越小，越亮表示流量越高。从密集的色块我们能够看得出来，workload 基本分布均匀，但是大概有两处是明显偏亮的区域，其中靠近最上方，有一个特别明显的**局部访问热点**（最亮的那条线）。\n\n**第二个例子，你见过 Sysbench 测试 「长」什么样子吗？看看下面。**\n\n![Sysbench-test](https://img1.www.pingcap.com/prod/3_Sysbench_test_d2281f2229.png)\n\n左边比较密集的明亮黄块部分，是导入数据阶段；右半段明暗相间的部分是在进行 oltp_point_select 测试，因为选取的模式是 uniform 模式，并且导入的时候是 32 线程 32 张测试表，可以看到的数据和分布和访问都比较均匀。\n如果你看懂了上面两个小例子，下面是一个小作业：这是我们模拟的一个实际用户的生产环境的照片，**这个用户的系统遇到了一些瓶颈，你能看出问题吗？**\n\n![bottleneck](https://img1.www.pingcap.com/prod/4_bottleneck_f32d5335e8.png)\n  \n上面几个小例子是让大家对 KeyViz 有个感性的认识，在介绍这个东西背后的意义之前，我想先介绍一下 TiDB 这类典型的分布式数据库的系统架构，方便大家更好的理解。\n\n![一个典型的分布式数据库的数据分布策略](https://img1.www.pingcap.com/prod/5_data_distribution_strategy_5c63eb7dbd.png)\n\n<center>一个典型的分布式数据库的数据分布策略</center>\n\n分布式数据库，顾名思义，数据一定是分散在不同机器上的。对于一张表的数据，我们会在逻辑上切分成若干个连续的区间，将这些区间内的数据分给不同的机器存储，不管是写入还是读取，只需要知道目标数据属于哪个区间，就可以直接到那个机器上进行访问。然后加上对每一个区间的数据在物理上做多副本冗余，实现高可用。如下图所示，Region 在 TiDB 的内部就是一个个连续的数据区间。\n\n![](https://img1.www.pingcap.com/prod/6_Node_849297025e.png)\n\n和很多分布式数据库不太一样的是，我们的 Region 的大小比较小（默认 96MB) ，另外数据的分布并不是静态的，而是动态的，Region 会像细胞一样分裂/合并，也会在不同机器之间移动进行动态的负载均衡。\n\n![](https://img1.www.pingcap.com/prod/7_Region_770e77763d.png)\n\n现在回头看这个设计，还是觉得无比的简洁和优雅。对用户而言再也不用去思考怎么分库，怎么分表，数据在最底层的细胞就像有生命一样繁衍和迁徙。\n\n**然后问题就来了，对于这样的数据库而言，有没有一种办法能够直观地描述系统的运行时状态？我怎么知道它是不是「生病」了？我能不能预测这个系统的未来？我能不能发现未知的风险？**\n\n过去，不管是业务开发者还是 DBA，衡量一个数据库的状态，来来回回就是几个指标，QPS 、TPS、查询时间、机器负载（CPU、网络、磁盘），但很多时候就像是盲人摸象一样对于系统的全局我们是不清楚的。再加上在一个分布式的架构下，很多时候，我们可能会被海量的数字蒙蔽了双眼。一些有经验的 DBA 或许可以通过自己的经验，从多个指标里模糊构建出业务全局状态，但是到底这个经验往往是不可描述的，这就是为什么一些老运维、老 DBA 那么值钱的原因，但是我认为这种做事方式是很难 scale 的。\n\nCT 、B 超、核磁共振，这些现代化的手段极大地促进了现代医学的发展，因为我们第一次能「看见」我们身体的内部状态，从而才能得出正确的判断。**在计算机的世界道理也是相通的，最好通过某些工具让人清晰地「看见」系统运行的健康状态、帮助诊断病灶，从而降低经验门槛和不确定性。**\n\n过去也经常有朋友问我：“你说我这个业务适不适合使用 TiDB？”这时我们只能问，你的 QPS 多少 TPS 多少，数据量多少？读写比？典型查询？数据分布怎么样？表结构是什么呀？等等一连串的灵魂拷问，而且很多术语都非常专业，不是在这个行业摸爬滚打很久的老司机可能都搞不太清楚。而且有些信息可能是敏感的，也不方便共享。所以「**预判** TiDB 到底适不适合某项业务」就成了一个玄学问题，这个问题困扰了我很久，很多时候也只能凭个人感觉和经验。其实这个问题也并不是 TiDB 特有，尤其是最近几年，几乎所有现代的分布式系统，都或多或少有类似的问题。\n\n**在过去，一个物理机器的状态确实可以通过几个监控指标描述，但是随着我们的系统越来越复杂，我们的观测对象正渐渐的从「Infrastructure」转到「应用」，观察行为本身从「Monitoring（监控）」到「Observability（观测）」。** 虽然看上去这两者只是文字上的差别，但是请仔细思考背后的含义。关于这个话题，我很喜欢引用下面这张图：\n\n![](https://img1.www.pingcap.com/prod/8_coordinate_drawing_1_10caf4d427.png)\n\n上图坐标描述了我们对系统的理解程度和可收集信息之间的关系。在 X 轴的右侧（Known Knows 和 Known Unknowns）这些称为**确定性的已知和未知**，图中也给出了相对应的例子，这些信息通常是最基础的普适的事实，也就是在系统上线之前我们一定就能想到，一定能够监控起来的（CPU Load、内存、TPS、QPS 之类的指标），我们过去已有的大多数运维监控都是围绕这些确定的东西。\n\n但是有一些情况是这些基础信息很难描述和衡量的，例如这个坐标的左上角：**Unknown Knowns**，用通俗的话来说，叫做「**假设**」。举个数据库的例子：有经验的架构师在设计一个基于分布式数据库的应用时，通常不会将表的主键设成自增主键，会尽可能的用 UUID 或者其他方式打散数据，这样在即使有突发写入压力的时候，系统也能很好的扩展。\n\n注意在这个例子中，其实「**假设**」的事情（写入压力突然增大）并没有发生，如果在日常压力不大，数据量不多的情况下，即使使用自增主键，从已有的基础监控中，可能也很难看出任何问题。但是到出事的时候，这个设计失误就会变成 **Unknown Unkowns（意外）**，这是任何人都不想看到的。有经验的架构师能通过种种的蛛丝马迹证实自己的推测，也从无数次翻车的 Post-mortem 中将 Unknown Unknowns 的范围变小。**但是更合理的做法是通过技术手段描绘系统更全面的状态。在 Cloud Native 和微服务的世界里，最近几年一个行业的大趋势是将「系统的可观测性」放在一个更高的位置（监控只是可观测性的一个子集），这是有道理的。**\n\n![](https://img1.www.pingcap.com/prod/9_coordinate_drawing_2_0c09027d9e.png)\n\n回到数据库的世界，TiDB KeyViz 的意义在于，就像上面提到的，这个工具不仅仅是一个监控工具，而且**它能以一个非常低门槛且形象的方式让架构师具象化的看到自己对于业务的「假设」是否符合预期，这些「假设」不一定是能够通过监控反映的，以获得对业务更深刻的 Insight。**\n\n还是说回上面那个主键的小例子。对于两种不同的主键设计，KeyViz 这边是怎么表现的呢？看看下面两张图，是不是非常一目了然？\n\n![](https://img1.www.pingcap.com/prod/10_UUID_69a78fd79b.png)\n\n![](https://img1.www.pingcap.com/prod/11_self_increment_71f30ca3a1.png)\n\n所以现在如果有朋友问我，“这个业务适不适合 TiDB？”我只需要通过录制线上流量，或者搭建一个从集群，只需要把 KeyViz 的图给我看一眼，我甚至都不需要压力测试就能判断这个业务是否适合，而且即使不适合，我也能准确的给出修改建议，因为 KeyViz 的图对我的「假设」的可解释性有了很强的支持。\n\n我们不妨在此基础上再放飞一下想象力，为什么人类能够一眼就从这图片中理解这些信息，这说明这些图形背后有**模式**，有模式我们就可以识别——\n\n想象一下，如果所有的 TiDB 用户，都使用 KeyViz 将自己的系统具象化后分享出来（其实这些图片已经高度抽象，已经不具有任何的业务机密信息），**我们是不是可以通过机器学习，挖掘背后更深层次的价值？AI 能不能通过这种形式更加理解我们的业务？**\n\n最后，我想以我最喜欢的科幻小说《三体：黑暗森林》中的一段话结束这篇文章，大致是面壁人希恩斯在冬眠后被妻子唤醒后的一个场景：\n\n>……与此同时，希恩斯感觉到围绕着他们的白雾发生了变化，雾被粗化了，显然是对某一局部进行了放大。他这时发现所谓的雾其实是由无数发光的小微粒组成的，那月光般的光亮是由这些小微粒自身发出的，而不是对外界光源的散射。放大在继续，小微粒都变成了闪亮的星星。希恩斯所看到的，并不是地球上的那种星空，他仿佛置身于银河系的核心，星星密密麻麻，几乎没有给黑夜留出空隙。\n>\n>“每一颗星星就是一个神经元。”山杉惠子说，一千亿颗星星构成的星海给他们的身躯镀上了银边。\n\n> 延展阅读：[做出让人爱不释手的基础软件：可观测性和可交互性](https://pingcap.com/zh/blog/how-to-develop-an-infrasoft-observability-and-interactivity)  \n> [TiDB 4.0 新特性前瞻（一）拍个 CT 诊断集群热点问题](https://pingcap.com/zh/blog/tidb-4.0-key-visualizer)","date":"2020-02-22","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"observability-of-distributed-system","file":null,"relatedBlogs":[]},{"id":"Blogs_61","title":"分布式系统 in 2010s ：测试和运维","tags":["分布式系统前沿技术"],"category":{"name":"观点洞察"},"summary":"本文为「分布式系统 in 2010s」 系列最终篇，这次我们来聊一聊测试和运维。","body":"我觉得面对测试的态度是区分一个普通程序员和优秀程序员的重要标准。现如今我们的程序和服务越来越庞大，光是单元测试 TDD 之类的就已经很难保证质量，不过这些都是 baseline，所以今天聊点新的话题。\n\n说测试之前，我们先问下自己，为什么要测试？当然是为了找 Bug。看起来这是句废话，但是仔细想想，如果我们能写出 Bug-free 的程序不就好了吗？何必那么麻烦。不过 100% 的 Bug-free 肯定是不行的，那么我们有没有办法能够尽可能地提升我们程序的质量？举个例子，我想到一个 Raft 的优化算法，与其等实现之后再测试，能不能在写代码前就知道这个算法理论上有没有问题？办法其实是有的，那就是形式化证明技术，比较常用的是 TLA+。\n\n## TLA+\n\nTLA+ 背后的思想很简单，TLA+ 会通过一套自己的 DSL（符号很接近数学语言）描述程序的初始状态以及后续状态之间的转换关系，同时根据你的业务逻辑来定义在这些状态切换中的不变量，然后 TLA+ 的 TLC model checker 对状态机的所有可达状态进行穷举，在穷举过程中不断检验不变量约束是否被破坏。\n\n举个简单的例子，分布式事务最简单的两阶段提交算法，对于 TLA+ Spec 来说，需要你定义好初始状态（例如事务要操作的 keys、有几个并发客户端等），然后定义状态间跳转的操作（ Begin / Write / Read / Commit 等），最后定义不变量（例如任何处于 Committed 状态的 write ops 一定是按照 commit timestamp 排序的，或者 Read 的操作一定不会读到脏数据之类的），写完以后放到 TLC Checker 里面运行，等待结果就好。\n\n但是，我们活在一个不完美的世界，即使你写出了完美的证明，也很难保证你就是对的。第一， Simulator 并没有办法模拟出无限多的 paticipants 和并发度， 一般也就是三五个；第二，聪明的你可能也看出来了，一般 TLA+ 的推广文章也不会告诉你 Spec 的关键是定义不变量，如果不变量定义不完备，或者定义出错，那么证明就是无效的。因此，我认为形式化验证的意义在于让工程师在写代码之前提高信心，在写证明的过程中也能更加深对算法的理解，此外，如果在 TLC Checker 里就跑出异常，那就更好了。\n\n目前 PingCAP 应该是国内唯一一个使用 TLA+ 证明关键算法，并且将证明的 Spec 开源出来的公司，大家可以参考 [pingcap/tla-plus](https://github.com/pingcap/tla-plus) 这个 Repo，以及我们的首席架构师唐刘的这篇[博客](https://www.jianshu.com/p/721df5b4454b)了解更多。\n\n## Chaos Engineering\n\n如果完美的证明不存在，那么 Deterministic 的测试存在吗？我记得大概 2015 年在 PingCAP 成立前，我看到了一个 FoundationDB 关于他们的 Deterministic 测试的[演讲](https://www.youtube.com/watch?v=4fFDFbi3toc)。简单来说他们用自己的 IO 处理和多任务处理框架 [Flow](https://apple.github.io/foundationdb/flow.html) 将代码逻辑和操作系统的线程以及 IO 操作解耦，并通过[集群模拟器](https://apple.github.io/foundationdb/testing.html)做到了百分之百重现 Bug 出现时的事件顺序，同时可以在模拟器中精确模拟各种异常，确实很完美。但是考虑到现实的情况，我们当时选择使用的编程语言主要是 Go，很难或者没有必要做类似 Flow 的事情 。所以我们选择了从另一个方向解决这个问题，提升分布式环境下 Bug 的复现率，能方便复现的 Bug 就能好解决，这个思路也是最近几年很火的 Chaos Engineering。 做 Chaos Engineering 的几个关键点：\n\n1. 定义稳态，记录正常环境下的 workload 以及关注的重要指标。\n\n2. 定义系统稳态后，我们分为实验组和对照组进行实验，确认在理想的硬件情况下，无论如何操作实验组，最后都会回归稳态。\n\n3. 开始对底层的操作系统和网络进行破坏，再重复实验，观察实验组会不会回归稳态。\n\n道理大家都懂，但是实际做起来最大的问题在于如何将整个流程自动化。原因在于：一是靠手动的效率很低；二是正统的 Chaos Engineering 强调的是在生产环境中操作，如何控制爆炸半径，这也是个比较重要的问题。\n\n先说第一个问题，PingCAP 在实践 Chaos Engineering 的初期，都是在物理机上通过脚本启停服务，所有实验都需要手动完成，耗时且非常低效，在资源利用上也十分不合理。这个问题我们觉得正好是 K8s 非常擅长的，于是我们开发了一个基于 K8s 的，内部称为 Schrodinger 的自动化测试平台，将 TiDB 集群的启停镜像化，另外将 TiDB 本身的 CI/CD，自动化测试用例的管理、Fault Injection 都统一了起来。这个项目还催生出一个好玩的子项目 Chaos Operator：我们通过 CRD 来描述 Chaos 的类型，然后在不同的物理节点上启动一个 DaemonSets，这个 DaemonSets 就负责干扰 Pod，往对应的 Pod 里面注入一个 Sidecar，Sidecar 帮我们进行注入错误（例如使用 Fuse 来模拟 IO 异常，修改 iptable 制造网络隔离等），破坏 Pod。近期我们也有计划将 Chaos Operator 开源。\n\n第二个问题，其实在我看来，有 Chaos Engineering 仍然还是不够的，我们在长时间的对测试和质量的研究中发现提升测试质量的关键是如何发现更多的测试 workload。在早期我们大量依赖了 MySQL 和相关社区的集成测试，数量大概千万级别，这个决定让我们在快速迭代的同时保证质量，但是即使这样还是不够的，我们也在从学术界寻求答案.例如引入并通过官方的 Jepsen Test ，再例如通过 SQLfuzz 自动生成合法 SQL 的语句加入到测试集中，这个思路在最近我们的一次 Hackathon 项目中有一个很完美的落地，可以看看这篇介绍这个项目的文章[《你呼呼大睡，机器人却在找 bug？》](https://pingcap.com/blog-cn/sqldebug-automatically/)。\n\n总之，比起写业务逻辑，在分布式环境下写测试 + 写测试框架花费的精力可能一点都不少，甚至可能多很多（如果就从代码量来说，TiDB 的测试相关的代码行数可能比内核代码行数多一个数量级），而且这是一个非常值得研究和投资的领域。另外一个问题是如何通过测试发现性能回退。我们的测试平台中每天运行着一个名为 benchbot 的机器人，每天的回归测试都会自动跑性能测试，对比每日的结果。这样一来我们的工程师就能很快知道哪些变更导致了性能下降，以及得到一个长期性能变化趋势。\n\n## eBPF\n\n说完测试，另外一个相关的话题是 profiling 和分布式 tracing。tracing 看看 Google 的 Dapper 和开源实现 OpenTracing 就大概能理解，所以，我重点聊聊 profiling。最近这几年我关注的比较多的是 eBPF（extended BPF）技术。想象下，过去我们如果要开发一个 TCP filter，要么就自己写一个内核驱动，要么就用 libpcap 之类的基于传统 BPF 的库，而传统 BPF 只是针对包过滤这个场景设计的虚拟机，很难定制和扩展。\n\n![图 1 BPF 工作原理](https://img1.www.pingcap.com/prod/1_bc7fe21dfd.png)\n\n<div class=\"caption-center\"> 图 1 BPF 工作原理</div>\n\n![图 2 eBPF 架构图](https://img1.www.pingcap.com/prod/2_1f9daea64e.png)\n\n<div class=\"caption-center\"> 图 2 eBPF 架构图</div>\n\n\n在这个背景下，eBPF 应运而生，eBPF 引入了 JIT 和寄存器，将 BPF 的功能进一步扩充，这背后的意义是，我们在内核中有一个安全的、高性能的、基于事件的、支持 JIT 的字节码的虚拟机！这其实极大地降低了拓展内核能力的门槛，我们可以不用担心在驱动中写个异常把内核搞崩，我们也可以将给 llvm 用的 clang 直接编译成 eBPF 对象，社区还有类似 bcc 这样的基于 Python 的实用工具集……\n\n过去其实大家是从系统状态监控、防火墙这个角度认识 eBPF 的。没错，性能监控以及防火墙确实是目前 eBPF 的王牌场景，但是我大胆地预测未来不止于此，就像最近 Brendan Gregg 在他的 blog 里喊出的口号：BPF is a new type of software。可能在不久的未来，eBPF 社区能诞生出更多好玩的东西，例如我们能不能用 eBPF 来做个超高性能的 web server？能不能做个 CDN 加速器？能不能用 BPF 来重定义操作系统的进程调度？我喜欢 eBPF 的另一个重要原因是，第一次内核应用开发者可以无视内核的类型和版本，只要内核能够运行 eBPF bytecode 就可以了，真正做到了一次编译，各个内核运行。所以有一种说法是 BPF is eating Linux，也不是没有道理 。\n\nPingCAP 也已经默默地在 BPF 社区投入了很长时间，我们也将自己做的一些 bcc 工具开源了，详情可以参考 [pingcap/kdt](https://github.com/pingcap/kdt) 这个 repo。其中值得一提的是，我们的 bcc 工具之一 drsnoop 被 Brendan Gregg 的新书收录了，也算是为社区做出了一点微小的贡献。\n\n上面聊的很多东西都是具体的技术，技术的落地离不开部署和运维，分布式系统的特性决定了维护的复杂度比单机系统大得多。在这个背景之下，我认为解法可能是：不可变基础设施。\n\n云和容器的普及让 infrastructure as code 的理念得以变成现实，通过描述式的语言来创建可重复的部署体验，这样可重用的描述其实很方便在开源社区共享，而且由于这些描述几乎是和具体的云的实现无关，对于跨云部署和混合数据中心部署的场景很适合。有些部署工具甚至诞生出自己的生态系统，例如 Terraform / Chef / Ansible。有一种说法戏称现在的运维工程师都是 yaml 语言工程师，其实很有道理的：人总是会出错，且传统的基于 shell 脚本的运维部署受环境影响太大，shell 天然也不是一个非常严谨的语言。描述意图，让机器去干事情，才是能 scale 的正道。\n\n> 相关阅读：  \n[分布式系统 in 2010s ：存储之数据库篇](https://pingcap.com/zh/blog/distributed-system-in-2010s-1)；  \n[分布式系统 in 2010s ：软件构建方式和演化](https://pingcap.com/zh/blog/distributed-system-in-2010s-2)；  \n> [分布式系统 in 2010s ：硬件的进化](https://pingcap.com/zh/blog/distributed-system-in-2010s-3)。","date":"2020-01-14","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"distributed-system-in-2010s-4","file":null,"relatedBlogs":[]},{"id":"Blogs_237","title":"分布式系统 in 2010s ：硬件的进化","tags":["分布式系统前沿技术"],"category":{"name":"观点洞察"},"summary":"本文为「分布式系统 in 2010s」 系列第三篇，这次我们来聊一聊硬件的进化。","body":"[上篇](https://pingcap.com/blog-cn/distributed-system-in-2010s-2/)我们聊了软件构建方式和演化，今天我们来聊聊硬件吧！\n\n## SSD 普及的深远影响\n\n如果说云的出现是一种商业模式的变化的话，驱动这个商业革命的推手就是最近十年硬件的快速更新。比起 CPU，存储和网络设备的进化速度更加迅速。最近五年，SSD 的价格 (包括 PCIe 接口) 的成本持续下降，批量采购的话已经几乎达到和 HDD 接近的价格。\n\n![图 1 近 5 年 SSD 成本曲线](https://img1.www.pingcap.com/prod/1_01f74bd80f.png)\n\n<div class=\"caption-center\"> 图 1 近 5 年 SSD 成本曲线</div>\n\nSSD 的普及，对于存储软件厂商的影响是深远的。\n\n其一，是极大地缓解了 IO 瓶颈。对于数据库厂商来说，可以将更多的精力花在其他事情，而不是优化存储引擎上。最近两年发生了一些更大的变化，NVMe 正在成为主流，我们很早就在 Intel Optane 进行实验和投资，类似这样的非易失内存的技术，正在模糊内存和存储的界限，但是同时对开发者带来挑战也是存在的。举一个简单的例子，对于 Optane 这类的非易失内存，如果你希望能够完全利用它的性能优势，最好使用类似 PMDK 这类基于 Page cache Bypass 的 SDK 针对你的程序进行开发，这类 SDK 的核心思想是将 NVM 设备真正地当做内存使用。如果仅仅将 Optane 挂载成本地磁盘使用，其实很大程度上的瓶颈不一定出现在硬件本身的 IO 上。\n\n下面这张图很有意思，来自 Intel 对于 Optane 的测试，我们可以看见在中间那一列，Storage with Optane SSD，随机读取的硬件延迟已经接近操作系统和文件系统带来的延迟，甚至 Linux VFS 本身会变成 CPU 瓶颈。其实背后的原因也很简单，过去由于 VFS 本身在 CPU 上的开销（比如锁）相比过去的 IO 来说太小了，但是现在这些新硬件本身的 IO 延迟已经低到让文件系统本身开销的比例不容忽视了。\n\n![图 2 Intel 对于 Optane 的测试](https://img1.www.pingcap.com/prod/2_839faf5ad2.png)\n\n<div class=\"caption-center\"> 图 2 Intel 对于 Optane 的测试</div>\n\n其二，这个变化影响了操作系统和文件系统本身。例如针对 Persistent Memory 设计新的文件系统，其中来自 UCSD 的 NVSL 实验室 (名字很厉害， Non-Volatile Systems Laboratory) 的 [NovaFS](https://lwn.net/Articles/749009/) 就是一个很好的例子。简单来说是大量使用了无锁数据结构，减低 CPU 开销，NovaFS 的代码量很小很好读，有兴趣可以看看。另外 Intel 对 Persistent Memory 编程模型有很好的一篇[文章](https://software.intel.com/en-us/articles/introduction-to-programming-with-persistent-memory-from-intel)，感兴趣的话可以从这里开始了解这些新变化。\n\n## 内核开销的挑战\n\n说完了存储设备，我们聊聊网络设备。我还记得我第一份工作的数据中心里甚至还有百兆的网卡，但现在，1GbE 已经都快淘汰光了，主流的数据中心基本上开始提供 10GbE 甚至 25GbE 的网络。为什么会变成这样？我们做一个简单的算术题就知道了。根据 Cisco 的[文档介绍](https://tools.cisco.com/security/center/resources/network_performance_metrics)， 一块千兆网卡的吞吐大概是: [1,000,000,000 b/s / (84 B * 8 b/B)] == 1,488,096 f/s (maximum rate)。\n\n那么万兆网卡的吞吐大概是它的十倍，也就是差不多每秒 1488 万帧，处理一个包的时间在百纳秒的级别，基本相当于一个 L2 Cache Miss 的时间。所以如何减小内核协议栈处理带来的内核-用户态频繁内存拷贝的开销，成为一个很重要的课题，这就是为什么现在很多高性能网络程序开始基于 DPDK 进行开发。\n\n对于不了解 DPDK 的朋友，在这里[简单科普一下](https://www.dpdk.org/wp-content/uploads/sites/35/2016/10/Day02-Session05-JingjingWu-Userspace2016.pdf):\n\n![图 3 DPDK Flow Bifurcation](https://img1.www.pingcap.com/prod/3_a6c5550cdf.png)\n\n<div class=\"caption-center\"> 图 3 DPDK Flow Bifurcation</div>\n\n从上图可以看到，数据包直接从网卡到了 DPDK，绕过了操作系统的内核驱动、协议栈和 Socket Library。DPDK 内部维护了一个叫做 UIO Framework 的用户态驱动 (PMD)，通过 ring queue 等技术实现内核到用户态的 zero-copy 数据交换，避免了 Syscall 和内核切换带来的 cache miss，而且在多核架构上通过多线程和绑核，极大提升了报文处理效率。如果你确定你的网络程序瓶颈在包处理效率上，不妨关注一下 DPDK。\n\n另外 RDMA 对未来体系结构的影响也会很大，它会让一个分布式集群向一个超级 NUMA 的架构演进（它的通信延时/带宽已经跟现在 NUMA 架构中连接不同 socket node 的 QPI 的延时/带宽在一个量级），但是目前受限于成本和开发模型的变化，可能还需要等很长一段时间才能普及。\n\n其实不管是 DPDK，SPDK，PMDK ，背后的主线都是 Bypass kernel，Linux 内核本身带来的开销已经很难适应现代硬件的发展，但是生态和兼容性依然是大的挑战，我对于一言不合就搞个 Bypass Kernel SDK 的做法其实是不太赞同的。大量的基础软件需要适配，甚至整个开发模型都要变化。\n\n我认为有关内核的问题，内核社区从长期来看一定会解决。一个值得关注的技术是 Linux 5.1 内核中引入的 io_uring 系列的新系统调用，io_uring 的原理简单来说就是通过两个内核/用户态共享的 ring buffer 来实现 IO 事件的提交以及收割，避免了 syscall 及内核<->用户态的内存拷贝，同时提供了 poll 的模式， 不用等待硬件中断，而是不断轮询硬件，这极大降低了 IO 延迟，提升了整体吞吐。 我认为 io_uring 的出现也代表了内核社区在各种 Bypass Kernel 技术涌现的当下，正在奋起直追。\n\n> 相关阅读：  \n[分布式系统 in 2010s ：存储之数据库篇](https://pingcap.com/zh/blog/distributed-system-in-2010s-1)；  \n[分布式系统 in 2010s ：软件构建方式和演化](https://pingcap.com/zh/blog/distributed-system-in-2010s-2)；  \n> [分布式系统 in 2010s ：测试和运维](https://pingcap.com/zh/blog/distributed-system-in-2010s-4)。","date":"2020-01-07","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"distributed-system-in-2010s-3","file":null,"relatedBlogs":[]},{"id":"Blogs_281","title":"分布式系统 in 2010s ：软件构建方式和演化","tags":["分布式系统前沿技术"],"category":{"name":"观点洞察"},"summary":"本文为「分布式系统 in 2010s」系列第二篇，内容为软件构建的方式和演化。","body":"我上大学的时候专业是软件工程，当时的软件工程是 CMM、瀑布模型之类。十几年过去了，看看现在我们的软件开发模式，尤其是在互联网行业，敏捷已经成为主流，很多时候老板说业务下周上线，那基本就是怎么快怎么来，所以现代架构师对于可复用性和弹性会有更多的关注。我所知道业界对 SOA 的关注是从 Amazon 的大规模 SOA 化开始， 2002 年 Bezos 要求 Amazon 的工程团队将所有的业务 API 和服务化，[几条原则](https://www.cio.com/article/3218667/have-you-had-your-bezos-moment-what-you-can-learn-from-amazon.html)放在今天仍然非常适用：\n\n>- All teams will henceforth expose their data and functionality through service interfaces.\n>\n>- Teams must communicate with each other through these interfaces.\n>\n>- There will be no other form of inter-process communication allowed: no direct linking, no direct reads of another team’s data store, no shared-memory model, no back-doors whatsoever. The only communication allowed is via service interface calls over the network.\n>\n>- It doesn’t matter what technology they use.\n>\n>- All service interfaces, without exception, must be designed from the ground up to be externalizable. That is to say, the team must plan and design to be able to expose the interface to developers in the outside world. No exceptions.\n\n尤其最后一条，我个人认为对于后来的 AWS 的诞生有直接的影响，另外这条也间接地对工程团队的软件质量和 API 质量提出了更高的要求。亚马逊在 SOA 上的实践是组件化在分布式环境中的延伸，尽可能地将业务打散成最细粒度的可复用单元（Services），新的业务通过组合的方式构建。这样的原则一直发展到今天，我们提到的微服务、甚至 Serverless，都是这个思想的延伸。\n\n## SOA 只是一个方法论\n\n很多人在思考 SOA 和微服务的区别时，经常有一些观点类似：「拆的粗就是 SOA，拆的细就是微服务 」，「使用 RESTful API 就是微服务，用 RPC 是 SOA」，「使用 XXX（可以是任何流行的开源框架） 的是微服务，使用 YYY 的是 SOA」... 这些观点我其实并不认可，我理解的 SOA 或者微服务只是一个方法论，核心在于有效地拆分应用，实现敏捷构建和部署，至于使用什么技术或者框架其实无所谓，甚至 SOA 本身就是反对绑定在某项技术上的。\n\n对于架构师来说， 微服务化也并不是灵丹妙药，有一些核心问题，在微服务化的实践中经常会遇到：\n\n1. 服务的拆分粒度到底多细？\n\n2. 大的单体服务如何避免成为单点，如何支持快速的弹性水平扩展？\n\n3. 如何进行流控和降级？防止调用者 DDoS？\n\n4. 海量服务背景下的 CI/CD (测试，版本控制，依赖管理)，运维（包括 tracing，分布式 metric 收集，问题排查）\n\n    … … \n    \n上面几个问题都很大。熟悉多线程编程的朋友可能比较熟悉 Actor 模型，我认为 Actor 的思想和微服务还是很接近的，同样的最佳实践也可以在分布式场景下适用，事实上 Erlang OTP 和 Scala 的 Akka Framework 都尝试直接将 Actor 模型在大规模分布式系统中应用。其实在软件工程上这个也不是新的东西，Actor 和 CSP 的概念几乎在软件诞生之初就存在了，现在服务化的兴起我认为是架构复杂到一定程度后很自然的选择，就像当年 CSP 和 Actor 简化并发编程一样。\n\n## 服务化和云\n\n从服务化的大方向和基础设施方面来说，我们这几年经历了：本地单体服务 + 私有 API （自建数据中心，自己运维管理） -> 云 IaaS + 本地服务 + 云提供的 Managed Service (例如 EC2 + RDS)  ->  Serverless 的转变。其本质在于云的出现让开发者对于硬件控制力越来越低，算力和服务越来越变成标准化的东西。而容器的诞生，使得资源复用的粒度进一步的降低（物理机 -> VM -> Container），这无疑是云厂商非常希望看到的。对公有云厂商来说，资源分配的粒度越细越轻量，就越能精准地分配，以提升整体的硬件资源利用率，实现效益最大化。\n\n这里暗含着一个我的观点：公有云和私有云在价值主张和商业模式上是不一样的：对公有云来说，只有不断地规模化，通过不断提升系统资源的利用率，获取收益（比如主流的公有云几乎对小型实例都会超卖）。而私有云的模式可以概括成降低运维成本（标准化服务 + 自动化运维），对于自己拥有数据中心的企业来说，通过云技术提升硬件资源的利用率是好事，只是这个收益并没有公有云的规模化收益来得明显。\n\n在服务化的大背景下，也产生了另外一个趋势，就是基础软件的垂直化和碎片化，当然这也是和现在的 workload 变得越来越大，单一的数据库软件或者开发框架很难满足多变且极端的需求有关。数据库、对象存储、RPC、缓存、监控这几个大类，几乎每位架构师都熟悉多个备选方案，根据不同需求排列组合，一个 Oracle 包打天下的时代已经过去了。\n\n这样带来的结果是数据或状态在不同系统之间的同步和传递成为一个新的普遍需求，这就是为什么以 Kafka，Pulsar 为代表的分布式的消息队列越来越流行。但是在异构数据源之间的同步，暗含了异步和不一致（如果需要一致性，那么就需要对消费者实现幂等的语义），在一些对一致性有极端需求的场景，仍然需要交给数据库处理。 \n\n在这种背景下，容器的出现将计算资源分配的粒度进一步的降低且更加标准化，硬件对于开发者来说越来越透明，而且随着 workload 的规模越来越大，就带来的一个新的挑战：海量的计算单元如何管理，以及如何进行服务编排。既然有编排这里面还隐含了另外一个问题：服务的生命周期管理。\n\n## Kubernetes 时代开始了\n\n其实在 Kubernetes 诞生之前，很多产品也做过此类尝试，例如 Mesos。Mesos 早期甚至并不支持容器，主要设计的目标也是短任务（后通过 Marathon Framework 支持长服务），更像一个分布式的工作流和任务管理（或者是分布式进程管理）系统，但是已经体现了 Workload 和硬件资源分离的思想。\n\n在前 Kubernetes 时代，Mesos 的设计更像是传统的系统工程师对分布式任务调度的思考和实践，而 K8s 的野心更大，从设计之初就是要在硬件层之上去抽象所有类型的 workload，构建自己的生态系统。如果说 Mesos 还是个工具的话，那么 K8s 的目标其实是奔着做一个分布式操作系统去的。简单做个类比：整个集群的计算资源统一管控起来就像一个单机的物理计算资源，容器就像一个个进程，Overlay network 就像进程通信，镜像就像一个个可执行文件，Controller 就像 Systemd，Kubectl 就像 Shell……同样相似的类比还有很多。\n\n从另一方面看，Kubernetes 为各种 IaaS 层提供了一套标准的抽象，不管你底层是自己的数据中心的物理机，还是某个公有云的 VM，只要你的服务是构建在 K8s 之上，那么就获得了无缝迁移的能力。K8s 就是一个更加中立的云，在我的设想中，未来不管是公有云还是私有云都会提供标准 K8s 能力。对于业务来说，基础架构的上云，最安全的路径就是上 K8s，目前从几个主流的公有云厂商的动作上来看（GCP 的 GKE，AWS 的 EKS，Azure 的 AKS），这个假设是成立的。\n\n不选择 K8s 的人很多时候会从性能角度来攻击 K8s，理由是：多一层抽象一定会损害性能。对于这个我是不太同意的。从网络方面说，大家可能有个误解，认为 Overlay Network 的性能一定不好，其实这不一定是事实。下面这张图来自 ITNEXT 的工程师对几个流行的 CNI 实现的[评测](https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-36475925a560)： \n\n![图 1 Kubernetses CNI benchmark](https://img1.www.pingcap.com/prod/1_24f22e5b84.png)\n\n<div class=\"caption-center\"> Kubernetses CNI benchmark</div>\n\n我们其实可以看到，除了 WaveNet Encrypted 因为需要额外的加密导致性能不佳以外，其它的 CNI 实现几乎已经和 Bare metal 的 host network 性能接近，出现异常的网络延迟大多问题是出现在 iptable NAT 或者 Ingress 的错误配置上面。 \n\n所以软件的未来在哪里？我个人的意见是硬件和操作系统对开发者会更加的透明，也就是现在概念刚开始普及起来的 Serverless。我经常用的一个比喻是：如果自己维护数据中心，采购服务器的话，相当于买房；使用云 IaaS 相当于租房；而 Serverless，相当于住酒店。长远来看，这三种方案都有各自适用的范围，并不是谁取代谁的关系。目前看来 Serverless 因为出现时间最短，所以发展的潜力也是最大的。\n\n从服务治理上来说，微服务的碎片化必然导致了管理成本上升，所以近年 Service Mesh （服务网格）的概念才兴起。 服务网格虽然名字很酷，但是其实可以想象成就是一个高级的负载均衡器或服务路由。比较新鲜的是 Sidecar 的模式，将业务逻辑和通信解耦。我其实一直相信未来在七层之上，会有一层以 Service Mesh 和服务为基础的「八层网络」，不过目前并没有一个事实标准出现。Istio 的整体架构过于臃肿，相比之下我更加喜欢单纯使用 Envoy 或者 Kong 这样更加轻量的 API Proxy。 不过我认为目前在 Service Mesh 领域还没有出现有统治地位的解决方案，还需要时间。\n\n> 相关阅读：  \n[分布式系统 in 2010s ：存储之数据库篇](https://pingcap.com/zh/blog/distributed-system-in-2010s-1)；  \n[分布式系统 in 2010s ：硬件的进化](https://pingcap.com/zh/blog/distributed-system-in-2010s-3)；  \n> [分布式系统 in 2010s ：测试和运维](https://pingcap.com/zh/blog/distributed-system-in-2010s-4)。","date":"2019-12-30","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"distributed-system-in-2010s-2","file":null,"relatedBlogs":[]},{"id":"Blogs_27","title":"分布式系统 in 2010s ：存储之数据库篇","tags":["分布式系统前沿技术"],"category":{"name":"观点洞察"},"summary":"无论哪个时代，存储都是一个重要的话题，今天先聊聊数据库。","body":"回看这几年，分布式系统领域出现了很多新东西，特别是云和 AI 的崛起，让这个过去其实不太 sexy 的领域一下到了风口浪尖，在这期间诞生了很多新技术、新思想，让这个古老的领域重新焕发生机。站在 2010s 的尾巴上，我想跟大家一起聊聊分布式系统令人振奋的进化路程，以及谈一些对 2020s 的大胆猜想。\n\n无论哪个时代，存储都是一个重要的话题，今天先聊聊数据库。在过去的几年，数据库技术上出现了几个很明显的趋势。\n\n## 存储和计算进一步分离\n\n我印象中最早的存储-计算分离的尝试是 Snowflake，Snowflake 团队在 2016 年发表的论文[《The Snowflake Elastic Data Warehouse》](http://pages.cs.wisc.edu/~remzi/Classes/739/Spring2004/Papers/p215-dageville-snowflake.pdf)是近几年我读过的最好的大数据相关论文之一，尤其推荐阅读。Snowflake 的架构关键点是在无状态的计算节点 + 中间的缓存层 + S3 上存储数据，计算并不强耦合缓存层，非常符合云的思想。从最近 AWS 推出的 RedShift 冷热分离架构来看，AWS 也承认 Snowflake 这个搞法是先进生产力的发展方向。另外这几年关注数据库的朋友不可能不注意到 Aurora。不同于 Snowflake，Aurora 应该是第一个将存储-计算分离的思想用在 OLTP 数据库中的产品，并大放异彩。Aurora 的成功在于将数据复制的粒度从 Binlog降低到 Redo Log ，极大地减少复制链路上的 IO 放大。而且前端复用了 MySQL，基本做到了 100% 的应用层 MySQL 语法兼容，并且托管了运维，同时让传统的 MySQL 适用范围进一步拓展，这在中小型数据量的场景下是一个很省心的方案。\n\n虽然 Aurora 获得了商业上的成功，但是从技术上，我并不觉得有很大的创新。熟悉 Oracle 的朋友第一次见 Aurora 的架构可能会觉得和 RAC 似曾相识。Oracle 大概在十几年前就用了类似的方案，甚至很完美的解决了 Cache Coherence 的问题。另外，Aurora 的 Multi-Master 还有很长的路要走，从最近在 ReInvent 上的说法来看，目前 Aurora 的 Multi-Master 的主要场景还是作为 Single Writer 的高可用方案，本质的原因应该是目前 Multi-Writer 采用乐观冲突检测，冲突检测的粒度是 Page，在冲突率高的场合会带来很大的性能下降。\n\n我认为 Aurora 是一个很好的迎合 90% 的公有云互联网用户的方案：100% MySQL 兼容，对一致性不太关心，读远大于写，全托管。但同时，Aurora 的架构决定了它放弃了 10% 有极端需求的用户，如全局的 ACID 事务+ 强一致，Hyper Scale（百 T 以上，并且业务不方便拆库），需要实时的复杂 OLAP。这类方案我觉得类似 TiDB 的以 Shared-nothing 为主的设计才是唯一的出路。作为一个分布式系统工程师，我对任何不能水平扩展的架构都会觉得不太优雅。\n\n## 分布式 SQL 数据库登上舞台，ACID 全面回归\n\n回想几年前 NoSQL 最风光的时候，大家恨不得将一切系统都使用 NoSQL 改造，虽然易用性、扩展性和性能都不错，但是多数 NoSQL 系统抛弃掉数据库最重要的一些东西，例如 ACID 约束，SQL 等等。NoSQL 的主要推手是互联网公司，对于互联网公司的简单业务加上超强的工程师团队来说当然能用这些简单工具搞定。\n\n但最近几年大家渐渐发现低垂的果实基本上没有了，剩下的都是硬骨头。\n\n最好的例子就是作为 NoSQL 的开山鼻祖，Google 第一个搞了 NewSQL （Spanner 和 F1）。在后移动时代，业务变得越来越复杂，要求越来越实时，同时对于数据的需求也越来越强。尤其对于一些金融机构来说，一方面产品面临着互联网化，一方面不管是出于监管的要求还是业务本身的需求，ACID 是很难绕开的。更现实的是，大多数传统公司并没有像顶级互联网公司的人才供给，大量历史系统基于 SQL 开发，完全迁移到 NoSQL 上肯定不现实。\n\n在这个背景下，分布式关系型数据库，我认为这是我们这一代人，在开源数据库这个市场上最后一个 missing part，终于慢慢流行起来。这背后的很多细节由于篇幅的原因我就不介绍，推荐阅读 PingCAP TiFlash 技术负责人 maxiaoyu 的一篇文章《[从大数据到数据库](https://pingcap.com/zh/blog/from-big-data-to-databases)》，对这个话题有很精彩的阐述。\n\n## 云基础设施和数据库的进一步整合\n\n在过去的几十年，数据库开发者都像是在单打独斗，就好像操作系统以下的就完全是黑盒了，这个假设也没错，毕竟软件开发者大多也没有硬件背景。另外如果一个方案过于绑定硬件和底层基础设施，必然很难成为事实标准，而且硬件非常不利于调试和更新，成本过高，这也是我一直对定制一体机不是太感兴趣的原因。但是云的出现，将 IaaS 的基础能力变成了软件可复用的单元，我可以在云上按需地租用算力和服务，这会给数据库开发者在设计系统的时候带来更多的可能性，举几个例子：\n\n1.  Spanner 原生的 TrueTime API 依赖原子钟和 GPS 时钟，如果纯软件实现的话，需要牺牲的东西很多（例如 CockroachDB 的 HLC 和 TiDB 的改进版 Percolator 模型，都是基于软件时钟的事务模型）。但是长期来看，不管是 AWS 还是 GCP 都会提供类似 TrueTime 的高精度时钟服务，这样一来我们就能更好的实现低延迟长距离分布式事务。\n\n2.  可以借助 Fargate + EKS 这种轻量级容器 + Managed K8s 的服务，让我们的数据库在面临突发热点小表读的场景（这个场景几乎是 Shared-Nothing 架构的老大难问题），比如在 TiDB 中通过 Raft Learner 的方式，配合云的 Auto Scaler 快速在新的容器中创建只读副本，而不是仅仅通过 3 副本提供服务；比如动态起 10 个 pod，给热点数据创建 Raft 副本（这是我们将 TiKV 的数据分片设计得那么小的一个重要原因），处理完突发的读流量后再销毁这些容器，变成 3 副本。\n\n3.  冷热数据分离，这个很好理解，将不常用的数据分片，分析型的副本，数据备份放到 S3 上，极大地降低成本。\n\n4.  RDMA/CPU/超算 as a Service，任何云上的硬件层面的改进，只要暴露 API，都是可以给软件开发者带来新的好处。\n\n例子还有很多，我就不一一列举了。总之我的观点是云服务 API 的能力会像过去的代码标准库一样，是大家可以依赖的东西，虽然现在公有云的 SLA 仍然不够理想，但是长远上看，一定是会越来越完善的。\n\n所以，数据库的未来在哪里？是更加的垂直化还是走向统一？对于这个问题，我同意这个世界不存在银弹，但是我也并不像我的偶像，AWS 的 CTO，Vogels 博士那么悲观，相信未来是一个割裂的世界（AWS 恨不得为了每个细分的场景设计一个数据库）。过度地细分会加大数据在不同系统中流动的成本。解决这个问题有两个关键：\n\n1.  数据产品应该切分到什么粒度？\n\n2.  用户可不可以不用知道背后发生了什么？\n\n第一个问题并没有一个明确的答案，但是我觉得肯定不是越细越好的，而且这个和 Workload 有关，比如如果没有那么大量的数据，直接在 MySQL 或者 PostgreSQL 上跑分析查询其实一点问题也没有，没有必要非去用 Redshift。虽然没有直接的答案，但是我隐约觉得第一个问题和第二个问题是息息相关的，毕竟没有银弹，就像 OLAP 跑在列存储引擎上一定比行存引擎快，但是对用户来说其实可以都是 SQL 的接口。\n\nSQL 是一个非常棒的语言，它只描述了用户的意图，而且完全与实现无关，对于数据库来说，其实可以在 SQL 层的后面来进行切分，在 TiDB 中，我们引入 TiFlash 就是一个很好的例子。动机很简单：\n\n1.  用户其实并不是数据库专家，你不能指望用户能 100% 在恰当的时间使用恰当的数据库，并且用对。\n\n2.  数据之间的同步在一个系统之下才能尽量保持更多的信息，例如，TiFlash 能保持 TiDB 中事务的 MVCC 版本，TiFlash 的数据同步粒度可以小到 Raft Log 的级别。\n\n另外一些新的功能仍然可以以 SQL 的接口对外提供，例如全文检索，用 SQL 其实也可以简洁的表达。这里我就不一一展开了。\n\n我其实坚信系统一定是朝着更智能、更易用的方向发展的，现在都 21 世纪了，你是希望每天拿着一个 Nokia 再背着一个相机，还是直接一部手机搞定？\n\n> 相关阅读：  \n[分布式系统 in 2010s ：软件构建方式和演化](https://pingcap.com/zh/blog/distributed-system-in-2010s-2)；  \n[分布式系统 in 2010s ：硬件的进化](https://pingcap.com/zh/blog/distributed-system-in-2010s-3)；  \n> [分布式系统 in 2010s ：测试和运维](https://pingcap.com/zh/blog/distributed-system-in-2010s-4)。","date":"2019-12-26","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"distributed-system-in-2010s-1","file":null,"relatedBlogs":[]},{"id":"Blogs_123","title":"从大数据到数据库","tags":["大数据","数据库"],"category":{"name":"观点洞察"},"summary":"作为一个从大数据转行做数据库的人，我自以为能感受到两个世界的异同。本篇文章，斗胆聊下这个话题，以及对未来的看法。","body":"作为一个从大数据转行做数据库的人，我自以为能感受到两个世界的异同。在这里，斗胆聊下这个话题，以及对未来的看法。\n\n## 大数据兴起\n\n从 70 年代关系型数据库进入历史舞台，很长一段时间它几乎是包打天下的选择。你很可能可以用一套数据库玩转所有业务，你也不需要一个连的工程师来维护她。哪怕你也许业务复杂，需要不同的数据库，但她们终究是还是数据库，温柔体贴。\n\n这个黄金时代整整延续了 20 多年。\n\n上世纪 90 年代人们开始讨论「Big Data」。SGI 首席科学家 John Mashey 在一个名为「[Big Data… and the Next Wave of Infrastress](https://static.usenix.org/event/usenix99/invited_talks/mashey.pdf)」让这个词汇变得流行。那个时候，人们讨论着硬盘容量和网络带宽，在未来数据爆炸的阴影下瑟瑟发抖。那个时候，互联网公司是第一批真正尝试解决大数据问题的先行者。有别传统的运营方式让它们率先面对了大数据时代[著名的 3V 问题](https://blogs.gartner.com/doug-laney/files/2012/01/ad949-3D-Data-Management-Controlling-Data-Volume-Velocity-and-Variety.pdf)（By Gartner）。\n\n*   容量（Volumn）：爆炸性的交易量带来爆炸性的数据容量。\n\n*   速度（Velocity）：和在这个规模下仍提供高速的数据应用。\n\n*   多样性（Variety）: 以及为了支持业务变更和复杂性所造成的数据多样性。\n\n与传统公司不同，互联网公司的数据单位价值偏低，但数据量极其庞大。而且它们并不一定是结构化的，并非完全能用 SQL 来处理。简而言之，它们已经超出了当时数据库的能力边界。而当时的互联网公司巨头们如 Google 和 Amazon，纷纷选择抛弃了传统手段，重起炉灶，由此拉开了「大数据」时代的大幕。\n\n有兴趣的童鞋，可以翻翻下面的论文：\n\n*   [The Google File System](https://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf) - 2003\n\n*   [MapReduce: Simplified Data Processing on Large Clusters](https://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf) - 2004\n\n*   [Bigtable: A Distributed Storage System for Structured Data](https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf) - 2006\n\n*   [Dynamo: Amazon’s Highly Available Key-value Store](https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf) - 2007\n\n也许你并不了解 GFS，Google 内的 MapReduce 或者 BigTable 具体是什么样子的。不过相信既然你看到了这里，你一定听说过 Apache Hadoop 和 NoSQL。Hadoop 加上属于 NoSQL 的 HBase，就是以上面 Google 的几篇论文为基础开发而成的。这是一个真正现象级的开源通用大规模分布式数据存储和处理套件。它的影响力是巨大的，稍具规模的互联网公司就不得不用，稍有经验的从业者就可以领取不菲的薪水，人人都以能向其提交一个补丁为荣，更不用提一个实打实的 Committer，你都可以从他脑后看到光环。不管现在多少人宣称 Hadoop 已死，XXX 是真理，但是以 Hadoop + NoSQL 为基础，所谓大数据基础架构所带来的想法变迁，一直延续到了今天，且并没有太大变化：\n\n*   选用白菜价的硬件组成集群，突出 Scale Out 而非 Scale Up。\n\n*   极度简化和粗暴的计算模型。\n\n*   几乎不经整理的存储格式，在多种引擎之间共享，所谓数据湖。\n\n*   忽略 / 弱化一致性，抛弃关系模型，简化甚至无视事务，所谓 NoSQL。\n\n你可以说这是开源社区的威力，但追根究底还是 Google，Amazon 这些先行者卓有远见的工作为大家铺平了道路。不过，有些反直觉的是：这些引用数几千几万的论文其实并没有提出巧夺天工的设计；相反，它们本质上是告诉了业界，把数据库换成设计如此粗糙狂野的架构，仍然可以解决问题：就算你没钱买超高端的软硬件，只要你放宽心，告诉自己，无视一致性，忘掉精巧的优化执行器和存储结构，忽略半结构化带来的混乱，干掉 SQL 语言，多雇几个码农，你仍然活的下去，而且可以活的还不错。\n\n这些到底为我们带来了什么？且看曾经非常著名的 Sort Benchmark。\n\n*   2004 年，NEC Express 5800 / 1320 Xd 单机，价格可能介于 200-600 万 USD 之间，1 分钟排序 34G。\n\n*   2006 年，Fujitsu PrimeQuest 480 单机，2 年将结果推高 6G，1 分钟排序 40G 数据；机器价格不可考。\n\n*   2007 年，麻省理工林肯国防实验室，Bradley C. Kuszmaul 使用 TX-2500 磁盘集群（550 万 + USD），440 节点用 Infiband 串联，使用了自制系统（文件系统，通信模块），在经历了无数硬件软件故障之后，一分钟内排序了 214GB 数据；该试验相比之前的超豪华服务器，已经开始使用「便宜硬件」，但是使用自制软件系统。\n\n*   2009年，Yahoo! 使用 Hadoop 以近似的总价（500 万 USD，以单价反推）但近 1/3 的单价串联了 1400 个白菜价节点集群，得到了一倍多的速度，排序了 500G。而这里 1400 的节点数是为了凑整 500G / 1 分钟，而非只能这么多或者必须这么多。\n\n请允许我用一句诗来总结它的意义：「旧时王谢堂前燕，飞入寻常百姓家」。\n\n## 王之蔑视\n\n与业界的欢腾不同，当时数据库研究者圈子对此的反应已经不是嗤之以鼻，而是痛心疾首了。这有点像，老师傅练了一辈子武艺，你突然告诉他，打架只要抡大锤就行了。\n\n[MapReduce: A major step backwards](https://homes.cs.washington.edu/~billhowe/mapreduce_a_major_step_backwards.html) by David DeWitt & Michael Stonebraker\n\n上面这篇文章是 DeWitt 和 Stonebraker 大神合写的对 MapReduce 的批评。这两尊是真神，DeWitt 是美国工程院院士，微软 Jim Gray 实验室老大，而石破天，则是图灵奖获得者。在他们看来，这破玩意抛弃了数据库所有美好的特点，实现也丑陋，还接不上数据库工具，简直臭不可闻。文末，老人家们「酸酸」地说，我们很高兴看到社区对这些技术感兴趣，但是也别把我们几十年的研究成果当 X 啊。\n\n![图 1 插图](https://img1.www.pingcap.com/prod/1_449a8c8b19.png)\n\n两位的评论，哪怕延伸到整个大数据生态，就算放到时隔多年的今天，也还是套的上去。但这套糙快猛的理念催生的技术栈，已经无需赘述获得了多大的成功。哪怕是数据库圈内的人，也时有抱怨：老一辈的人有时候不够 Open-Minded。所以，他们说错了么？\n\n也许他们对业界面临的困扰不够感同身受，也许他们不够有包容心。不过，他们对技术的判断着实是精准到位的。\n\n事实上，没过多久，人们在大数据体系中引入了 SQL、MPP 引擎、列存，加入了向量化、JIT，实现了 CBO。对于数据库圈外的童鞋们，有时你看社区兴高采烈地宣称，他们实现了多么神奇的技术，仿佛普罗米修斯从天上带来了火种，其实他们只是从十几甚至几十年前的故纸堆中汲取了养分。\n\n是大数据社区的人无知无能因此重新「发明」数据库界玩烂的技术么？不，只是因为业界等不了数据库圈子慢慢悠悠匠心打磨：没有合适的工具，他们每分每秒都在损失 $。且不说大规模分布式交易型数据库一直是老大难，就算脱开交易型场景不谈，分布式的分析型数据库早已有之，却也因为包袱沉重，还没来得及跟上时代的步伐，就被大数据的浪头打的狼狈不堪。Pivotal 先是由 Greenplum 折腾了对接 Hadoop 的 HAWQ ，继而被迫双双开源；就连 Teradata 这样的巨擘也不得不支持 Hadoop。\n\n只是，一旦社区步入小康，虽是野蛮生长的生态，也还是阻挡不了人们追求小资生活的决心：用户希望友好、快速、高效、稳定的数据存储和处理手段，这是亘古不变的需求。而这些，恰恰是数据库领域多年积累所在。\n\n![图 2 大数据生态](https://img1.www.pingcap.com/prod/2_790716184e.png)\n\n<div class=\"caption-center\">摘自 pramodgampa.blogspot.com</div>\n\n现今的大数据生态，如同哥斯拉，强大而难以驯服。不管什么场景，似乎都经不起它尾巴一扫。但若说干净灵巧地解决问题，却是难如登天。毕竟狂野粗放基因的产物，不管如何演化，都很难优雅起来。对数据湖而言，开放形态加上公共存储格式，能轻易串联多种引擎，但也几乎抹杀了精细整理数据的可能；而混沌的存储体系和不受控的数据入口，也限制了整个体系可以伸展腾挪的空间。对 NoSQL 而言，孱弱或者干脆不存在的事务，所谓最终一致性，小儿科的 SQL 支持，也都成为人们诟病的理由。而整个圈子野蛮生长的开放体系，在得到巨大动能的同时，也使得用户体验几乎不可能良好。这些种种，使得大数据生态很大程度上都只服务于工程师，而你需要一大票专家才能真的驯服大数据平台。从这个角度看，MapR 变卖家当给 HP，Hortonworks 被收购，Cloudera 巨亏股价狂泻，都是必然的：大数据生态基本不可能做成类似 Oracle 这样的标准件生意。\n\n也许，更偏向于数据库形态的方案，才是更友善的方案；也许，随着技术的成熟，我们还有机会回到黄金时代。\n\n## 回归数据库\n\n随着时间的推进，Google 这样的巨人自己也忍受不了自己创造的怪物，又开始了新的探索：哪怕是 Google 这样聪明脑袋汇聚的地方，也不想总是需要自己花心思处理一致性，或者用繁琐的代码实现 SQL 逻辑。\n\n[Spanner: Google’s Globally-Distributed Database](https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf) - 2012\n\nSpanner 是一个能像 NoSQL 一样延展（甚至横跨多个大陆），但却支持传统数据库事务的分布式交易型数据库。它创造性地用原子钟解决了以往分布式事务一致性需要依赖中心节点，因而无法大规模扩展的问题。这算是拉开了所谓 NewSQL 的大幕。这启发了很多项目，比如小强，比如我们的 TiDB。她们拥有对业务透明的 Sharding 设计和分布式事务，良好的可扩容性，又兼顾了一致性，这让分布式体系很大程度上拥有单机数据库近似的用户体验。不过有意思的是，哪怕论文最创新的点是基于原子钟的分布式事务，但是对很多人来说，它更大的意义仍然是：证明给一个类似 NoSQL 架构加上传统数据库特性，用来做传统数据库业务，是可行的（当然共识算法 Paxos / Raft 的应用也很重要）。天知道这背后经历了多少试错，这就是先行者的伟大。\n\n至此，业界也许可以说解决了整个体系中最难啃的问题：分布式交易型数据库。而随着技术不断成熟，人们也逐渐开始接受这个新鲜事物：光就 TiDB 而言，从第一个用户拿来做并不那么 TP 的边缘业务，到现在登上银行核心系统。也许你在刷二维码付费的时候，背后支撑你这笔交易的数据库就是 TiDB。\n\n对我们来说，现有的 Multi-Raft 体系，提供了可自由伸缩，对用户透明的分片体系，以及可均衡的并行复制机制。以这些为基础，通过 Raft Learner 将数据从 TP 行存到 AP 列存进行异步异构复制但提供一致性读取，我们得以整合了 TP 和 ODS 层，而且互相之间不影响，这就是今年我们折腾的 TiFlash。希望明年能尝试进一步同样通过 Raft 协议将列存引擎延伸到传统的数仓业务，而统一更多场景。很多人不相信最终数据库能做到一站式服务（Silver Bullet），能简化到一个产品，去除平台间数据的迁移。毕竟，有些设计的取舍很难兼顾。我个人的看法是，也许，但通过小心的设计，我们现在已经可以做到将不同的引擎无缝地整合到一个产品中。毕竟，经过这十多年的大数据浪潮，哪怕浪不再那么高，社区终究沉淀下了宝贵的财富，前人设计的得失也好，强大的开源引擎如 Spark 也好（Spark 已经慢慢脱离野蛮生态直通云霄了），甚至更多有经验的小伙伴也好，这都成为我们能借力的抓手，让我们能有勇气挑战似乎不切实际的目标：让用户从大数据生态复杂的技术栈解放出来，让数据平台收敛到单一一个产品，因为这才是数据处理应有的模样，哪怕这是一条很长很长的路。","date":"2019-12-18","author":"马晓宇","fillInMethod":"writeDirectly","customUrl":"from-big-data-to-databases","file":null,"relatedBlogs":[]},{"id":"Blogs_115","title":"高效编排有状态应用——TiDB 的云原生实践与思考","tags":["TiDB Operator","云原生"],"category":{"name":"观点洞察"},"summary":"本文将以 TiDB 与 Kubernetes 的“爱恨情仇”为例，总结有状态应用走向云原生的工程最佳实践。","body":"## 导语\n\n云原生时代以降，无状态应用以其天生的可替换性率先成为各类编排系统的宠儿。以 Kubernetes 为代表的编排系统能够充分利用云上的可编程基础设施，实现无状态应用的弹性伸缩与自动故障转移。这种基础能力的下沉无疑是对应用开发者生产力的又一次解放。 然而，在轻松地交付无状态应用时，我们应当注意到，状态本身并没有消失，而是按照各类最佳实践下推到了底层的数据库、对象存储等有状态应用上。那么，“负重前行”的有状态应用是否能充分利云与 Kubernetes 的潜力，复制无状态应用的成功呢？\n\n或许你已经知道，Operator 模式已经成为社区在 Kubernetes 上编排有状态应用的最佳实践，脚手架项目 KubeBuilder 和 operator-sdk 也已经愈发成熟，而对磁盘 IO 有严苛要求的数据库等应用所必须的 Local PV（本地持久卷）也已经在 1.14 中 GA。这些积木似乎已经足够搭建出有状态应用在平稳运行在 Kubernetes 之上这一和谐景象。然而，书面上的最佳实践与生产环境之间还有无数工程细节造就的鸿沟，要在 Kubernetes 上可靠地运行有状态应用仍需要相当多的努力。下面我将以 TiDB 与 Kubernetes 的“爱恨情仇”为例，总结有状态应用走向云原生的工程最佳实践。\n\n## TiDB 简介\n\n首先让我们先熟悉熟悉研究对象。TiDB 是一个分布式的关系型数据库，它采用了存储和计算分离的架构，并且分层十分清晰：\n\n![图 1 TiDB 架构](https://img1.www.pingcap.com/prod/1_70a828b7e6.png)\n\n<div class=\"caption-center\">图 1 TiDB 架构</div>\n\n其中 TiDB 是 SQL 计算层，TiDB 进程接收 SQL 请求，计算查询计划，再根据查询计划去查询存储层完成查询。\n\n存储层就是图中的 TiKV，TiKV 会将数据拆分为一个个小的数据块，比如一张 1000000 行的表，在 TiKV 中就有可能被拆分为 200 个 5000 行的数据块。这些数据块在 TiKV 中叫做 Region，而为了确保可用性， 每个 Region 都对应一个 Raft Group，通过 Raft Log 复制实现每个 Region 至少有三副本。\n\n![图 2 TiKV Region 分布](https://img1.www.pingcap.com/prod/2_5d5890038f.png)\n\n<div class=\"caption-center\">图 2 TiKV Region 分布</div>\n\n而 PD 则是集群的大脑，它接收 TiKV 进程上报的存储信息，并计算出整个集群中的 Region 分布。借由此，TiDB 便能通过 PD 获知该如何访问某块数据。更重要的是，PD 还会基于集群 Region 分布与负载情况进行数据调度。比如，将过大的 Region 拆分为两个小 Region，避免 Region 大小由于写入而无限扩张；将部分 Leader 或数据副本从负载较高的 TiKV 实例迁移到负载较低的 TiKV 实例上，以最大化集群性能。这引出了一个很有趣的事实，也就是 TiKV 虽然是存储层，但它可以非常简单地进行水平伸缩。这有点意思对吧？在传统的存储中，假如我们通过分片打散数据，那么加减节点数往往需要重新分片或手工迁移大量的数据。而在 TiKV 中，以 Region 为抽象的数据块迁移能够在 PD 的调度下完全自动化地进行，而对于运维而言，只管加机器就行了。\n\n**了解有状态应用本身的架构与特性是进行编排的前提，比如通过前面的介绍我们就可以归纳出，TiDB 是无状态的，PD 和 TiKV 是有状态的，它们三者均能独立进行水平伸缩。我们也能看到，TiDB 本身的设计就是云原生的——它的容错能力和水平伸缩能力能够充分发挥云基础设施提供的弹性，既然如此，云原生“操作系统” Kubernetes 不正是云原生数据库 TiDB 的最佳载体吗？TiDB Operator 应运而生。**\n\n## TiDB Operator 简介\n\nOperator 大家都很熟悉了，目前几乎每个开源的存储项目都有自己的 Operator，比如鼻祖 etcd-operator 以及后来的 prometheus-operator、postgres-operator。Operator 的灵感很简单，Kubernetes 自身就用 Deployment、DaemonSet 等 API 对象来记录用户的意图，并通过 control loop 控制集群状态向目标状态收敛，那么我们当然也可以定义自己的 API 对象，记录自身领域中的特定意图，并通过自定义的 control loop 完成状态收敛。\n\n在 Kubernetes 中，添加自定义 API 对象的最简单方式就是 CustomResourceDefinition（CRD），而添加自定义 control loop 的最简单方式则是部署一个自定义控制器。自定义控制器 + CRD 就是 Operator。具体到 TiDB 上，用户可以向 Kubernetes 提交一个 TidbCluster 对象来描述 TiDB 集群定义，假设我们这里描述说“集群有 3 个 PD 节点、3 个 TiDB 节点和 3 个 TiKV 节点”，这是我们的意图。 而 TiDB Operator 中的自定义控制器则会进行一系列的 Kubernetes 集群操作，比如分别创建 3 个 TiKV、TiDB、PD Pod，来让真实的集群符合我们的意图。\n\n![图 3 TiDB Operator](https://img1.www.pingcap.com/prod/3_6a94c79cd1.png)\n\n<div class=\"caption-center\">图 3 TiDB Operator</div>\n\nTiDB Operator 的意义在于让 TiDB 能够无缝运行在 Kubernetes 上，而 Kubernetes 又为我们抽象了基础设施。因此，TiDB Operator 也是 TiDB 多种产品形态的内核。对于希望直接使用 TiDB Operator 的用户， TiDB Operator 能做到在既有 Kubernetes 集群或公有云上开箱即用；而对于不希望有太大运维负载，又需求一套完整的分布式数据库解决方案的用户，我们则提供了打包 Kubernetes 的 on-premise 部署解决方案，用户可以直接通过方案中打包的 GUI 操作 TiDB 集群，也能通过 OpenAPI 将集群管理能力接入到自己现有的 PaaS 平台中；另外，对于完全不想运维数据库，只希望购买 SQL 计算与存储能力的用户，我们则基于 TiDB Operator 提供托管的 TiDB 服务，也即 DBaaS（Database as a Service）。\n\n![图 4 TiDB Operator 的多种上层产品形态](https://img1.www.pingcap.com/prod/4_f3a02640cd.png)\n\n<div class=\"caption-center\">图 4 TiDB Operator 的多种上层产品形态</div>\n\n多样的产品形态对作为内核的 TiDB Operator 提出了更高的要求与挑战——事实上，由于数据资产的宝贵性和引入状态后带来的复杂性，有状态应用的可靠性要求与运维复杂度往往远高于无状态应用，这从 TiDB Operator 所面临的挑战中就可见一斑。\n\n## 挑战\n\n描绘架构总是让人觉得美好，而生产中的实际挑战则将我们拖回现实。\n\n**TiDB Operator 的最大挑战就是数据库的场景极其严苛，大量用户的期盼都是我的数据库能够“永不停机”，对于数据不一致或丢失更是零容忍**。很多时候大家对于数据库等有状态应用的可用性要求甚至是高于承载线上服务的 Kubernetes 集群的，至少线上集群宕机还能补救，而数据一旦出问题，往往意味着巨大的损失和补救成本，甚至有可能“回天乏术”。这本身也会在很大程度上影响大家把有状态应用推上 Kubernetes 的信心。\n\n**第二个挑战是编排分布式系统这件事情本身的复杂性**。Kubernetes 主导的 level driven 状态收敛模式虽然很好地解决了命令式编排在一致性、事务性上的种种问题，但它本身的心智模型是更为抽象的，我们需要考虑每一种可能的状态并针对性地设计收敛策略，而最后的实际状态收敛路径是随着环境而变化的，我们很难对整个过程进行准确的预测和验证。假如我们不能有效地控制编排层面的复杂度，最后的结果就是没有人能拍胸脯保证 TiDB Operator 能够满足上面提到的严苛挑战，那么走向生产也就无从谈起了。\n\n**第三个挑战是存储**。数据库对于磁盘和网络的 IO 性能相当敏感，而在 Kubernetes 上，最主流的各类网络存储很难满足 TiDB 对磁盘 IO 性能的要求。假如我们使用本地存储，则不得不面对本地存储的易失性问题——磁盘故障或节点故障都会导致某块存储不可用，而这两种故障在分布式系统中是家常便饭。\n\n**最后的问题是，尽管 Kubernetes 成功抽象了基础设施的计算能力与存储能力，但在实际场景的成本优化上考虑得很少**。对于公有云、私有云、裸金属等不同的基础设施环境，TiDB Operator 需要更高级、特化的调度策略来做成本优化。大家也知道，成本优化是没有尽头的，并且往往伴随着一些牺牲，怎么找到优化过程中边际收益最大化的点，同样也是非常有意思的问题之一。\n\n其中，场景严苛可以作为一个前提条件，而针对性的成本优化则不够有普适性。我们接下来就从编排和存储两块入手，从实际例子来看 TiDB 与 TiDB Operator 如何解决这些问题，并推广到一般的有状态应用上。\n\n## 控制器——剪不断，理还乱\n\nTiDB Operator 需要驱动集群向期望状态收敛，而最简单的驱动方式就是创建一组 Pod 来组成 TiDB 集群。通过直接操作 Pod，我们可以自由地控制所有编排细节。举例来说，我们可以：\n\n*   通过替换 Pod 中容器的 image 字段完成原地升级。\n\n*   自由决定一组 Pod 的升级顺序。\n\n*   自由下线任意 Pod。\n\n事实上我们也确实采用过完全操作 Pod 的方案，但是当真正推进该方案时我们才发现，这种完全“自己造轮子”的方案不仅开发复杂，而且验证成本非常高。试想，为什么大家对 Kubernetes 的接受度越来越高， 即使是传统上较为保守的公司现在也敢于拥抱 Kuberentes？除了 Kubernetes 本身项目素质过硬之外，更重要的是有整个社区为它背书。我们知道 Kubernetes 已经在各种场景下经受过大量的生产环境考验，这种信心是各类测试手段都没法给到我们的。回到 TiDB Operator 上，选择直接操作 Pod 就意味着我们抛弃了社区在 StatefulSet、Deployment 等对象中沉淀的编排经验，随之带来的巨大验证成本大大影响了整个项目的开发效率。\n\n因此，在目前的 TiDB Operator 项目中，大家可以看到控制器的主要操作对象是 StatefulSet。StatefulSet 能够满足有状态应用的大部分通用编排需求。当然，StatefulSet 为了做到通用化，做了很多不必要的假设，比如高序号的 Pod 是隐式依赖低序号 Pod 的，这会给我们带来一些额外的限制，比如：\n\n+  无法指定 Pod 进行下线缩容。\n+  滚动更新顺序固定。\n+  滚动更新需要后驱 Pod 全部 Ready。\n\nStatefulSet 和 Pod 的抉择，最终是灵活性和可靠性的权衡，而在 TiDB 面临的严苛场景下，我们只有先做到可靠，才能做开发、敢做开发。最后的选择自然就呼之欲出——StatefulSet。当然，这里并不是说，使用基于高级对象进行编排的方案要比基于 Pod 进行编排的方案更好，只是说我们在当时认为选择 StatefulSet 是一个更好的权衡。当然这个故事还没有结束，当我们基于 StatefulSet 把第一版 TiDB Operator 做稳定后，我们正在接下来的版本中开发一个新的对象来水平替换 StatefulSet，这个对象可以使用社区积累的 StatefulSet 测试用例进行验证，同时又可以解除上面提到的额外限制，给我们提供更好的灵活性。 假如你也在考虑从零开始搭建一个 Operator，或许也可以参考“先基于成熟的原生对象快速迭代，在验证了价值后再增强或替换原生对象来解决高级需求”这条落地路径。\n\n接下来的问题是控制器如何协调基础设施层的状态与应用层的状态。举个例子，在滚动升级 TiKV 时，每次重启 TiKV 实例前，都要先驱逐该实例上的所有 Region Leader；而在缩容 TiKV 时，则要先在 PD 中将待缩容的 TiKV 下线，等待待缩容的 TiKV 实例上的 Region 全部迁移走，PD 认为 TiKV 下线完成时，再真正执行缩容操作调整 Pod 个数。这些都是在编排中协调应用层状态的例子，我们可以怎么做自动化呢？\n\n大家也注意到了，上面的例子都和 Pod 下线挂钩，因此一个简单的方案就通过 container lifecycle hook，在 preStop 时执行一个脚本进行协调。这个方案碰到的第一个问题是缺乏全局信息，脚本中无法区分当前是在滚动升级还是缩容。当然，这可以通过在脚本中查询 apiserver 来绕过。更大的问题是 preStop hook 存在 grace period，kubelet 最多等待 .spec.terminationGracePeriodSeconds 这么长的时间，就会强制删除 Pod。对于 TiDB 的场景而言，我们更希望在自动的下线逻辑失败时进行等待并报警，通知运维人员介入，以便于最小化影响，因此基于 container hook 来做是不可接受的。\n\n第二种方案是在控制循环中来协调应用层的状态。比如，我们可以通过 partition 字段来控制 StatefulSet 升级进度，并在升级前确保 leader 迁移完毕，如下图所示：\n\n![图 5 在控制循环中协调状态](https://img1.www.pingcap.com/prod/5_626be61fb4.png)\n\n<div class=\"caption-center\">图 5 在控制循环中协调状态</div>\n\n在伪代码中，每次我们因为要将所有 Pod 收敛到新版本而进入这段控制逻辑时，都会先检查下一个要待升级的 TiKV 实例上 leader 是否迁移完毕，直到迁移完毕才会继续往下走，调整 partition 参数，开始升级对应的 TiKV 实例。缩容也是类似的逻辑。但你可能已经意识到，缩容和滚动更新两个操作是有可能同时出现在状态收敛的过程中的，也就是同时修改 replicas 和 image 字段。这时候由于控制器需要区分缩容与滚动更新，诸如此类的边界条件会让控制器越来越复杂。\n\n第三种方案是使用 Kubernetes 的 Admission Webhook 将一部分协调逻辑从控制器中拆出来，放到更纯粹的切面当中。针对这个例子，我们可以拦截 Pod 的 Delete 请求和针对上层对象的 Update 请求，检查缩容或滚动升级的前置条件，假如不满足，则拒绝请求并触发指令进行协调，比如驱逐 leader，假如满足，那么就放行请求。控制循环会不断下发指令直到状态收敛，因此 webhook 就相应地会不断进行检查直到条件满足，如下图所示：\n\n\n![图 6 在 Webhook 中协调状态](https://img1.www.pingcap.com/prod/6_81b513d518.png)\n\n<div class=\"caption-center\">图 6 在 Webhook 中协调状态</div>\n\n这种方案的好处是我们把逻辑拆分到了一个与控制器垂直的单元中，从而可以更容易地编写业务代码和单元测试。当然，这个方案也有缺点，一是引入了新的错误模式，处理 webhook 的 server 假如宕机，会造成集群功能降级；二是该方案适用面并不广，只能用于状态协调与特定的 Kubernetes API 操作强相关的场景。在实际的代码实践中，我们会按照具体场景选择方案二或方案三，大家也可以到项目中一探究竟。\n\n**上面的两个例子都是关于如何控制编排逻辑复杂度的，关于 Operator 的各类科普文中都会用一句“在自定义控制器中编写领域特定的运维知识”将这一部分轻描淡写地一笔带过，而我们的实践告诉我们，真正编写生产级 的自定义控制器充满挑战与抉择。**\n\n## Local PV —— 想说爱你不容易\n\n接下来是存储的问题。我们不妨看看 Kubernetes 为我们提供了哪些存储方案：\n\n![图 7 存储方案](https://img1.www.pingcap.com/prod/7_937ba0fb08.png)\n\n<div class=\"caption-center\">图 7 存储方案</div>\n\n其中，本地临时存储中的数据会随着 Pod 被删除而清空，因此不适用于持久存储。\n\n远程存储则面临两个问题：\n\n+ 通常来说，远程存储的性能较差，这尤其体现在 IOPS 不够稳定上，因此对于磁盘性能有严格要求的有状态应用，大多数远程存储是不适用的。\n\n+ 通常来说，远程存储本身会做三副本，因此单位成本较高，这对于在存储层已经实现三副本的 TiDB 来说是不必要的成本开销。\n\n因此，最适用于 TiDB 的是本地持久存储。这其中，hostPath 的生命周期又不被 Kubernetes 管理，需要付出额外的维护成本，最终的选项就只剩下了 Local PV。\n\nLocal PV 并非免费的午餐，所有的文档都会告诉我们 Local PV 有以下限制：\n\n+ 数据易失（相比于远程存储的三副本）。\n\n+ 节点故障会影响数据访问。\n\n+ 难以垂直扩展容量（相当一部分远程存储可以直接调整 volume 大小）。\n\n这些问题同样也是在传统的虚拟机运维场景下的痛点，因此 TiDB 本身设计就充分考虑了这些问题：\n\n+ 本地存储的易失性要求应用自身实现数据冗余。\n   - TiDB 的存储层 TiKV 默认就为每个 Region 维护至少三副本。\n   - 当副本缺失时，TiKV 能自动补齐副本数。\n+ 节点故障会影响本地存储的数据访问。\n    - 节点故障后，相关 Region 会重新进行 leader 选举，将读写自动迁移到健康节点上。\n+ 本地存储的容量难以垂直扩展。\n    - TiKV 的自动数据切分与调度能够实现水平伸缩。\n\n存储层的这些关键特性是 TiDB 高效使用 Local PV 的前提条件，也是 TiDB 水平伸缩的关键所在。当然，在发生节点故障或磁盘故障时，由于旧 Pod 无法正常运行，我们需要自定义控制器帮助我们进行恢复，及时补齐实例数，确保有足够的健康实例来提供整个集群所需的存储空间、计算能力与 IO 能力。这也就是自动故障转移。\n\n我们先看一看为什么 TiDB 的存储层不能像无状态应用或者使用远程存储的 Pod 那样自动进行故障转移。假设下图中的节点发生了故障，由于 TiKV-1 绑定了节点上的 PV，只能运行在该节点上，因此 在节点恢复前，TiKV-1 将一直处于 Pending 状态：\n\n\n![图 8 节点故障](https://img1.www.pingcap.com/prod/8_dbab905937.png)\n\n<div class=\"caption-center\">图 8 节点故障</div>\n\n此时，假如我们能够确认 Node 已经宕机并且短期无法恢复，那么就可以删除 Node 对象（比如 NodeController 在公有上会查询公有云的 API 来删除已经释放的 Node）。此时，控制器通过 Node 对象不存在这一事实理解了 Node 已经无法恢复，就可以直接删除 pvc-1 来解绑 PV，并强制删除 TiKV-1，最终让 TiKV-1 调度到其它节点上。当然，我们同时也要做应用层状态的协调，也就是先在 PD 中下线 TiKV-1，再将新的 TiKV-1 作为一个新成员加入集群，此时，PD 就会通知 TiKV-1 创建 Region 副本来补齐集群中的 Region 副本数。\n\n![图 9 能够确定节点状态时的故障转移](https://img1.www.pingcap.com/prod/9_56706c6958.png)\n\n<div class=\"caption-center\">图 9 能够确定节点状态时的故障转移</div>\n\n当然，更多的情况下，我们是无法在自定义控制器中确定节点状态的，此时就很难针对性地进行原地恢复，因此我们通过向集群中添加新 Pod 来进行故障转移：\n\n![图 10 无法确定节点状态时的故障转移](https://img1.www.pingcap.com/prod/10_015ed13155.png)\n\n<div class=\"caption-center\">图 10 无法确定节点状态时的故障转移</div>\n\n上面讲的是 TiDB 特有的故障转移策略，但其实可以类推到大部分的有状态应用上。比如对于 MySQL 的 slave，我们同样可以通过新增 slave 来做 failover，而在 failover 时，我们同样也要做应用层的一些事情， 比如说去 S3 上拉一个全量备份，再通过 binlog 把增量数据补上，当 lag 达到可接受的程度之后开始对外提供读服务。因此大家就可以发现，对于有状态应用的 failover 策略是共通的，也都需要应用本身支持某种 failover 形式。比如对于 MySQL 的 master，我们只能通过 M-M 模式做一定程度上的 failover，而且还会损失数据一致性。这当然不是 Kubernetes 或云原生本身有什么问题，而是说 Kubernetes 只是改变了应用的运维模式，但并不能影响应用本身的架构特性。假如应用本身的设计就不是云原生的，那只能从应用本身去解决。\n\n## 总结\n\n通过 TiDB Operator 的实践，我们有以下几条总结：\n\n* Operator 本身的复杂度不可忽视。\n\n* Local PV 能满足高 IO 性能需求，代价则是编排上额外的复杂度。\n\n* 应用本身必须迈向云原生（meets kubernetes part way）。\n\n最后，言语的描述总是不如代码本身来得简洁有力，TiDB Operator 是一个完全开源的项目，眼见为实，大家可以尽情到 [项目仓库](https://github.com/pingcap/tidb-operator) 中拍砖，也欢迎大家加入社区一起玩起来，期待你的 issue 和 PR！\n\n假如你对于文章有任何问题或建议，或是想直接加入 PingCAP 鼓捣相关项目，欢迎通过我的邮箱 wuyelei@pingcap.com 联系我。\n\n\n>本文为吴叶磊在 2019 QCon 全球软件开发大会（上海）上的专题演讲实录，Slides [下载地址](https://github.com/pingcap/presentations/blob/master/conference/%E5%90%B4%E5%8F%B6%E7%A3%8A-QCon-2019-%E9%AB%98%E6%95%88%E7%BC%96%E6%8E%92%E6%9C%89%E7%8A%B6%E6%80%81%E5%BA%94%E7%94%A8-TiDB%E7%9A%84%E4%BA%91%E5%8E%9F%E7%94%9F%E5%AE%9E%E8%B7%B5%E4%B8%8E%E6%80%9D%E8%80%83.pdf)。","date":"2019-10-29","author":"吴叶磊","fillInMethod":"writeDirectly","customUrl":"efficiently-orchestrating-stateful-application","file":null,"relatedBlogs":[]},{"id":"Blogs_279","title":"势高，则围广：TiDB 的架构演进哲学","tags":["TiDB","架构"],"category":{"name":"观点洞察"},"summary":"我们更多时候是站在哲学层面思考整个公司的运转和 TiDB 这个产品的演进的思路。这些思路很多时候是大家看不见的，因为不是一个纯粹的技术层面或者算法层面的事情。","body":"大家可能知道我是 PingCAP CEO，但是不知道的是，我也是 PingCAP 的产品经理，应该也是最大的产品经理，是对于产品重大特性具有一票否决权的人。中国有一类产品经理是这样的，别人有的功能我们统统都要有，别人没有的功能，我们也统统都要有，所以大家看到传统的国内好多产品就是一个超级巨无霸，功能巨多、巨难用。所以我在 PingCAP 的一个重要职责是排除掉“看起来应该需要但实际上不需要”的那些功能，保证我们的产品足够的专注、足够聚焦，同时又具有足够的弹性。\n\n## 一、最初的三个基本信念\n\n本次分享题目是《TiDB 的架构演进哲学》，既然讲哲学那肯定有故事和教训，否则哲学从哪儿来呢？但从另外的角度来说，一般大家来讲哲学就先得有信念。有一个内容特别扯的美剧叫做《美国众神》，里面核心的一条思路是“你相信什么你就是什么”。其实人类这么多年来，基本上也是朝这条线路在走的，人类对于未知的东西很难做一个很精确的推导，这时信念就变得非常重要了。\n\n![图 1 最初的基本信念](https://img1.www.pingcap.com/prod/1_672df1c56a.png)\n\n<div class=\"caption-center\">图 1 最初的基本信念</div>\n\n实际上，我们开始做 TiDB 这个产品的时候，第一个信念就是相信云是未来。当年 K8s 还没火，我们就坚定的拥抱了 K8s。第二是不依赖特定硬件、特定的云厂商，也就是说 TiDB 的设计方向是希望可以 Run 在所有环境上面，包括公有云私有云等等。第三是能支持多种硬件，大家都知道我们支持 X86、AMD64、ARM 等等，可能大家不清楚的是 MIPS，MIPS 典型代表是龙芯，除此之外，TiDB 未来还可以在 GPU 上跑（TiFlash 的后续工作会支持 GPU）。\n\n## 二、早期用户故事\n\n### 2.1 Make it work\n\n有一句话大概是“眼睛里面写满了故事，脸上没有一点沧桑”，其实现实是残酷的，岁月一定会给你沧桑的。我们早期的时候，也有相对比较难的时候，这时候就有一些故事关于我们怎么去经历、怎么渡过的。  \n\n首先大家做产品之前肯定先做用户调研，这是通用的流程，我们当初也做过这个事，跟用户聊。我们通常会说：“我们要做一个分布式数据库，自动弹性伸缩，能解决分库分表的问题，你会用吗？”用户说“那肯定啊，现在的分库分表太痛苦了。”这是最初我们获取需求最普通的方式，也是我们最容易掉入陷阱的方式，就好像“我有一百万，你要不要？肯定要。”“我有一瓶水，喝了之后就健康无比，延年益寿你要不要？肯定要。”很容易就得到类似的结论。\n\n所以这个一句话结论的代价是我们进行了长达两年的开发。在这两年的时间里，我们确定了很多的技术方向，比如最初 TiDB 就决定是分层的。很显然一个复杂的系统如果没有分层，基本上没有办法很好的控制规模和复杂度。TiDB 分两层，一层是 SQL 层，一层是 key-value 层，那么到底先从哪一个层开始写呢？其实从哪层开始都可以，但是总要有一个先后，如何选择？\n\n这里就涉及到 TiDB 的第一条哲学。我们做一个产品的时候会不断面临选择，那每次选择的时候核心指导思想是什么？核心思想是能一直指导我们持续往前去迭代，所以我们第一条哲学就是：**永远站在离用户更近的地方去考虑问题。**\n\n为什么我们会定义这样一条哲学？因为离用户越近越能更快的得到用户的反馈，更快的验证你的想法是不是可行的。显然 SQL 层离用户更近，所以我们选择从 SQL 层写起。其实一直到现在，绝大多数用户用 TiDB 的时候根本感受不到 KV 层的存在，用户写的都是 SQL，至于底层存储引擎换成了别的，或者底层的 RocksDB 做了很多优化和改进，这些变化对于用户关注的接口来说是不可见的。\n\n选择从 SQL 层开始写之后，接下来面临的问题就是怎么做测试，怎么去更好的做验证，怎么让整个架构，先能够完整跑起来。\n\n在软件开发领域有一条非常经典的哲学：**「Make it work, make it right, make it fast」**。我想大家每一个学软件开发的人，或者每一个学计算机的人可能都听过这样一句话。所以当时我们就做另外一个决定，先在已有的 KV 上面构建出一个原形，用最短的时间让整个系统能够先能 work。\n\n我们在 2015 年的 9 月份开源了第一个版本，当时是没有存储层的，需要接在 HBase 上。当这个系统能跑起来之后，我们的第一想法是赶紧找到当初调研时说要用的那些用户，看看他们是什么想法，尽快的去验证我们的想法是不是可行的。因为很多人做产品思维属于自嗨型，“我做的东西最厉害，只要一推出去肯定一群人蜂拥而至。”抱有这种想法的人太多了，实际上，只有尽快去验证才是唯一的解决之道，避免产品走入误区。\n\n![图 2 与调研用户第二次对话](https://img1.www.pingcap.com/prod/2_b92cf46f50.png)\n\n<div class=\"caption-center\">图 2 与调研用户第二次对话</div>\n\n然而当我跟用户讲，你需要先装一个 Hadoop，可能还要装一组 Zookeeper，**但用户说：“我只想要一个更强大的 MySQL，但是让我装这一堆东西，你是解决问题还是引入问题？”**\n\n这个问题有什么解决办法呢？一个办法是你去解决用户，可以通过销售或者通过某些关系跟用户聊，显然这是一个不靠谱的思路。作为一个产品型的公司，我们很快就否了这个想法。用户的本质要求是：你不要给我装一堆的东西，要真正解决我的问题。所以我们马上开始启动分布式 KV 的开发工作，彻底解决掉这个问题，满足用户的要求。\n\n![图 3 开发 TiKV 前的技术考量](https://img1.www.pingcap.com/prod/3_8eb8daea73.png)\n\n<div class=\"caption-center\">图 3 开发 TiKV 前的技术考量</div>\n\n开始开发 KV 层时候又会面临很多技术选择，我们有很多考量（如图 3）。\n\n**第一点，我们认为作为数据库最重要的是正确性。** 假设这个数据库要用在金融行业，用在银行、保险、证券，和其他一些非常关键的场合的时候，正确性就是无比重要的东西。没有人会用一个不正确的数据库。\n\n**第二点是实现简洁、易用。** 用户对于一个不简洁、不易用的东西是无法接受的，所以我们当时的一个想法是一定要做得比 HBase 更加易用，代码量也要比 HBase 小，所以时至今天 TiDB 代码量仍然是比 HBase 小得多，大约还不到 HBase 的十分之一。\n\n**第三点考虑是扩展性。** TiDB 不仅在整体上是分层的，在存储层 TiKV 内部也是分层的，所以有非常好的扩展性，也支持 Raw KV API、Transaction API，这个设计后来也收获了很多用户的支持，比如一点资讯的同学就是用的 Raw KV API。\n\n**第四点就是要求高性能低延迟。** 大家对于数据库的性能和延迟的追求是没有止境的，但是我们当时并没有把太多精力花在高性能低延迟上。刚才说到我们有一条哲学是「Make it work, make it right, make it fast」，大家可以看到这句话里面 「Fast」是放最后的，这一点也是 TiDB 和其他产品有非常大的差异的地方。作为一个技术人员，通常大家看一个产品好不好，就会想：“来，不服跑个分，产品架构、易用性、技术文档、Community 这些指标都不看，先跑个分让大家看看行不行”。这个思路真正往市场上去推时是不对的。很多事情的选择是一个综合的过程。你可以让你的汽车跑的巨快无比，上面东西全拆了就留一个发动机和四个轮子，那肯定也是跑得巨快，重量轻，而且还是敞篷车，但没有一个人会在路上用的。同样的，选择 Rust 也是综合考量的结果。我们看中了 Rust 这个非常具有潜力的语言。当时 Rust 没有发布 1.0，还不是一个 stable 版本，但我们相信它会有 1.0。大概过了几个月，Rust 就发布了 1.0 版本，证明我们的选择还是非常正确的。\n\n**最后一点就是稳定性。** 作为一个分布式数据库，每一层的稳定性都非常重要。最底下的一个存储引擎，我们选择了非常稳定的 RocksDB。不过后来我们也查到几个 RocksDB 掉数据的 Bug。这也是做数据库或者说做基础产品的残酷性，我们在做产品的过程中找到了 Rust 编译器的 Bug，XFS 掉数据的 Bug，RocksDB 掉数据的 Bug，好像几大基础组件的 Bug 都聚在这里开会。\n\n接着我们辛辛苦苦干了三个月，然后就开源了 TiKV，所以这时候看起来没有那么多的组件了。我们也不忘初心，又去找了我们当初那个用户，说我们做了一些改进，你要不要试一试。\n\n![图 4 与调研用户第三次对话](https://img1.www.pingcap.com/prod/4_5d645138a5.png)\n\n<div class=\"caption-center\">图 4 与调研用户第三次对话</div>\n\n但是用户这时候给了一个让我们非常伤心非常难受的回答：没有，我们不敢上线，虽然你们的产品听起来挺好的，但是数据库后面有很大的责任，心理上的担心确实是过不去。于是我们回去开始加班加点写 TiDB Binlog，让用户可以把 binlog 同步给 MySQL。**毕竟用户需要一个 Backup：万一 TiDB 挂了怎么办，我需要切回 MySQL，这样才放心，因为数据是核心资产。**\n\n![图 5 第一个上线用户的架构图](https://img1.www.pingcap.com/prod/5_8f549b97fb.png)\n\n<div class=\"caption-center\">图 5 第一个上线用户的架构图</div>\n\n所以最终我们第一个用户上线的时候，整个 TiDB 的架构是这样的（如图 5）。用户通过 Client 连上 TiDB，然后 TiDB 后面就通过 Binlog 同步到 MySQL。后来过了一段时间，用户就把后面的 MySQL 撤了。我们当时挺好奇为什么撤了，用户说，第一个原因是后面 MySQL 撑不起一个集群给它回吐 Binlog，第二就是用了一段时间觉得 TiDB 挺稳定的，然后就不需要 Binlog 备份了。\n\n其实第一个用户上线的时候，数据量并不算大，大概 800G 的数据，使用场景是 OLTP 为主，有少量的复杂分析和运算，但这少量的复杂分析运算是当时他们选择 TiDB 最重要的原因。因为当时他们需要每隔几分钟算一个图出来，如果是在 MySQL 上面跑，大约需要十几分钟，但他们需要每隔几分钟打一个点，后来突然发现第二天才能把前一天的点都打出来，这对于一个实时的系统来说就很不现实了。虽然这个应用实践只有少部分运算，但也是偏 OLAP，我记得 TiDB 也不算特别快，大概是十几秒钟，因为支持了一个并行的 Hash Join。\n\n**不管怎样，这个时候终于有第一个用户能证明我们做到了「Make it work」。**\n\n### 2.2 Make it right\n\n接下来就是「Make it right」。大家可能想象不到做一个保证正确性的数据库这件事情有多么难，这是一个巨大的挑战，也有巨大的工作量，是从理论到实践的距离。\n\n![图 6 理论到实践的距离](https://img1.www.pingcap.com/prod/6_8ebebc3451.png)\n\n<div class=\"caption-center\">图 6 理论到实践的距离</div>\n\n#### 2.2.1 TLA+ 证明\n\n大家可能会想写程序跟理论有什么关系？其实在分布式数据库领域是有一套方法论的。这个方法论要求先实现正确性，而实现正确的前提是有一个形式化的证明。为了保证整个系统的理论正确，我们把所有的核心算法都用 TLA+ 写了一遍证明，并且把这个证明 [开源](https://github.com/pingcap/tla-plus) 出去了，如果大家感兴趣可以翻看一下。以前写程序的时候，大家很少想到先证明一下算法是对的，然后再把算法变成一个程序，其实今天还有很多数据库厂商没有做这件事。\n\n#### 2.2.2 千万级别测试用例\n\n在理论上保证正确性之后，下一步是在现实中测试验证。这时只有一个办法就是用非常庞大的测试用例做测试。大家通常自己做测试的时候，测试用例应该很少能达到十万级的规模，而我们现在测试用例的规模是以千万为单位的。当然如果以千万为单位的测试用例靠纯手写不太现实，好在我们兼容了 MySQL 协议，可以直接从 MySQL 的测试用例里收集一些。这样就能很快验证整个系统是否具备正确性。\n\n这些测试用例包括应用、框架、管理工具等等。比如有很多应用程序是依赖 MySQL，那直接拿这个应用程序在 TiDB 上跑一下，就知道 TiDB 跟 MySQL 的兼容没问题，如 Wordpress、无数的 ORM 等等。还有一些 MySQL 的管理工具可以拿来测试，比如 Navicat、PHP admin 等。另外我们把公司内部在用的 Confluence、Jira 后面接的 MySQL 都换成了 TiDB，虽然说规模不大，但是我们是希望在应用这块有足够的测试，同时自己「Eat dog food」。\n\n#### 2.2.3 7*24 的错误注入测试用例\n\n这些工作看起来已经挺多的了，但实际上还有一块工作比较消耗精力，叫 7*24 的错误注入测试。最早我们也不知道这个测试这么花钱，我们现在测试的集群已经是几百台服务器了。如果创业的时候就知道需要这么多服务器测试，我们可能就不创业了，好像天使轮的融资都不够买服务器的。不过好在这个事是一步一步买起来，刚开始我们也没有买这么多测试服务器，后来随着规模的扩大，不断的在增加这块的投入。\n\n大家可能到这儿的时候还是没有一个直观的感受，说这么多测试用例，到底是一个什么样的感受。我们可以对比看一下行业巨头 Oracle 是怎么干的。\n\n![图 7 前 Oracle 员工的描述](https://img1.www.pingcap.com/prod/7_6e480d4021.png)\n\n<div class=\"caption-center\">图 7 前 Oracle 员工的描述</div>\n\n这是一篇 [在 HackNews上面的讨论](https://news.ycombinator.com/item?id=18442941&utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=website)，讨论的问题是：你觉得这个最坏的、规模最大的代码是什么样子的？下面就有一个 Oracle 的前员工就介绍了 Oracle Database 12.2 这个版本的情况。他说这个整体的源代码接近 2500 万行 C 代码，可能大家维护 25 万行 C 代码的时候就会痛不欲生了，可以想想维护这么多代码的是一种什么样的感受。到现在为止，TiDB 的代码应该还不到 25 万行。当然 TiDB 的功能远远没有 Oracle 那么多，Oracle 的功能其实是很多的，历史积累一直往上加，加的很凶。\n\n这位 Oracle 前员工介绍了自己在 Oracle 的开发工作的流程，如下图：\n\n![图 8  Oracle 开发者 fix bug 的过程](https://img1.www.pingcap.com/prod/8_8a4291f0a4.png)\n\n<div class=\"caption-center\">图 8  Oracle 开发者 fix bug 的过程</div>\n\n比如用户报了一个 Bug，然后他开始 fix。第一件事是花两周左右的时间去理解 20 个不同的 flag，看看有没有可能因为内部乱七八糟的原因来造成这个 Bug。大家可能不知道 MySQL 有多少变量，我刚做 TiDB 的时候也不知道，当时我觉得自己是懂数据库的，后来去看了一下 MySQL 的 flag 的变量数就惊呆了，但看到 Oracle 的 flag 变量数，那不是惊呆了，是绝望了。大家可能知道开启 1 个 flag 的时候会对什么东西有影响，但是要去理解 20 个 flag 开启时和另外几个 flag 组合的时候都有什么影响，可能会崩溃。所以其实精通 Oracle 这件事情，实际上可能比精通 C++ 这件事情更困难的。一个 Oracle 开发者在内部处理这件事情都这么复杂，更何况是外面的用户。但 Oracle 确实是功能很强大。\n\n说回这位前 Oracle 员工的描述，他接着添加了更多的 flag 处理一个新的用户场景的问题，然后加强代码，最后改完以后会提交一个测试。先在 100 到 200 台机器上面把这个 Oracle 给 build 出来，然后再对这个 Oracle 去做新的测试。他应该对 Oracle 的测试用例的实际数量了解不深刻，我猜他可能不知道 Oracle 有多少个测试，所以写的是 “millions of tests”，这显然太低估了 Oracle 的测试数量。通常情况下，只会看到挂了的测试，看不到全部的测试数量。\n\n下面的步骤更有意思了：Go home，因为整个测试需要 20-30 个小时，跑完之后测试系统反馈了一个报告：挂了 200 多个 test，更茫然的是这 200 tests 他以前都没见过，这也是 Oracle 非常强大的一个地方，如果一个开发者的代码提交过去挂掉一两百个测试，是很正常的事情，因为 Oracle 的测试能 Cover 东西非常多，是这么多年来非常强大的积累，不停的堆功能的同时就不停的堆测试，当然也不停的堆 flag。所以从另一个角度来看，限制一个系统的功能数量，对于维护来说是非常重要的。\n\n总之，看完这个回复之后，我对行业前辈们充满了敬畏之情。\n\n### 2.3 Make it fast\n\n#### 2.3.1 新问题\n\n随着 TiDB 有用户开始上线，用户的数量和规模越来越大，这时候就出现了一个很有意思的事情，一部分用户把 TiDB 当成了可以支持事务、拥有良好实时性的数据仓库在用，和我们说：我们把公司 Hadoop 换了，数据量十几 T。\n\n我们就一下开始陷入了深深的思考，因为 TiDB 本来设计的目的不是这个方向，我们想做一个分布式 OLTP 数据库，并没有想说我们要做一个 Data Warehouse。但是用户的理由让我们觉得也很有道理，无法反驳——TiDB 兼容 MySQL，会 MySQL 的人很多，更好招人，最重要的是 Hadoop 跑得还不够快。\n\n虽然我们自己也很吃惊，但这体现了 TiDB 另一方面的价值，所以我们继续问用户还有什么痛点。用户表示还有一部分查询不够快，数据没办法做到 shuffle，而且以前用 Spark，TiDB 好像没有 Spark 的支持。\n\n我们想了想，TiDB 直接连 Spark 也是可以的，但这样 Spark 对底下没有感知，事务跑得巨慢，就跟 Spark 接 MySQL 没什么差别。我们研究了一下，做出了一个新的东西——TiSpark。TiSpark 就开始能够同时在 TiDB 上去跑 OLAP 和 OLTP。\n\n![图 9 出现的新问题](https://img1.www.pingcap.com/prod/9_45617011ab.png)\n\n<div class=\"caption-center\">图 9 出现的新问题</div>\n\n就在我们准备改进 TiDB 的数据分析能力的时候，突然又有一大批 TP 用户上线了，给我们报了一堆问题，比如执行计划不准确，选不到最优执行计划，数据热点分布不均匀，Raft store 单线程写入瓶颈，报表跑的慢等等……于是我们制定了 1.0 到 2.X 的计划，先把用户提的这些问题一一解决。\n\n**这里有另外一条哲学：将用户遇到的问题放在第一优先级。我们从产品最初设计和之后 Roadmap 计划永远是按照这个原则去做的。**\n\n**首先，执行计划不准确的问题。** 最简单有效的解决办法是加一个 Index Hint，就像是“你告诉我怎么执行，我就怎么执行，我自己不会自作聪明的选择”。但这不是长久之计，因为用户可能是在一个界面上选择各种条件、参数等等，最后拼成一个 SQL，他们自己没办法在里面加 Index Hint。我们不能决定用户的使用习惯，所以从这时开始，我们决定从 RBO（Rule Based Optimizer）演进到 CBO（Cost Based Optimizer），这条路也走了非常久，而且还在持续进行。\n\n**第二个是热点数据处理问题。** 我们推出了一个热点调度器，这个可能大家在分布式数据库领域第一次听说，数据库领域应该是 PingCAP 首创。 热点调度器会统计、监控整个系统热点情况，再把这些热点做一个快速迁移和平衡，比如整个系统有 10 个热点，某一个机器上有 6 个热点，这台机器就会很卡，这时热点调度器会开始将热点打散，快速分散到集群的其他机器上去，从而让整个集群的机器都处于比较正常的负载状态。\n\n**第三个就是解决 Raft store 单线程瓶颈的问题**。为了改变 Raft store 单线程，我们大概花了一年多的时间，目前已经在 TiDB 3.0 里实现了。我们将 Raft store 线程更多耗时的计算变成异步操作，offload 到其它线程。不知道有没有人会好奇为什么这个改进会花这么长时间？我们一直认为数据库的稳定性第一位的。分布式系统里面一致性协议本身也复杂，虽然说 Raft 是比 Paxos 要简单，但它实际做起来也很复杂，要在一个复杂系统里支持多线程，并且还要做优化，尽可能让这个 I/O 能 group 到一起，其实非常耗精力。\n\n**第四个就是解决报表跑得慢的问题**，这个骨头特别硬，我们也是啃到今天还在继续。首先要大幅提升 TiDB 在分析场景下的能力。大家都可以看到我们在发布每一个版本的时候，都会给出与上一个版本的 TPC-H 性能对比（TPC-H 是一个有非常多的复杂查询、大量运算的场景）。其次就是高度并行化，充分利用多核，并提供参数控制，这个特性可能很多用户不知道，我们可以配一下参数，就让 TiDB 有多个并发在底层做 Scan。\n\n解决完这些问题，我们终于觉得可以喘口气了，但喘气的时间就不到一个星期，很快又有很多用户的反馈开始把我们淹没了。因为随着用户规模的扩大，用户反馈问题的速度也变得越来越快，我们处理的速度不一定跟的上用户的增速。\n\n#### 2.3.4 新呼声\n\n这时候我们也听到了用户的一些「新呼声」。\n\n有用户说他们在跑复杂查询时 OLTP 的查询延迟变高了，跑一个报表的时候发现  OLTP 开始卡了。这个问题的原因是在跑复杂查询的时候，SQL 资源被抢占。我们又想有没有可能将 OLAP 和 OLTP 的 Workload 分开？于是我们搞了第一个实验版本，在 TiKV 里把请求分优先级，放到不同队列里面去，复杂 Query 放在第一优先级的队列， OLTP 放在高优先级。然后我们发现自己是对报表理解不够深刻，这个方案只能解决一部分用户的问题，因为有的报表跑起来需要几个小时，导致队列永远是满的，永远抢占着系统的资源。还有一部分用户的报表没有那么复杂，只是希望报表跑得更快、更加实时，比如一个做餐饮 SaaS 的用户，每天晚上需要看一下餐馆营收情况，统计一家餐馆时速度还行，如果统计所有餐馆的情况，那就另说了。\n\n另外，报表有一些必需品，比如 View 和 Window Function，没有这些的话 SQL 写起来很痛苦，缺乏灵活度。\n\n与此同时，用户关于兼容性和新特性的要求也开始变多，比如希望支持 MySQL 类似的 table partition，还有银行用户习惯用悲观锁，而 TiDB 是乐观锁，迁移过来会造成额外的改造成本（TiDB 3.0 已经支持了悲观锁）。\n\n还有用户有 400T 的数据，没有一个快速导入的工具非常耗时（当然现在我们有快速导入工具TiDB Lightning），这个问题有一部分原因在于用户的硬件条件限制，比如说千兆网导入数据。\n\n还有些用户的数据规模越来越大，到 100T 以上就开始发现十分钟已经跑不完 GC 了（TiDB 的 GC 是每十分钟一次），一个月下来 GC 已经整体落后了非常多。\n\n![图 10 用户的新呼声](https://img1.www.pingcap.com/prod/10_f3c1e6d3f0.png)\n\n<div class=\"caption-center\">图 10 用户的新呼声</div>\n\n我们当时非常头痛，收到了一堆意见和需求，压力特别大，然后赶紧汇总了一下，如图 10 所示。\n\n面对这么多的需求，我们考虑了两个点：\n\n*   哪些是共性需求？\n\n*   什么是彻底解决之道？\n\n**把共性的需求都列在一块，提供一个在产品层面和技术层面真正的彻底的解决办法。**\n\n比如图 10 列举的那么多问题，其实真正要解决三个方面：性能、隔离和功能。性能和隔离兼得好像很困难，但是这个架构有非常独特的优势，也是可以做得到的。那可以进一步「三者兼得」，同时解决功能的问题吗？我们思考了一下，也是有办法的。TiDB 使用的 Raft 协议里有一个 Raft Learner 的角色，可以不断的从 Leader 那边复制数据，我们把数据同步存成了一个列存，刚才这三方面的问题都可以用一个方案去彻底解决了。\n\n首先复杂查询的速度变快了，众所周知分析型的数据引擎基本上全部使用的是列存。第二就是强一致性，整个 Raft 协议可以保证从 Learner 读数据的时候可以选择一致性的读，可以从 Leader 那边拿到 Learner 当前的进度，判断是否可以对外提供请求。第三个是实时性可以保证，因为是通过 streaming 的方式复制的。\n\n所以这些看上去非常复杂的问题用一个方案就可以解决，并且强化了原来的系统。这个「强化」怎么讲？从用户的角度看，他们不会考虑 Query 是 OLAP 还是 OLTP，只是想跑这条 Query，这很合理。**用一套东西解决用户的所有问题，对用户来说就是「强化」的系统。**\n\n## 三、关于成本问题的思考\n\n\n![图 11 成本问题](https://img1.www.pingcap.com/prod/11_fa9b5eda47.png)\n\n<div class=\"caption-center\">图 11 成本问题</div>\n\n很多用户都跟我们反馈了成本问题，用户觉得全部部署到  SSD 成本有点高。一开始听到这个反馈，我们还不能理解，SSD 已经很便宜了呀，而且在整个系统来看，存储机器只是成本的一小部分。后来我们深刻思考了一下，其实用户说得对，很多系统都是有早晚高峰的，如果在几百 T 数据里跑报表，只在每天晚上收工时统计今天营业的状况，那为什么要求用户付出最高峰值的配置呢？这个要求是不合理的，合不合理是一回事，至于做不做得到、怎么做到是另外一回事。\n\n于是我们开始面临全新的思考，这个问题本质上是用户的数据只有一部分是热的，但是付出的代价是要让机器 Handle 所有的数据，所以可以把问题转化成：我们能不能在系统里面做到冷热数据分离？能不能支持系统动态弹性的伸缩，伸展热点数据，用完就释放？\n\n如果对一个系统来说，峰值时段和非峰值时段的差别在于峰值时段多了 5% 的热点。我们有必要去 Handle 所有的数据吗？**所以彻底的解决办法是对系统进行合理的监控，检测出热点后，马上创建一个新的节点，这个新的节点只负责处理热点数据，而不是把所有的数据做动态的 rebalance，重新搬迁。在峰值时间过去之后就可以把复制出来的热点数据撤掉，占的这个机器可以直接停掉了，不需要长时间配备非常高配置的资源，而是动态弹性伸缩的。**\n\nTiDB 作为一个高度动态的系统，本身的架构就具有非常强的张力，像海绵一样，能够满足这个要求，而且能根据系统负载动态的做这件事。这跟传统数据库的架构有很大的区别。比如有一个 4T 的 MySQL 数据库，一主一从，如果主库很热，只能马上搞一个等配的机器重挂上去，然后复制全部数据，但实际上用户需要的只是 5% 的热数据。而在 TiDB 里，数据被切成 64MB 一个块，可以很精确的检测热数据，很方便的为热数据做伸展。这个特性预计在 TiDB 4.0 提供。\n\n这也是一个良好的架构本身带来的强大的价值，再加上基于 K8s 和云的弹性架构，就可以得到非常多的不一样的东西。同样的思路，如果我要做数据分析，一定是扫全部数据吗？对于一个多租户的系统，我想统计某个餐馆今天的收入，数据库里有成千上万个餐馆，我需要运算的数据只是其中一小块。如果我要快速做列存计算时，需要把数据全部复制一份吗？也不需要，只复制我需要的这部分数据就行。这些事情只有一个具有弹性、高度张力的系统才能做到。这是 TiDB 相对于传统架构有非常不一样的地方。时至今天，我们才算是把整个系统的架构基本上稳定了，基于这个稳定的架构，我们还可以做更多非常具有张力的事情。\n\n**所以，用一句话总结我们解决成本问题的思路是：一定要解决真正的核心的问题，解决最本质的问题。**\n\n## 四、关于横向和纵向发展的哲学\n\nTiDB 还有一条哲学是关于横向和纵向发展的选择。 \n\n通常业内会给创业公司的最佳建议是优先打“透”一个行业，因为行业内复制成本是最低的，可复制性也是最好的。**但 TiDB 从第一天开始就选择了相反的一条路——「先往通用性发展」，这是一条非常艰难的路，意味着放弃了短时间的复制性，但其实我们换取的是更长时间的复制性，也就是通用性。**\n\n因为产品的整体价值取决于总的市场空间，产品的广泛程度会决定产品最终的价值。早期坚定不移的往通用性上面走，有利于尽早感知整个系统是否有结构性缺陷，验证自己对用户需求的理解是否具有足够的广度。如果只往一个行业去走，就无法知道这个产品在其他行业的适应性和通用性。如果我们变成了某个行业专用数据库，那么再往其他行业去发展时，面临的第一个问题是自己的恐惧。这恐惧怎么讲呢？Database 应该是一个通用型的东西，如果在一个行业里固定了，那么你要如何确定它在其他场景和行业是否具有适应性？\n\n**这个选择也意味着我们会面临非常大的挑战，一上来先做最厉害的、最有挑战的用户。** 如果大家去关注整个 TiDB 发展的用户案例的情况，你会注意到 TiDB 有这样一个特点，TiDB 是先做百亿美金以上的互联网公司，这是一个非常难的选择。但大家应该知道，百亿美金以上的互联网公司，在选择一个数据库等技术产品的时候，是没有任何商业上的考量的，对这些公司来说，你的实力是第一位的，一定要能解决他们问题，才会认可你整个系统。但这个也不好做，因为这些公司的应用场景通常都压力巨大。数据量巨大，QPS 特别高，对稳定性的要求也非常高。我们先做了百亿美金的公司之后，去年我们有 80% 百亿美金以上的公司用 TiDB，除了把我们当成竞争对手的公司没有用，其他全部在用。然后再做 30 亿美金以上的公司，今年是 10 亿美金以上的用户，实际上现在是什么样规模的用户都有，甭管多少亿美金的，“反正这东西挺好用的，我就用了。”所以我们现在也有人专门负责在用户群里面回答大家的提问。\n\n**其实当初这么定那个目标主要是考虑数据量，因为 TiDB 作为一个分布式系统一定是要处理具有足够数据量的用户场景，** 百亿美金以上的公司肯定有足够的数据，30 亿美金的公司也会有，因为他们的数据在高速增长，当我们完成了这些，然后再开始切入到传统行业，因为在这之前我们经过了稳定性的验证，经过了规模的验证，经过了场景的验证。\n\n![图 12 横向发展与纵向发展](https://img1.www.pingcap.com/prod/12_fcd36a317c.png)\n\n<div class=\"caption-center\">图 12 横向发展与纵向发展</div>\n\n**坚持全球化的技术视野也是一个以横向优先的发展哲学。** 最厉害的产品一定是全球在用的。这个事情的最大差异在于视野和格局，而格局最终会反映到人才上，最终竞争不是在 PingCAP 这两百个员工，也不是现在 400 多个 Contributors，未来可能会有上千人参与整个系统的进化迭代，在不同的场景下对系统进行打磨，所以竞争本质上是人才和场景的竞争。基于这一条哲学，所以才有了现在 TiDB 在新一代分布式数据库领域的全面领先，无论是从 GitHub Star 数、 Contributor 数量来看，还是从用户数据的规模、用户分布的行业来看，都是领先的。同样是在做一个数据库，大家的指导哲学不一样会导致产品最终的表现和收获不一样，迭代过程也会完全不一样。我们在做的方向是「携全球的人才和全球的场景去竞争」。\n\n关于横向和纵向发展，并不是我们只取了横向。\n\n**2019 年 TiDB 演进的指导思想是：稳定性排第一，易用性排第二，性能第三，新功能第四。** 这是我在 2018 年经过思考后，把我们发展的优先级做了排序。上半年我们重点关注的是前两个，稳定性和易用性。下半年会关注纵向发展，「Make it fast」其实是纵向上精耕细作、释放潜力的事情。这个指导思想看起来好像又跟其他厂商想法不太一样。\n\n我们前面讲的三条哲学里面，最后一条就是「Make it fast」，如果要修建五百层的摩天大楼，要做的不是搭完一层、装修一层，马上给第一层做营业，再去搭第二层。而一定要先把五百层的架构搭好，然后想装修哪一层都可以。**TiDB 就是「摩天大楼先搭架构后装修」的思路，所以在 TiDB 3.0 发布之后，我们开始有足够的时间去做「装修」的事情。**\n\n## 五、总结与展望\n\n说了这么多故事，如果要我总结一下 2015 - 2019 年外面的朋友对 TiDB 的感受，是下图这样的：\n\n![图 13 2015-2019 小结](https://img1.www.pingcap.com/prod/13_da28fa81cf.png)\n\n<div class=\"caption-center\">图 13 2015-2019 小结</div>\n\n2015 年，当我们开始做 TiDB 的时候，大家说：啊？这事儿你们也敢干？因为写一个数据库本身非常难，写一个分布式数据库就是无比的难，然后还是国人自主研发。到 2016 年的时候，大家觉得你好像折腾了点东西，听到点声音，但也没啥。到 2017、2018 年，大家看到有越来越多用户在用。2019 年，能看到更多使用后点赞的朋友了。\n\n我昨天翻了一下 2015 年 4 月 19 日发的一条微博。\n\n![图 14 刚创业时发的微博](https://img1.www.pingcap.com/prod/14_64c3636a50.png)\n\n<div class=\"caption-center\">图 14 刚创业时发的微博</div>\n\n当时我们正准备创业，意气风发发了一条这样微博。这一堆话其实不重要，大家看一下阅读量 47.3 万，有 101 条转发，44 条评论，然而我一封简历都没收到。当时大家看到我们都觉得，这事儿外国人都没搞，你行吗？折腾到今天，我想应该没有人再对这个问题有任何的怀疑。**很多国人其实能力很强了，自信也可以同步跟上来，毕竟我们拥有全球最快的数据增速，很多厂家拥有最大的数据量，对产品有最佳的打磨场景。**\n\n想想当时我也挺绝望的，想着应该还有不少人血气方刚，还有很多技术人员是有非常强大的理想的，但是前面我也说了，总有一个从理想到现实的距离，这个距离很长，好在现在我们能收到很多简历。所以很多时候大家也很难想象我们刚开始做这件事情的时候有多么的困难，以及中间的每一个坚持。**只要稍微有一丁点的松懈，就可能走了另外一条更容易走的路，但是那条更容易走的路，从长远上看是一条更加困难的路，甚至是一条没有出路的路。**\n\n![图 15 对 2020 年的展望](https://img1.www.pingcap.com/prod/15_d0acc1906a.png)\n\n<div class=\"caption-center\">图 15 对 2020 年的展望</div>\n\n最后再说一下 2020 年。在拥有行业复制能力的之后，在产品层面我们要开始向着更高的性能、更低的延迟、更多 Cloud 支持（不管是公有云还是私有云都可以很好的使用 TiDB）等方向纵向发展。同时也会支持我刚刚说的，热点根据 Workload 自动伸缩，用极小的成本去扛，仅仅需要处理部分热点的数据，而不是复制整个数据的传统主-从思路。\n\n大家去想一想，如果整个系统会根据 Workload 自动伸缩，本质上是一个 self-driving 的事情。现在有越来越多的用户把 TiDB 当成一个数据中台来用，有了 TiDB 行列混存，并且 TiDB 对用户有足够透明度，就相当于是握有了 database 加上 ETL，加上 data warehouse，并且是保证了一致性、实时性的。\n\n昨天我写完 slides 之后想起了以前看的一个电视剧《大秦帝国》。第一部第九集里有一段关于围棋的对话。商鞅执黑子先行，先下在了一个应该是叫天元位置，大约在棋盘的中间。大家知道一般下围棋的时候都是先从角落开始落子居多。商鞅的对手就说，我许你重下，意思就是你不要开玩笑，谁下这儿啊？于是商鞅说这样一句话，“中枢之地，辐射四极，雄视八荒”，这也是一个视野和格局的事情。然后对手说：“先生招招高位，步步悬空，全无根基实地”，就是看起来好像是都还挺厉害的，一点实际的基础都没有，商鞅说：“旦有高位，岂无实地？”，后来商鞅赢了这盘棋，他解释道：“**棋道以围地为归宿，但必以取势为根本。势高，则围广**”。\n\n**这跟我们做 TiDB 其实很像，我们一上来就是先做最难最有挑战的具有最高 QPS 和 TPS、最大数据量的场景，这就是一个「取势」的思路，因为「势高，则围广」。** 所以我们更多时候是像我前面说的那样，站在哲学层面思考整个公司的运转和 TiDB 这个产品的演进的思路。这些思路很多时候是大家看不见的，因为不是一个纯粹的技术层面或者算法层面的事情。\n\n我也听说有很多同学对 TiDB 3.0 特别感兴趣，不过今天没有足够的时间介绍，我们会在后续的 TechDay 上介绍 3.0 GA 的重大特性，因为从 2.0 到 3.0 产生了一个巨大的变化和提升，性能大幅提升，硬件成本也下降了一倍的样子，需要一天的时间为大家详细的拆解。\n\n![liuqi](https://img1.www.pingcap.com/prod/liuqi_17f6e03dd3.jpg)\n\n>本文根据我司 CEO 刘奇在第 100 期 Infra Meetup 上的演讲整理。\n\n<div class=\"caption-center\">- END -</div>","date":"2019-05-30","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"guiding-ideologies-in-the-evolution-of-tidb","file":null,"relatedBlogs":[]},{"id":"Blogs_187","title":"The (Near) Future of Database — TiDB DevCon 2019","tags":["TiDB","架构"],"category":{"name":"观点洞察"},"summary":"在 TiDB DevCon 2019 上，我司联合创始人兼 CTO 黄东旭分享了对数据库行业大趋势以及未来数据库技术的看法。","body":">在 TiDB DevCon 2019 上，我司联合创始人兼 CTO 黄东旭分享了对数据库行业大趋势以及未来数据库技术的看法。以下是演讲实录，enjoy~ \n\n![我司联合创始人兼 CTO 黄东旭](https://img1.www.pingcap.com/prod/dongxu_79a7ecb861.jpg)\n\n<div class=\"caption-center\">我司联合创始人兼 CTO 黄东旭</div>\n\n大家今天在这里看到了 TiDB 社区用户实践分享和我们自己的一些技术进展和展望，还有非常好玩的 Demo Show，正好在大会结束之前，我想跟大家聊一聊我心目中未来的 Database 应该是一个什么样子。\n\n其实我们并不是一个特别擅长发明名词的公司，我记得我们第一次去用 HTAP 这个词的时候，应该是 2016 左右。在使用 HTAP 这个词的时候，我们市场部同事还跟我们说 HTAP 这个词从来没人用过，都是论文里的词，大家都不知道，你把你们公司的产品定位改成这个别人都不知道怎么办？我们后来仔细想，还是觉得 HTAP 这个方向是一个更加适合我们的方向，所以还是选了 HTAP 这个词。现在很欣喜的看到现在各种友商、后来的一些数据库，都开始争相说 HTAP，就是说得到了同行的认可。\n\n那么在 HTAP 的未来应该是一个什么样子，我希望能够在今年这个 Talk 里面先说一说，但是这个题目起的有点不太谦虚，所以我特地加了一个「Near」， 分享一下这一年、两年、三年我们想做什么，和对行业大趋势的展望。\n\n![图 1](https://img1.www.pingcap.com/prod/1_280ee6f1bb.png)\n\n<div class=\"caption-center\">图 1</div>\n\n**今天我们的分享的一个主题就是：「我们只做用户想要的东西，并不是要去做一个完美的东西」**。其实很多工程师包括我们自己，都会有一个小小的心理的洁癖，就是想要做一个超级快、超级牛的东西，但是做出来一个数据库，单机跑分一百万 TPS ，其实用户实际业务就需要 3000，然后所有的用户还会说我需要这些东西，比如需要 Scalability（弹性扩展）， Super Large 的数据量，最好是我的业务一行代码都不用改，而且 ACID 能够完全的满足，怎么踹都踹不坏，机器坏了可以高可用，业务层完全不用动， 另外可以在跑 OLTP 的同时，完全不用担心任何资源隔离地跑 OLAP（这里不是要说大家的愿望不切实际，而是非常切实际，我们也觉得数据库本身就应该是这样的。所以大家记住这几个要点，然后慢慢看 TiDB 到底是不是朝着这个方向发展的）。**本质上来说用户的需求就是「大一统」。看过《魔戒》的同学都知道这句话 ：ONE RING TO RULE THEM ALL，就是一套解决方案去解决各种问题**。\n\n过去很多，包括一些行业的大佬之前说在各种环境下都要出一个数据库来解决特定的一个问题，但是其实看上去我们想走的方案还是尽可能在一个平台里面，尽可能大范围去解决用户的问题。因为不同的产品之间去做数据的交互和沟通，其实是蛮复杂的。\n\n![图 2 理想中的「赛道」](https://img1.www.pingcap.com/prod/2_1cc1f1ddad.png)\n\n<div class=\"caption-center\">图 2 理想中的「赛道」</div>\n\n这张图（图 2）什么意思呢？就是很多人设计系统的时候，总是会陷入跑分思维，就是说这个东西在实验室或者说在一个特定的 Workload 下，跑得巨快无比。如果大家去看一下大概 2000 年以后关于数据库的论文，很多在做一个新的模型或者新的系统的时候，都会说 TPCC 能够跑到多大，然后把 Oracle 摁在地上摩擦，这样的论文有很多很多很多。但是大家回头看看 Oracle 还是王者。所以大多数实验室的产品和工程师自己做的东西都会陷入一个问题，就是想象中的我的赛道应该是一个图 2 那样的，但实际上用户的业务环境是下面这样的（图 3）。很多大家在广告上看到特别牛的东西，一放到生产环境或者说放到自己的业务场景里面就不对了，然后陷入各种各样的比较和纠结的烦恼之中。\n\n![图 3 实际上用户的业务环境](https://img1.www.pingcap.com/prod/3_decbc5a48d.png)\n\n<div class=\"caption-center\">图 3 实际上用户的业务环境</div>\n\nTiDB 的定位或者说我们想做的事情，并不是在图 2 那样的赛道上，跑步跑得巨快，全世界没人在短跑上跑得过我，我们不想做这样。或者说，**我们其实也能跑得很快，但是并不想把所有优势资源全都投入到一个用户可能一辈子都用不到的场景之中。我们其实更像是做铁人三项的，因为用户实际应用场景可能就是一个土路。这就是为什么 TiDB 的设计放在第一位的是「稳定性」**。\n\n我们一直在想能不能做一个数据库，怎么踹都踹不坏，然后所有的异常的状况，或者它的 Workload  都是可预期的。我觉得很多人远远低估了这个事情的困难程度，其实我们自己也特别低估了困难程度。大概 4 年前出来创业的时候，我们就是想做这么一个数据库出来，我跟刘奇、崔秋三个人也就三个月做出来了。但是到现在已经 4 年过去了，我们的目标跟当年还是一模一样。不忘初心，不是忘不掉，而是因为初心还没达到，怎么忘？其实把一个数据库做稳，是很难很难的。\n\n\n![图 4 近年来硬件的发展](https://img1.www.pingcap.com/prod/4_df2860373c.png)\n\n<div class=\"caption-center\">图 4 近年来硬件的发展</div>\n\n**而且我们这个团队的平均年龄可能也就在二十到三十岁之间，为什么我们如此年轻的一个团队，能够去做数据库这么古老的一件事情。其实也是得益于整个 IT 行业这几年非常大的发展**。图 4 是这几年发展起来的 SSD，内存越来越大，万兆的网卡，还有各种各样的多核的 CPU，虚拟化的技术，让过去很多不可能的事情变成了可能。\n\n举一个例子吧，比如极端一点，大家可能在上世纪八九十年代用过这种 5 寸盘、3 寸盘，我针对这样的磁盘设计一个数据结构，现在看上去是个笑话是吧？因为大家根本没有人用这样的设备了。在数据库这个行业里面很多的假设，在现在新的硬件的环境下其实都是不成立的。比如说，为什么 B-Tree 就一定会比 LSM-Tree 要快呢？不一定啊，我跑到 Flash 或者 NVMe SSD 、Optane 甚至未来的持久化内存这种介质上，那数据结构设计完全就发生变化了。过去可能需要投入很多精力去做的数据结构，现在暴力就好了。\n\n![图 5 近年来软件变革](https://img1.www.pingcap.com/prod/5_d17444d02d.png)\n\n<div class=\"caption-center\">图 5 近年来软件变革</div>\n\n同时在软件上也发生了很多很多的变革，图 5 左上角是 Wisckey 那篇论文里的一个截图，还有一些分布式系统上的新的技术，比如 2014 年 Diego 发表了 Raft 这篇论文，另外 Paxos 这几年在各种新的分布式系统里也用得越来越多。\n\n**所以我觉得这几年我们赶上了一个比较好的时代，就是不管是软件还是硬件，还是分布式系统理论上，都有了一些比较大突破，所以我们基础才能够打得比较好**。\n\n![图 6  Data Type](https://img1.www.pingcap.com/prod/6_5ed8719d82.png)\n\n<div class=\"caption-center\">图 6  Data Type</div>\n\n除了有这样的新的硬件和软件之外，我觉得在业务场景上也在发生一些比较大变化。过去，可能十年前就是我刚开始参加工作的时候，线上的架构基本就是在线和离线两套系统，在线是 Oracle 和 MySQL，离线是一套 Hadoop 或者一个纯离线的数据仓库。**但最近这两年越来越多的业务开始强调敏捷、微服务和中台化，于是产生了一个新的数据类型，就是 warm data，它需要像热数据这样支持 transaction、支持实时写入，但是需要海量的数据都能存在这个平台上实时查询， 并不是离线数仓这种业务**。\n\n所以对 warm data 来说，过去在 TiDB 之前，其实是并没有太好的办法去很优雅的做一层大数据中台架构的，**「the missing part of modern data processing stack」，就是在 warm data 这方面，TiDB 正好去补充了这个位置，所以才能有这么快的增长**。当然这个增长也是得益于 MySQL 社区的流行。\n\n![图 7 应用举例](https://img1.www.pingcap.com/prod/7_5b7a33b459.png)\n\n<div class=\"caption-center\">图 7 应用举例</div>\n\n想象一下，我们如果在过去要做这样很简单的业务（图 7），比如在美国的订单库跟在中国的订单库可能都是在不同的数据库里，用户库可能是另外一个库，然后不同的业务可能是操作不同的库。如果我想看看美国的消费者里面有哪些在中国有过消费的，就是这么一条 SQL。过去如果没有像 TiDB 这样的东西，大家想象这个东西该怎么做？\n\n![图 8 过去的解决方案](https://img1.www.pingcap.com/prod/8_7bff7809a8.png)\n\n<div class=\"caption-center\">图 8 过去的解决方案</div>\n\n假如说这两边的数据量都特别大，然后已经分库分表了。过去可能只能第二天才可以看到前一天的数据，因为中间比如说一个 T+1  要做一个 ETL 到一个 data ware house 里。或者厉害一点的架构师可能会说，我可以做一套实时的 OLAP 来做这个事情，怎么做呢？比如说 MySQL 中间通过一个 MQ 再通过 Hadoop 做一下 ETL，然后再导到 Hadoop 上做一个冷的数据存储，再在上面去跑一个 OLAP 做实时的分析。先不说这个实时性到底有多「实时」，大家仔细算一算，这套架构需要的副本数有多少，比如 M 是我的业务数，N 是每一个系统会存储的 Replica，拍脑袋算一下就是下面这个数字（图 9 中的 **R** ）。\n\n![图 9 过去解决方案里需要的 Replica 数量](https://img1.www.pingcap.com/prod/9_6ec859321c.png)\n\n<div class=\"caption-center\">图 9 过去解决方案里需要的 Replica 数量</div>\n\n所以大家其实一开始在过去说，TiDB 这个背后这么多 Replica  不好，但其实你想想，你自己在去做这个业务的时候，大家在过去又能怎么样呢？所以我觉得 TiDB 在这个场景下去统一一个中台，是一个大的趋势。今天在社区实践分享上也看到很多用户都要提到了 TiDB 在中台上非常好的应用。\n\n![图 10 现在的解决方案](https://img1.www.pingcap.com/prod/10_f2ddbc83ff.png)\n\n<div class=\"caption-center\">图 10 现在的解决方案 </div>\n\n**回顾完行业和应用场景近年来的一些变化之后，我们再说说未来。假设要去做一个面向未来的数据库，会使用哪些技术？**\n\n## 1. Log is the new database\n\n第一个大的趋势就是日志，「log is the new database」 这句话应该也是业界的一个共识吧。现在如果有一个分布式数据库的复制协议，还是同步一个逻辑语句过去，或者做 binlog 的复制，那其实还算比较 low 的。\n\n![图 11  Log is the new database](https://img1.www.pingcap.com/prod/11_bea8870bae.png)\n\n<div class=\"caption-center\">图 11  Log is the new database </div>\n\n上面图 11 左半部分是 Hyper，它是慕尼黑工业大学的一个实验性数据库项目，它做了一些分析，第一个柱形是正常的 SQL 语句的执行时间，比如说直接把一语句放到另外一个库里去执行，耗时这么多。第二个柱形是用逻辑日志去存放，耗时大概能快 23%，第三个柱形能看到如果是存放物理日志能快 56%。所以大家仔细想想，**TiDB 的架构里的 TiFlash 其实同步的是 Raft 日志，而并不是同步 Binlog 或者其他的**。\n\n上面图 11 右半部分是 Aurora，它的架构就不用说了，同步的都是 redo log 。其实他的好处也很明显，也比较直白，就是 I/O 更小，网络传输的 size 也更小，所以就更快。\n\n然后在这一块 TiDB 跟传统的数据库有点不一样的就是，其实如果很多同学对 TiDB 的基础架构不太理解的话就觉得， Raft 不是一个一定要有 Index 或者说是一定强顺序的一个算法吗？那为什么能做到这样的乱序的提交？**其实 TiDB 并不是单 Raft 的架构，而是一个多 Raft 的架构，I/O 可以发生在任何一个 Raft Group 上**。传统的单机型数据库，就算你用更好的硬件都不可能达到一个线性扩展，因为无论怎么去做，都是这么一个架构不可改变。比如说我单机上 Snapshot  加 WAL，不管怎么写， 总是在 WAL  后面加，I/O 总是发生在这。但 TiDB 的 I/O 是分散在多个 Raft Group、多个机器上，这是一个很本质的变化，这就是为什么在一些场景下，TiDB 能够获取更好的吞吐。\n\n## 2. Vectorized\n\n第二个大趋势是全面的向量化。向量化是什么意思？我举个简单的例子。比如我要去算一个聚合，从一个表里面去求某一列的总量数据，如果我是一个行存的数据库，我只能把这条记录的 C 取出来，然后到下一条记录，再取再取再取，整个 Runtime 的开销也好，还有去扫描、读放大的每一行也好，都是很有问题的。但是如果在内存里面已经是一个列式存储，是很紧凑的结构的话，那会是非常快的。\n\n![图 12 TiDB 向量化面临的挑战](https://img1.www.pingcap.com/prod/12_6fd1394908.png)\n\n<div class=\"caption-center\">图 12 TiDB 向量化面临的挑战</div>\n\n这里面其实也有一些挑战。我们花了大概差不多 2018 年一年的时间去做向量化的改造，其实还挺难的。为什么？首先 TiDB SQL 引擎是用了 Volcano 模型，这个模型很简单，就是遍历一棵物理计划的树，不停的调 Next，每一次 Next 都是调用他的子节点的 Next，然后再返回结果。这个模型有几个问题：第一是每一次都是拿一行，导致 CPU 的 L1、L2 这样的缓存利用率很差，就是说没有办法利用多 CPU 的 Cache。第二，在真正实现的时候，它内部的架构是一个多级的虚函数调用。大家知道虚函数调用在 Runtime  本身的开销是很大的，在[《MonetDB/X100: Hyper-Pipelining Query Execution》](http://cidrdb.org/cidr2005/papers/P19.pdf)里面提到，在跑 TPC-H 的时候，Volcano 模型在 MySQL 上跑，大概有 90% 的时间是花在 MySQL 本身的 Runtime  上，而不是真正的数据扫描。所以这就是 Volcano 模型一个比较大的问题。第三，如果使用一个纯静态的列存的数据结构，大家知道列存特别大问题就是它的更新是比较麻烦的， 至少过去在 TiFlash 之前，没有一个列存数据库能够支持做增删改查。那在这种情况下，怎么保证数据的新鲜？这些都是问题。\n\n\n![图 13 TiDB SQL 引擎向量化](https://img1.www.pingcap.com/prod/13_2d9b9f311a.png)\n\n<div class=\"caption-center\">图 13 TiDB SQL 引擎向量化</div>\n\nTiDB 已经迈出了第一步，我们已经把 TiDB SQL 引擎的 Volcano 模型，从一行一行变成了一个 Chunk 一个 Chunk，每个 Chunk 里面是一个批量的数据，所以聚合的效率会更高。而且在 TiDB 这边做向量化之外，我们还会把这些算子推到 TiKV 来做，然后在 TiKV 也会变成一个全向量化的执行器的框架。\n\n## 3. Workload Isolation\n\n另外一个比较大的话题，是 Workload Isolation。今天我们在演示的各种东西都有一个中心思想，就是怎么样尽可能地把 OLTP 跟 OLAP 隔离开。这个问题在业界也有不同的声音，包括我们的老前辈 Google Spanner，他们其实是想做一个新的数据结构，来替代 Bigtable-Like SSTable 数据结构，这个数据结构叫 Ressi，大家去看 2018 年 《Spanner: Becoming a SQL System》这篇 Paper 就能看到。它其实表面上看还是行存，但内部也是一个 Chunk 变成列存这样的一个结构。但我们觉得即使是换一个新的数据结构，也没有办法很好做隔离，因为毕竟还是在一台机器上，在同一个物理资源上。最彻底的隔离是物理隔离。\n\n\n![图 14 TiFlash 架构](https://img1.www.pingcap.com/prod/14_3a6678ea75.png)\n\n<div class=\"caption-center\">图 14 TiFlash 架构</div>\n\n我们在 TiFlash 用了好几种技术来去保证数据是更新的。一是增加了 Raft Leaner，二是我们把 TiDB 的 MVCC 也实现在了 TiFlash 的内部。第三在 TiFlash 这边接触了更新（的过程），在 TiFlash 内部还有一个小的 Memstore，来处理更新的热数据结果，最后查询的时候，是列存跟内存里的行存去 merge 并得到最终的结果。**TiFlash 的核心思想就是通过 Raft 的副本来做物理隔离**。\n\n这个有什么好处呢？这是我们今天给出的答案，但是背后的思考，到底是什么原因呢？为什么我们不能直接去同步一个 binlog 到另外一个 dedicate 的新集群上（比如 TiFlash 集群），而一定要走 Raft log？**最核心的原因是，我们认为 Raft log 的同步可以水平扩展的**。因为 TiDB 内部是 Mult-Raft 架构，Raft log 是发生在每一个 TiKV 节点的同步上。大家想象一下，如果中间是通过 Kafka 沟通两边的存储引擎，那么实时的同步会受制于中间管道的吞吐。比如图 14 中绿色部分一直在更新，另一边并发写入每秒两百万，但是中间的 Kafka 集群可能只能承载 100 万的写入，那么就会导致中间的 log 堆积，而且下游的消费也是不可控的。**而通过 Raft 同步， Throughput 可以根据实际存储节点的集群大小，能够线性增长。这是一个特别核心的好处**。\n\n## 4. SIMD\n\n说完了存储层，接下来说一说执行器。TiDB 在接下来会做一个很重要的工作，就是全面地 leverage  SIMD 的计算。我先简单科普一下 SIMD 是什么。\n\n![图 15 SIMD 原理举例（1/2）](https://img1.www.pingcap.com/prod/15_a9c2923399.png)\n\n\n<div class=\"caption-center\">图 15 SIMD 原理举例（1/2）</div>\n\n如图 15，在做一些聚合的时候，有这样一个函数，我要去做一个求和。正常人写程序，他就是一个 for 循环，做累加。但是在一个数据库里面，如果有一百亿条数据做聚合，每一次执行这条操作的时候，CPU 的这个指令是一次一次的执行，数据量特别大或者扫描的行数特别多的时候，就会很明显的感受到这个差别。\n\n![图 16 SIMD 原理举例（2/2）](https://img1.www.pingcap.com/prod/16_d4beb7c7a4.png)\n\n<div class=\"caption-center\">图 16 SIMD 原理举例（2/2）</div>\n\n现代的 CPU 会支持一些批量的指令，比如像 _mm_add_epi32，可以一次通过一个32 位字长对齐的命令，批量的操作 4 个累加。看上去只是省了几个 CPU 的指令，但如果是在一个大数据量的情况下，基本上能得到 4 倍速度的提升。\n\n**顺便说一句，有一个很大的趋势是 I/O 已经不是瓶颈了**，大家一定要记住我这句话。再过几年，如果想去买一块机械磁盘，除了在那种冷备的业务场景以外，我相信大家可能都要去定制一块机械磁盘了。未来一定 I/O 不会是瓶颈，那瓶颈会是什么？CPU。**我们怎么去用新的硬件，去尽可能的把计算效率提升，这个才是未来我觉得数据库发展的重点**。比如说我怎么在数据库里 leverage GPU 的计算能力，因为如果 GPU 用的好，其实可以很大程度上减少计算的开销。所以，如果在单机 I/O 这些都不是问题的话，下一个最大问题就是怎么做好分布式，这也是为什么我们一开始就选择了一条看上去更加困难的路：我要去做一个 Share-nothing 的数据库，并不是像 Aurora 底下共享一个存储。\n\n## 5. Dynamic Data placement\n\n\n![图 17 Dynamic Data placement (1/2)分库分表方案与 TiDB 对比](https://img1.www.pingcap.com/prod/17_76bbd98da0.png)\n\n<div class=\"caption-center\">图 17 Dynamic Data placement (1/2)分库分表方案与 TiDB 对比</div>\n\n在今天大家其实看不到未来十年数据增长是怎样的，回想十年前大家能想到现在我们的数据量有这么大吗？不可能的。所以新的架构或者新的数据库，一定要去面向我们未知的 Scale 做设计。比如大家想象现在有业务 100T 的数据，目前看可能还挺大的，但是有没有办法设计一套方案去解决 1P、2P 这样数据量的架构？**在海量的数据量下，怎么把数据很灵活的分片是一个很大的学问**。\n\n为什么分库分表在对比 TiDB 的时候，我们会觉得分库分表是上一代的方案。这个也很好理解，核心的原因是分库分表的 Router 是静态的。如果出现分片不均衡，比如业务可能按照 User ID 分表，但是发现某一地方/某一部分的 User ID 特别多，导致数据不均衡了，这时 TiDB 的架构有什么优势呢？就是 TiDB 彻底把分片这个事情，从数据库里隔离了出来，放到了另外一个模块里。**分片应该是根据业务的负载、根据数据的实时运行状态，来决定这个数据应该放在哪儿。这是传统的静态分片不能相比的，不管传统的用一致性哈希，还是用最简单的对机器数取模的方式去分片（都是不能比的）**。\n\n在这个架构下，甚至未来我们还能让 AI 来帮忙。把分片操作放到 PD 里面，它就像一个 DBA 一样，甚至预测 Workload 给出数据分布操作。比如课程报名数据库系统，系统发现可能明天会是报名高峰，就事先把数据给切分好，放到更好的机器上。这在传统方案下是都需要人肉操作，其实这些事情都应该是自动化的。\n\n![图 18 Dynamic Data placement (2/2)](https://img1.www.pingcap.com/prod/18_97e772ea09.png)\n\n<div class=\"caption-center\">图 18 Dynamic Data placement (2/2)</div>\n\n**Dynamic Data placement 好处首先是让事情变得更 flexible ，对业务能实时感知和响应**。另外还有一点，为什么我们有了 Dynamic Placement 的策略，还要去做 Table Partition（[今天上午申砾也提到了](https://zhuanlan.zhihu.com/p/57749943)）？Table Partition 在背后实现其实挺简单的。相当于业务这边已经告诉我们数据应该怎么分片比较好，我们还可以做更多针对性的优化。这个 Partition 指的是逻辑上的 Partition ，是可能根据你的业务相关的，比如说我这张表，就是存着 2018 年的数据，虽然我在底下还是 TiDB 这边，通过 PD 去调度，但是我知道你 Drop 这个 Table 的时候，一定是 Drop 这些数据，所以这样会更好，而且更加符合用户的直觉。\n\n但这样架构仍然有比较大的挑战。当然这个挑战在静态分片的模型上也都会有。比如说围绕着这个问题，我们一直在去尝试解决怎么更快的发现数据的热点，比如说我们的调度器，如果最好能做到，比如突然来个秒杀业务，我们马上就发现了，就赶紧把这块数据挪到好的机器上，或者把这块数据赶紧添加副本，再或者把它放到内存的存储引擎里。这个事情应该是由数据库本身去做的。所以为什么我们这么期待 AI 技术能够帮我们，是因为虽然在 TiDB 内部，用了很多规则和方法来去做这个事情，但我们不是万能的。\n\n## 6. Storage and Computing Seperation\n\n![图 19 存储计算分离](https://img1.www.pingcap.com/prod/19_d5daecfd66.png)\n\n<div class=\"caption-center\">图 19 存储计算分离</div>\n\n还有大的趋势是存储计算分离。我觉得现在业界有一个特别大的问题，就是把存储计算分离给固化成了某一个架构的特定一个指代，比如说只有长的像 Aurora 那样的架构才是存储计算分离。那么 TiDB 算存储计算分离吗？我觉得其实算。**或者说存储计算分离本质上带来的好处是什么？就是我们的存储依赖的物理资源，跟计算所依赖的物理资源并不一样。这点其实很重要**。就用 TiDB 来举例子，比如计算可能需要很多 CPU，需要很多内存来去做聚合，存储节点可能需要很多的磁盘和 I/O，如果全都放在一个组件里 ，调度器就会很难受：我到底要把这个节点作为存储节点还是计算节点？其实在这块，可以让调度器根据不同的机型（来做决定），是计算型机型就放计算节点，是存储型机型就放存储节点。\n\n## 7. Everything is Pluggable\n\n![图 20 Everything is Pluggable](https://img1.www.pingcap.com/prod/20_7826e8c76c.png)\n\n<div class=\"caption-center\">图 20 Everything is Pluggable</div>\n\n今天由于时间关系没有给大家演示的**插件平台**。未来 TiDB 会变成一个更加灵活的框架，像图 20 中 TiFlash 是一个 local storage，我们其实也在秘密研发一个新的存储的项目叫 Unitstore，可能明年的 DevCon 就能看到它的 Demo 了。在计算方面，每一层我们未来都会去对外暴露一个非常抽象的接口，能够去 leverage 不同的系统的好处。今年我其实很喜欢的一篇 Paper 是 [F1 Query](https://mp.weixin.qq.com/s/PrX0yhGkoPzQUZFQ2EkIbw) 这篇论文，基本表述了我对一个大规模的分布式系统的期待，架构的切分非常漂亮。\n\n## 8. Distributed Transaction\n\n![图 21 Distributed Transaction（1/2）](https://img1.www.pingcap.com/prod/21_3326a0f4be.png)\n\n<div class=\"caption-center\">图 21 Distributed Transaction（1/2）</div>\n\n说到分布式事务，我也分享一下我的观点。**目前看上去，ACID 事务肯定是必要的**。我们仍然还没有太多更好的办法，除了 Google 在这块用了原子钟，Truetime 非常牛，我们也在研究各种新型的时钟的技术，但是要把它推广到整个开源社区也不太可能。当然，时间戳，不管是用硬件还是软件分配，仍然是我们现在能拥有最好的东西， 因为如果要摆脱中心事务管理器，时间戳还是很重要的。**所以在这方面的挑战就会变成：怎么去减少两阶段提交带来的网络的 round-trips？或者如果有一个时钟的 PD 服务，怎么能尽可能的少去拿时间戳？**\n\n![图 22 Distributed Transaction（2/2）](https://img1.www.pingcap.com/prod/22_b4db0e66e9.png)\n\n<div class=\"caption-center\">图 22 Distributed Transaction（2/2）</div>\n\n我们在这方面的理论上有一些突破，我们把 Percolator 模型做了一些优化，能够在数学上证明，可以少拿一次时钟。虽然我们目前还没有在 TiDB 里去实现，但是我们已经把数学证明的过程已经开源出来了，我们用了 [TLA+ 这个数学工具去做了证明](https://github.com/pingcap/tla-plus/blob/master/OptimizedCommitTS/OptimizedCommitTS.tla)。此外在 PD 方面，我们也在思考是不是所有的事务都必须跑到 PD 去拿时间戳？其实也不一定，我们在这上面也已有一些想法和探索，但是现在还没有成型，这个不剧透了。另外我觉得还有一个非常重要的东西，就是 Follower Read。很多场景读多写少，读的业务压力很多时候是要比写大很多的，Follower Read 能够帮我们线性扩展读的性能，而且在我们的模型上，因为没有时间戳 ，所以能够在一些特定情况下保证不会去牺牲一致性。\n\n## 9. Cloud-Native Architecture\n\n![图 23 Cloud-Native](https://img1.www.pingcap.com/prod/23_036759d45b.png)\n\n<div class=\"caption-center\">图 23 Cloud-Native</div>\n\n另外一点就是 Cloud-Native。刚刚中午有一个社区小伙伴问我，你们为什么不把多租户做在 TiDB 的系统内部？**我想说「数据库就是数据库」，它并不是一个操作系统，不是一个容器管理平台。我们更喜欢模块和结构化更清晰的一个做事方式。**而且 Kubernetes 在这块已经做的足够好了 ，我相信未来 K8s 会变成集群的新操作系统，会变成一个 Linux。比如说如果你单机时代做一个数据库，你会在你的数据库里面内置一个操作系统吗？肯定不会。所以这个模块抽象的边界，在这块我还是比较相信 K8s 的。《Large-scale cluster management at Google with Borg》这篇论文里面提到了一句话，BigTable 其实也跑在 Borg 上。\n\n![图 24 TiDB 社区小伙伴的愿望列表](https://img1.www.pingcap.com/prod/24_fcd4a21cfa.png)\n\n<div class=\"caption-center\">图 24 TiDB 社区小伙伴的愿望列表</div>\n\n当然最后，大家听完这一堆东西以后，回头看我们社区小伙伴们的愿望列表（图 24），就会发现对一下 TiDB 好像还都能对得上 :D \n\n谢谢大家。\n\n>1 月 19 日 TiDB DevCon 2019 在北京圆满落幕，超过 750 位热情的社区伙伴参加了此次大会。会上我们首次全面展示了全新存储引擎 Titan、新生态工具 TiFlash 以及 TiDB 在云上的进展，同时宣布 TiDB-Lightning Toolset & TiDB-DM 两大生态工具开源，并分享了  TiDB 3.0 的特性与未来规划，描述了我们眼中未来数据库的模样。此外，更有 11 位来自一线的 TiDB 用户为大家分享了实践经验与踩过的「坑」。同时，我们也为新晋 TiDB Committer 授予了证书，并为 2018 年最佳社区贡献个人、最佳社区贡献团队颁发了荣誉奖杯。","date":"2019-03-05","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"the-near-future-of-database","file":null,"relatedBlogs":[]},{"id":"Blogs_260","title":"十问 TiDB ：关于架构设计的一些思考","tags":["TiDB","架构"],"category":{"name":"观点洞察"},"summary":"这篇文章是关于 TiDB 代表性“为什么”的 TOP 10，希望大家在了解了我们这些背后的选择之后，能更加纯熟的使用 TiDB，让它在适合的环境里更好的发挥价值。","body":">“我希望能够把 TiDB 的设计的一些理念能够更好的传达给大家，相信大家理解了背后原因后，就能够把 TiDB 用的更好。”\n\n\n做 TiDB 的缘起是从思考一个问题开始的：为什么在数据库领域有这么多永远也躲不开的坑？从 2015 年我们写下第一行代码，3 年以来我们迎面遇到无数个问题，一边思考一边做，尽量用最小的代价来快速奔跑。\n\n作为一个开源项目，TiDB 是我们基础架构工程师和社区一起努力的结果，TiDB 已经发版到 2.0，有了一个比较稳定的形态，大量在生产环境使用的伙伴们。可以负责任的说，我们做的任何决定都经过了非常慎重的思考和实践，是经过内部和社区一起论证产生的结果。它未必是最好的，但是在这个阶段应该是最适合我们的，而且大家也可以看到 TiDB 在快速迭代进化。\n\n**这篇文章是关于 TiDB 代表性“为什么”的 TOP 10，希望大家在了解了我们这些背后的选择之后，能更加纯熟的使用 TiDB，让它在适合的环境里更好的发挥价值。**\n\n这个世界有很多人，感觉大于思想，疑问多于答案。感恩大家保持疑问，我们承诺回馈我们的思考过程，毕竟有时候很多思考也很有意思。\n\n## 一、为什么分布式系统并不是银弹\n\n其实并没有什么技术是完美和包治百病的，在存储领域更是如此，如果你的数据能够在一个 MySQL 装下并且服务器的压力不大，或者对复杂查询性能要求不高，其实分布式数据库并不是一个特别好的选择。 选用分布式的架构就意味着引入额外的维护成本，而且这个成本对于特别小的业务来说是不太划算的，即使你说需要高可用的能力，那 MySQL 的主从复制 + GTID 的方案可能也基本够用，这不够的话，还有最近引入的 Group Replication。而且 MySQL 的社区足够庞大，你能 Google 找到几乎一切常见问题的答案。 \n\n**我们做 TiDB 的初衷并不是想要在小数据量下取代 MySQL，而是尝试去解决基于单机数据库解决不了的一些本质的问题。**\n\n有很多朋友问我选择分布式数据库的一个比较合适的时机是什么？我觉得对于每个公司或者每个业务都不太一样，我并不希望一刀切的给个普适的标准（也可能这个标准并不存在），但是有一些事件开始出现的时候：比如是当你发现你的数据库已经到了你每天开始绞尽脑汁思考数据备份迁移扩容，开始隔三差五的想着优化存储空间和复杂的慢查询，或者你开始不自觉的调研数据库中间件方案时，或者人肉在代码里面做 sharding 的时候，这时给自己提个醒，看看 TiDB 是否能够帮助你，我相信大多数时候应该是可以的。 \n\n而且另一方面，选择 TiDB 和选择 MySQL 并不是一刀切的有你没他的过程，我们为了能让 MySQL 的用户尽可能减小迁移和改造成本，做了大量的工具能让整个数据迁移和灰度上线变得平滑，甚至从 TiDB 无缝的迁移回来，而且有些小数据量的业务你仍然可以继续使用 MySQL。**所以一开始如果你的业务和数据量还小，大胆放心的用 MySQL 吧，MySQL still rocks，TiDB 在未来等你。**\n\n\n## 二、为什么是 MySQL\n\n和上面提到的一样，并不是 MySQL 不好我们要取代他，而是选择兼容 MySQL 的生态对我们来说是最贴近用户实际场景的选择：\n\n1. MySQL 的社区足够大，有着特别良好的群众基础，作为一个新的数据库来说，如果需要用户去学习一套新的语法，同时伴随很重的业务迁移的话，是很不利于新项目冷启动的。 \n\n2. MySQL 那么长时间积累下来大量的测试用例和各种依赖 MySQL 的第三方框架和工具的测试用例是我们一个很重要的测试资源，特别是在早期，你如何证明你的数据库是对的，MySQL 的测试就是我们的一把尺子。 \n\n3. 已经有大量的已有业务正在使用 MySQL，同时也遇到了扩展性的问题，如果放弃这部分有直接痛点的场景和用户，也是不明智的。\n\n另一方面来看，MySQL 自从被 Oracle 收购后，不管是性能还是稳定性这几年都在稳步的提升，甚至在某些场景下，已经开始有替换 Oracle 的能力，从大的发展趋势上来说，是非常健康的，所以跟随着这个健康的社区一起成长，对我们来说也是一个商业上的策略。\n\n## 三、为什么 TiDB 的设计中 SQL 层和存储层是分开的\n\n一个显而易见的原因是对运维的友好性。很多人觉得这个地方稍微有点反直觉，多一个组件不就会增加部署的复杂度吗？\n\n其实在实际生产环境中，运维并不仅仅包含部署。举个例子，如果在 SQL 层发现了一个 BUG 需要紧急的更新，如果所有部件都是耦合在一起的话，你面临的就是一次整个集群的滚动更新，如果分层得当的话，你可能需要的只是更新无状态的 SQL 层，反之亦然。 \n\n另外一个更深层次的原因是成本。存储和 SQL 所依赖的计算资源是不一样的，存储会依赖 IO，而计算对 CPU 以及内存的要求会更高，无需配置 PCIe/NVMe/Optane 等磁盘，而且这两者是不一定对等的，如果全部耦合在一起的话，对于资源调度是不友好的。 对于 TiDB 来说，目标定位是支持 HTAP，即 OLTP 和 OLAP 需要在同一个系统内部完成。显然，不同的 workload 即使对于 SQL 层的物理资源需求也是不一样的，OLAP 请求更多的是吞吐偏好型以及长 query，部分请求会占用大量内存，而 OLTP 面向的是短平快的请求，优化的是延迟和 OPS (operation per second)，在 TiDB 中 SQL 层是无状态的，所以你可以将不同的 workload 定向到不同的物理资源上做到隔离。**还是那句话，对调度器友好，同时调度期的升级也不需要把整个集群全部升级一遍。**\n\n另一方面，底层存储使用 KV 对数据进行抽象，是一个更加灵活的选择。\n\n一个好处是简单。对于 Scale-out 的需求，对 KV 键值对进行分片的难度远小于对带有复杂的表结构的结构化数据，另外，存储层抽象出来后也可以给计算带来新的选择，比如可以对接其他的计算引擎，和 TiDB SQL 层同时平行使用，TiSpark 就是一个很好的例子。 \n\n从开发角度来说，这个拆分带来的灵活度还体现在可以选择不同的编程语言来开发。对于无状态的计算层来说，我们选择了 Go 这样开发效率极高的语言，而对于存储层项目 TiKV 来说，是更贴近系统底层，对于性能更加敏感，所以我们选择了 Rust，如果所有组件都耦合在一起很难进行这样的按需多语言的开发，对于开发团队而言，也可以实现专业的人干专业的事情，存储引擎的开发者和 SQL 优化器的开发者能够并行的开发。 另外对于分布式系统来说，所有的通信几乎都是 RPC，所以更明确的分层是一个很自然的而且代价不大的选择。\n\n## 四、为什么不复用 MySQL 的 SQL 层，而是选择自己重写\n\n这点是我们和很多友商非常不一样的地方。 目前已有的很多方案，例如 Aurora 之类的，都是直接基于 MySQL 的源码，保留 SQL 层，下面替换存储引擎的方式实现扩展，这个方案有几个好处：一是 SQL 层代码直接复用，确实减轻了一开始的开发负担，二是面向用户这端确实能做到 100% 兼容 MySQL 应用。\n\n但是缺点也很明显，MySQL 已经是一个 20 多年的老项目，设计之初也没考虑分布式的场景，整个 SQL 层并不能很好的利用数据分布的特性生成更优的查询计划，虽然替换底层存储的方案使得存储层看上去能 Scale，但是计算层并没有，在一些比较复杂的 Query 上就能看出来。另外，如果需要真正能够大范围水平扩展的分布式事务，依靠 MySQL 原生的事务机制还是不够的。\n\n自己重写整个 SQL 层一开始看上去很困难，但其实只要想清楚，有很多在现代的应用里使用频度很小的语法，例如存储过程什么的，不去支持就好了，至少从 Parser 这层，工作量并不会很大。 同时优化器这边自己写的好处就是能够更好的与底层的存储配合，另外重写可以选择一些更现代的编程语言和工具，使得开发效率也更高，从长远来看，是个更加省事的选择。\n\n## 五、为什么用 RocksDB 和 Etcd Raft\n\n很多工程师都有着一颗造轮子（玩具）的心，我们也是，但是做一个工业级的产品就完全不一样了，目前的环境下，做一个新的数据库，底层的存储数据结构能选的大概就两种：1. B+Tree,  2. LSM-Tree。\n\n但是对于 B+Tree 来说每个写入，都至少要写两次磁盘： 1.  在日志里； 2. 刷新脏页的时候，即使你的写可能就只改动了一个 Byte，这个 Byte 也会放大成一个页的写 （在 MySQL 里默认 InnoDB 的 Page size 是 16K），虽然说 LSM-Tree 也有写放大的问题，但是好处是 LSM-tree 将所有的随机写变成了顺序写（对应的 B+tree 在回刷脏页的时候可能页和页之间并不是连续的）。 另一方面，LSMTree 对压缩更友好，数据存储的格式相比 B+Tree 紧凑得多，Facebook 发表了一些关于 MyRocks 的文章对比在他们的 MySQL 从 InnoDB 切换成 MyRocks （Facebook 基于 RocksDB 的 MySQL 存储引擎）节省了很多的空间。所以 LSM-Tree 是我们的选择。\n\n选择 RocksDB 的出发点是 RocksDB 身后有个庞大且活跃的社区，同时 RocksDB 在 Facebook 已经有了大规模的应用，而且 RocksDB 的接口足够通用，并且相比原始的 LevelDB 暴露了很多参数可以进行针对性的调优。随着对于 RocksDB 理解和使用的不断深入，我们也已经成为 RocksDB 社区最大的使用者和贡献者之一，另外随着 RocksDB 的用户越来越多，这个项目也会变得越来越好，越来越稳定，可以看到在学术界很多基于 LSM-Tree 的改进都是基于 RocksDB 开发的，另外一些硬件厂商，特别是存储设备厂商很多会针对特定存储引擎进行优化，RocksDB 也是他们的首选之一。\n\n反过来，自己开发存储引擎的好处和问题同样明显，一是从开发到产品的周期会很长，而且要保证工业级的稳定性和质量不是一个简单的事情，需要投入大量的人力物力。好处是可以针对自己的 workload 进行定制的设计和优化，由于分布式系统天然的横向扩展性，单机有限的性能提升对比整个集群吞吐其实意义不大，把有限的精力投入到高可用和扩展性上是一个更加经济的选择。 另一方面，RocksDB 作为 LSM-Tree 其实现比工业级的 B+Tree 简单很多（参考对比 InnoDB），从易于掌握和维护方面来说，也是一个更好的选择。 当然，随着我们对存储的理解越来越深刻，发现很多专门针对数据库的优化在 RocksDB 上实现比较困难，这个时候就需要重新设计新的专门的引擎，就像 CPU 也能做图像处理，但远不如 GPU，而 GPU 做机器学习又不如专用的 TPU。\n\n选择 Etcd Raft 的理由也类似。先说说为什么是 Raft，在 TiDB 项目启动的时候，我们其实有过在 MultiPaxos 和 Raft 之间的纠结，后来结论是选择了 Raft。Raft 的算法整体实现起来更加工程化，从论文就能看出来，论文中甚至连 RPC 的结构都描述了出来，是一个对工业实现很友好的算法，而且当时工业界已经有一个经过大量用户考验的开源实现，就是 Etcd。而且 Etcd 更加吸引我们的地方是它对测试的态度，Etcd 将状态机的各个接口都抽象得很好，基本上可以做到与操作系统的 API 分离，极大降低了写单元测试的难度，同时设计了很多 hook 点能够做诸如错误注入等操作，看得出来设计者对于测试的重视程度。\n\n与其自己重新实现一个 Raft，不如借力社区，互相成长。现在我们也是 Etcd 社区的一个活跃的贡献者，一些重大的 Features 例如 Learner 等新特性，都是由我们设计和贡献给 Etcd 的，同时我们还在不断的为 Etcd 修复 Bug。\n\n没有完全复用 Etcd 的主要的原因是我们存储引擎的开发语言使用了 Rust，Etcd 是用 Go 写的，我们需要做的一个工作是将他们的 Raft 用 Rust 语言重写，为了完成这个事情，我们第一步是将 Etcd 的单元测试和集成测试先移植过来了（没错，这个也是选择 Etcd 的一个很重要的原因，有一个测试集作为参照），以免移植过程破坏了正确性。另外一方面，就如同前面所说，和 Etcd 不一样，TiKV 的 Raft 使用的是 Multi-Raft 的模型，同一个集群内会存在海量的互相独立 Raft 组，真正复杂的地方在如何安全和动态的分裂，移动及合并多个 Raft 组，我在我的 [《基于 Raft 构建弹性伸缩的存储系统的一些实践》](https://pingcap.com/blog-cn/building-distributed-db-with-raft/) 这篇文章里面描述了这个过程。\n\n## 六、为什么有这样的硬件配置要求\n\n我们其实对生产环境硬件的要求还是蛮高的，对于存储节点来说，SSD 或者 NVMe 或者 Optane 是刚需，另外对 CPU 及内存的使用要求也很高，同时对大规模的集群，网络也会有一些要求 （详见我们的官方文档推荐配置的 [相关章节](https://pingcap.com/docs-cn/FAQ/)），其中一个很重要的原因是我们底层的选择了 RocksDB 的实现，对于 LSM Tree 来说因为存在写放大的天然特性，对磁盘吞吐需求会相应的更高，尤其是 RocksDB 还有类似并行 Compaction 等特性。 而且大多数机械磁盘的机器配置倾向于一台机器放更大容量的磁盘（相比 SSD），但是相应的内存却一般来说不会更大，例如 24T 的机械磁盘 + 64G 内存，磁盘存储的数据量看起来更大，但是大量的随机读会转化为磁盘的读，这时候，机械磁盘很容易出现 IO 瓶颈，另一方面，对于灾难恢复和数据迁移来说，也是不太友好的。\n\n另外，TiDB 的各个组件目前使用 gRPC 作为 RPC 框架，gRPC 是依赖 [HTTP2](https://developers.google.com/web/fundamentals/performance/http2/) 作为底层协议，相比很多朴素的 RPC 实现，会有一些额外的 CPU 开销。TiKV 内部使用 RocksDB 的方式会伴随大量的 Prefix Scan，这意味着大量的二分查找和字符串比较，这也是和很多传统的离线数据仓库很不一样的 Pattern，这个会是一个 CPU 密集型的操作。在 TiDB 的 SQL 层这端，SQL 是计算密集型的应用这个自然不用说，另外对内存也有一定的需求。由于 TiDB 的 SQL 是一个完整的 SQL 实现，表达力和众多中间件根本不是一个量级，有些算子，比如 Hashjoin，就是会在内存里开辟一块大内存来执行 Join，所以如果你的查询逻辑比较复杂，或者 Join 的一张子表比较大的情况下（偏 OLAP 实时分析业务），对内存的需求也是比较高的，我们并没有像单机数据库的优化器一样，比如 Order by 内存放不下，就退化到磁盘上，我们的哲学是尽可能的使用内存。 如果硬件资源不足，及时的通过拒绝执行和失败通知用户，因为有时候半死不活的系统反而更加可怕。\n\n另外一方面，还有很多用户使用 TiDB 的目的是用于替换线上 OLTP 业务，这类业务对于性能要求是比较高的。 一开始我们并没有在安装阶段严格检查用户的机器配置，结果很多用户在硬件明显没有匹配业务压力的情况下上线，可能一开始没什么问题，但是峰值压力一上来，可能就会造成故障，尽管 TiDB 和 TiKV 对这种情况做了层层的内部限流，但是很多情况也无济于事。 所以我们决定将配置检查作为部署脚本的强制检查，一是减少了很多沟通成本，二是可以让用户在上线时尽可能的减少后顾之忧。\n\n## 七、为什么用 Range-based 的分片策略，而不是 Hash-based\n\nHash-based 的问题是实现有序的 Scan API 会比较困难，我们的目标是实现一个标准的关系型数据库，所以会有大量的顺序扫描的操作，比如 Table Scan，Index Scan 等。用 Hash 分片策略的一个问题就是，可能同一个表的数据是不连续的，一个顺序扫描即使几行都可能会跨越不同的机器，所以这个问题上没得选，只能是 Range 分片。 但是 Range 分片可能会造成一些问题，比如频繁读写小表问题以及单点顺序写入的问题。 在这里首先澄清一下，静态分片在我们这样的系统里面是不存在的，例如传统中间件方案那样简单的将数据分片和物理机一一对应的分片策略会造成：\n\n* 动态添加节点后，需要考虑数据重新分布，这里必然需要做动态的数据迁移；\n\n* 静态分片对于根据 workload 实时调度是不友好的，例如如果数据存在访问热点，系统需要能够快速进行数据迁移以便于将热点分散在不同的物理服务商上。\n\n回到刚才提到的基于 Range 分片的问题，刚才我说过，对于顺序写入热点的问题确实存在，但也不是不可解。对于大压力的顺序写入的场景大多数是日志或者类似的场景，这类场景的典型特点是读写比悬殊（读 << 写），几乎没有 Update 和随机删除，针对这种场景，写入压力其实可以通过 Partition Table 解决，这个已经在 TiDB 的开发路线图里面，今年之内会和大家见面。 \n\n另外还有一个频繁读写小表造成的热点问题。这个原因是，在底层，TiDB 的数据调度的最小单位是 Region，也就是一段段按字节序排序的键值 Key-Value Pairs （默认大小 96M），假设如果一个小表，总大小连 96M 都不到，访问还特别频繁，按照目前的机制，如果不强制的手动 Split，调度系统无论将这块数据调度到什么位置，新的位置都会出现热点，所以这个问题本质上是无解的。因此建议如果有类似的访问 pattern，尽可能的将通用的小表放到 Redis 之类的内存缓存中，或者甚至直接放在业务服务的内存里面（反正小）。  \n\n## 八、为什么性能（延迟）不是唯一的评价标准\n\n很多朋友问过我，TiDB 能替换 Redis 吗？大家对 Redis 和 TiDB 的喜爱之情我也很能理解，但是很遗憾，TiDB 并不是一个缓存服务，它支持跨行强一致事务，在非易失设备上实现持久化存储，而这些都是有代价的。\n\n简单来说，写磁盘的 IO 开销 （WAL，持久化），多副本高可用和保证分布式事务必然会牺牲延迟，更不用说做跨数据中心的同步了，在这点上，我认为如果需要很低延迟的响应速度（亚毫秒级）就需要在业务端做缓存了。TiDB 的定位是给业务提供一个可扩展的 The Source of Truth （真相之源），即使业务层的缓存失效，也有一个地方能够提供强一致的数据，而且业务不用关心容量问题。**另一方面，衡量一个分布式系统更有意义的指标是吞吐，这个观点我在很多文章里已经提到过，提高并发度，如果系统的吞吐能够随着集群机器数量线性提升，而且延迟是稳定的才有意义，而且这样才能有无限的提升空间。** 在实际的环境中，单个 TiDB 集群已经有一些用户使用到了百万级别的 QPS，这个在单机架构上是几乎不可能实现的。另外，这几年硬件的进步速度非常快，特别是 IO 相关的创新，比如 NVMe SSD 的普及，还有刚刚商用的持久化内存等新的存储介质。很多时候我们在软件层面上绞尽脑汁甚至牺牲代码的优雅换来一点点性能提升，很可能换块磁盘就能带来成倍的提升。\n\n**我们公司内部有一句话：Make it right before making it fast。正确性和可靠性的位置是在性能之前的，毕竟在一个不稳定的系统上谈性能是没有意义的。**\n\n\n## 九、为什么弹性伸缩能力如此重要\n\n在业务初期，数据量不大，业务流量和压力不大的时候，基本随便什么数据库都能够搞定，但很多时候业务的爆发性增长可能是没有办法预期的，特别是一些 ToC 端的应用。早期的 Twitter 用户一定对时不时的大鲸鱼（服务不可用）深恶痛绝，近一点还有前两年有一段时间爆红的足记 App，很短的时间之内业务和数据量爆发性增长，数据库几乎是所有这些案例中的核心瓶颈。 很多互联网的 DBA 和年轻的架构师会低估重构业务代码带来的隐形成本，在业务早期快速搞定功能和需求是最重要的。想象一下，业务快速增长，服务器每天都因为数据库过载停止服务的时候，DBA 告诉你没办法，先让你重新去把你的业务全改写成分库分表的形式，在代码里到处加 Sharding key，牺牲一切非 Sharding key 的多维关联查询和相关的跨 Shard 的强一致事务，然后数据复制好多份……这种时候是真正的时间等于金钱，决定这个公司生死存亡的时候不是去写业务和功能代码，而是因为基础设施的限制被迫重构，其实是非常不好的。 如果这个时候，有一个方案，能够让你几乎无成本的，不修改业务代码的时候对数据库吞吐进行线性扩展（无脑加机器其实是最便宜的），最关键的是为了业务的进化争取了时间，我相信这个选择其实一点都不难做。\n\n**其实做 TiDB 的初心正是如此，我们过去见到了太多类似的血和泪，实在不能忍了，分库分表用各种中间件什么的炫技是很简单，但是我们想的是真正解决很多开发者和 DBA 眼前的燃眉之急。**\n\n最近这段时间，有两个用户的例子让我印象很深，也很自豪，一个是 Mobike，一个是转转，前者是 TiDB 的早期用户，他们自己也在数据增长很快的时候就开始使用 TiDB，在快速的发展过程中没有因为数据库的问题掉链子；后者是典型的快速发展的互联网公司，一个 All-in TiDB 的公司，这个早期的技术选型极大的解放了业务开发的生产力，让业务能够更放开手脚去写业务代码，而不是陷入无休止的选择 Sharding key，做读写分离等等和数据库较劲的事情。\n\n为业务开发提供更加灵活便捷和低成本的智能基础存储服务，是我们做 TiDB 的出发点和落脚点，分布式/高可用/方便灵活的编程接口/智能省心，这些大的方向上也符合未来主流的技术发展趋势。对于CEO 、 CTO 和架构师这类的管理者而言，在解决眼前问题的同时，跟随大的技术方向，不给未来多变的业务埋坑，公司尽可能快速发展，这个才是核心要去思考的问题。\n\n## 十、如何根据自己的实际情况参考业内的使用案例\n\nTiDB 是一个通用的数据库，甚至希望比一般的数据库更加通用，TiDB 是很早就尝试融合 OLTP 和 OLAP 的边界的数据库产品，我们是最早将 HTAP 这个概念从实验室和论文里带到现实的产品之一。这类通用基础软件面临的一个问题就是我们在早期其实很难去指导垂直行业的用户把 TiDB 用好，毕竟各自领域都有各自的使用场景和特点，TiDB 的开发团队的背景大部分是互联网行业，所以天然的会对互联网领域的架构和场景更熟悉，但是比如在金融，游戏，电商，传统制造业这些行业里其实我们不是专家，不过现在都已经有很多的行业专家和开发者已经能将 TiDB 在各自领域用得很好。\n\n**我们的 Blog，公众号，官网等平台会作为一个案例分享的中心，欢迎各位正在使用 TiDB 的用户，将你们的思考和使用经验分享给我们，就像现在已有案例背后的许多公司一样，我们会将你们的经验变成一篇篇的用户案例，通过我们的平台分享给其他的正在选型的公司。**","date":"2018-06-19","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"10-questions-tidb-structure","file":null,"relatedBlogs":[]},{"id":"Blogs_59","title":"写在 TiDB 1.0 发布之际 | 预测未来最好的方式就是创造未来","tags":["GA","社区动态"],"category":{"name":"观点洞察"},"summary":"1.0 版本只是个开始，是新的起点，愿我们一路相扶，不负远途。","body":"如果只能用一个词来描述此刻的心情，我想说恍如隔世，这样说多少显得有几分矫情，或许内心还是想在能矫情的时候再矫情一次，毕竟当初做这一切的起因是为了梦想。还记得有人说预测未来最好的方式就是创造未来，以前看到这句话总觉得是废话，如今看到这一切在自己身上变成现实的一刻，感受是如此的真切，敲击键盘的手居然有点颤抖，是的，预测未来最好的方式就是创造未来。\n\n还记得刚开始做的时候，只有很少的几个人相信这个事情可以做，毕竟难度比较高，就像有些户外旅行，只有方向，没有路。从零开始到发布 1.0 版本，历时 2 年 6 个月，终于还是做出来了。这是开源精神的胜利，是真正属于工程师们的荣耀。这个过程我们一直和用户保持沟通和密切协作，从最早纯粹的为 OLTP 场景的设计，到后来迭代为 HTAP 的设计，一共经历了 7 次重构，许多看得见的汗水，看不见的心跳，也许这就是相信相信的力量，总有那么一群人顶着世俗的压力，用自己的信念和力量在改变世界。在这个过程中，质疑的声音变少了，越来越多的人从观望，到为我们鼓舞助威，帮助我们快速成长。特别感谢那些从 beta 版本开始一路相随的用户，没有你们的信任，耐心和参与，就没有今天的 PingCAP。\n\n开心的时刻总是特别想对很多帮助和支持我们的童鞋们说声谢谢，没有你们就没有 PingCAP，特别感谢每一位项目的贡献者。也许你已经知道了，我们专门为你们定制了一面[荣誉墙](http://gaday.pingcap.com/)，那里的色彩记录了你们的每一次贡献，如果你仍在埋头工作，来不及知道，我想请你过去逛逛，不负好时光。\n\n这个世界还是有人相信未来是可以被创造的。感谢开源精神，让我们这样一个信仰创造未来的团队，可以站在未来的入口，因为相信和努力，获得源源不绝的正向的力量。面对未来，让我们可以摒弃对未知的恐惧和对不完美的妥协。\n\n也感谢那些曾经的诋毁和吐槽，让我们不敢懈怠，砥砺前行。\n\n然而 1.0 版本只是个开始，是新的起点，愿我们一路相扶，不负远途。","date":"2017-10-17","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"ga-1.0","file":null,"relatedBlogs":[]},{"id":"Blogs_239","title":"谈谈开源(一)","tags":["OpenSource"],"category":{"name":"观点洞察"},"summary":"很多人的『开源』是一个比较时髦且有情怀的词汇，不少公司也把开源当做 KPI 或者是技术宣传的手段。但是在我们看来，大多数人开源做的并不好，大多数开源项目也没有被很好的维护。比如前一段时间微博上流传关于 Tengine 的讨论，一个优秀的开源项目不止是公布源代码就 OK 了，还需要后续大量的精力去维护，包括制定 RoadMap、开发新功能、和社区交流、推动项目在社区中的使用、对使用者提供一定程度的支持，等等。","body":"> 源码面前，了无秘密\n> ---- 侯捷\n\n### 前言\n很多人的『开源』是一个比较时髦且有情怀的词汇，不少公司也把开源当做 KPI 或者是技术宣传的手段。但是在我们看来，大多数人开源做的并不好，大多数开源项目也没有被很好的维护。比如前一段时间微博上流传关于 Tengine 的讨论，一个优秀的开源项目不止是公布源代码就 OK 了，还需要后续大量的精力去维护，包括制定 RoadMap、开发新功能、和社区交流、推动项目在社区中的使用、对使用者提供一定程度的支持，等等。\n\n目前我们在国内没看到什么特别好的文章讲如何运营一个开源项目，或者是如何做一个顶级的开源项目。TiDB 这个项目从创建到现在已经有两年多，从开发之初我们就坚定地走开源路线，陆续开源了 TiDB、TiKV、PD 这三个核心组件，获得了广泛的关注，项目在 GitHub 的 Trending 上面也多次登上首页。在这两年中，我们在这方面积累了一些经验和教训，这里和大家交流一下我们做开源过程中的一些感受，以及参与开源项目（至少是指 TiDB 相关项目）的正确姿势。\n\n### 什么是开源\n\n> Open-source software (OSS) is computer software with its source code made available with a license in which\n> the copyright holder provides the rights to study, change, and distribute the software to anyone and for any\n> purpose.\n>\n> ---- From [Wikipedia](https://en.wikipedia.org/wiki/Open-source_software)\n\n本文讨论的开源是指开源软件，简而言之，开源就是拥有源代码版权的人，允许其他人在一定许可证所述范围内，访问源代码，并用于一些自己的目的。\n最基本的要求就是其他人可以访问源代码，另外获取代码后能做什么，就需要一个专门的许可证来规范（可以是自己写的，也可以用一个别人写好的）。里面一般会规定诸如对修改代码、新增代码、后续工作是否需要开源以及专利相关的事项。\nOK，我们写一个 `main.py` 里面有一行 `print \"Hello World!\"`，再和某个许可证文件一起扔到 GitHub 上，我们就有一个满足最低要求的开源项目了。\n\n### 为什么要开源\n很多人觉得代码是一个软件公司最宝贵的资产，把这些最宝贵的资产让别人免费获取，对你们有什么好处？如果对手拿走了你们的代码，另起炉灶和你们竞争怎么办？或者是用户直接获取源代码，用于自己的环境中，那你们如何收钱呢？\n对一个技术型公司来说，最宝贵的资产其实是人，对一个开源项目来说，最核心的资产是一个活跃的开源社区以及他人对这个项目的认可。\n我们从这两方面来看一下开源在这两方面的影响。\n\n* Branding\n很明显，开源是一种非常好的 PR、Branding 的手段，大多数大公司做开源也是这个目的，可以以一种成本几乎为零的方式宣传企业名，树立技术型企业形象。一个知名且良好的企业形象，对于各个方面都很有好处。比如国外有一个知名的技术媒体叫 HackNews，我司的产品曾经多次登上其首页，获得了大量的关注。其实那几次都不是我们自己发的帖子，而是其他人关注到我们的产品，自行做的传播。\n\n* 人才获取\n人才招聘最大的难处就是如何鉴别这个人的能力，他是否能干活、是否是靠刷题通过了面试。如何能和这个人工作一段时间，看到他是如何完成日常工作，那么对于这个人的能力了解会更进一步。为了实现这个目的，传统的手段是 Some How 找到和这个人共事过的人，听取他的意见。这样做首先要看运气，有的时候要转几层关系才能找到这样的人，并且不一定得到的是正确、真实的答案。\n但是如果这个人已经给你的项目贡献了一些代码，并且代码质量比较高、贡献过程中和你的沟通很顺畅，那么一方面说明这个人软硬实例都不错，另一方面说明这个人对你做的事情很有兴趣。TiDB 有大量的正式、实习员工都是从 Contributor 中转化来的，以至于我们担心别把所有的人都招进来，社区没了 :) 。\n\n* 社区贡献\n可以这么说，如果没有开源社区，整个互联网都不会是现在这样。想象一下如果没有 Linux、MySQL、GCC、Hadoop、Lucence 这些东西，那么整个互联网的基础技术栈将不复存在（当然，肯定会出现另外一套东西，但是可能不会像开源的这套这么完善）。无数的开源社区贡献者贡献自己的力量，共同维持这样一个互助互利的社区，支撑社会技术进步。\n我们也从开源社区中获得了很多支持，包括大家报的问题、提的建议以及来自全球一百四十多名贡献者提交的代码。随着项目的发展，我相信社区贡献代码的比例会持续提升。\n\n* 提升项目质量\n当一个项目以开源方式运营时，代码质量是项目的脸面，大家无论是在提交代码的时候，还是在 Comment 别人的 PR 的时候，都会非常谨慎，因为你的一举一动全世界都能看到，毕竟谁也不想人前露怯是吧。\n\n* 对基础软件的意义\n对于一个数据库这样的基础软件，最重要的就是正确性、稳定性和性能。前两点尤其重要，要保证这两点，一方面需要在开发和测试过程中尽可能提高质量，另一方面广泛的使用也非常重要。只有当你的产品有足够多的人试用，甚至用于生产环境，才可能有足够多的问题反馈以及产品建议。开发人员能做的测试毕竟是有限的，很多场景、环境或者是业务负载是我们想象不到的。来自实际用户的问题反馈有助于我们提升产品质量，来自用户的建议有利于我们提升产品易用性。只有长期在生产环境中运行过的基础软件的，才算是合格的基础软件的。\n\n所以我们认为开源是基础软件的大趋势，无论是 Hadoop、MySQL、Spark 这样的知名产品，或者是 Linux 基金会、Apache 基金会、CNCF 基金会这样的巨头，都证明了这个观点。国内目前大公司比较热门的开源项目，也都集中在基础软件领域，比如百度的 Brpc、Palo、Tera，以及腾讯的 PaxosStore。\n\n### PingCAP 开源了哪些项目\n这里简单讲一下我们开源的几个 Repo 都是做什么：\n\n* [TiDB](https://github.com/pingcap/tidb)：数据库的 SQL 层\n* [TiKV](https://github.com/pingcap/tikv)：数据库的分布式存储引擎\n* [PD](https://github.com/pingcap/pd)：集群的管理节点\n* [Docs](https://github.com/pingcap/docs)：项目的英文文档\n* [Docs-cn](https://github.com/pingcap/docs-cn)：项目的中文文档\n\n大家可以在 GitHub 上浏览我们的代码，看到我们完整的开发过程。\n\n### 开源模式下的开发流程\nPingCAP 攻城狮小申典型的一天：\n\n8:00 起床，先登录 Slack 看一下昨晚定时跑的测试任务是否结果正常，然后关注一下 Slack 上各种 Channel 以及微信群、邮箱是否有什么重要的消息\n\n9:00 洗漱完+吃完早饭，逗一会可爱的女儿（也可能是被女儿逗），然后去上班\n\n9:30 到达公司，开始干活。\n\n\t* 打开电脑看看 GitHub 上面有什么新的 Issue\n\t* 看看自己的 PR 有没有被别人 Comment，如果有 Comment 的话，尽快解决；如果还没人看的话，at 一下相关的同学，求 Review\n\t* 看看有没有别人的 PR 需要自己 Review，特别是 at 自己的那些 PR\n\t* 带上耳机开始写点代码\n\t* Slack 有人 at  我，赶紧回复一下\n\t* Slack 上我关注的 Channel 中有人在讨论问题，我很感兴趣，加入进去讨论一会\n\t* 同事要做一个新的 Feature，写了设计文档，我点进去看了一遍提了几个 Comment\n\n12:00 肚子可耻的饿了，呼朋唤友去吃饭，路上顺便讨论讨论技术以及八卦\n\n13:00 吃饭归来，看看邮件、Slack、微信留言，处理一下紧急的事情\n\n13:30 小睡一会\n\n14:00 小睡结束，接一杯咖啡，开始下午的工作，键盘敲起来。。。。。\n\n15:30 参与同事的设计评审会议，通过视频会议系统和远程的同事一起讨论设计方案，拍板后开干\n\n16:30 休息一下，然后继续敲代码、Review PR\n\n18:00 大部分同事已经去吃饭了，我准备开车回家吃饭去\n\n20:30 吃完饭，收拾完，没什么事情，打开电脑看一会邮件、Issue、PR\n\n22:30 休息一会，准备洗澡睡觉\n\n### 如何做一个开源项目\n首先你需要根据自己的诉求、商业模式等选择一个开源协议，常见的有 GPL 、BSD、Apache 和 Mit ，这些开源协议的区别在阮一峰老师的 [如何选择开源许可证？](http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html) 这篇博客中解释的很清楚了，推荐大家阅读。\n\n协议选定之后，再选择一个代码托管平台，目前的标准选择是 GitHub，注册一个 GitHub 账号，申请一个 Orgnization 之后，就可以开始用了，如果不需要私有 Repo 的话，那么不需要交任何费用。\n\n开始代码开发，提交第一次 Commit，完成 Readme 的撰写（一个好的 Readme 真的很重要）。\n\n后续的开发都需要通过 Pull Request 进行，最好不要直接 Push Master。一个严肃的项目需要把 Master 加入 Protected Branch，禁止直接 Push。\n\n为了保证后续的代码提交都是 Work 的，最好在 GitHub 中集成至少一个 CI 服务，常用的有 TravisCI、CircleCI （最近一段时间 CircelCI 似乎总是出问题）。然后在 PR 的设置页面上要求 PR 通过了 CI 才能合并。\n\n如果有人试用项目时发现一些问题，会通过 Issue 反馈，所以需要关注 Issue ，尽快给予回复。另外将 Issue 通过 Label 分门别类是一个好的实践，便于大家快速搜索、分类 Issue。比如我们会将一部分简单些的 Issue 标记为 Help Wanted，如果有新加入社区的同学想要开始贡献代码，那么这些 Issue 就是不错的起点。\n\n当参与的人越来越多，那么会有一部分人开始贡献代码，Maintainer 需要 Review 其他人的 PR，保证能项目自身的代码质量要求、编码风格一致。\n\n最后一点，一个好的项目需要配备完善的文档，帮助大家使用项目。包括架构、简要介绍、详细介绍、FAQ、使用范例、接口文档、安装部署以及最佳实践等等。这点也是大多数项目所忽略的。\n\n### 如何参与开源项目\n\n#### 试用\n最简单的参与方式是试用开源项目，这也是开源最大的一个好处，所有人都可以随时试用，相当于有很多人帮助项目作者做测试。毕竟如果只有作者自己做测试，遇到的环境、场景、应用方式会比较单一，总有一些你想像不到的地方会出问题。所以每一个测试出来的问题都很宝贵，我们都会尽可能快的评估和回复。\n\n#### 报 Issue\n试用过程中大家可能会遇到各种问题，特别是文档中没有提及的问题，反馈问题的最佳方式是在 GitHub 上新建 Issue，这样所有的人都可以看到，而且通过 Issue 来反馈我们也会更重视一些，有人会定期扫一遍未处理的 Issue。当然，建立 Issue 之前先搜索是否和已有的 Issue 重复是个好习惯。\n\n在 Issue 中尽可能详细的描述清楚遇到的问题，以及一个可操作的复现步骤，包括所用 Binary 的版本、部署方式、客户端以及服务的日志、操作系统的日志（如 dmesg 的输出）。如果不能复现，也尽可能详细地提供 Log。这些对开发人员追踪 Bug 会非常有用。\n\n#### 提出建议\n如果对项目有什么建议，也可以通过新建 Issue 来反馈， 我们一般会给出是否会支持，如果要支持的话，大概会在什么时候支持。\n\n#### 提 PR\n当你使用 TiDB 遇到问题或者需要新的 Feature，而觉得自己有能力 Fix 或者是当前官方还没有精力 Fix 时，可以尝试自己修改代码，解决问题。\n\n目前 TiDB 项目的 Contributor 有 140 多个，分散在全球十几个国家。其中不乏深度参与的用户。\n\n如果是小的功能或者是简单的 Bug Fix，可以在相关的 Issue 下面吼一声，让大家知道你在做这个事情即可，这样不会有人做重复的工作。如果做的过程中遇到了什么问题，也可以在相关的 Issue 中和 Maintainer 讨论。\n\n如果要做的是比较大的功能，那么最好先和官方做一轮讨论，然后写一个尽可能详细的 Design，讨论 OK 后，开始开发。\n\n### 讲一点好玩的事情\n在开源项目中总能或多或少的发现奇葩的 [Issue](https://github.com/pingcap/tidb/issues/194)，比如 [这个](https://github.com/pingcap/tidb/issues/194)：\n\n![Issue 1](https://img1.www.pingcap.com/prod/1_360d0ac5bd.jpg)\n\n![Issue 2](https://img1.www.pingcap.com/prod/2_683a96be9c.jpg)\n\n看到这个 Issue 真的是震惊了。","date":"2017-09-25","author":"申砾","fillInMethod":"writeDirectly","customUrl":"talk-about-opensource","file":null,"relatedBlogs":[]},{"id":"Blogs_267","title":"来自 PingCAP CEO 的信：说在 B 轮融资完成之际","tags":["PingCAP"],"category":{"name":"观点洞察"},"summary":"平时技术说得多，今天说点走心的。","body":"平时技术说得多，今天说点走心的。\n\n从决定出来创业到现在，刚好两年多一点，如果把 PingCAP 比喻成一个孩子的话， 刚是过了蹒跚学步的时期，前方有更大更美好的世界等我们去探索。这两年时间，在一片质疑声之中 ，TiDB 还算顽强的从无到有成长了起来。其实这一切的初心也很简单，最开始只不过是几个不愿妥协的分布式系统工程师对心目中'完美'的数据库的探索。很欣喜的看到 TiDB 的日渐成熟，周边工具和社区渐渐壮大，我感到由衷的自豪，在这个过程中，也一次又一次的挑战着技术和各自能力的边界，很庆幸能和自己的产品一起成长。\n\n坚持做正确的事，哪怕这看起来是一条更困难的路。TiDB 从诞生的第一天起便决定开源，虽然更多的是商业上的考量，不过里面也有一点点读书人兼济天下的情怀和对传统 Hacker 精神的贯彻。在我们之前，很多人认为分布式 OLTP 和 OLAP 融合几乎是不可能的事情，也有无数的人，其中不乏亲朋好友，劝我们说在国内做这个事情几乎难于登天，而且没有成功的先例。不过我们还是相信一个朴素道理，有价值的技术一定会有它的舞台，另外，任何事情如果没有尝试就打退堂鼓也不是我们的风格。如果没有成功的先例，那就一起来创造先例，做开创者是我们每个人的梦想。说实话，从技术上来说，这个领域是一个非常前沿的领域，大多数时候我们面前是无人区，也很幸运，目前看来技术上和预想的没有出现大的偏差，整个产品和团队也在稳步的前进。\n\n整个团队也从一开始的 3 个人，到今天 63 个志同道合的伙伴结伴前行，又一次很幸运，能凑齐这么一个具有很强战斗力和国际视野的团队，挑战计算机领域最困难和最前沿的课题之一，前方还有无数个迷人的问题等待着被解决，有时候也只能摸索着前进，不过这正是这个事情有意思的地方。谢谢你们，和你们一同工作，是我的荣幸。\n\n到今天，我们很自豪的宣布，已经有数十家客户将 TiDB 使用在各自的生产环境中解决问题，感谢我们早期的铁杆用户和可爱的社区开发者，是你们让 TiDB 一点点的变得更加稳定成熟，随着社区的不断变大，TiDB 正以惊人的速度正向迭代，这就是开源的力量。\n\n最后，PingCAP 也刚顺利的完成了 1500 万美金的 B 轮融资，感谢这轮的领投方华创资本，以及跟投方经纬中国，云启资本，峰瑞资本，险峰华兴。我们的征途是星辰大海，感谢有你们的一路支持。\n\n刘奇、黄东旭、崔秋\n\nPingCAP\n\n2017-6-13","date":"2017-06-13","author":"刘奇 黄东旭 崔秋","fillInMethod":"writeDirectly","customUrl":"series-B-funding","file":null,"relatedBlogs":[]},{"id":"Blogs_6","title":"演讲实录|黄东旭：Cloud-Native 的分布式数据库架构与实践","tags":["TiDB","k8s"],"category":{"name":"观点洞察"},"summary":"4 月 19 日，我司 CTO 黄东旭同学在全球云计算开源大会上，发表了《Cloud-Native 的分布式数据库架构与实践》主题演讲，以下为演讲实录。","body":"4 月 19 日，我司 CTO 黄东旭同学在全球云计算开源大会上，发表了《Cloud-Native 的分布式数据库架构与实践》主题演讲，以下为演讲实录。\n\n## 实录\n\n![黄东旭](https://img1.www.pingcap.com/prod/1_f6b951fcc1.jpeg)\n\n<div class=\"caption-center\">PingCAP 的联合创始人兼 CTO 黄东旭</div>\n\n大家好，今天我的题目是 Cloud-Native 与分布式数据库的实践。先简单的介绍一下自己，我是 PingCAP 的联合创始人和 CTO，过去一直在做基础软件领域的工程师，基本上做的所有的东西都是开源。在分享之前我想说一下为什么现在各行各业或者整个技术软件社区一直在重复的再造数据库，现在数据库到底怎么了，为什么这么百花齐放？\n\n\n+ 首先随着业务的多种多样，还有不管是传统行业还是互联网行业，业务的迭代速度越来越互联网化，使得整个数据量其实是一直在往上走的；\n\n\n+ 第二就是随着 IOT 的设备还有包括像手机、移动互联网蓬勃的发展，终端其实也不再仅仅是传统的 PC 客户端的数据的接入；\n\n\n+ 第三方面随着现在 AI 或者大数据分析一些模型或者理论上的突破，使得在大数据上进行计算的手段越来越多样，还有在物理上一些硬件的新的带有保护的内存，各种各样新的物理的设备，越来越多的硬件或者物理上的存储成本持续的降低，使得我们的数据库需要要面对更多的挑战。\n\n\n关联数据库理论是上世纪七十年代做出来的东西，现在四十年过去不管是物理的环境还是计算模型都是完全不一样的阶段，还抱着过去这种观念可能并不是一个面向未来的设计。而且今天我的题目是 Cloud-Native，有一个比较大胆的假设，大家在过去三十年的计算平台基本都是在一台 PC 或者一个服务器或者一个手机这样的独立的计算平台，但是未来我觉得一切的服务都应该是分布式的。因为我觉得摩尔定律已经失效了，所以未来的操作系统会是一个大规模分布式的操作系统，在上面跑的任何的进程，任何的服务都应该是分布式的，在这个假设下怎么去做设计，云其实是这个假设最好的载体。怎么在这个假设上去设计面向云的技术软件，其实是最近我一直在思考的一个问题。其实在这个时代包括面向云的软件，对业务开发来说尽量还是不要太多的改变过去的开发习惯。你看最近大数据的发展趋势，从最传统的关系数据库到过去十年相比，整个改变了用户的编程模型，但是改变到底是好的还是不好的，我个人觉得其实并不是太好。最近这两年大家会看到整个学术圈各种各样的论文都在回归，包括 DB 新时代的软件都会把扩展性和分布式放在第一个要素。\n\n\n大家可能听到主题会有点蒙，叫 Cloud-Native，Cloud-Native 是什么？其实很早的过去也不是没有人做过这种分布式系统的尝试，最早是 IBM 提出面向服务的软件架构设计，最近热门的 SOA、Micro Service 把自己的服务拆分成小的服务，到现在谷歌一直对外输出一个观点就是 Cloud-Native，就是未来大家的业务看上去的分布式会变成一个更加透明的概念，就是你怎么让分布式的复杂性消失在云的基础设施后，这是 Cloud-Native 更加关心的事情。\n\n![CNCF 基金会](https://img1.www.pingcap.com/prod/2_4fdd3d912d.png)\n\n<div class=\"caption-center\">CNCF 基金会</div>\n\n这个图是 CNCF 的一个基金会，也是谷歌支持的基金会上扒过来的图。这里面有一个简单的定义，就是 SCALE 作为一等公民，面向 Cloud-Native 的业务必须是弹性伸缩的，不仅能伸也得能缩；第二就是在对于这种 Cloud-Native 业务来说是面向 Micro service 友好；第三就是部署更加的去人工化。\n\n\n最近大家可能也看到很多各种各样容器化的方案，背后代表的意义是什么？就是整个运维和部署脱离人工，大家可以想象过去十几二十年来，一直以来运维的手段是什么样的。我找了一个运维，去买服务器，买服务器装系统，在上面部署业务。但是现在 Cloud-Native 出现变得非常的自动化，就相当于把人的功能变得更低，这是很有意义的，因为理想中的世界或者未来的世界应该怎么样，一个业务可能会有成百上千的物理节点，如果是人工的去做运维和部署是根本不可能做得到的，所以其实构建整个 Cloud-Native 的基础设施的两个条件：第一个就是存储本身的云化；第二就是运维要和部署的方式必须是云化的。\n\n**我就从这两个点说一下我们 TiDB 在上面的一些工作和一些我的思考。**\n\n\n存储本身的云化有几个基本条件，大家过去认为是高可用，主要停留在双活。其实仔细去思考的话，主备的方案是很难保证数据在完全不需要人工的介入情况下数据的一致性可用性的，所以大家会发现最近这几年出来的分布式存储系统的可用性的协议跟复制协议基本都会用类似 Raft/Paxos 基于选取的一致性算法，不会像过去做这种老的复制的方案。\n\n第二就是整个分片的策略，作为分布式系统数据一定是会分片的，数据分片是来做分布式存储唯一的思路，自动分片一定会取代传统的人工分片来去支撑业务。比如传统分片，当你的数据量越来越大，你只能做分库分表或者用中间件，不管你分库分表还是中间件都必须制订自己人工的分辨规则，但是其实在一个真正面向 Cloud 的数据库设计里，任何一种人的介入的东西都是不对的。\n\n第三，接入层的去状态化，因为你需要面对 Cloud-Native 做设计，你的接入层就不能带有状态，你可以相当于是前端的接入层是一层无状态的或者连接到任何一个服务的接入的入口，对你来说应该都是一样的，就是说你不能整个系统因为一个关键组件的损坏或者说磁盘坏掉或者机器的宕机，整个系统就不能服务了，整个测试系统应该具有自我愈合和自我维护的能力。\n其实我本身是架构师，所以整个我们数据库的设计都是围绕这些点来做思考的，就是一个数据库怎么能让他自我的生长，自我的维护，哪怕出现任何的灾难性的物理故障（有物理故障是非常正常的，每天在一个比较大的集群的规模下，网络中断、磁盘损坏甚至是很多很诡异的问题都是很正常的），所以怎么设计这种数据库。\n\n我们的项目是 TiDB，我不知道在座的有没有听说过这个项目，它其实是一个开源实现。当你的业务已经用了数据库，数据量一大就有可能遇到一些问题，一个是单点的可靠性的问题，还有一个数据容量怎么去弹性伸缩的问题。TiDB 就能解决这个问题，它本身对外暴露了一个接口，你可以用客户端去连接，你可以认为你下面面对的是一个弹性动态伸缩完全没有容量限制，同时还可以在上面支持复杂的子查询的东西。底层存储的话，相当于这一层无状态的会把这个请求发到底层的节点上，这个存储里面的数据都是通过协议做高可用和复制的，这个数据在底层会不停的分裂和移动，你可以认为这个数据库是一个活的数据库，你任何一个节点的宕机都不会影响整个数据库对业务层的使用，包括你可以跨数据中心部署，甚至你在跨数据中心的时候，整个数据中心网络被切断，机房着火，业务层都几乎完全是透明的，而且这个数据比如副本丢失会自己去修复，自己去管理或者移动数据。\n\n![集群](https://img1.www.pingcap.com/prod/3_1156189922.png)\n\n<div class=\"caption-center\">集群</div>\n\n上图右边是一个集群的调度模块，你可以认为它是整个集群的大脑，是一个 7×24 小时不眠的 DBA，你任何的业务可以接上来。NewSQL 这个词大家听的都烂了，但是我还是想提，首先它是一个面向扩展的数据库，同时它还结合的传统管理数据库的强一致事务，必须得是 SSI 隔离级别的，并不是非常弱根本没法用的隔离级别，而是需要提供最强一致性的隔离级别的数据库。扩展性其实是通过在 TiKV 层面做完全自动分片，可用性是通过 Raft 为保证，我们整个数据库没有主从的概念，每一个节点既可以是主又可以是从，然后整个数据复制通过 Raft 为保证，对外的是一个强一致性的事务层，其实背后的算法是用两阶段提交的算法，比如一个最简单的例子，我一百个并发过来很快，每个平均十毫秒访问数据，一百个并发，一百万个并发，你还能保证每一个请求都是十毫秒返回数据吗？那我可以简单的通过添加机器把系统的吞吐加上去，每一个吞吐的响应延迟会更大一些，在论文里提到过，谷歌数据库写的每一个平均延迟是 150 到 100 毫秒，可以做到线性扩展。所以终于有一个数据库可以 scable。刚才说的是存储层面的云化，刚才提到了 Cloud-Native 还有一个重要的点就是部署和运维方式的云化，我们其实选的这个 Kubernetes 就是用来承载背后数据库大规模集群上的部署，其实大家都知道这个是什么东西，这是最出名的开源项目之一，谷歌开源的，大家也知道 borg，就是他们用了这么多年的集群调度服务，主要做的事情就是服务的编排、部署、自动化的运维，一台物理机挂掉了，他会很好的让这个业务不中断，像集群调度器，它就是整个数据中心的操作系统，但是面临最大的问题就是所有的业务一旦是有状态的，那你这个就非常恶心。举个案例，比如我在跑一个数据库，如果你这台物理机宕机，按照 Kubernetes 会开一个服务器在那边展开，但是这一台老的宕机服务器数据是存在上面的，你不能只是把进程在新的服务器那启起来而数据不带过去，相当于这种业务是带状态的，这在 Kubernetes 过去是一个老大难的问题，其实整个应用层，因为它的特性被分成了四个大的阵营，如果想上可以看一下自己的业务到底属于哪一个阵营。\n\n第一个就是完全无状态的业务，比如这是一个简单的 CRUD 业务层的逻辑，其实是无状态的应用层。第二种就是单点的带状态的 applications，还有任何单机的数据库其实都有属于 applications。第三个就是 Static distributed，比如高可用的分布式服务，大家也不会做扩容什么的，这种是静态的分布式应用。还有最难的一个问题，就是这种集群型的 applications，clustered 是没有办法很好的调度服务的。这是刚才说的，其实对于 Single point，其实是很好解决的，对于静态的其实也是用 Static distributed 来解决带状态的持续化的方案。\n\n刚才我说最难的那个问题，我们整个架构中引入了 Operational，调度一套有状态服务的方案，其实它思路也很简单，就是把运维分布人员系统的领域知识给嵌入到了系统中，Knowledge 发布调度任务之前都会相当于被 CoreOS 提供的接口以后再调度业务，这套方案依赖了 HtirdPartyResources 调度，因为这个里面我的状态我自己才知道，这个时候你需要通过把你的系统领域知识放到 operator 里。很简单，就是 Create 用 TiDB Operator 来实现，还有 Rollingupdate 和 Scale Out 还有 Failover 等。使用 Kubemetes 很重要的原因就是它只用到了很毛的一层 API，内部大量的逻辑是在 Operator 内部，而且像 PV/Statefulset 中并不是一个很好的方案，比如 PV 实现你可以用分布式文件系统或者快存储作为你持久化的这一层，但是数据库的业务，我对我底层的 IO 或者硬件有很强的掌控力的，我在我的业务层自己做了三副本和高可用，我其实就不需要在存储层面上比如我在一个裸盘上跑的性能能比其他上快十倍，这个时候你告诉我不好意思下面只支持 statefulset 那这是不适合跑数据库的，也就是数据库集群是跟它的普通的云盘或者云存储的业务是分开的。\n\n分布式数据库也不是百分之百所有的业务场景都适合，特别是大规模的分布式数据库来说，比如自增 ID，虽然我们支持，但是自增 IT 高压力写入的时候它的压力会集中在表的末尾，其实是我不管怎么调度总会有一块热点，当然你可以先分表，最后我们聚合分析也没有问题，像秒杀或者特别小的表，其实是完全不适合在这种分布式数据库上做的，比较好的一些实践业务的读写比较平均，数据量比较大，同时还有并发的事务的支持，需要有事务的支持，但并不是冲突特别大的场景，并不是秒杀的场景，同时你又可以需要在上面做比较复杂的分析，比如现在我们的一些线上的用户特别好玩，过去它的业务全都是跑在 MySQL 上，一主多从，他发现我一个个 MySQL 成为了信息的孤岛，他并没有办法做聚合地分析，过去传统的方案就是我把 MySQL 或者数据通过一个 ETL 流程导到数据仓库里，但是开发者不会用各种琳琅满目大数据的东西，他只会用 MySQL，一般他做的数据分析都会把 MySQL 倒腾到一个库上再做分析，数据量一大堆分析不出来，这个时候他把所有他自己的 MySQL 总库连到了一个 TiDB上，过去是一主多从，先多主多从，把所有的从都打通，做 MySQL 的分析，所以我觉得 TiDB 打造了新的模型，可以读写高并发的事务，所以未来的数据库会是一个什么样子的，我觉得可能是至少我们觉得沿着这条路走下去应该会有一条新的路，谢谢大家。","date":"2017-04-22","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"talk-cloud-native","file":null,"relatedBlogs":[]},{"id":"Blogs_165","title":"Spanner - CAP, TrueTime and Transaction","tags":["Cloud","Spanner","CAP"],"category":{"name":"观点洞察"},"summary":"最近大家非常关注的一件事情就是 Google Spanner Cloud 的发布，这应该算是 NewSQL 又一个里程碑的事件。在本篇文章中，唐刘同学与大家分享了他自己对 Spanner 的理解，Spanner 的一些关键技术的实现以及与 TiDB 的相关对比。","body":"最近非常关注的一件事情就是 Google Spanner Cloud 的发布，这应该算是 NewSQL 又一个里程碑的事件。NewSQL 的概念应该就是在 12 年 Google Spanner 以及 F1 的论文发表之后，才开始慢慢流行，然后就开始有企业尝试根据 paper 做自己的 NewSQL，譬如国外的 CockroachDB 以及国内我们 PingCAP。\n\nSpanner 的论文在很早就发布了，国内也有很多中文翻译，这里笔者只是想聊聊自己对 Spanner 的理解，以及 Spanner 的一些关键技术的实现，以及跟我们自己的 TiDB 的相关对比。\n\n## CAP\n\n在分布式领域，CAP 是一个完全绕不开的东西，大家应该早就非常熟悉，这里笔者只是简单的再次说明一下：\n\n+ C：一致性，也就是通常说的线性一致性，假设在 T 时刻写入了一个值，那么在 T 之后的读取一定要能读到这个最新的值。\n+ A：完全 100% 的可用性，也就是无论系统发生任何故障，都仍然能对外提供服务。\n+ P：网络分区容忍性。\n\n在分布式环境下面，P 是铁定存在的，也就是只要我们有多台机器，那么网络隔离分区就一定不可避免，所以在设计系统的时候我们就要选择到底是设计的是 AP 系统还是 CP 系统，但实际上，我们只要深入理解下 CAP，就会发现其实有时候系统设计上面没必要这么纠结，主要表现在：\n\n1. 网络分区出现的概率很低，所以我们没必要去刻意去忽略 C 或者 A。多数时候，应该是一个 CA 系统。\n2. CAP 里面的 A 是 100% 的可用性，但实际上，我们只需要提供 high availability，也就是仅仅需要满足 99.99% 或者 99.999% 等几个 9 就可以了。\n\nSpanner 是一个 CP + HA 系统，官方文档说的可用性是优于 5 个 9 ，稍微小于 6 个 9，也就是说，Spanner 在系统出现了大的故障的情况下面，大概 31s+ 的时间就能够恢复对外提供服务，这个时间是非常短暂的，远远比很多外部的系统更加稳定。然后鉴于 Google 强大的自建网络，P 很少发生，所以 Spanner 可以算是一个 CA 系统。\n\nTiDB 在设计的时候也是一个 CP + HA 系统，多数时候也是一个 CA 系统。如果出现了 P，也就是刚好对外服务的 leader 被隔离了，新 leader 大概需要 10s+ 以上的时间才能选举出来对外提供服务。当然，我们现在还不敢说系统的可用性在 6 个 9 了，6 个 9 现在还是我们正在努力的目标。\n\n当然，无论是 Spanner 还是 TiDB，当整个集群真的出现了灾难性的事故，导致大多数节点都出现了问题，整个系统当然不可能服务了，当然这个概率是非常小的，我们可以通过增加更多的副本数来降低这个概率发生。据传在一些关键数据上面，Spanner 都有 7 个副本。\n\n## TrueTime\n\n最开始看到 Spanner 论文的时候，我是直接被 TrueTime 给惊艳到了，这特么的完全就是解决分布式系统时间问题的一个核弹呀（银弹我可不敢说）。\n\n在分布式系统里面，时间到底有多么重要呢？之前笔者也写过一篇文章来聊过[分布式系统的时间](http://www.jianshu.com/p/8500882ab38c)问题，简单来说，我们需要有一套机制来保证相关事务之间的先后顺序，如果事务 T1 在事务 T2 开始之前已经提交，那么 T2 一定能看到 T1 提交的数据。\n\n也就是事务需要有一个递增序列号，后开始的事务一定比前面开始的事务序列号要大。那么这跟时间又有啥关系呢，用一个全局序列号生成器不就行呢，为啥还要这么麻烦的搞一个 TrueTime 出来？笔者觉得有几个原因：\n\n1. 全局序列号生成器是一个典型的单点，即使会做一些 failover 的处理，但它仍然是整个系统的一个瓶颈。同时也避免不了网络开销。但全局序列号的实现非常简单，Google 之前的 Percolator 以及现在 TiDB 都是采用这种方式。\n2. 为什么要用时间？判断两个事件的先后顺序，时间是一个非常直观的度量方式，另外，如果用时间跟事件关联，那么我们就能知道某一个时间点整个系统的 snapshot。在 TiDB 的用户里面，一个非常典型的用法就是在游戏里面确认用户是否谎报因为回档丢失了数据，假设用户说在某个时间点得到某个装备，但后来又没有了，我们就可以直接在那个特定的时间点查询这个用户的数据，从而知道是否真的有问题。\n3. 我们不光可以用时间来确定以前的 snapshot，同样也可以用时间来约定集群会在未来达到某个状态。这个典型的应用就是 schema change。虽然笔者不清楚 Spanner schema change 的实现，但 Google F1 有一篇 [Online, Asynchronous Schema Change in F1](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/41376.pdf) 论文提到了相关的方法，而 TiDB 也是采用的这种实现方式。简单来说，对于一个 schema change，通常都会分几个阶段来完成，如果集群某个节点在未来一个约定的时间没达到这个状态，这个节点就需要自杀下线，防止因为数据不一致损坏数据。\n\n使用 TrueTime，Spanner 可以非常方便的实现笔者提到的用法，但 TrueTime 也并不是万能的：\n\n+ TrueTime 需要依赖 atomic clock 和 GPS，这属于硬件方案，而 Google 并没有论文说明如何构造 TrueTime，对于其他用户的实际并没有太多参考意义。\n+ TrueTime 也会有误差范围，虽然非常的小，在毫秒级别以下，所以我们需要等待一个最大的误差时间，才能确保事务的相关顺序。\n\n## Transaction\n\nSpanner 默认将数据使用 range 的方式切分成不同的 splits，就跟 TiKV 里面 region 的概念比较类似。每一个 Split 都会有多个副本，分布在不同的 node 上面，各个副本之间使用 Paxos 协议保证数据的一致性。\n\nSpanner 对外提供了 read-only transaction 和 read-write transaction 两种事务，这里简单的介绍一下，主要参考 Spanner 的[白皮书](https://cloud.google.com/spanner/docs/whitepapers/LifeCloudSpannerReadWrite.pdf)。\n\n### Single Split Write\n\n假设 client 要插入一行数据 Row 1，这种情况我们知道，这一行数据铁定属于一个 split，spanner 在这里使用了一个优化的 1PC 算法，流程如下：\n\n1. API Layer 首先找到 Row 1 属于哪一个 split，譬如 Split 1。\n2. API Layer 将写入请求发送给 Split 1 的 leader。\n3. Leader 开始一个事务。\n4. Leader 首先尝试对于 Row 1 获取一个 write lock，如果这时候有另外的 read-write transaction 已经对于这行数据上了一个 read lock，那么就会等待直到能获取到 write lock。\n\t+ 这里需要注意的是，假设事务 1 先 lock a，然后 lock b，而事务 2 是先 lock b，在 lock a，这样就会出现 dead lock 的情况。这里 Spanner 采用的是 `wound-wait` 的解决方式，新的事务会等待老的事务的 lock，而老的事务可能会直接 abort 掉新的事务已经占用的 lock。\n5. 当 lock 被成功获取到之后，Leader 就使用 TrueTime 给当前事务绑定一个 timestamp。因为用 TrueTime，我们能够保证这个 timestamp 一定大于之前已经提交的事务 timestamp，也就是我们一定能够读取到之前已经更新的数据。\n6. Leader 将这次事务和对应的 timestamp 复制给 Split 1 其他的副本，当大多数副本成功的将这个相关 Log 保存之后，我们就可以认为该事务已经提交（注意，这里还并没有将这次改动 apply）。\n7. Leader 等待一段时间确保事务的 timestamp 有效（TrueTime 的误差限制），然后告诉 client 事务的结果。这个 `commit wait` 机制能够确保后面的 client 读请求一定能读到这次事务的改动。另外，因为 `commit wait` 在等待的时候，Leader 同时也在处理上面的步骤 6，等待副本的回应，这两个操作是并行的，所以 `commit wait` 开销很小。\n8. Leader 告诉 client 事务已经被提交，同时也可以顺便返回这次事务的 timestamp。\n9. 在 Leader 返回结果给 client 的时候，这次事务的改动也在并行的被 apply 到状态机里面。\n\t+ Leader 将事务的改动 apply 到状态机，并且释放 lock。\n\t\t- Leader 同时通知其他的副本也 apply 事务的改动。\n\t\t- 后续其他的事务需要等到这次事务的改动被 apply 之后，才能读取到数据。对于 read-write 事务，因为要拿 read lock，所以必须等到之前的 write lock 释放。而对于 read-only 事务，则需要比较 read-only 的 timestamp 是不是大于最后已经被成功 apply 的数据的 timestamp。\n\nTiDB 现在并没有使用 1PC 的方式，但不排除未来也针对单个 region 的 read-write 事务，提供 1PC 的支持。\n\n### Multi Split Write\n\n上面介绍了单个 Split 的 write 事务的实现流程，如果一个 read-write 事务要操作多个 Split 了，那么我们就只能使用 2PC 了。\n\n假设一个事务需要在 Split 1 读取数据 Row 1，同时将改动 Row 2，Row 3 分别写到 Split 2，Split 3，流程如下：\n\n1. client 开始一个 read-write 事务。\n2. client 需要读取 Row 1，告诉 API Layer 相关请求。\n3. API Layer 发现 Row 1 在 Split 1。\n4. API Layer 给 Split 1 的 Leader 发送一个 read request。\n5. Split1 的 Leader 尝试将 Row 1 获取一个 read lock。如果这行数据之前有 write lock，则会持续等待。如果之前已经有另一个事务上了一个 read lock，则不会等待。至于 deadlock，仍然采用上面的  `wound-wait` 处理方式。\n6. Leader 获取到 Row 1 的数据并且返回。\n7. . Clients 开始发起一个 commit request，包括 Row 2，Row 3 的改动。所有的跟这个事务关联的 Split 都变成参与者 participants。\n8.  一个 participant 成为协调者 coordinator，譬如这个 case 里面 Row 2 成为 coordinator。Coordinator 的作用是确保事务在所有 participants 上面要不提交成功，要不失败。这些都是在 participants 和 coordinator 各自的 Split Leader 上面完成的。\n9.  Participants 开始获取 lock\n\t+ Split 2 对 Row 2 获取 write lock。\n\t+ Split 3 对 Row 3 获取 write lock。\n\t+ Split 1 确定仍然持有 Row 1 的 read lock。\n\t+ 每个 participant 的 Split Leader 将 lock 复制到其他 Split 副本，这样就能保证即使节点挂了，lock 也仍然能被持有。\n\t+ 如果所有的 participants 告诉 coordinator lock 已经被持有，那么就可以提交事务了。coordinator 会使用这个时候的时间点作为这次事务的提交时间点。\n\t+ 如果某一个 participant  告诉 lock 不能被获取，事务就被取消\n10. 如果所有 participants 和 coordinator 成功的获取了 lock，Coordinator 决定提交这次事务，并使用 TrueTime 获取一个 timestamp。这个 commit 决定，以及 Split 2 自己的 Row 2 的数据，都会复制到 Split 2 的大多数节点上面，复制成功之后，就可以认为这个事务已经被提交。\n11. Coordinator 将结果告诉其他的 participants，各个 participant 的 Leader 自己将改动复制到其他副本上面。\n12. 如果事务已经提交，coordinator 和所有的 participants 就 apply 实际的改动。\n13. Coordinator Leader 返回给 client 说事务已经提交成功，并且返回事务的 timestamp。当然为了保证数据的一致性，需要有 `commit-wait`。\n\n TiDB 也使用的是一个 2PC 方案，采用的是优化的类 Google Percolator 事务模型，没有中心的 coordinator，全部是靠 client 自己去协调调度的。另外，TiDB 也没有实现 `wound-wait`，而是对一个事务需要操作的 key 顺序排序，然后依次上 lock，来避免 deadlock。\n\n### Strong Read\n\n上面说了在一个或者多个 Split 上面 read-write 事务的处理流程，这里在说说 read-only 的事务处理，相比 read-write，read-only 要简单一点，这里以多个 Split 的 Strong read 为例。\n\n假设我们要在 Split 1，Split 2 和 Split 3 上面读取 Row 1，Row 2 和 Row 3。\n\n1. API Layer 发现 Row 1，Row 2，和 Row 3 在 Split1，Split 2 和 Split 3 上面。\n2. API Layer  通过 TrueTime 获取一个 read timestamp（如果我们能够接受 Stale Read 也可以直接选择一个以前的 timestamp 去读）。\n3. API Layer 将读的请求发给 Split 1，Split 2 和 Split 3 的一些副本上面，这里有几种情况：\n\t+ 多数情况下面，各个副本能通过内部状态和 TrueTime 知道自己有最新的数据，直接能提供 read。\n\t+ 如果一个副本不确定是否有最新的数据，就向 Leader 问一下最新提交的事务 timestamp 是啥，然后等到这个事务被 apply 了，就可以提供 read。\n\t+ 如果副本本来就是 Leader，因为 Leader 一定有最新的数据，所以直接提供 read。\n4. 各个副本的结果汇总然会返回给 client。\n\n当然，Spanner 对于 Read 还有一些优化，如果我们要进行 stale read，并且这个 stale 的时间在 10s 之前，那么就可以直接在任何副本上面读取，因为 Leader 会每隔 10s 将最新的 timestamp 更新到其他副本上面。\n\n现在 TiDB 只能支持从 Leader 读取数据，还没有支持 follower read，这个功能已经实现，但还有一些优化需要进行，现阶段并没有发布。\n\nTiDB 在 Leader 上面的读大部分走的是 lease read，也就是只要 Leader 能够确定自己仍然在 lease 有效范围里面，就可以直接读，如果不能确认，我们就会走 Raft 的 ReadIndex 机制，让 Leader 跟其他节点进行 heartbeat 交互，确认自己仍然是 Leader 之后再进行读操作。\n\n## 小结\n\n随着 Spanner Cloud 的发布，我们这边也会持续关注 Spanner  Cloud 的进展，TiDB 的原始模型就是基于 Spanner + F1 搭建起来，随着 Spanner Cloud 更多资料的公布，TiDB 也能有更多的参考。\n\n另外，我们一直相信，我们走在正确的道路上面，如果你对我们的东西感兴趣，欢迎联系我。\n\n+ 邮箱：tl@pingcap.com\n+ 微信：siddontang","date":"2017-02-21","author":"唐刘","fillInMethod":"writeDirectly","customUrl":"Spanner-cap-truetime-transaction","file":null,"relatedBlogs":[]},{"id":"Blogs_88","title":"分布式系统测试那些事儿 - 信心的毁灭与重建","tags":["TiDB","分布式系统测试","测试工具"],"category":{"name":"观点洞察"},"summary":"本话题系列文章整理自 PingCAP Infra Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长，为方便大家阅读，会分为上中下三篇，本文为下篇。","body":"> 本话题系列文章整理自 PingCAP Infra Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长，为方便大家阅读，会分为上中下三篇，本文为下篇。\n\n##### -接中篇-\n\nScyllaDB 有一个开源的东西，是专门用来给文件系统做 Failure Injection 的, 名字叫做 CharybdeFS。如果你想测试你的系统，就是文件系统在哪不断出问题，比如说写磁盘失败了，驱动程序分配内存失败了，文件已经存在等等，它都可以测模拟出来。\n\n**CharybdeFS: A new fault-injecting file system for software testing**\n\nSimulate the following errors:\n\n- disk IO error (EIO)\n- driver out of memory error (ENOMEM)\n- file already exists (EEXIST)\n- disk quota exceeded (EDQUOT)\n\n再来看看 Cloudera，下图是整个 Cloudera 的一个 Failure Injection 的结构。\n\n![Failure Injection](https://img1.www.pingcap.com/prod/1_b550a81caa.png)\n\n一边是 Tools，一边是它的整个的 Level 划分。比如说整个 Cluster， Cluster 上面有很多 Host，Host 上面又跑了各种 Service，整个系统主要用于测试 HDFS， HDFS 也是很努力的在做有效的测试。然后每个机器上部署一个 AgenTEST，就用来注射那些可能出现的错误。\n\n看一下它们作用有多强大。\n\n**Cloudera: Simulate the following errors:**\n\n+ Packets loss/corrupt/reorder/duplicate/delay\n+ Bandwidth limit: Limit the network bandwidth for the specified address and port.\n+ DNSFail: Apply an injection to let the DNS fail.\n+ FLOOD: Starts a DoS attack on the specified port.\n+ BLOCK: Blocks all the packets directed to 10.0.0.0/8 (used internally by EC2).\n+ SIGSTOP: Pause a given process in its current state.\n+ BurnCPU/BurnIO/FillDISK/RONLY/FIllMEM/CorruptHDFS\n+ HANG: Hang a host running a fork bomb.\n+ PANIC: Force a kernel panic.\n+ Suicide: Shut down the machine.\n\n数据包是可以丢的，可以坏的，可以 reorder 的，比如说你发一个 A，再发一个 B，它可以给你 reorder，变成先发了 B 再发了 A，然后看你应用程序有没有正确的处理这种行为。接着发完一次后面再给你重发，然后可以延迟，这个就比较简单。目前这个里面的大部分，TiKV 都有实现，还有带宽的限制，就比如说把你带宽压缩成 1M。以前我们遇到一个问题很有意思，发现有人把文件存到 Redis 里面，但 Redis 是带多个用户共享的，一个用户就能把整个 Redis 带宽给打满了，这样其他人的带宽就很卡，那这种很卡的时候 Redis 可能出现的行为是什么呢？我们并不需要一个用户真的去把它打满，只要用这种工具，瞬间就能出现我把你的带宽限制到原来的 1%，假设别人在跟你抢带宽，你的程序行为是什么？马上就能出来，也不需要配很复杂的环境。这极大的提高了测试效率，同时能测试到很多 corner case。\n\n然后 DNS fail。那 DNS fail 会有什么样的结果？有测过吗？可能都没有想过这个问题，但是在一个真正的分布式系统里面，每一点都是有可能出错的。还有 FLOOD，假设你现在被攻击了，整个系统的行为是什么样的？然后一不小心被这个 IP table 给 block 了，该怎么办。这种情况我们确实出现过。我们一上来并发，两万个连接一打出去，然后发现大部分都连不上，后来一看 IP table 自动启用了一个机制，然后把你们都 block。当然我们后面查了半个小时左右，才把问题查出来。但这种实际上应该是在最开始设计的时候就应该考虑的东西。\n\n如果你的进程被暂停了，比如说大家在云上跑在 VM 里面，整个 VM 为了升级，先把你整个暂停了，升级完之后再把你恢复的时候会怎么样？那简单来讲，就是如果假设你程序是有 GC 的，GC 现在把我们的程序卡了五秒，程序行为是正常的吗？五十秒呢？这个很有意思的就是，BurnCPU，就是再写一个程序，把 CPU 全占了，然后让你这个现在的程序只能使用一小部分的 CPU 的时候，你程序的行为是不是正常的。正常来讲，你可能说我 CPU 不是瓶颈啊，我瓶颈在 IO，当别人跟你抢 CPU，把你这个 CPU 压的很低的时候，到 CPU 是瓶颈的时候，正常你的程序的这个行为是不是正常的？还有 IO，跟你抢读的资源，跟你抢写的资源，然后 filedisk 把磁盘写满，写的空间很少。比如说对数据库而言，你创建你的 redo log 的时候，都已经满了会怎么样？然后我突然把磁盘设为只读，就你突然一个写入会出错，但是你接下来正常的读写行为是不是对的？很典型的一个例子，如果一个数据库你现在写入，磁盘满了，那外面读请求是否就能正常响应。  Fill memory，就是瞬间把这个 memory 给压缩下来，让你下次 malloc 的时候可能分布不到内存。这个就和业务比较相关了，就是破坏 HDFS 的文件。其它的就是 Hang、Panic，然后还有自杀，直接关掉机器，整个系统的行为是什么样的？\n\n现在比较痛苦的一点是大家各自为政，每一家都做一套，但是没有办法做成一个通用的东西给所有的人去用。包括我们自己也做了一套，但是确实没有办法和其他的语言之间去 share，最早提到的那个 libfu 库实际上是在 C 语言写的，那所有 C 相关的都可以去 call 那个库。\n\n**Distributed testing**\n\n+ Namazu\n\t+ ZooKeeper:\n\t\t- Found ZOOKEEPER-2212, ZOOKEEPER-2080 (race): (blog article)\n\t+ Etcd:\n\t\t- Found etcdctl bug #3517 (timing specification), fixed in #3530. The fix also resulted a hint of #3611， Reproduced flaky tests {#4006, #4039}\n\t+ YARN: Found YARN-4301 (fault tolerance)， Reproduced flaky tests{1978, 4168, 4543, 4548, 4556}\n\n然后 Namazu。大家肯定觉得 ZooKeeper 很稳定呀， Facebook 在用、阿里在用、京东在用。大家都觉得这个东西也是很稳定的，直到这个工具出现了，然后轻轻松松就找到 bug 了，所有的大家认为的这种特别稳定的系统，其实 bug 都还挺多的，这是一个毁三观的事情，就是你觉得东西都很稳定，都很 stable，其实不是的。从上面，我们能看到 Namazu 找到的 Etcd 的几个 bug，然后 YARN 的几个 bug，其实还有一些别的。\n\n**How TiKV use namazu**\n\n+ Use nmz container / non-container mode to disturb cluster.\n\t- Run container mode in CI for each commit. (1 hour)\n\t- Run non-container mode for a stable version. (1 week+)\n+ Use `extreme` policy for process inspector\n\t- Pick up some processes and execute them with SCHED_RR scheduler. others are executed with SCHED_BATCH scheduler\n+ Use [0, 30s] delay for filesystem inspector\n\n接下来说一下 TiKV 用 Namazu 的一些经验。因为我们曾经在系统上、在云上面出现过一次写入磁盘花了五十几秒才完成的情况，所以我们需要专门的工具模拟这个磁盘的抖动。有时候一次写入可能确实耗时比较久，那这种时候是不是 OK 的。大家如果能把这种东西统统用上，我觉得还能为很多开源系统找出一堆 bug。\n\n稍微介绍一下我们现在运行的基本策略，比如说我们会用 0 到 30 秒的这个 delay （就是每一次你往文件系统的交互，比如说读或者写，那么我们会给你产生随机的 0 到 30 秒的 delay ），但我们正常应该还是需要去测三十秒到几分钟的延迟的情况，是否会让整个系统崩掉了。\n\n**How TiKV simulate network transport**\n\n+ Drop/Delay messages randomly\n+ Isolate Node\n+ Partition [1, 2, 3, 4, 5] -> [1, 2, 3]  +  [4, 5]\n+ Out of order messages\n+ Filter messages\n+ Duplicate and send redundant messages\n\n怎么模拟网络呢？假设你有网络，里面有五台机器，那我现在想做一个脑裂怎么做？不能靠拔网线对吧？比如在 TiKV 的测试框架中，我们就可以直接通过 API 把 5 个节点脑裂成两部分，让 1, 2, 3 号节点互相联通，4, 5 号节点也能联通，这两个分区彼此是隔离的，非常的方便。其实原理很简单，这种情况是用程序自己去模拟，假如是你发的包，自动给你丢掉，或者直接告诉你 unreachable，那这个时候你就知道这个网络就脑裂了，然后你怎么做？就是只允许特定类型的消息进来，把其他的都丢掉，这样一来你可以保证有些 bug 是必然重现的。这个框架给了我们极大的信心用来模拟并重现各种 corner case，确保这些 corner case 在单元测试中每次都能被覆盖到。\n\n**How to test Rocksdb**\n\n+ Treat storage as a black box.\n+ Three steps(7*24):\n\t- Fill data, Random kill -9\n\t- Restart\n\t- Consistent check.\n+ Results:\n\t- Found 2 bugs. Both fixed\n\n然后说说我们怎么测 RocksDB。 RocksDB 在大家印象中是很稳定的，但我们最近发现了两个 bug。测的方法是这样的：我们往 RocksDB 里面填数据，然后随机的一段时间去把它 kill 掉，kill 掉之后我们重启，重新启动之后去检测我们刚才 fail 的 data 是不是一致的，然后我们发现两个可能造成数据丢失的 bug，但是官方的响应速度非常快，几天就都 fix 了。可是大家普遍运行的是这么 stable 的系统，为什么还会这么容易找到 bug？就说这个测试，如果是一直有这个测试的 cover，那么这两个 bug 可能很快就能够被发现。\n\n这是我们一个基本的，也就是当成一个纯黑盒的测。大家在测数据库的时候，基本也是当黑盒测。比如说 MySQL 写入数据，kill 掉，比如说我 commit 一个事务，数据库告诉我们 commit 成功，我把数据库 kill 掉，我再去查我刚才提交的数据一样能查到。这是一个正常的行为，如果查不到，说明整个系统有问题。\n\n**More tools**\n\n+ american fuzzy lop\n\n![american fuzzy lop](https://img1.www.pingcap.com/prod/2_48114d1965.png)\n\n\n其实还有一些更加先进的工具，大家平时觉得特别稳定的东西，都被摧残的不行。Nginx 、NGPD、tcpdump 、LibreOffice ，如果有用 Linux 的同学可能知道，还有 Flash、sqlite。这个东西一出来，当时大家很兴奋，说怎么一下子找了这么多 bug，为什么以前那么稳定的系统这么不堪一击，会觉得这个东西它还挺智能的。就比如说你程序里面有个 if 分支，它是这样的，假如你程序有一百条指令，它先从前面一直走，走到某条分支指令的时候，它是一直持续探索，一个分支走不下去，它会一直在这儿持续探索，再给你随机的输入，直到我探索进去了，我记下来了下次我知道我用这个输入可以进去特定的分支。那我可以再往下走，比如说你 if 分支进去之后里面还有 if ，那你传统手段可能探测不进去了但它可以，它记录一下，我这个可以进去，然后我重来，反正我继续输入这个，我再往里面走，一旦我探测到一个新的分支，我再记住，我再往里面走。所以它一出来的时候大家都说这个真厉害，一下发现这么多 bug。但最激动的不是这些人，最激动的是黑客，为什么？因为突然有很多栈溢出、堆溢出漏洞被发现了，然后就可以写一堆工具去攻击线上的这么多系统。所以很多的技术的推进在早期的时候是黑客做出来，但是他们的目的当然不一定是为了测试 bug，而是为了怎么黑一个系统进去，这是他们当时做的，所以这个工具也是非常强大、非常有意思的，大家可以拿去研究一下自己的系统。\n\n大家印象里面各种文件系统是很稳定的，可是当用 American fuzzy lop 来测试的时候，被惊呆了。 Btrfs 连 5 秒都没有坚持到就跪了，大家用的最多的 Ext4 是最坚挺的，也才抗了两个小时！！！\n\n![Time to first bug](https://img1.www.pingcap.com/prod/3_cac3b6b973.png)\n\n再来说说 Google，Google 怎么做测试对外讲的不多，最近 Chrome team 开源了他们的 Fuzz 测试工具 OSS-Fuzz，这个工具强大的地方在于自动化做的极好：\n\n+ 发现 bug 后自动创建 issue\n+ bug 解决后自动 verify\n\n更惊人的是 OSS-Fuzz 集群一周可以跑 ~4 trillion test cases 更多细节大家可以看这篇文章：[Announcing OSS-Fuzz: Continuous Fuzzing for Open Source Software](https://opensource.googleblog.com/2016/12/announcing-oss-fuzz-continuous-fuzzing.html)\n\n另外有些工具能让分布式系统开发人员的生活变得更美好一点。\n\n**Tracing tools may help you**\n\n+ Google Dapper\n+ Zipkin\n+ OpenTracing\n\n还有 Tracing，比如说我一个 query 过来，然后经过这么多层，经过这么多机器，然后在不同的地方，不同环节耗时多久，实际上这个在分布式系统里面，有个专门的东西做 Tracing ，就是 distribute tracing tools。它可以用一条线来表达你的请求在各个阶段耗时多长，如果有几段，那么分到几个机器，分别并行的时候好了多长时间。大体的结构是这样的：\n\n![distribute tracing tools](https://img1.www.pingcap.com/prod/4_a854e9e16b.png)\n\n\n这里是一个具体的例子：\n\n![图例](https://img1.www.pingcap.com/prod/5_bd990b46bc.png)\n\n很清晰，一看就知道了，不用去看 log，这事其实一点也不新鲜，Google 十几年前就做了一个分布式追踪的工具。然后开源社区要做一个实现叫做 Zipkin，好像是 java 还是什么写的，又出了新的叫 OpenTracing，是 Go 写的。我们现在正准备上这个系统，用来追踪 TiDB 的请求在各个阶段的响应时间。\n\n最后想说一下，大家研究系统发现 bug 多了之后，不要对系统就丧失了信心，毕竟 bug 一直在那里，只是从前没有发现，现在发现得多了，总体上新的测试方法让系统的质量比以前好了很多。好像有点超时了，先聊到这里吧，还有好多细节没法展开，下次再聊。\n\n##### -本系列完结-\n\n> 相关阅读：  \n[分布式系统测试那些事儿 - 理念](https://pingcap.com/zh/blog/distributed-system-test-1)；  \n> [分布式系统测试那些事儿 - 错误注入](https://pingcap.com/zh/blog/distributed-system-test-2)。","date":"2016-12-07","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"distributed-system-test-3","file":null,"relatedBlogs":[]},{"id":"Blogs_140","title":"分布式系统测试那些事儿 - 错误注入","tags":["TiDB","分布式系统测试"],"category":{"name":"观点洞察"},"summary":"本话题系列文章整理自 PingCAP Infra Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长，为方便大家阅读，会分为上中下三篇，本文为中篇。","body":"> 本话题系列文章整理自 PingCAP Infra Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长，为方便大家阅读，会分为上中下三篇，本文为中篇。\n\n##### -接上篇-\n\n当然测试可能会让你代码变得没有那么漂亮，举个例子：\n\n![图例 1](https://img1.www.pingcap.com/prod/1_7d6f0f14b5.jpg)\n\n这是知名的 Kubernetes 的代码，就是说它有一个 DaemonSetcontroller，这 controller 里面注入了三个测试点，比如这个地方注入了一个 handler ，你可以认为所有的注入都是 interface。比如说你写一个简单的 1+1=2 的程序，假设我们写一个计算器，这个计算器的功能就是求和，那这就很难注入错误。所以你必须要在你正确的代码里面去注入测试逻辑。再比如别人 call 你的这个 add 的 function，然后你是不是有一个 error？这个 error 的问题是它可能永远不会返回一个 error，所以你必须要人肉的注进去，然后看应用程序是不是正确的行为。说完了加法，再说我们做一个除法。除法大家知道可能有处理异常，那上面是不是能正常处理呢？上面没有，上面写着一个比如说 6 ÷ 3，然后写了一个 test，coverage 100%，但是一个除零异常，系统就崩掉了，所以这时候就需要去注入错误。大名鼎鼎的 Kubernetes 为了测试各种异常逻辑也采用类似的方式，这个结构体不算长，大概是十几个成员，然后里面就注入了三个点，可以在里面注入错误。\n\n那么在设计 TiDB 的时候，我们当时是怎么考虑 test 这个事情的？首先一个百万级的 test 不可能由人肉来写，也就是说你如果重新定义一个自己的所谓的 SQL 语法，或者一个 query  language，那这个时候你需要构建百万级的 test，即使全公司去写，写个两年都不够，所以这个事情显然是不靠谱的。但是除非说我的 query language 特别简单，比如像 MongoDB 早期的那种，那我一个“大于多少”的这种，或者 equal 这种条件查询特别简单的，那你确实是不需要构建这种百万级的 test。但是如果做一个 SQL 的 database 的话，那是需要构建这种非常非常复杂的 test 的。这时候这个 test 又不能全公司的人写个两年，对吧？所以有什么好办法呢？MySQL 兼容的各种系统都是可以用来 test 的，所以我们当时兼容 MySQL 协议，那意味着我们能够取得大量的 MySQL test。不知道有没有人统计过 MySQL 有多少个 test，产品级的 test 很吓人的，千万级。然后还有很多 ORM， 支持 MySQL 的各种应用都有自己的测试。大家知道，每个语言都会 build 自己的 ORM，然后甚至是一个语言的 ORM 都有好几个。比如说对于 MySQL 可能有排第一的、排第二的，那我们可以把这些全拿过来用来测试我们的系统。\n\n但对于有些应用程序而言，这时候就比较坑了。就是一个应用程序你得把它 setup 起来，然后操作这个应用程序，比如 WordPress，而后再看那个结果。所以这时候我们为了避免刚才人肉去测试，我们做了一个程序来自动化的 Record---Replay。就是你在首次运行的时候，我们会记录它所有执行的 SQL 语句，那下一次我再需要重新运行这个程序的时候怎么办？我不需要运行这个程序了，我不需要起来了，我只需要把它前面记录的 SQL record 重新回放一遍，就相当于是我模拟了程序的整个行为。所以我们在这部分是这样做的自动化。\n\n那么刚刚说了那么多，实际上做的是什么？实际上做的都是正确路径的测试，那几百万个 test 也都是做的正确的路径测试，但是错误的路径怎么办？很典型的一个例子就是怎么做 Fault injection。硬件比较简单粗暴的模拟网络故障可以拔网线，比如说测网络的时候可以把这个网线拔掉，但是这个做法是极其低效的，而且它是没法 scale 的，因为这个需要人的参与。\n\n然后还有比如说 CPU，这个 CPU 的损坏概率其实也挺高的，特别是对于过保了的机器。然后还有磁盘，磁盘大概是三年百分之八点几的损坏率，这是一篇论文里面给出的数据。我记得 Google 好像之前给过一个数据，就是 CPU、网卡还有磁盘在多少年之内的损坏率大概是什么样的。\n\n还有一个大家不太关注的就是时钟。先前，我们发现系统时钟是有回跳的，然后我们果断在程序里面加个监测模块，一旦系统时钟回跳，我们马上把这个检测出来。当然我们最初监测出这个东西的时候，用户是觉得不可能吧，时钟还会有回跳？我说没关系，先把我们程序开了监测一下，然后过段时间就检测到，系统时钟最近回跳了。所以怎么配 NTP 很重要。然后还有更多的，比如说文件系统，大家有没有考虑过你写磁盘的时候，磁盘出错会怎么办？好，写磁盘的时候没有出错，成功了，然后磁盘一个扇区坏了，读出来的数据是损坏的，怎么办？大家有没有 checksum ？没有 checksum  然后我们直接用了这个数据，然后直接给用户返回了，这个时候可能是很要命的。如果这个数据刚好存的是个元数据，而元数据又指向别的数据，然后你又根据元数据的信息去写入另外一份数据，那就更要命了，可能数据被进一步破坏了。\n\n**所以比较好的做法是什么？**\n\n+ **Fault injection**\n\t- Hardware\n\t\t- disk error\n\t\t- network card\n\t\t- cpu\n\t\t- clock\n\t- Software\n\t\t- file system\n \t\t- network & protocol\n+ **Simulate everything**\n\n**模拟一切东西。**就是磁盘是模拟的，网络是模拟的，那我们可以监控它，你可以在任何时间、任何的场景下去注入各种错误，你可以注入任何你想要的错误。比如说你写一个磁盘，我就告诉你磁盘满了，我告诉你磁盘坏了，然后我可以让你 hang 住，比如 sleep 五十几秒。我们确实在云上面出现过这种情况，就是我们一次写入，然后被 hang 了为 53 秒，最后才写进去，那肯定是网络磁盘，对吧？这种事情其实是很吓人的，但是肯定没有人会想说我一次磁盘写入然后要耗掉 53 秒，但是当 53 秒出现的时候，整个程序的行为是什么？TiDB 里面用了大量的 Raft，所以当时出现一个情况就是 53 秒，然后所有的机器就开始选举了，说这肯定是哪儿不对，重新把 leader 都选出来了，这时候卡 53 秒的哥们说“我写完了”，然后整个系统状态就做了一次全新的迁移。这种错误注入的好处是什么？就是知道当出错的时候，你的错误能严重到什么程度，这个事情很重要，就是 predictable，整个系统要可预测的。如果没有做错误路径的测试，那很简单的一个问题，现在假设走到其中一条错误路径了，整个系统行为是什么？这一点不知道是很吓人的。你不知道是否可能破坏数据；还是业务那边会 block 住；还是业务那边会 retry？\n\n以前我遇到一个问题很有意思，当时我们在做一个消息系统，有大量连接会连这个，一个单机大概是连八十万左右的连接，就是做消息推送。然后我记得，当时的 swap 分区开了，开了是什么概念？当你有更多连接打进来的时候，然后你内存要爆了对吧？内存爆的话会自动启用 swap 分区，但一旦你启用 swap 分区，那你系统就卡成狗了，外面用户断连之后他就失败了，他得重连，但是重连到你正常程序能响应，可能又需要三十秒，然后那个用户肯定觉得超时了，又切断连接又重连，就造成一个什么状态呢？就是系统永远在重试，永远没有一次成功。那这个行为是不是可以预测？这种错误当时有没有做很好的测试？这都是非常重要的一些教训。\n\n硬件测试以前的办法是这样的（Joke）：\n\n![Joke](https://img1.www.pingcap.com/prod/2_50c357ad38.jpg)\n\n假设我一个磁盘坏了，假设我一个机器挂了，还有一个假设它不一定坏了也不一定挂了，比如说它着火了会怎么样？前两个月吧，是瑞士还是哪个地方的一个银行做测试，那哥们也挺逗的，人肉对着服务器这样吹气，来看监控数据那个变化，然后那边马上开始报警。这还只是吹气而已，那如果更复杂的测试，比如说你着火从哪个地方开始烧，先烧到硬盘、或者先烧到网卡，这个结果可能也是不一样的。当然这个成本很高，然后也不是能 scale 的一种方案，同时也很难去复制。\n\n这不仅仅是硬件的监控，也可以认为是做错误的注入。比如说一个集群我现在烧掉一台会怎么样？着火了，很典型的嘛，虽然重要的机房都会有这种防火、防水等各种的策略，但是真的着火的时候怎么办？当然你不能真去烧，这一烧可能就不止坏一台机器了，但我们需要使用 Fault injection 来模拟。\n\n我介绍一下到底什么是 Fault injection。给一个直观的例子，大家知道所有人都用过 Unix 或者 Linux 的系统，大家都知道，很多人习惯打开这个系统第一行命令就是 ls 来列出目录里面的文件，但是大家有没有想过一个有意思的问题，如果你要测试 ls 命令实现的正确性，怎么测？如果没有源代码，这个系统该怎么测？如果把它当成一黑盒这个系统该怎么测？如果你 ls 的时候磁盘出现错误怎么办？如果读取一个扇区读取失败会怎么办？\n\n这个是一个很好玩的工具，推荐大家去玩一下。就是当你还没有做更深入的测试之前，可以先去理解一下到底什么是 Fault injection，你就可以体验到它的强大，一会我们用它来找个 MySQL 的 bug。\n\n**libfiu - Fault injection in userspace**\n\nIt can be used to perform fault injection in the **POSIX API** without having to modify the application's source code, that can help to test failure handling in an easy and reproducible way.\n\n那这个东西主要是用来 Hook 这些 API 的，它很重要的一点就是它提供了一个 library ，这个 library 也可以嵌到你的程序里面去 hook 那些 API。就比如说你去读文件的时候，它可以给你返回这个文件不存在，可以给你返回磁盘错误等等。最重要的是，它是可以重来的。\n\n举一个例子，正常来讲我们敲 ls 命令的时候，肯定是能够把当前的目录显示出来。\n\n![图例 2](https://img1.www.pingcap.com/prod/3_d069497d28.png)\n\n这个程序干的是什么呢？就是 run，指定一个参数，现在是要有一个 enable_random，就是后面所有的对于 IO 下面这些 API 的操作，有 5% 的失败率。那第一次是运气比较好，没有遇到失败，所以我们把整个目录列出来了。然后我们重新再跑一次，这时候它告诉我有一次读取失败了，就是它 read 这个 directory 的时候，遇到一个 Bad file descriptor，这时候可以看到，列出来的文件就比上面的要少了，因为有一条路径让它失败了。接下来，我们进一步再跑，发现刚列出来一个目录，然后下次读取就出错了。然后后面再跑一次的时候，这次运气也比较好，把这整个都列出来了，这个还只是模拟的 5% 的失败率。就是有 5% 的概率你去 read、去 open 的时候会失败，那么这时候可以看到 ls 命令的行为还是很 stable 的，就是没有什么常见的 segment fault 这些。\n\n大家可能会说这个还不太好玩，也就是找找 ls 命令是否有 bug 嘛，那我们复现 MySQL bug 玩一下。\n\n**Bug #76020**\n\n**InnoDB does not report filename in I/O error message for reads**\n\nfiu-run -x -c \"enable_random name=posix/io/*,probability=0.05\" bin/mysqld  --\n\nbasedir=/data/ushastry/server/mysql-5.6.24 --datadir=/data/ushastry/server/mysql-5.6.24/76020 --core-file --socket=/tmp/mysql_ushastry.sock  --port=15000\n\n2015-05-20 19:12:07 31030 [ERROR] InnoDB: Error in system call pread(). The operating system error number is 5.\n\n2015-05-20 19:12:07 7f7986efc720  InnoDB: Operating system error number 5 in a file operation.\n\nInnoDB: Error number 5 means 'Input/output error'.\n\n2015-05-20 19:12:07 31030 [ERROR] InnoDB: File (unknown):\n\n'read' returned OS error 105. Cannot continue operation\n\n这是用 libfiu 找到的 MySQL 的一个 bug，这个 bug 是这样的，bug 编号是 76020，是说 InnoDB 在出错的时候没有报文件名，那用户给你报了错，你这时候就傻了对吧？这个到底是什么地方出错了呢？然后这个地方它怎么出来的？你可以看到它还是用我们刚才提到的 fiu-run，然后来模拟，模拟的失败概率还是这么多，可以看到，我们的参数一个没变，这时把 MySQL 启动，然后跑一下，出现了，可以看到 InnoDB 在报的时候确实没有报 filename ，File : 'read' returned OS error，然后这边是 auto error，你不知道是哪一个文件名。\n\n换一个思路来看，假设没有这个东西，你复现这个 bug 的成本是什么？大家可以想想，如果没有这个东西，这个 bug 应该怎么复现，怎么让 MySQL 读取的东西出错？正常路径下你让它读取出错太困难了，可能好多年没出现过。这时我们进一步再放大一下，这个在 5.7 里面还有，也是在 MySQL 里面很可能有十几年大家都没怎么遇到过的，但这种 bug 在这个工具的辅助下，马上就能出来。所以  Fault injection 它带来了很重要的一个好处就是让一个东西可以变得更加容易重现。这个还是模拟的 5% 的概率。这个例子是我昨天晚上做的，就是我要给大家一个直观的理解，但是分布式系统里面错误注入比这个要复杂。而且如果你遇到一个错误十年都没出现，你是不是太孤独了？ 这个电影大家可能还有印象，威尔史密斯主演的，全世界就一个人活着，唯一的伙伴是一条狗。\n\n![电影截图](https://img1.www.pingcap.com/prod/4_1f1319f18c.jpg)\n\n实际上不是的，比我们痛苦的人大把的存在着。\n\n举 Netflix 的一个例子，下图是 Netflix 的系统。\n\n\n![Netflix](https://img1.www.pingcap.com/prod/5_136c75608f.png)\n\n他们在 2014 年 10 月份的时候写了一篇博客，叫《 Failure Injection Testing 》，是讲他们整个系统怎么做错误注入，然后他们的这个说法是 Internet Scale，就是整个多数据中心互联网的这个级别。大家可能记得 Spanner 刚出来的时候他们叫做 Global Scale，然后这地方可以看到，蓝色是注射点，黑色的是网络调用，就是所有这些请求在这些情况下面，所有这些蓝色的框框都有可能出错。大家可以想一想，在 Microservice 系统上，一个业务调用可能涉及到几十个系统的调用，如果其中一个失败了会怎么样？如果是第一次第一个失败，第二次第二个失败，第三次第三个失败是怎么样的？有没有系统做过这样的测试？有没有系统在自己的程序里面去很好的验证过是不是每一个可以预期的错误都是可预测的，这个变得非常的重要。这里以 cache 为例，就说每一次访问  Cassandra 的时候可能出错，那么也就给了我们一个错误的注入点。\n\n然后我们谈谈 OpenStack.\n\n**OpenStack fault-injection library:**\n\n***https://pypi.org/project/os-faults/***\n\n大名鼎鼎的 OpenStack 其实也有一个 Failure Injection Library，然后我把这个例子也贴到这里，大家有兴趣可以看一下这个 OpenStack 的 Failure Injection。这以前大家可能不太关注，其实大家在这一点上都很痛苦， OpenStack 现在还有一堆人在骂，说稳定性太差了，其实他们已经很努力了。但是整个系统确实是做的异乎寻常的复杂，因为组件太多。如果你出错的点特别多，那可能会带来另外一个问题，就是出错的点之间还能组合，就是先 A 出错，再 B 出错，或者 AB 都出错，这也就几种情况，还好。那你要是有十万个错误的点，这个组合怎么弄？当然现在还有新的论文在研究这个，2015 年的时候好像有一篇论文，讲的就是会探测你的程序的路径，然后在对应的路径下面去注入错误。\n\n再来说 Jepsen.\n\n**Jepsen: Distributed Systems Safety Analysis**\n\n\n![图例 3](https://img1.www.pingcap.com/prod/6_0a628008f2.jpg)\n\n大家所有听过的知名的开源分布式系统基本上都被它找出来过 bug。但是在这之前大家都觉得自己还是很 OK 的，我们的系统还是比较稳定的，所以当新的这个工具或者新的方法出现的时候，就比如说我刚才提到的那篇能够线性 Scale 的去查错的那篇论文，那个到时候查错力就很惊人了，因为它能够自动帮你探测。另外我介绍一个工具 Namazu，后面讲，它也很强大。这里先说Jepsen, 这货算是重型武器了，无论是 ZooKeeper、MongoDB 以及 Redis 等等，所有这些全部都被找出了 bug，现在用的所有数据库都是它找出的 bug，最大的问题是小众语言 closure 编写的，扩展起来有点麻烦。我先说说 Jepsen 的基本原理，一个典型使用 Jepsen 的测试通过会在一个 control node上面运行相关的 clojure 程序，control node 会使用 ssh 登陆到相关的系统 node（jepsen 叫做 db node）进行一些测试操作。\n\n当我们的分布式系统启动起来之后，control node 会启动很多进程，每一个进程都能使用特定的 client 访问到我们的分布式系统。一个 generator 为每一个进程生成一系列的操作，比如 get/set/cas，让其执行。每一个操作都会被记录到 history 里面。在执行操作的同时，另一个 nemesis 进程会尝试去破坏这个分布式系统，譬如使用 iptable 断开网络连接等，当所有操作执行完毕之后，jepsen 会使用一个 checker 来分析验证系统的行为是否符合预期。PingCAP 的首席架构师唐刘写过两篇文章介绍我们实际怎么用 Jepsen 来测试 TiDB，大家可以搜索一下，我这里就不详细展开了。\n\n+ FoundationDB\n\t- It is difficult to be deterministic\n\t\t- Random\n\t\t- Disk Size\n\t\t- File Length\n\t\t- Time\n\t\t- Multithread\n\nFoundationDB 这就是前辈了，2015 年被 Apple 收购了。他们为了解决错误注入的问题，或者说怎么去让它重现的这个问题，做了很多事情，很重要的一个事情就是 deterministic 。如果我给你一样的输入，跑几遍，是不是能得到一样的输出？这个听起来好像很科学、很自然，但是实际上我们绝大多数程序都是做不到的，比如说你们有判断程序里面有随机数吗？有多线程吗？有判断磁盘空间吗？有判断时间吗？你再一次判断的时候还是一样的吗？你再跑一次，同样的输入，但行为已经不一样了，比如你生了一个随机数，比如你判断磁盘空间，这次判断和下次判断可能是不一样的。\n\n所以他们为了做到“我给你一样的输入，一定能得到一样的输出”，花了大概两年的时间做了一个库。这个库有以下特性：它是个单线程的，然后是个伪并发的。为什么？因为如果用多线程你怎么让它这个相同的输入变成相同的输出，谁先拿到锁呢？这里面的问题很多，所以他们选择使用单线程，但是单线程本身有单线程的问题。而且比如你用 Go 语言，那你单线程它也是个并发的。然后它的语言规范就告诉我们说，如果一个 select 作用在两个 channel 上，两个 channel 都 ready 的时候，它会随机的一个，就是在语言定义的规范上面，就已经不可能让你得到一个 deterministic 了。但还好 FoundationDB 是用 C++ 写的。\n\n+ FoundationDB\n\t- Single-threaded pseudo-concurrency\n\t- Simulated the implementation of all the external communication\n\t- Determinism\n\t- Disasters happen more frequently here than in the real world.\n\n另外 FoundationDB 模拟了所有的网络，就是两个之间认为通过网络通讯，对吧？实际上是通过它自己模拟的一套东西在通讯。它里面有一个很重要的观点就是说，如果磁盘损坏，出现的概率是三年百分之八的话，那么在用户那出现的概率是三年百分之八。但是在用户那一旦出现了，那证明就很严重了，所以他们对待这个问题的办法是什么？就是我通过自己的模拟系统让它每时每刻都在产生。它们大概是每两分钟产生一次磁盘损坏，也就是说它比现实中的概率要高几十万倍，所以它就觉得它调的技术 more frequently，就是我这种错误出现的更加频繁，那网卡损坏的概率是多少？这都是极低的，但是你可以用这个系统让它每分每秒都产生，这样一来你就让你的系统遇到这种错误的概率是比现实中要大非常非常多。那你重现，比如说现实中跑三年能重现一次，你可能跑三十秒就能重现一次。\n\n但对于一个 bug 来说最可怕的是什么？就是它不能重现。发现一个 bug，后来说我 fix 了，然后不能重现了，那你到底 fix 了没有？不知道，这个事情就变得非常的恐怖。所以通过 deterministic 肯定能保证重现，我只要把我的输入重放一次，我把它录下来，每一次我把它录下来一次，然后只要是曾经出现过，我重放，一定能出现。当然这个代价太大了，所以现在学术界走的是另外一条路，不是完全 deterministic，但是我只需要它  reasonable。比如说我在三十分钟内能把它重现也是不错的，我并不需要在三秒内把它重现。所以，每前一步要付出相应的成本代价。\n\n##### 未完待续...\n\n> 相关阅读：  \n[分布式系统测试那些事儿 - 理念](https://pingcap.com/zh/blog/distributed-system-test-1)；  \n> [分布式系统测试那些事儿 - 信心的毁灭与重建](https://pingcap.com/zh/blog/distributed-system-test-3)。","date":"2016-11-10","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"distributed-system-test-2","file":null,"relatedBlogs":[]},{"id":"Blogs_182","title":"分布式系统测试那些事儿 - 理念","tags":["TiDB","分布式系统测试","自动化测试"],"category":{"name":"观点洞察"},"summary":"本话题系列文章整理自 PingCAP Infra Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长，为方便大家阅读，会分为上中下三篇，本文为上篇。","body":"> 本话题系列文章整理自 PingCAP NewSQL Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长，为方便大家阅读，会分为上中下三篇，本文为上篇。\n\n今天主要是介绍分布式系统测试。对于 PingCAP 目前的现状来说，我们是觉得做好分布式系统测试比做一个分布式系统更难。就是你把它写出来不是最难的，把它测好才是最难的。大家肯定会觉得有这么夸张吗？那我们先从一个最简单的、每个人都会写的 Hello world  开始。\n\n### A simple “Hello world” is a miracle\n\nWe should walk through all of the bugs in:\n\n+ Compiler\n+ Linker\n+ VM (maybe)\n+ OS\n\n其实这个 Hello world 能够每次都正确运行已经是一个奇迹了，为什么呢？首先，编译器得没 bug，链接器得没 bug ；然后我们可能跑在 VM 上，那 VM 还得没 bug；并且 Hello world 那还有一个 syscall，那我们还得保证操作系统没有 bug；到这还不算吧，我们还得要硬件没有 bug。所以一个最简单程序它能正常运行起来，我们要穿越巨长的一条路径，然后这个路径里面所有的东西都不能出问题，我们才能看到一个最简单的 Hello world。\n\n但是分布式系统里面呢，就更加复杂了。比如大家现在用的很典型的微服务。假设你提供了一个微服务，然后在微服务提供的功能就是输出一个 Hello world  ，然后让别人来 Call。\n\n### A RPC “Hello world” is a miracle\n\nWe should walk through all of the bugs in:\n\n+ Coordinator (zookeeper, etcd)\n+ RPC implementation\n+ Network stack\n+ Encoding/Decoding library\n+ Compiler for programming languages or [protocol buffers, avro, msgpack, capn]\n\n那么我们可以看一下它的路径。我们起码需要依赖 Coordinator 去做这种服务发现，比如用 zookeeper，etcd ，大家会感觉是这东西应该很稳定了吧？但大家可以去查一下他们每一次  release notes，里边说我们 fix 了哪些 bug，就是所有大家印象中非常稳定的这些东西，一直都在升级，每一次升级都会有 bug fix。但换个思路来看，其实我们也很幸运，因为大部分时候我们没有碰到那个 bug，然后 RPC 的这个实现不能有问题。当然如果大家深度使用 RPC，比如说 gRPC，你会发现其实 bug 还是挺多的，用的深一点，基本上就会发现它有 bug。还有系统网络协议栈，去年 TCP 被爆出有一个 checksum 问题，就是 Linux 的 TCP 协议栈，这都是印象中永远不会出问题的。再有，编解码，大家如果有 Go 的经验的话，可以看一下 Go 的 JSON 历史上从发布以来更新的记录，也会发现一些 bug。还有更多的大家喜欢的编解码，比如说你用 Protocol buffers、Avro、Msgpack、Cap'n 等等，那它们本身还需要 compiler 去生成一个代码，然后我们还需要那个 compiler 生成的代码是没有 bug 的。然后这一整套下来，我们这个程序差不多是能运行的，当然我们没有考虑硬件本身的 bug。\n\n其实一个正确的运行程序从概率上来讲（不考虑宇宙射线什么的这种），已经是非常幸运的了。当然每一个系统都不是完善的，那通常情况下，为什么我们这个就运行的顺利呢？因为我们的测试永远都测到了正确的路径，我们跑一个简单的测试一定是把正确的路径测到了，但是这中间有很多错误路径其实我们都没有碰到。然后我不知道大家有没有印象，如果写 Go 程序的时候，错误处理通常写成 if err != nil，然后 return error ，不知道大家写了多少。那其它程序、其它的语言里就是 try.catch，然后里面各种 error 处理。就是一个真正完善的系统，最终的错误处理代码实际上通常会比你写正常逻辑代码还要多的，但是我们的测试通常 cover 的是正确的逻辑，就是实际上我们测试的 cover 是一小部分。\n\n那先纠正几个观念，关于测试的。就是到底怎么样才能得到一个好的、高质量的程序，或者说得到一个高质量的系统？\n\n### Who is the tester ?\n\n+ Quality comes from solid engineering.\n+ Stop talking and go build things.\n+ Don’t hire too many testers.\n\t- Testing is owned by the entire team.  It is a culture, not a process.\n+ Are testers software engineers? Yes.\n+ Hiring good people is the first step.  And then keep them challenged.\n\n我们的观念是说先有 solid engineering 。我觉得这个几乎是勿庸置疑的吧，不知道大家的经验是什么？然后还有一个就是不扯淡，尽快去把东西 build 起来，然后让东西去运转起来。我前一段时间也写了一个段子，就是：“你是写 Rust 的，他是写 Java 的，你们这聊了这么久，人家 Rust （编译速度慢） 的程序已经编译过了，你 Java 还没开始写。”原版是这样的:“你是砍柴的，他是放羊的，你们聊了一天，他的羊吃饱了，你的柴呢？”然后最近还有一个特别有争议的话题：CTO 应该干嘛。就是 CTO 到底该不该写代码，这个也是众说纷纭。因为每一个人都受到自己环境的局限，所以每个人的看法都是不一样的。那我觉得有点像，就是同样是聊天，然后不同人有不同的看法。\n\n### Test automation\n\n+ Allow developers to get a unit test results immediately.\n+ Allow developers to run all unit tests in one go.\n+ Allow code coverage calculations.\n+ Show the testing evolution on the dashboards.\n+ Automate everything.\n\n我们现在很有意思的一个事情是，迄今为止 PingCAP 没有一个测试人员，这是在所有的公司看来可能都是觉得不可思议的事情，那为什么我们要这么干？因为我们现在的测试已经不可能由人去测了。究竟复杂到什么程度呢？我说几个基本数字大家感受一下：我们现在有六百多万个 Test，这是完全自动化去跑的。然后我们还有大量从社区收集到的各种 ORM Test，一会我会提到这一点。就是这么多 Test 已经不可能是由人写出来的了，以前的概念里面是 Test 是由人写的，但实际上 Test 不一定是人写的，Test 也是可以由机器生成的。举个例子，如果给你一个合法的语法树，你按照这个语法树去做一个输出，比如说你可以更换变量名，可以更换它的表达式等等，你可以生成很多的这种 SQL 出来。\n\nGoogle Spanner 就用到这个特性，它会有专门的程序自动生成符合 SQL 语法的语句，然后再交给系统去执行。如果执行过程中 crash 了，那说明这个系统肯定有 bug。但是这地方又蹦出另外一个问题，就是你生成了合法的 SQL 语句，但是你不知道它语句执行的结构，那你怎么去判断它是不是对的？当然业界有很聪明的人。我把它扔给几个数据库同时跑一下，然后取几个大家一致的结果，那我就认为这个结果基本上是对的。如果一个语句过来，然后在我这边执行的结果和另外几个都不一样，那说明我这边肯定错了。就算你是对的，可能也是错的，因为别人执行下来都是这个结果，你不一样，那大家都会认为你是错的。\n\n所以说在测试的时候，怎么去自动生成测试很重要。去年，在美国那边开始流行一个新的说法，叫做 “怎么在你睡觉的时候发现 bug”。那么实际上测试干的很重要的事情就是这个，就是自动化测试是可以在你睡觉的时候发现 bug。好像刚才我们还提到 fault injection ，好像还有 fuzz testing。然后所有测试的人都是工程师，因为只有这样你才不会甩锅。\n\n这是我们现在坚信的一个事情，就是所有的测试必须要高度的自动化，完全不由人去干预。然后很重要的一个就是雇最优秀的人才，同时给他们挑战，就是如果没有挑战，这些人才会很闲，精力分散，然后很难合力出成绩。因为以现在这个社会而言，很重要一个特性是什么？就是对于复杂性工程需要大量的优秀人才，如果优秀的人才力不往一处使力的话，这个复杂性工程是做不出来的。我今天看了一下龙芯做了十年了，差不多是做到英特尔凌动处理器的水平。他们肯定是有很优秀的人才，但是目前还得承认，我们在硬件上面和国外的差距还比较大，其实软件上面的差距也比较大，比如说我们和 Spanner 起码差了七年，2012 年 Spanner 就已经大规模在 Google 使用了，对这些优秀的作品，我们一直心存敬仰。\n\n我刚才已经反复强调过自动化这个事情。不知道大家平时写代码 cover 已经到多少了？如果 cover 一直低于 50%，那就是说你有一半的代码没有被测到，那它在线上什么时候都有可能出现问题。当然我们还需要更好的方法去在上线之前能够把线上的 case 回放。理论上你对线上这个回放的越久你就越安全，但是前提是线上代码永远不更新，如果业务方更新了，那就又相当于埋下了一个定时炸弹。比如说你在上面跑两个月，然后业务现在有一点修改，然而那两个又没有 cover 住修改，那这时候可能有新的问题。所以要把所有的一切都自动化，包括刚才的监控。比如说你一个系统一过去，然后自动发现有哪些项需要监控，然后自动设置报警。大家觉得这事是不是很神奇？其实这在 Google 里面是司空见惯的事情，PingCAP 现在也正在做。\n\n### Well… still not enough ?\n\n+ Each layer can be tested independently.\n+ Make sure you are building the right tests.\n+ Don’t bother great people unless the testing fails.\n+ Write unit tests for every bug.\n\n这么多还是不够的，就是对于整个系统测试来讲，你可以分成很多层、分成很多模块，然后一个一个的去测。还有很重要的一点，就是早期的时候我们发现一个很有意思的事情。就是我们 build 了大量 Test，然后我们的程序都轻松的 pass 了大量的 Test，后来发现我们一个 Test 是错的，那意味着什么？意味着我们的程序一直是错的，因为 Test 会把你这个 cover 住。所以直到后来我们有一次觉得自己写了一个正确的代码，但是跑出来的结果不对，我们这时候再去查，发现以前有一个 Test 写错了。所以一个正确的 Test 是非常重要的，否则你永远被埋在错误里面，然后埋在错误里面感觉还特别好，因为它告诉你是正确的。\n\n还有，为什么要自动化呢？就是你不要去打扰这些聪明人。他们本身很聪明，你没事别去打扰他们，说“来，你过来给我做个测试”，那这时候不断去打扰他们，是影响他们的发挥，影响他们做自己的挑战。\n\n这一条非常重要，所有出现过的 bug，历史上只要出现过一次，你一定要写一个 Test 去 cover 它，那这个法则大家应该已经都清楚了。我看今天所在的人的年龄，应该《圣斗士星矢》是看过的，对吧？这个圣斗士是有一个特点的，所有对他们有效的招数只能用一次，那这个也是一样的，就保证你不会被再次咬到，就不会再次被坑到。我印象中应该有很多人 fix bug 是这样的：有一个 bug 我 fix 了，但没有 Test，后来又出现了，然后这时候就觉得很奇怪，然后积累的越多，最后就被坑的越惨。\n\n这个是目前主流开源社区都在坚持的做法，基本没有例外。就是如果有一个开源社区说我发现一个 bug，我没有 Test 去 cover 它，这个东西以后别人是不敢用的。\n\n### Code review\n\n+ At least two LGTMs (Looks good to me) from the maintainers.\n+ Address comments.\n+ Squash commit logs.\n+ Travis CI/Circle CI for PRs.\n\n简单说一下 code review 的事情，它和 Test 还是有一点关系，为什么？因为在 code review 的时候你会提一个新的 pr，然后这个 pr 一定要通过这个 Test。比如说典型的 Travis CI，或者 CircleCI 的这种 Test。为什么要这样做呢？因为要保证它被 merge 到 master 之前你一定要发现这个问题，如果已经 merge 到 master 了，首先这不好看，因为你要 revert 掉，这个在 commit 记录上是特别不好看的一个事情。另外一个就是它出现问题之前，你就先把它发现其实是最好的，因为有很多工具会根据 master 自动去 build。比如说我们会根据 master 去自动 build docker 镜像，一旦你代码被 commit 到 master，然后 docker 镜像就出来了。那你的用户就发现，你有新的更新，我要马上使用新的，但是如果你之前的 CI 没有过，这时候就麻烦了，所以 CI 没过，一定不能进入到 CD 阶段。\n\n### Who to blame in case of bugs?\n\nThe entire team.\n\n另外一个观念纠正一下，就是出现 bug 的时候，责任是谁的？通常我见过的很多人都是这样，就说“这个 bug 跟我没关系，他的模块的 bug”。那 PingCAP 这边的看法不一样，就是一旦出现 bug，这应该是整个 team 的责任，因为你有自己的 code review 机制，至少有两个以上的人会去看它这个代码，然后如果这个还出现问题，那一定不是一个人的问题。\n\n除了刚才说的发现一些 bug，还有一些你很难定义，说这是不是 bug，怎么系统跑的慢，这算不算 bug，怎么对 bug 做界定呢？我们现在的界定方式是用户说了算。虽然我们觉得这不是 bug，这不就慢一点吗，但是用户说了这个东西太慢了，我们不能忍，这就是 bug，你就是该优化的就优化。然后我们团队里面出现过这样的事情，说“我们这个已经跑的很快了，已经够快了”，对不起，用户说慢，用户说慢就得改，你就得去提升。总而言之，标准不能自己定，当然如果你自己去定这个标准，那这个事就变成“我这个很 OK 了，我不需要改了，可以了。”这样是不行的。\n\n### Profiling\n\n+ Profile everything, even on production\n\t- once-in-a-lifetime chance\n+ Bench testing\n\n另外，在 Profile 这个事情上面，我们强调一个，即使是在线上，也需要能做  Profile，其实  Profile 的开销是很小的。然后很有可能是这样的，有一次线上系统特别卡，如果你把那个重启了，你可能再也没有机会复现它了，那么对于这些情况它很可能是一辈子发生一次的，那一次你没有抓住它，你可能再也没有机会抓住它了。当然我们后面会介绍一些方法，可以让这个能复现，但是有一些确实是和业务相关性极强的，那么可能刚好又碰到一个特别的环境才能让它出现，那真的可能是一辈子就那么一次的，你一定要这次抓住它，这次抓不住，你可能永远就抓不住了。因为有些犯罪它一辈子只犯一次，它犯完之后你再也没有机会抓住它了。\n\n### Embed testing to your design\n\n+ Design for testing or Die without good tests\n+ Tests may make your code less beautiful\n\n再说测试和设计的关系。测试是一定要融入到你的设计里面，就是在你设计的时候就一定要想这个东西到底应该怎么去测。如果在设计的时候想不到这个东西应该怎么测，那这个东西就是正确性实际上是没法验证的，这是非常恐怖的一件事情。我们把测试的重要程度看成这样的：你要么就设计好的测试，要么就挂了，就没什么其它的容你选择。就是说在这一块我们把它的重要性放到一个最高的程度。\n\n##### 未完待续...\n\n> 相关阅读：  \n[分布式系统测试那些事儿 - 错误注入](https://pingcap.com/zh/blog/distributed-system-test-2)；  \n> [分布式系统测试那些事儿 - 信心的毁灭与重建](https://pingcap.com/zh/blog/distributed-system-test-3)。","date":"2016-11-01","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"distributed-system-test-1","file":null,"relatedBlogs":[]},{"id":"Blogs_90","title":"Building a Reliable Large-Scale Distributed Database - Principles and Practice","tags":["TiDB","NewSQL","Test"],"category":{"name":"观点洞察"},"summary":"日前，PingCAP Engineering VP 申砾受邀参加 2016 中国开源年会，并发表了《Building a Reliable Large-Scale Distributed Database - Principles and Practice》主题演讲。本文为演讲实录。","body":"大家好，我叫申砾，是 PingCAP Tech Leader，负责 TiDB 技术相关的工作。我曾就职网易有道、360 搜索，主要在做垂直搜索相关的事情，现在主要关注分布式计算/存储领域。过去的一年半时间我在 PingCAP 做分布式关系数据库 TiDB。目前我们的整个项目已经开源了大概一年时间，获得了不少关注。在 Github 上 Star 数量超过 5k，并且 Contributor 数量为 50+，拥有一个活跃的社区，在国内和国际上都有一定的知名度。\n今天主要想和大家分享一下我们在做一款开源的分布式数据库产品过程中得到的一些经验和体会，包括技术上、产品上以及开源社区方面的内容，不会涉及太多技术上的细节。\n\n## 数据库现状\n\n近年来，随着移动互联网、物联网、人工智能等技术的兴起，我们已经进入了一个信息爆炸的大数据时代，需要处理和分析的数据越来越多，这些数据如何保存、如何应用是一个重要的问题。\n\n传统的 SQL 数据库一般通过中间件、分库分表等方案获得 Scale 的能力。但是这些方案仍然很难做到对应用透明且保证数据均匀分布，同时也无法支持一致性的跨节点事务、JOIN 等操作。在进行扩容的时候往往需要人工介入，随着集群规模的增大，维护和扩展的复杂度呈指数级上升。\n\n以 Google 的 BigTable 论文为开端，涌现出了一大批 NoSQL 方案。这些方案致力于解决扩展性，而牺牲一致性。如果采用 NoSQL 方案替换原有关系型数据库，往往要涉及大规模的业务重构，这相当于将数据库层的计算逻辑复杂度转嫁给业务层，同时还要损失掉事务等特性。\n\n以上两种方案都没有完美地解决高可用的问题，跨机房多活、故障恢复、扩容经常都需要繁重的人工介入。\n\n最近几年，人们希望有一种既有 SQL/NoSQL 的优点，又能避免他们的不足的新型数据库，于是提出了 NewSQL 的概念。Google 发布的 Spanner/F1，算是第一个真正在大规模业务上验证过的分布式数据库，向业界证明了 NewSQL 这条道路的正确性。TiDB 作为 Google Spanner/F1 的开源实现，正是业界盼望已久的 NewSQL 开源数据库。\n\n## 什么是 NewSQL\n\n并不是所有号称 NewSQL 的数据库都是 NewSQL。我们认为作为 NewSQL 数据库需要有下面几点特性：\n\n**首先是 Scale。**这点上我想大家都深有体会，不管什么数据解决方案，最基本的要求就是能有足够的能力，保存用户所有的数据。\n\n**第二是事务。**ACID Transaction，这个东西如果业务不需要，就感觉不到；一旦你的业务有这种需求，就能体会到它的重要性了。事实证明这个需求是广泛存在的，Google 的 BigTable 没有提供事务，结果内部很多业务都有需求，于是各个组造了一堆轮子，Jeff Dean 看不下去，出来说他最大的错误就是没有给 BigTable 提供事务。\n\n**第三是 SQL。**SQL 作为一门古老的语言，在现在的技术领域内依然有强大的生命力，基本是流行的各种 NoSQL 上面都会有人来做一套 SQL-on-X。最近刚看到一个 2016 最佳编程语言榜单，SQL 依然能上榜。我想 SQL 在业界的应用还会延续很多很多年。\n\n**第四是 Auto-failover / Self recovery / Survivability。**\n\nSpanner 能够做到任何一个数据中心宕机，底层可以完全的 Auto-Failover，上层的业务甚至是完全无感知的。这个 Failover 的过程是完全不需要人工介入的。国内很多互联网公司也都在做这个，但是还没有那一家能做的特别好，比如光纤被挖断之后，大家发现支付工具无法支付了。除了业务不被中断这一好处之外，Auto-failover 还会极大地降低运维的成本，如 Google 这么牛的公司，在维护一百多个节点的 MySQL Sharding 的数据库的时候，都已经非常痛苦，宁可重新去写一个数据库，也不想去维护这个 database cluster。\n\n为了给业界提供 NewSQL 数据库，我们开发了 TiDB，提供如下特性：\n\n+ 无限水平扩展\n+ 分布式 ACID 事务\n+ 强一致\n+ 高可靠\n+ 提供 SQL 并且支持 MySQL 协议\n\nTiDB 目前是世界上最受欢迎的开源 NewSQL 数据库之一，可能是国人发起和主要维护的最大也是 stars 数最多的开源的数据库项目。\n\n## 我们在开发 TiDB 过程中学到的东西\n\n下面就和大家分享一下我们在开发这个项目过程中学到的一些东西。\n\n### Always believe shit is about to happen\n\n大家写程序的时候，总会做一些错误检查，处理异常情况，但是很多情况可能大家普遍不会想到，比如光纤被挖断、IDC 整个 down 掉，还有前几天的阿里云 IO 问题。这说明即使以这些顶级大厂的技术能力，依然不能保证基础设施不出问题。所以我们会特别强调 Auto-failover 的作用。我们的整个设计始终会考虑容灾。其中最重要的就是如何保存多副本，一份数据写足够多的副本并且使用健壮的副本分布策略，才能保证安全。Spanner 默认使用 5 副本，重要的数据使用 7 副本。\n\n传统的保存副本的方案是 Master-slave 模式。但是这并不是一个完美的方案。如果要在 master 和 slave 之间保持强一致，那么不但要担心效率问题 (速度取决于最慢的那个 slave)，还需要考虑各种容错。比如如果写 Slave 失败了，如何处理，是否要回滚 Master？所以依靠 master-slave 实现可靠复制对性能和复杂度都有比较大的挑战。而如果不要做到强一致，那么就面临 master 挂掉之后，slave 和 master 之间数据还没有同步完成，造成丢数据的问题。\n\nMulti-Paxos / Raft 是一个更好的选择，采用这种方案，多数节点写成功即可成功，在保证可靠性的同时，尽可能的提升了复制效率。\n\n### Don't rely on humans\n\n面对容灾，我们需要尽可能的将工作自动化，因为人会累，会犯错，但是机器不会。我们希望能提供一套自动的方案，来支撑业务的需求，抵御各种异常情况。比如做 Scale 的时候，只需要点击几下即可增加新节点，然后系统自动将部分数据迁移到新节点。发生灾难时，系统能够自动下线 down 掉的节点，并将数据迁移到其他的节点。\n\n### Talk is cheap, show me the tests\n\n其实做数据库这么长时间，我认为最难的事情是测试。首先我们做的是一个支持 SQL 的数据库，想一下 SQL 的各种语法、操作符、函数，如何进行测试？同时我们是一个分布式的数据库，做测试就更难了。一直困扰我们的问题就是如何对我们的产品进行测试，比如一个 PR 上来后，如何检查逻辑是否正确，是否影响性能，是否支持容错？我们不断的探索和实践，有了一些自己的方案：\n\n**首先是单元测试。**我们的 Code Review 规范明确的写了，如果改了逻辑、bug，没有单测不予 Review。\n\n**第二是集成测试。**我们为了验证逻辑正确性，引入了大量的集成测试，其中一大块是 MySQL 源代码中的 test，因为我们支持 MySQL 语法和协议，所以可以直接拿过来用，省掉了我们大量的时间，很难想象没有这些测试，代码会变成什么样子。\n\n**除此之外还有大量的 ORM 框架自带的 Test，我们也会运行。**我们精选出一批集成测试 case，每次提交 PR 之前必需要跑过。当 PR merge 后，我们内部的 CI 会自动运行，跑更多更耗时的测试。\n\n**为了测试分布式场景下的系统容错能力，我们也引入了一些工具，**比如 Jepson/Namazu，可以进行错误注入。很多知名的分布式系统都被这些工具找出来过 bug，比如 etcd/zookeeper。\n\n### \"All problems in computer science can be solved by another level of indirection\"\n\n在一年半的时间里，TiDB 从零开始，成长为一个庞大的项目。首先我们是实现了一个内存的数据库，在一个简单的 memkv 基础上，做了一个小的 SQL 层，然后慢慢的替换 memkv 为持久化存储。我们将 SQL 和存储引擎之间的接口进行了抽象。后续的分布式存储引擎，也依赖于这个接口。这样就屏蔽了下层存储引擎的差别。无论是 TiDB 还是 TiKV 我们在开发过程中始终遵循良好的分层+抽象的原则，有效的降低了开发的复杂度和耦合度，另外对测试也有很大的帮助，我们可以更容易的 mock 某一层，做更精细的控制。抽象是对抗大系统复杂性的有效武器。\n\n### Don't try to teach your user, just follow them\n\n想要做一款成功的数据库产品，就需要让用户觉得方便好用。在这一点上，中间件或者 Sharding 方案往往需要侵入用户代码、或者是修改用户逻辑，在做扩容的时候，也要消耗用户大量的精力。我们要求 TiDB 能够尽可能的减少用户工作，可以一行代码都不用修改就能从单机 MySQL 迁移到 TiDB 上。并且要尽可能的和行业标准贴近，减少用户的工作量。\n\n### Make it right, and then make it fast\n\n我们大概用了一个月的时间，做了一个可以用的数据库，在接下来的工作中，我们准备了整套测试框架，然后不断的完善功能，保证每次都是对的，与此同时，我们还会调整架构，最终做出一个还算不错的数据库，但是初期性能并不好，比如我们和第一家客户去聊，然后测试一下，发现一个简单的 SQL 跑了 600s，但是我们并不气馁，经过半个月的优化，我们将这个 SQL 优化到了 60ms。之所以能这么快优化到这么好，是因为我们有良好的架构，清晰的分层，完善的测试。所以这里并不是说我们不需要做优化，而是不要过早优化。这种大型系统，应该在早期关注架构的正确性以及弹性，为后面的优化留下足够的操作空间，保证每个模块可以单独的去优化。\n\n### Embrace the community\n\nTiDB 是一个开源的数据库，我们从第一天起就坚定的走拥抱社区的路线，希望能够成为整个大数据生态的一部分。我们通过开源社区获得了大量高质量的第三方库，提高开发进度。与此同时，我们也向开源社区贡献了很多代码，比如 Etcd、Rocksdb、go-hbase、go-mysql 等。客户在进行数据库技术选型时，如果使用一些闭源的产品，那么就很容易被绑死在某一个厂商，或者是某一个云上。而使用 TiDB 不会有这方面的困扰，无论是迁移过来还是从 TiDB 迁移到其他的产品，都很容易，也不会被某个特定的云厂商绑死。\n\n**如果一个公司符合如下任何一种情况，TiDB 或许是一个很好的解决方案：**\n\n1. 项目选型阶段。为了快速开发，简化生产力和运维，使用 TiDB，再也不用对数据库进行分库分表或者选用数据库中间件，TiDB 帮你搞定所有底层的跨节点的分布式事务、聚合查询难点，开发人员专注于业务设计，维护人员运维非常容易。\n\n2. 目前使用 MySQL 且数据量很大，但是查询速度特别慢。TiDB 是 MySQL 兼容的，且在大数据量性能大大优于 MySQL。\n\n3. 有跨数据中心数据强一致性需求或者自动运维需求。\n\n\n## Q&A\n\n### 提问：TiDB 是否和其他的数据库(比如 MySQL、Oracle) 进行过性能对比？\n\n申砾：我们内部用 Sysbench 做过对比，单套 TiDB 在写入能力上超过 MySQL，读取方面比 MySQL 略低。从整体上看，延迟会大于 MySQL，但是吞吐可以远高于 MySQL。我们正在不断提高性能，不久之后会对外发布性能测试结果。\n\n### 提问：TiDB 是如何支持跨机房容灾？\n\n申砾：TiDB 使用 Raft 做复制，PD 是整个集群的管理节点。PD 会自动根据存储节点的 IDC 位置指定副本存放策略，保证同一个 Raft Group 中的副本分布在多个机房。\n\n### 提问：TiDB 是否会出商业版本？\n\n申砾：是的，PingCAP 会提供 TiDB 的商业版。（含监控、部署、数据处理、调度及支持服务等）","date":"2016-10-21","author":"申砾","fillInMethod":"writeDirectly","customUrl":"talk-principles-practice","file":null,"relatedBlogs":[]},{"id":"Blogs_252","title":"How do we build TiDB","tags":["架构","Raft","MVCC","分布式事务","PD","Go"],"category":{"name":"观点洞察"},"summary":"首先我们聊聊 Database 的历史，在已经有这么多种数据库的背景下我们为什么要创建另外一个数据库；以及说一下现在方案遇到的困境，说一下 Google Spanner 和 F1，TiKV 和 TiDB，说一下架构的事情，在这里我们会重点聊一下 TiKV。因为我们产品的很多特性是 TiKV 提供的，比如说跨数据中心的复制，Transaction，auto-scale...","body":"首先我们聊聊 Database 的历史，在已经有这么多种数据库的背景下我们为什么要创建另外一个数据库；以及说一下现在方案遇到的困境，说一下 Google Spanner 和 F1，TiKV 和 TiDB，说一下架构的事情，在这里我们会重点聊一下 TiKV。因为我们产品的很多特性是 TiKV 提供的，比如说跨数据中心的复制，Transaction，auto-scale。\n\n再聊一下为什么 TiKV 用 Raft 能实现所有这些重要的特性，以及 scale，MVCC 和事务模型。东西非常多，我今天不太可能把里面的技术细节都描述得特别细，因为几乎每一个话题都可以找到一篇或者是多篇论文。但讲完之后我还在这边，所以详细的技术问题大家可以单独来找我聊。\n\n后面再说一下我们现在遇到的窘境，就是大家常规遇到的分布式方案有哪些问题，比如 MySQL Sharding。我们创建了无数 MySQL Proxy，比如官方的 MySQL proxy，Youtube 的 Vitess，淘宝的 Cobar、TDDL,以及基于 Cobar 的 MyCAT，金山的 Kingshard，360 的 Atlas，京东的 JProxy，我在豌豆荚也写了一个。可以说，随便一个大公司都会造一个MySQL Sharding的方案。\n\n## 为什么我们要创建另外一个数据库？\n\n昨天晚上我还跟一个同学聊到，基于 MySQL 的方案它的天花板在哪里，它的天花板特别明显。有一个思路是能不能通过 MySQL 的 server 把 InnoDB 变成一个分布式数据库，听起来这个方案很完美，但是很快就会遇到天花板。因为 MySQL 生成的执行计划是个单机的，它认为整个计划的 cost 也是单机的，我读取一行和读取下一行之间的开销是很小的，比如迭代 next row 可以立刻拿到下一行。实际上在一个分布式系统里面，这是不一定的。\n\n\n另外，你把数据都拿回来计算这个太慢了，很多时候我们需要把我们的  expression 或者计算过程等等运算推下去，向上返回一个最终的计算结果，这个一定要用分布式的 plan，前面控制执行计划的节点，它必须要理解下面是分布式的东西，才能生成最好的 plan，这样才能实现最高的执行效率。\n\n比如说你做一个 sum，你是一条条拿回来加，还是让一堆机器一起算，最后给我一个结果。 例如我有 100 亿条数据分布在 10 台机器上，并行在这 10 台 机器我可能只拿到 10 个结果，如果把所有的数据每一条都拿回来，这就太慢了，完全丧失了分布式的价值。聊到 MySQL 想实现分布式，另外一个实现分布式的方案是什么，就是 Proxy。但是 Proxy 本身的天花板在那里，就是它不支持分布式的 transaction，它不支持跨节点的 join，它无法理解复杂的 plan，一个复杂的 plan 打到 Proxy 上面，Proxy 就傻了，我到底应该往哪一个节点上转发呢，如果我涉及到 subquery sql 怎么办？所以这个天花板是瞬间会到，在传统模型下面的修改，很快会达不到我们的要求。\n\n另外一个很重要的是，MySQL 支持的复制方式是半同步或者是异步，但是半同步可以降级成异步，也就是说任何时候数据出了问题你不敢切换，因为有可能是异步复制，有一部分数据还没有同步过来，这时候切换数据就不一致了。前一阵子出现过某公司突然不能支付了这种事件，今年有很多这种类似的 case，所以微博上大家都在说“说好的异地多活呢？”……\n\n为什么传统的方案在这上面解决起来特别的困难，天花板马上到了，基本上不可能解决这个问题。另外是多数据中心的复制和数据中心的容灾，MySQL 在这上面是做不好的。\n\n![数据库演进](https://img1.www.pingcap.com/prod/1_c552b06693.png)\n\n<div class=\"caption-center\">数据库演进</div>\n\n在前面三十年基本上是关系数据库的时代，那个时代创建了很多伟大的公司，比如说 IBM、Oracle、微软也有自己的数据库，早期还有一个公司叫 Sybase，有一部分特别老的程序员同学在当年的教程里面还可以找到这些东西，但是现在基本上看不到了。\n\n另外是 NoSQL。NoSQL 也是一度非常火，像 Cassandra，MongoDB 等等，这些都属于在互联网快速发展的时候创建这些能够 scale 的方案，但 Redis scale 出来比较晚，所以很多时候大家把 Redis 当成一个 Cache，现在慢慢大家把它当成存储不那么重要的数据的数据库。因为它有了 scale 支持以后，大家会把更多的数据放在里面。\n\n然后到了 2015，严格来讲是到 2014 年到 2015 年之间，Raft 论文发表以后，真正的 NewSQL 的理论基础终于完成了。我觉得 NewSQL 这个理论基础，最重要的划时代的几篇论文，一个是谷歌的 Spanner，是在 2013 年初发布的，再就是 Raft 是在 2014 年上半年发布的。这几篇相当于打下了分布式数据库 NewSQL 的理论基础，这个模型是非常重要的，如果没有模型在上面是堆不起来东西的。说到现在，大家可能对于模型还是可以理解的，但是对于它的实现难度很难想象。\n\n前面我大概提到了我们为什么需要另外一个数据库，说到 Scalability 数据的伸缩，然后我们讲到需要 SQL，比如你给我一个纯粹的 key-value 系统的 API，比如我要查找年龄在 10 岁到 20 岁之间的 email 要满足一个什么要求的。如果只有 KV 的 API 这是会写死人的，要写很多代码，但是实际上用 SQL 写一句话就可以了，而且 SQL 的优化器对整个数据的分布是知道的，它可以很快理解你这个 SQL，然后会得到一个最优的 plan，他得到这个最优的 plan 基本上等价于一个真正理解 KV 每一步操作的人写出来的程序。通常情况下，SQL 的优化器是为了更加了解或者做出更好的选择。\n\n另外一个就是 ACID 的事务，这是传统数据库必须要提供的基础。以前你不提供 ACID 就不能叫数据库，但是近些年大家写一个内存的 map 也可以叫自己是数据库。大家写一个 append-only 文件，我们也可以叫只读数据库，数据库的概念比以前极大的泛化了。\n\n另外就是高可用和自动恢复，他们的概念是什么呢？有些人会有一些误解，因为今天还有朋友在现场问到，出了故障，比如说一个机房挂掉以后我应该怎么做切换，怎么操作。这个实际上相当于还是上一代的概念，还需要人去干预，这种不算是高可用。\n\n未来的高可用一定是系统出了问题马上可以自动恢复，马上可以变成可用。比如说一个机房挂掉了，十秒钟不能支付，十秒钟之后系统自动恢复了变得可以支付，即使这个数据中心再也不起来我整个系统仍然是可以支付的。Auto-Failover 的重要性就在这里。大家不希望在睡觉的时候被一个报警给拉起来，我相信大家以后具备这样一个能力，5 分钟以内的报警不用理会，挂掉一个机房，又挂掉一个机房，这种连续报警才会理。我们内部开玩笑说，希望大家都能睡个好觉，很重要的事情就是这个。\n\n说完应用层的事情，现在很有很多业务，在应用层自己去分片，比如说我按照 user ID 在代码里面分片，还有一部分是更高级一点我会用到一致性哈希。问题在于它的复杂度，到一定程度之后我自动的分库，自动的分表，我觉得下一代数据库是不需要理解这些东西的，不需要了解什么叫做分库，不需要了解什么叫做分表，因为系统是全部自动搞定的。同时复杂度，如果一个应用不支持事务，那么在应用层去做，通常的做法是引入一个外部队列，引入大量的程序机制和状态转换，A 状态的时候允许转换到 B 状态，B 状态允许转换到 C 状态。\n\n举一个简单的例子，比如说在京东上买东西，先下订单，支付状态之后这个商品才能出库，如果不是支付状态一定不能出库，每一步都有严格的流程。\n\n## Google Spanner / F1\n\n说一下 Google 的 Spanner 和 F1，这是我非常喜欢的论文，也是我最近几年看过很多遍的论文。Google Spanner 已经强大到什么程度呢？Google Spanner 是全球分布的数据库，在国内目前普遍做法叫做同城两地三中心，它们的差别是什么呢？以 Google 的数据来讲，谷歌比较高的级别是他们有 7 个副本，通常是美国保存 3 个副本，再在另外 2 个国家可以保存 2 个副本，这样的好处是万一美国两个数据中心出了问题，那整个系统还能继续可用，这个概念就是比如美国 3 个副本全挂了，整个数据都还在，这个数据安全级别比很多国家的安全级别还要高，这是 Google 目前做到的，这是全球分布的好处。\n\n现在国内主流的做法是两地三中心，但现在基本上都不能自动切换。大家可以看到很多号称实现了两地三中心或者异地多活，但是一出现问题都说不好意思这段时间我不能提供服务了。大家无数次的见到这种 case，我就不列举了。\n\nSpanner 现在也提供一部分 SQL 特性。在以前，大部分 SQL 特性是在 F1 里面提供的，现在 Spanner 也在逐步丰富它的功能，Google 是全球第一个做到这个规模或者是做到这个级别的数据库。事务支持里面 Google 有点黑科技（其实也没有那么黑），就是它有 GPS 时钟和原子钟。大家知道在分布式系统里面，比如说数千台机器，两个事务启动先后顺序，这个顺序怎么界定(事务外部一致性)。这个时候 Google 内部使用了 GPS 时钟和原子钟，正常情况下它会使用一个 GPS 时钟的一个集群，就是说我拿的一个时间戳，并不是从一个 GPS 上来拿的时间戳，因为大家知道所有的硬件都会有误差。如果这时候我从一个上拿到的 GPS 本身有点问题，那么你拿到的这个时钟是不精确的。而 Google 它实际上是在一批 GPS 时钟上去拿了能够满足 majority 的精度，再用时间的算法，得到一个比较精确的时间。同时大家知道 GPS 也不太安全，因为它是美国军方的，对于 Google 来讲要实现比国家安全级别更高的数据库，而 GPS 是可能受到干扰的，因为 GPS 信号是可以调整的，这在军事用途上面很典型的，大家知道导弹的制导需要依赖 GPS，如果调整了 GPS 精度，那么导弹精度就废了。所以他们还用原子钟去校正 GPS，如果 GPS 突然跳跃了，原子钟上是可以检测到 GPS 跳跃的，这部分相对有一点黑科技，但是从原理上来讲还是比较简单，比较好理解的。\n\n最开始它 Spanner 最大的用户就是 Google 的 Adwords，这是 Google 最赚钱的业务，Google 就是靠广告生存的，我们一直觉得 Google 是科技公司，但是他的钱是从广告那来的，所以一定程度来讲 Google 是一个广告公司。Google 内部的方向先有了 Big table ，然后有了 MegaStore ，MegaStore 的下一代是 Spanner ，F1 是在 Spanner 上面构建的。\n\n## TiDB and TiKV\n\nTiKV 和 TiDB 基本上对应 Google Spanner 和 Google F1，用 Open Source 方式重建。目前这两个项目都开放在 GitHub 上面，两个项目都比较火爆，TiDB 是更早一点开源的， 目前 TiDB 在 GitHub 上 有 4300 多个 Star，每天都在增长。\n\n另外，对于现在的社会来讲，我们觉得 Infrastructure 领域闭源的东西是没有任何生存机会的。没有任何一家公司，愿意把自己的身家性命压在一个闭源的项目上。举一个很典型的例子，在美国有一个数据库叫 FoundationDB，去年被苹果收购了。 FoundationDB 之前和用户签的合约都是一年的合约。比如说，我给你服务周期是一年，现在我被另外一个公司收购了，我今年服务到期之后，我是满足合约的。但是其他公司再也不能找它服务了，因为它现在不叫 FoundationDB 了，它叫 Apple了，你不能找 Apple 给你提供一个 enterprise service。\n\n![Architecture Overview Software](https://img1.www.pingcap.com/prod/2_6d0f5ee11e.png)\n\n<div class=\"caption-center\">Architecture Overview Software</div>\n\nTiDB 和 TiKV 为什么是两个项目，因为它和 Google 的内部架构对比差不多是这样的：TiKV 对应的是 Spanner，TiDB 对应的是 F1 。F1 里面更强调上层的分布式的 SQL 层到底怎么做，分布式的 Plan 应该怎么做，分布式的 Plan 应该怎么去做优化。同时 TiDB 有一点做的比较好的是，它兼容了 MySQL 协议，当你出现了一个新型的数据库的时候，用户使用它是有成本的。大家都知道作为开发很讨厌的一个事情就是，我要每个语言都写一个 Driver，比如说你要支持 C++，你要支持 Java，你要支持 Go 等等，这个太累了，而且用户还得改他的程序，所以我们选择了一个更加好的东西兼容 MySQL 协议，让用户可以不用改。一会我会用一个视频来演示一下，为什么一行代码不改就可以用，用户就能体会到 TiDB 带来的所有的好处。\n\n![Architecture Overview Logical](https://img1.www.pingcap.com/prod/3_d016b09513.png)\n\n<div class=\"caption-center\">Architecture Overview Logical</div>\n\n这个图实际上是整个协议栈或者是整个软件栈的实现。大家可以看到整个系统是高度分层的，从最底下开始是 RocksDB ，然后再上面用 Raft 构建一层可以被复制的 RocksDB，在这一层的时候它还没有 Transaction，但是整个系统现在的状态是所有写入的数据一定要保证它复制到了足够多的副本。也就是说只要我写进来的数据一定有足够多的副本去 cover 它，这样才比较安全，在一个比较安全的 Key-value store 上面， 再去构建它的多版本，再去构建它的分布式事务，然后在分布式事务构建完成之后，就可以轻松的加上 SQL 层，再轻松的加上 MySQL 协议的支持。然后，这两天我比较好奇，自己写了 MongoDB 协议的支持，然后我们可以用 MongoDB 的客户端来玩，就是说协议这一层是高度可插拔的。TiDB 上可以在上面构建一个 MongoDB 的协议，相当于这个是构建一个 SQL 的协议，可以构建一个 NoSQL 的协议。这一点主要是用来验证 TiKV 在模型上面的支持能力。\n\n![TiKV 架构图](https://img1.www.pingcap.com/prod/4_4ec2b016cf.png)\n\n<div class=\"caption-center\">TiKV 架构图</div>\n\n这是整个 TiKV 的架构图，从这个看来，整个集群里面有很多 Node，比如这里画了四个 Node，分别对应了四个机器。每一个 Node 上可以有多个 Store，每个 Store 里面又会有很多小的 Region，就是说一小片数据，就是一个 Region 。从全局来看所有的数据被划分成很多小片，每个小片默认配置是 64M，它已经足够小，可以很轻松的从一个节点移到另外一个节点，Region 1 有三个副本，它分别在 Node1、Node 2 和 Node4 上面， 类似的Region 2，Region 3 也是有三个副本。每个 Region 的所有副本组成一个 Raft Group, 整个系统可以看到很多这样的 Raft groups。\n\nRaft 细节我不展开了，大家有兴趣可以找我私聊或者看一下相应的资料。\n\n因为整个系统里面我们可以看到上一张图里面有很多 Raft group 给我们，不同 Raft group 之间的通讯都是有开销的。所以我们有一个类似于 MySQL 的 group commit 机制 ，你发消息的时候实际上可以 share 同一个 connection ， 然后 pipeline + batch 发送, 很大程度上可以省掉大量 syscall 的开销。\n\n另外，其实在一定程度上后面我们在支持压缩的时候，也有非常大的帮助，就是可以减少数据的传输。对于整个系统而言，可能有数百万的 Region，它的大小可以调整，比如说 64M、128M、256M，这个实际上依赖于整个系统里面当前的状况。\n\n比如说我们曾经在有一个用户的机房里面做过测试，这个测试有一个香港机房和新加坡的机房。结果我们在做复制的时候，新加坡的机房大于 256M 就复制不过去，因为机房很不稳定，必须要保证数据切的足够小，这样才能复制过去。\n\n如果一个 Region 太大以后我们会自动做 SPLIT，这是非常好玩的过程，有点像细胞的分裂。\n\n然后 TiKV 的 Raft 实现，是从 etcd 里面 port 过来的，为什么要从 etcd 里面 port 过来呢？首先 TiKV 的 Raft 实现是用 Rust 写的。作为第一个做到生产级别的 Raft 实现，所以我们从 etcd 里面把它用 Go 语言写的 port 到这边。\n\n![TiKV 在 Raft 官网里的状态](https://img1.www.pingcap.com/prod/5_5ec138f2b7.png)\n\n<div class=\"caption-center\">TiKV 在 Raft 官网里的状态</div>\n\n这个是 Raft 官网上面列出来的 TiKV 在里面的状态，大家可以看到 TiKV 把所有 Raft 的 feature 都实现了。 比如说 Leader Election、Membership Changes，这个是非常重要的，整个系统的 scale 过程高度依赖 Membership Changes，后面我用一个图来讲这个过程。后面这个是 Log Compaction，这个用户不太关心。\n\n![细胞分裂图](https://img1.www.pingcap.com/prod/6_0cf4640663.png)\n\n<div class=\"caption-center\">细胞分裂图</div>\n\n这是很典型的细胞分裂的图，实际上 Region 的分裂过程和这个是类似的。\n\n我们看一下扩容是怎么做的。\n\n![Scale out](https://img1.www.pingcap.com/prod/7_7441bf6e43.png)\n\n<div class=\"caption-center\">Scale out</div>\n\n比如说以现在的系统假设，我们刚开始说只有三个节点，有 Region1 分别是在 1 、2、4，我用虚线连接起来代表它是 一个 Raft group ，大家可以看到整个系统里面有三个 Raft group，在每一个 Node 上面数据的分布是比较均匀的，在这个假设每一个 Region 是 64M ，相当于只有一个 Node 上面负载比其他的稍微大一点点。\n\n这是一个在线的视频。默认的时候，我们都是推荐 3 个副本或者 5 个副本的配置。Raft 本身有一个特点，如果一个 leader down 掉之后，其它的节点会选一个新的 leader，那么这个新的 leader 会把它还没有 commit 但已经 reply 过去的 log 做一个 commit ，然后会再做 apply，这个有点偏 Raft 协议，细节我不讲了。\n\n复制数据的小的 Region，它实际上是跨多个数据中心做的复制。这里面最重要的一点是永远不丢失数据，无论如何我保证我的复制一定是复制到 majority，任何时候我只要对外提供服务，允许外面写入数据一定要复制到 majority。很重要的一点就是恢复的过程一定要是自动化的，我前面已经强调过，如果不能自动化恢复，那么中间的宕机时间或者对外不可服务的时间，便不是由整个系统决定的，这是相对回到了几十年前的状态。\n\n## MVCC\n\nMVCC 我稍微仔细讲一下这一块。MVCC 的好处，它很好支持 Lock-free  的 snapshot read ，一会儿我有一个图会展示 MVCC 是怎么做的。isolation level 就不讲了，MySQL 里面的级别是可以调的，我们的 TiKV 有 SI，还有 SI+lock，默认是支持 SI 的这种隔离级别，然后你写一个 select for update 语句，这个会自动的调整到 SI 加上 lock 这个隔离级别。这个隔离级别基本上和 SSI 是一致的。还有一个就是 GC 的问题，如果你的系统里面的数据产生了很多版本，你需要把这个比较老的数据给 GC 掉，比如说正常情况下我们是不删除数据的， 你写入一行，然后再写入一行，不断去 update 同一行的时候，每一次 update 会产生新的版本，新的版本就会在系统里存在，所以我们需要一个 GC 的模块把比较老的数据给 GC 掉，实际上这个 GC 不是 Go 里面的GC，不是 Java 的 GC，而是数据的 GC。\n\n![数据版本](https://img1.www.pingcap.com/prod/8_461480d746.png)\n\n<div class=\"caption-center\">数据版本</div>\n\n这是一个数据版本，大家可以看到我们的数据分成两块，一个是 meta，一个是 data。meta 相对于描述我的数据当前有多少个版本。大家可以看到绿色的部分，比如说我们的 meta key 是 A，keyA 有三个版本，是 A1、A2、A3，我们把 key 自己和 version 拼到一起。那我们用 A1、A2、A3 分别描述 A 的三个版本，那么就是 version 1/2/3。meta 里面描述，就是我的整个 key 相对应哪个版本，我想找到那个版本。比如说我现在要读取 key A 的版本 10，但显然现在版本 10 是没有的，那么小于版本 10 最大的版本是 3，所以这时我就能读取到 3，这是它的隔离级别决定的。关于 data，我刚才已经讲过了。\n\n## 分布式事务模型\n\n接下来是分布式事务模型，其实是基于 Google Percolator，这是 Google 在 2006 发表的一篇论文，是 Google 在做内部增量处理的时候发现了这个方法，本质上还是二阶段提交的。这使用的是一个乐观锁，比如说我提供一个 transaction ，我去改一个东西，改的时候是发布在本地的，并没有马上 commit 到数据存储那一端，这个模型就是说，我修改的东西我马上去 Lock 住，这个基本就是一个悲观锁。但如果到最后一刻我才提交出去，那么锁住的这一小段的时间，这个时候实现的是乐观锁。乐观锁的好处就是当你冲突很小的时候可以得到非常好的性能，因为冲突特别小，所以我本地修改通常都是有效的，所以我不需要去 Lock ，不需要去 roll back 。本质上分布式事务就是 2PC 或者是 2+xPC，基本上没有 1PC，除非你在别人的级别上做弱化。比如说我允许你读到当前最新的版本，也允许你读到前面的版本，书里面把这个叫做幻读。如果你调到这个程度是比较容易做 1PC 的，这个实际上还是依赖用户设定的隔离级别的，如果用户需要更高的隔离级别，这个 1PC 就不太好做了。\n\n这是一个路由，正常来讲，大家可能会好奇一个 SQL 语句怎么最后会落到存储层，然后能很好的运行，最后怎么能映射到 KV 上面，又怎么能路由到正确的节点，因为整个系统可能有上千个节点，你怎么能正确路由到那一个的节点。我们在 TiDB 有一个 TiKV driver ， 另外 TiKV 对外使用的是 Google Protocol Buffer 来作为通讯的编码格式。\n\n## Placement Driver\n\n来说一下 Placement Driver 。Placement Driver 是什么呢？整个系统里面有一个节点，它会时刻知道现在整个系统的状态。比如说每个机器的负载，每个机器的容量，是否有新加的机器，新加机器的容量到底是怎么样的，是不是可以把一部分数据挪过去，是不是也是一样下线， 如果一个节点在十分钟之内无法被其他节点探测到，我认为它已经挂了，不管它实际上是不是真的挂了，但是我也认为它挂了。因为这个时候是有风险的，如果这个机器万一真的挂了，意味着你现在机器的副本数只有两个，有一部分数据的副本数只有两个。那么现在你必须马上要在系统里面重新选一台机器出来，它上面有足够的空间，让我现在只有两个副本的数据重新再做一份新的复制，系统始终维持在三个副本。整个系统里面如果机器挂掉了，副本数少了，这个时候应该会被自动发现，马上补充新的副本，这样会维持整个系统的副本数。这是很重要的 ，为了避免数据丢失，必须维持足够的副本数，因为副本数每少一个，你的风险就会再增加。这就是 Placement Driver 做的事情。\n\n同时，Placement Driver 还会根据性能负载，不断去 move 这个 data 。比如说你这边负载已经很高了，一个磁盘假设有 100G，现在已经用了 80G，另外一个机器上也是 100G，但是他只用了 20G，所以这上面还可以有几十 G 的数据，比如 40G 的数据，你可以 move 过去，这样可以保证系统有很好的负载，不会出现一个磁盘巨忙无比，数据已经多的装不下了，另外一个上面还没有东西，这是 Placement Driver 要做的东西。\n\nRaft 协议还提供一个很高级的特性叫 leader transfer。leader transfer 就是说在我不移动数据的时候，我把我的 leadership 给你，相当于从这个角度来讲，我把流量分给你，因为我是 leader，所以数据会到我这来，但我现在把 leader 给你，我让你来当 leader，原来打给我的请求会被打给你，这样我的负载就降下来。这就可以很好的动态调整整个系统的负载，同时又不搬移数据。不搬移数据的好处就是，不会形成一个抖动。\n\n## MySQL Sharding\n\nMySQL Sharding 我前面已经提到了它的各种天花板，MySQL Sharding 的方案很典型的就是解决基本问题以后，业务稍微复杂一点，你在 sharding 这一层根本搞不定。它永远需要一个 sharding key，你必须要告诉我的 proxy，我的数据要到哪里找，对用户来说是极不友好的，比如我现在是一个单机的，现在我要切入到一个分布式的环境，这时我必须要改我的代码，我必须要知道我这个 key ，我的 row 应该往哪里 Sharding。如果是用 ORM ，这个基本上就没法做这个事情了。有很多 ORM 它本身假设我后面只有一个 MySQL。但 TiDB 就可以很好的支持，因为我所有的角色都是对的，我不需要关注 Sharding、分库、分表这类的事情。\n\n这里面有一个很重要的问题没有提，我怎么做 DDL。如果这个表非常大的话，比如说我们有一百亿吧，横跨了四台机器，这个时候你要给它做一个新的 Index，就是我要添加一个新的索引，这个时候你必须要不影响任何现有的业务，实际上这是多阶段提交的算法，这个是 Google 和 F1 一起发出来那篇论文。\n\n简单来讲是这样的，先把状态标记成 delete only ，delete only 是什么意思呢？因为在分布式系统里面，所有的系统对于 schema 的视野不是一致的，比如说我现在改了一个值，有一部分人发现这个值被改了，但是还有一部分人还没有开始访问这个，所以根本不知道它被改了。然后在一个分布系统里，你也不可能实时通知到所有人在同一时刻发现它改变了。比如说从有索引到没有索引，你不能一步切过去，因为有的人认为它有索引，所以他给它建了一个索引，但是另外一个机器他认为它没有索引，所以他就把数据给删了，索引就留在里面了。这样遇到一个问题，我通过索引找的时候告诉我有， 实际数据却没有了，这个时候一致性出了问题。比如说我 count 一个 email 等于多少的，我通过 email 建了一个索引，我认为它是在，但是 UID 再转过去的时候可能已经不存在了。\n\n比如说我先标记成 delete only，我删除它的时候不管它现在有没有索引，我都会尝试删除索引，所以我的数据是干净的。如果我删除掉的话，我不管结果是什么样的，我尝试去删一下，可能这个索引还没 build 出来，但是我仍然删除，如果数据没有了，索引一定没有了，所以这可以很好的保持它的一致性。后面再类似于前面，先标记成 write only 这种方式, 连续再迭代这个状态，就可以迭代到一个最终可以对外公开的状态。比如说当我迭代到一定程度的时候，我可以从后台 build index ，比如说我一百亿，正在操作的 index 会马上 build，但是还有很多没有 build index ，这个时候后台不断的跑 map-reduce 去 build index ，直到整个都 build 完成之后，再对外 public ，就是说我这个索引已经可用了，你可以直接拿索引来找，这个是非常经典的。在这个 Online, Asynchronous Schema Change in F1 paper 之前，大家都不知道这事该怎么做。\n\nProxy Sharding 的方案不支持分布式事务，更不用说跨数据中心的一致性事务了。 TiKV 很好的支持 transaction，刚才提到的 Raft 除了增加副本之外，还有 leader transfer，这是一个传统的方案都无法提供的特性。以及它带来的好处，当我瞬间平衡整个系统负载的时候，对外是透明的， 做 leader transfer 的时候并不需要移动数据, 只是个简单的 leader transfer 消息。\n\n然后说一下如果大家想参与我们项目的话是怎样的过程，因为整个系统是完全开源的，如果大家想参与其中任何一部分都可以，比如说我想参与到分布式 KV，可以直接贡献到 TiKV。TiKV 需要写 Rust，如果大家对这块特别有激情可以体验写 Rust 的感觉 。\n\nTiDB 是用 Go 写的，Go 在中国的群众基础是非常多的，目前也有很多人在贡献。整个 TiDB 和TiKV 是高度协作的项目，因为 TiDB 目前还用到了 etcd，我们在和 CoreOS 在密切的合作，也特别感谢 CoreOS 帮我们做了很多的支持，我们也为 CoreOS 的 etcd 提了一些 patch。同时，TiKV 使用 RocksDB ，所以我们也为 RocksDB 提了一些 patch 和 test，我们也非常感谢 Facebook RocksDB team 对我们项目的支持。\n\n另外一个是 PD，就是我们前面提的 Placement Driver，它负责监控整个系统。这部分的算法比较好玩，大家如果有兴趣的话，可以去自己控制整个集群的调度，它和 k8s 或者是 Mesos 的调度算法是不一样的，因为它调度的维度实际上比那个要更多。比如说磁盘的容量，你的 leader 的数量，你的网络当前的使用情况，你的 IO 的负载和 CPU 的负载都可以放进去。同时你还可以让它调度不要跨一个机房里面建多个副本。","date":"2016-10-01","author":"刘奇","fillInMethod":"writeDirectly","customUrl":"how-do-we-build-tidb","file":null,"relatedBlogs":[]},{"id":"Blogs_201","title":"演讲实录 | 黄东旭：分布式数据库模式与反模式","tags":["TiDB","分布式数据库"],"category":{"name":"观点洞察"},"summary":"日前，PingCAP 联合创始人兼 CTO 黄东旭在「2016中国数据分析师行业峰会(CDAS)」 “数据库与技术实战”分论坛上，分享了《分布式数据库模式与反模式》的主题演讲。本文为演讲实录。","body":"我叫黄东旭，是 PingCAP 的联合创始人兼 CTO，也是本场论坛的主持人。我原来在 MSRA，后来到了网易、豌豆荚。跟在座的大部分数据分析师不太一样的是，我是一个数据库开发，虽然是 CTO，但是还在写代码。\n\n同时，我也是一些用的比较广泛的分布式的开源软件的作者。比如说我们做的 TiDB、TiKV 这些大型的分布式关系型数据库的项目。\n\n我们现在正在做一个 OLTP 的数据库，主要 focus 在大数据的关系型数据库的存储和可扩展性，还有关系的模型，以及在线交易型数据库上的应用。\n\n所以，今天整个数据库的模式和反模式，我都会围绕着如何在一个海量的并发，海量的数据存储的容量上，去做在线实时的数据库业务的一些模式来讲。并从数据库的开发者角度，来为大家分享怎样写出更加适合数据库的一些程序。\n\n## 基础软件的发展趋势\n\n一开始我先简单介绍一下，现在我认为的一些基础软件上的发展趋势。\n\n### 开源\n\n第一点，开源是一个非常大的趋势。大家可以看到一些比较著名的基础软件，基本都是开源的，比如 Docker，比如 k8s。甚至在互联网公司里面用的非常多的软件，像 MySQL、Hadoop 等这种新一代的大数据处理的数据库等基础软件，也大多是开源的。其实这背后的逻辑非常简单：在未来其实你很难去将你所有的技术软件都用闭源, 因为开源会慢慢组成一个生态，而并不是被某一个公司绑定住。比如国家经常说去 IOE，为什么？很大的原因就是基本上你的业务是被基础软件绑死的，这个其实是不太好的一个事情。而且现在跟过去二十年前不一样，无论是开源软件的质量，还是社区的迭代速度，都已经是今非昔比，所以基本上开源再也不是低质低量的代名词，在互联网公司已经被验证很多次了。\n\n### 分布式\n\n第二，分布式会渐渐成为主流的趋势。这是为什么？这个其实也很好理解，因为随着数据量越来越大，大家可以看到，随着现在的硬件发展，我感觉摩尔定律有渐渐失效的趋势。所以单个节点的计算资源或者计算能力，它的增长速度是远比数据的增长速度要慢的。在这种情况下，你要完成业务，存储数据，要应对这么大的并发，只有一种办法就是横向的扩展。横向的扩展，分布式基本是唯一的出路。scale-up  和 scale-out 这两个选择其实我是坚定的站在 scale-out 这边。当然传统的关系数据库都会说我现在用的 Oracle，IBM DB2，他们现在还是在走 scale-up  的路线，但是未来我觉得 scale-out 的方向会渐渐成为主流。\n碎片化\n\n### 碎片化\n\n第三，就是整个基础软件碎片化。现在看上去会越来越严重。但是回想在十年前、二十年前，大家在写程序的时候，我上面一层业务，下面一层数据库。但是现在你会发现，随着可以给你选择的东西越来越多，可以给你在开源社区里面能用到的组件越来越多，业务越来越复杂，你会发现，像缓存有一个单独的软件，比如 redis，队列又有很多可以选择的，比如说  zeromq, rabbitmq, celery 各种各样的队列；数据库有 NoSQL、HBase，关系型数据库有 MySQL 、PG 等各种各样的基础软件都可以选。但是就没有一个非常好东西能够完全解决自己的问题。所以这是一个碎片化的现状。\n\n### 微服务\n\n第四，是微服务的模式兴起。其实这个也是最近两年在软件架构领域非常火的一个概念。这个概念的背后思想，其实也是跟当年的 SOA 是一脉相承的。就是说一个大的软件项目，其实是非常难去 handle 复杂度的，当你业务变得越来越大以后，维护成本和开发成本会随着项目的代码量呈指数级别上升的。所以现在比较流行的就是，把各个业务之间拆的非常细，然后互相之间尽量做到无状态，整个系统的复杂度可以控制，是由很多比较简单的小的组件组合在一起，来对外提供服务的。\n\n这个服务看上去非常美妙，一会儿会说有什么问题。最典型的问题就是，当你的上层业务都拆成无状态的小服务以后，你会发现原有的逻辑需要有状态的存储服务的时候你是没法拆的。我所有的业务都分成一小块，每一小块都是自己的数据库或者数据存储。比如说一个简单的 case，我每一个小部分都需要依赖同一个用户信息服务，这个信息服务会变成整个系统的一个状态集中的点，如果这个点没有办法做弹性扩展或者容量扩展的话，就会变成整个系统很致命的单点。\n\n所以现在整个基础软件的现状，特别在互联网行业是非常典型的几个大的趋势。我觉得大概传统行业跟互联网行业整合，应该在三到五年，这么一个时间。所以互联网行业遇到的今天，可能就是传统行业，或者其他的行业会遇到的明天。所以，通过现在整个互联网里面，在数据存储、数据架构方面的一些比较新的思想，我们就能知道如何去做这个程序的设计，应对明天数据的量级。\n\n## 现有存储系统的痛点\n\n其实今天主要的内容是讲存储系统，存储系统现在有哪些痛点？其实我觉得在座的各位应该也都能切身的体会到。\n\n### 弹性扩展\n\n首先，大数据量级下你如何实现弹性扩展？因为我们今天主要讨论的是 OLTP ，是在线的存储服务，并不是离线分析的服务。所以在线的存储服务，它其实要做到的可用性、一致性，是要比离线的分析业务强得多的。但是在这种情况下，你们怎样做到业务无感知的弹性扩展，你的数据怎么很好的满足现有的高并发、大吞吐，还有数据容量的方案。\n\n### 可用性\n\n第二，在分布式的存储系统下，你的应用的可用性到底是如何去定义，如何去保证？其实这个也很好理解，因为在大规模的分布式系统里面，任何一个节点，任何一个数据中心或者支架都有可能出现硬件的故障，软件的故障，各种各样的故障，但这个时候你很多业务是并没有办法停止，或者并没有办法去容忍 Down time 的。所以在一个新的环境之下，你如何对你系统的可用性做定义和保证，这是一个新的课题。一会儿我会讲到最新的研究方向和成果。\n\n### 可维护性\n\n第三，对于大规模的分布式数据库来说它的可维护性，这个怎么办？可维护性跟单机的系统是明显不同的，因为单机的数据库，或者传统的单点的数据库，它其实做到主从，甚至做到一主多从，我去维护 master ，别让它挂掉，这个维护性主要就是维护单点。在一个大规模的分布式系统上，你去做这个事情是非常麻烦的。可以简单说一个案例，就是 Google 的 Spanner。Spanner 是 Google 内部的一个大规模分布式系统，整个谷歌内部只部署了一套，在生产环节中只部署了一套。这一套系统上有上万甚至上数十万的物理节点。但是整个数据库的维护团队，其实只有很小的一组人。想像一下，上十万台的物理节点，如果你要真正换一块盘、做一次数据恢复或者人工运维的话，这是根本不可能做到的事情。但是对于一个分布式系统来说，它的可维护性或者说它的维护应该是转嫁给数据库自己。\n\n### 开发复杂度\n\n还有，就是对于一个分布式数据库来说，它在开发业务的时候复杂度是怎么样的。大家其实可能接触的比较多的，像 Hbase、 Cassandra、Bigtable 等这种开源的实现，像 NoSQL 数据库它其实并没有一个很好的 cross-row transaction 的 support。\n\n另外，对于很多的 NoSQL 数据库并没有一个很好的 SQL 的 interface，这会让你写程序变得非常麻烦。比如说对于一些很普通的业务，一个表，我需要去 select from table，然后有一个fliter 比如一个条件大于 10，小于 100，这么简单的逻辑，如果在 HBase 上去做的话，你要写十行、二十行、三十行；如果你在一个关系的数据库，或者支持 SQL 的数据库，其实一行就搞定了。\n\n其实这个对于很多互联网公司来说，在过去的几年之内基本上已经完成了这种从 RDBMS 到 NoSQL 的改造，但是这个改造的成本和代价是非常非常高的。比如我原来的业务可能在很早以前是用 MySQL 已经写的稳定运行好久了，但是随着并发、容量、可扩展性的要求，我需要迁移 Bigtable、Hbase、Cassandra、MongoDB 这种 NoSQL 数据库上，这时基本上就要面临代码的完整重写。这个要放在互联网公司还可以，因为它们有这样的技术能力去保证迁移的过程。反正我花这么多钱，招这么牛的工程师，你要帮我搞定这个事情。但是对于传统的行业，或者传统的机构来说，这个基本上是不可能的事情。你不可能让他把原来用 Oracle 用SQL 的代码改成 NoSQL 的 code。\n\n因为 NoSQL 很少有跨行事务，首先你要做一个转账，你如果不是一个很强的工程师，你这个程序基本写不对，这是一个很大的问题。这也是为什么一直以来像这种 NoSQL 的东西并没有很好的在传统行业中去使用的一个最核心的原因，就是代价实在太大。\n\n## 存储系统的扩展模型\n\n所以其实在去讲这些具体到底该怎么解决，或者未来数据库会是什么样的之前，我想简单讲一下扩展的模型。对于一个关系型数据库也好，对于存储的系统本身也好，它的扩展模型有哪些。\n\n### Sharding 模式\n\n第一种模式是 Sharding 模式。如果在座的各位有运维过线上的 MySQL 的话，对这个模型会非常熟悉。最简单的就是分库、分表加中间件，就是说我不同的业务可能用不同的库，不同的表。当一个单表太大的时候，我通过一些 Cobar、Mycat 等这样的数据库中间件来去把它分发到具体的数据库的实例上。这种模型是目前用的最普遍的模型，它其实也解决了很大部分的问题。为什么这十年在关系型数据库上并没有很好的扩展方案，但是大家看上去这种业务还没有出现死掉的情况，就是因为后面有各种各样 Sharding 的中间件或者分库分表这种策略在硬扛着。像这种中间件 Sharding 第一个优势就是实现非常简单。你并不需要对数据库内做任何的改造，你也并不需要去比如说从你原来的 SQL 代码转到 NoSQL 的代码。\n\n**但是它也有自己的缺点。首先，对你的业务层有很强的侵入性。** 这是没有办法的，比如你想用一个中间件，你就需要给它指定一个 Sharding key。另外，原来比如你的业务有一些 join ,有一些跨表跨行的事务，像这种事务你必须得改掉，因为很多中间件并没有办法支持这个跨 shard 的分布式 join。\n**第二个比较大的缺陷是它的分片基本是固定的，自动化程度、扩展性都非常，** 你必须得有一个专职的 DBA 团队给你的 MySQL 或者 PG 的  Sharding 的集群去做运维。我之前在豌豆荚做过一段时间 MySQL cluster  的分片的维护工作。当时我记得是一个 16 个节点的 MySQL 的集群，我们需要扩展到 32 个节点的规模，整整提前演练了一个月，最后上线了一个礼拜。上线那个礼拜，晚上基本上没有办法睡觉，所以非常痛苦。\n\n再说一个 Google 的事情，Google 在刚才我说的 Spanner 和 F1 这两个数据库没有上线之前，Google 的广告系统的业务是由 100 多个节点的 MySQL 的集群对外提供服务的。如 Google 这么牛的公司，在维护一百多个节点的 MySQL Sharding 的数据库的时候，都已经非常痛苦，宁可重新去写一个数据库，也不想去维护这个 database cluster。其实大家可以看到，像这种 Sharding 的方案，它比较大的问题就是它的维护代价或者维护集群的复杂度，并不是随着节点数呈线性增长，而是随着节点的增加非线性的增长上去。比如你维护 2 个节点的还好，维护 4 个节点的也还可以，但是你维护 16 个、64 个、128 个基本就是不可能的事情。\n\n**第三**就是一些复杂的查询优化，并没有办法在中间件这一层，去帮你产生一个足够优化的执行计划，因此，对于一些复杂查询来说，Sharding 的方案是没法做的。所以对你的业务层有很高的要求。\n\n这是一种思路，是目前来说互联网公司里边用的最多的一种 MySQL 或者 PG 这种关系型数据库的扩展方案。\n\n### Region Base 模型\n\n第二种扩展模型是 Region Base。这张图是我项目里面扒出来的图。\n\n![Region Base](https://img1.www.pingcap.com/prod/1_de6b313640.png)\n\n<div class=\"caption-center\">Region Base</div>\n\n它整个思路有点像 Bigtable，它相当于把底下的存储层分开，数据在最底层存储上已经没有表、行这样结构的划分，每一块数据都由一个固定的 size 比如 64 M、128 M 连续的 Key-value pairs 组成。其实这个模型背后最早的系统应该是谷歌在 06 年发表的 Bigtable 这篇论文里面去描述的。这个模型有什么好处呢？一是它能真正实现这种弹性的扩展。第二个，它是一个真正高度去中心化。去中心化这个事情，对于一个大的 Cluster 来说是一个非常重要的特性。\n\n**还有一个优势，在 KV 层实现真正具有一定的自动 Failover 的能力。** Failover指的是什么呢？比如说在一个集群比较大的情况下，或者你是一个 cluster ，你任何一个节点，任何一个数据损坏，如果能做到业务端的透明，你就真正实现了 Auto-Failover 的能力。其实在一些对一致性要求不那么高的业务里面，Auto-Failover 就是指， 比如在最简单的一个 MySQL 组从的模型里，当你的组挂掉了以后，我监控的程序自动把 slave  提上来，这也是一种 Failover 的方式。但是这个一致性或者说数据的正确性并不能做到很好的保证。你怎么做到一致性的 Auto-Failover，其实背后需要做非常非常多的工作。\n\n这是 Region 模型的一些优势。**但是它的劣势也同样明显，这种模型的实现非常复杂。** 我一会儿会说到背后的关键技术和理论，但是它比起写中间件真的复杂太多了。你要写一个能用的 MySQL 或者 PG 的中间件，可能只需要一两个工程师，花一两周的时间就能写出一个能用的数据库中间件；但是你如果按照这个模型做一个弹性扩展的数据库的话，你的工作量就会是数量级的增加。\n\n**第二个劣势就是它业务层的兼容性。** 像 Region Base 的模型，最典型的分布式存储系统就是 HBase。HBase 它对外的编程接口和 SQL 是千差万别，因为它是一个 Key Value 的数据库。你的业务层的代码兼容性都得改，这个对于一些没有这么强开发能力的用户来说，是很难去使用的，或者它说没有 SQL 对于用户端这么友好。\n\n## 可用性级别\n\n我一会儿会讲一下，刚才我们由 Region Base 这个模型往上去思考的一些东西，在此之前先说一些可用性。高可用。其实说到高可用这个词，大多数的架构师都对它非常熟悉。我的系统是高可用的，任何一个节点故障业务层都不受影响，但是真的不受影响吗？我经过很多的思考得到的一个经验就是主从的模型是不可能保证同时满足强一致性和高可用性的。可能这一点很多人觉得，我主从，我主挂了，从再提起来就好，为什么不能保护这个一致性呢？就是因为在一个集群的环境下，有一种故障叫脑裂。脑裂是什么情况？整个集群是全网络联通的，但是出现一种情况，就是我只是在集群内部分成了两个互不联通的一个子集。这两个子集又可以对外提供服务，其实这个并不是非常少见的状况，经常会发生。像这种情况，你贸然把 slave 提起来，相当于原来的 master 并没有完全的被 shutdown，这个时候两边可能都会有读写的情况，造成数据非常严重的不一致，当然这个比较极端了。所以你会发现阿里或者说淘宝，年年都在说我们有异地多活。但是去年甚至前几个月，杭州阿里的数据中心光纤被挖断，支付宝并没有直接切到重复层，而是宁可停止服务，完全不动，也不敢把 slave 数据中心提起来。所以其实任何基于主从模型的异地多活方案都是不行的。这个问题有没有办法解决呢？其实也是有的。\n\n还是说到 Google，我认为它才是全世界最大的数据库公司，因为它有全世界最大的数据量。你从来没有听说过 Google 哪一个业务因为哪一个数据中心光纤挖断，哪一个磁盘坏了而对外终止服务的，几乎完全没有。因为 Google 的存储系统大多完全抛弃了基于主从的一致性模型。它的所有数据都不是通过主从做复制的，而是通过类似 Raft 或者 Paxos 这种分布式选举的算法做数据的同步。这个算法的细节不展开了，总体来说是一个解决在数据的一致性跟自动的数据恢复方面的一个算法。同时，它的 latency 会比多节点强同步的主从平均表现要好的一个分布式选举的算法。\n\n在 Google 内部其实一直用的 Paxos，它最新的 Spanner 数据库是用 Paxos 做的 replication 。在社区里面，跟 Paxos 等价的一个算法就是 Raft。Raft 这个算法的性能以及可靠性都是跟 Paxos 等价的实现。这个算法就不展开了。我认为这才是新一代的强一致的数据库应该使用的数据库复制模型。\n\n## 分布式事务\n\n说到事务。对于一个数据库来说，我要做传统的关系型数据库业务，事务在一个分布式环境下，并不像单机的数据库有这么多的方法，这么多的优化。其实在分布式事务这个领域只有一种方法，并且这么多年了从分布式事务开始到现在，在这个方法上并没有什么突破，基本只有一条出路就是两阶段提交。其实可以看一下 Google 的系统。对于我们做分布式系统的公司来说，Google 就是给大家带路的角色。Google 最新的数据库系统上它使用的分布式事务的方法仍然是两阶段提交。其实还有没有什么优化的路呢？其实也是有的。两阶段提交最大的问题是什么呢？一个是延迟。因为第一阶段先要把数据发过去，第二阶段要收到所有参与的节点的 response 之后你才能去 commit 。这个过程，相当于你走了很多次网络的 roundtrip，latency  也会变得非常高。所以其实优化的方向也是有的，但是你的 latency 没法优化，只能通过吞吐做优化，就是 throughput 。比如说我在一万个并发的情况下，每个用户的  latency 是 100  毫秒，但是一百万并发，一千万并发的时候，我每个用户的 latency 还可以是 100 毫秒，这在传统的单点关系型数据库上，是没有办法实现的。第二就是去中心化的事务管理器。另外没有什么东西是银弹，是包治百病的，你要根据你的业务的特性去选择合适的一致性算法。\n\n## NewSQL\n\n其实刚刚这些 pattern 会发展出一个新的类别，我们能不能把关系数据库上的一些 SQL、Transaction 跟 NoSQL 跟刚才我说到的 Region Base 的可扩展的模型融合起来。这个思想应该是在 2013 年左右的时候，学术界提出来比较多的东西，NewSQL。NewSQL 首先要解决 Scalability 的问题， 刚给我们说过 scalability 是一个未来的数据库必须要有的功能，第二个就是 SQL，SQL 对于业务开发者来说是很好的编程的接口。第三，ACID Transaction，我希望我的数据库实现转帐和存钱这种强一致性级别的业务。第四，就是整个 cluster 可以支持无穷大的数据规模，同时任何数据节点的宕机、损坏都需要集群自己去做监控，不需要 DBA 的介入。\n\n## 案例：Google Spanner / F1\n\n有没有这样的系统？其实有的。刚才一直提到 Google 的 Spanner 系统。Spanner 系统是在 2012 年底于 OSDI  的会议上发布了论文； F1 这篇论文在 2013 年的 VLDB 发布的，去描述了整个 Google 内部的分布式关系型数据库的实现。首先，根据 Spanner 的论文 Spanner 和  F1 在生产环境只有一个部署，上万物理节点遍布在全球各种数据中心内，通过 Paxos 进行日志复制。第二，整个架构是无状态的 SQL 层架在一个 NoSQL 的基础之上。第三，它对外提供的是一个跨行事务的语义，这个跨行事务是透明的跨行事务，我不需要对我的业务层做修改，它是通过 一个硬件支持的 Truetime API，GPS 时钟和原子钟去实现事务的隔离级别。这个系统是最早用来支撑 Google 的在线广告业务，在线广告业务大家知道，其实对于扣费、广告计费、点击记录，广告活动等一致性的级别要求非常高。首先这个钱不能多扣，也不能少扣，实时性要求非常高。而且业务逻辑相当复杂，这个时候需要一个 SQL 数据库，需要一个支持事务的数据库，需要一个支持 Auto-Failover 的数据库，所以就有了 Google Spanner/F1 这个系统。\n\n## 典型业务场景\n\n最典型的业务场景是什么呢？对于这种高吞吐、大容量的数据量级对于 NoSQL 系统来说，典型的应用的 Pattern 就是高吞吐大容量，还有就是 Workload 相对比较分散的情况。比较典型的反例是秒杀，秒杀这个场景其实非常不适合这种 NewSQL。另外就是一致性、可用性和 latency 之间怎么做取舍。在这种分布式数据库上面，第一个要丢弃的就是延迟，在这么大规模的量级上做强一致性，延迟是首先是不能保证的。你去看谷歌的 F1 和 Spanner 的论文里面，它提到它们的 latency 基本都是 10 毫秒、20 毫秒、甚至50 毫秒、100 毫秒的量级，但是它并不会太关心 latency 。因为它必须保证通过 Paxos 去做跨机房、多机房的复制，光速你肯定没法超越，所以这个时间是省不了的，它整个系统是面向吞吐设计的，而不是面向低延迟设计的，但是它要求非常强的一致性。\n\n### MySQL Sharding\n\n一个典型的场景就是替换 MySQL Sharding 的业务。它的业务典型的特点，就是高吞吐，海量并发的小事务，并不是特别大的 transection，模型也相对简单，没有复杂的 join 的程序。但是痛点刚才提到了非常明显，首先就是对于 MySQL Sharding 方案 scale 能力很差，对于表结构变更的方案并没有太多；再者，cross shard transaction，目前 Sharding 的方案并没有办法很好支持，但 NewSQL 面向的场景和 MySQL Sharding 面向的场景是非常的像的。\n\n### Cross datacenter HA\n\n第二种场景是 Cross datacenter HA（跨数据中心多活），这种场景简直是数据开发者追求的圣杯。因为像 Oracle、DB2，它在最关键，最核心的业务上，比如说像银行这种业务，它必须要求实现这种跨数据中心的高可用。但是在一个分布式的数据库上，或者说是 Open-source solution 里，有没有人有办法实现这个 Cross datacenter HA 呢？完全没有。目前来说并没有任何一个数据库能去解决这个问题。因为刚才提到了主从的模型根本是不可靠的。像这种业务的数据极端的重要，任何一点数据的丢失都不能容忍。另外即使整个数据中心宕机也不能影响线上的业务，很典型的像支付宝，这种涉及钱相关的，甚至有些比如你的银行卡，你肯定不能容忍说你吃完饭，告诉你不好意思数据中心挂了，你的钱我刷不了。但是并没有开源的数据库能解决这个问题，如果你真的自己做同步复制的方案的话，特别两地三中心的情况，你请求的延迟是取决于离你最远的数据中心，所以大部分业务来说延迟过大。 另外就是这些系统重度依赖人工运维。我认为一旦任何系统有人工的介入一定是会出错的。因为人是最难自动化的一个因素。\n\n## 反模式\n\n### 滥用传统关系模型\n\n对于这种大规模的分布式 NewSQL 来说，比较大的反模式就是，大量的使用存储过程 foreign  key，视图等操作。因为首先存储过程是没有办法 scale 的。另外，大表与大表的 JOIN ，在线上的 OLTP 数据库上最大的开销并不是优化器的开销，而是网络通信的开销。比如两个表去做一个笛卡儿积，算起来可能并不是这么慢，但是要把数据一条一条在网络中传输代价是非常大的，这种情况下用 OLAP 的数据库是比较适合。\n没有利用好并发\n\n### 没有利用好并发\n\n刚才我一直强调对于新型的 OLTP 或者分布式关系型数据库来说，并发或者说吞吐才是应该追求的优化点。在架构设计时，不应该把对延迟非常敏感的业务去使用分布式数据库来实现。所以其实在延迟跟吞吐之间，数据库永远去选择吞吐。所以写程序会遇到的一个很典型的问题，就是我的查询是一行一行，上下之间有这种强依赖关系的模式。其实在这种模式下，对于分布式关系型数据库来说是非常不合适的。所以你应该用并发的思想去做，比如说我的请求，我可以把吞吐打到整个集群上，我的 Database，我的 cluster 会自动 balance 一些 workload，如果一行行查询之间是有依赖的话，那么每一条查询之间的 latency 是会叠加起来。所以这个其实并不是一个太好的 pattern。\n\n### 不均匀的设计\n\n数据库其实经常会被大家滥用。比如说我看到很多传统行业数据库使用的方法，其实真的是非常痛苦。无论什么业务我全都直接上 Oracle，不管这个业务是否真的需要 Database 来去支持；比如有人用 MySQL 做计数器，有些有 MySQL 做队列或者做秒杀，这个并不是太 scale 的东西。特别像秒杀的业务，特别高的并发打到同一个 key 上，workload 没办法去分拆到好多个节点来帮你去处理，所以整个分布式的集群就会退化成一个单点，这是非常不合理的。第二，当你的索引设计的不太好的时候，涉及到的过多全表扫描是非常不划算的。刚刚也说过，在一个分布式集群里面，最大的开销是网络的开销，你做全表扫描的时候并不是在一台机器上，而是在好多机器上做全表扫描，同时经过很大的网络传输，当你的索引设计不合理的时候会出现这样的问题。还有是过多的无效索引，会导致整个系统在写入的时候有延迟也好或者吞吐也好，会变得更慢。主要注意的就是不要存在任何可以把你的系统退化成单点的机会。\n\n### 错误的一致性模型\n\n还有一种最容易犯的问题，就是在没有好好思考你的业务适合的场景情况下，就去使用很强的一致性模型。因为当你要求一个非常高的强一致性的时候，你的分布式事务的 latency 一定比不这么强的一致性的业务要高得多的。其实，很多业务并不需要那么强的一致性，我的数据库虽然给你了这个能力，但如果你去滥用的话，你会说这个数据库好慢，或者为什么我这个请求100 毫秒才给我返回。但其实很多场景下，你并不是这么强的依赖强一致性 。这个跟数据库本身提不提供这个机制是没有关系的。作为一个 Database 开发者来说，我还是需要给你能实现这个功能的机制，但是不要滥用。\n\n另外根据你业务的冲突的频繁程度选择不同的锁策略。你知道这个业务就是一个很高的冲突的场景，比如说可能像类似发工资，一个集团的账号发到成千上万的小账号。如果你是一个乐观事务的话，可能涉及到的冲突就会很大。因为所有的事务的发起者都要去修改这个公共账号，这种情况下一般可以使用悲观事务，因为你已经预知到你业务的 conflict 级别会很高。但当我知道我的业务的冲突很小，我要追求整个系统的吞吐，我可能会选用乐观的事务的模型。\n\n我的演讲就到这儿，谢谢。\n\n## Q&A\n\n### 提问：您好，我简单问一下对于秒杀这个场景，什么样的数据库设计是合适的？\n\n黄东旭：其实秒杀这个业务是一个比较系统的工程，并不是一个简单的我用什么数据库就可以做的东西。我之前给一些朋友做秒杀的架构设计的时候，从最上层，甚至你可能从 JS 这边就要去做排队，一层一层的排队。比如在缓存这边我可以用 redis，我可以用一些缓存的数据库再去进行二级的排队，因为每一次排队你都会丢掉很多，最后到底下的队列，在数据库这一层，比如库存就十个，你只要在前面放十个进来就行了。就是说，你在上层把流量用排队的方式做更好。最典型的例子就是大家看 12306 卖火车票的时候经常会有排队。基本没有什么数据库能去应对，像淘宝，像京东这种秒杀的业务，它从上到下是整个系统的过程。谢谢。\n\n### 提问：您好，我问一下，你说的是分布式的 OLTP 数据库，历史数据怎么清理，如果后续还需要分析数据的话。\n\n黄东旭：其实在谷歌 Spanner 包括像 TiDB 、TiKV 这个系统之上，是通过一种 MVCC 的技术，每一条数据都会有一个版本号。比如说你不停的 update，它可能会产生好多版本。我背后会有一个 GC 的逻辑，去选定一个 safe point，在这个 safe point 之前的所有数据全都删掉也好，还是挪到冷的存储上也好，我们是通过这种方式实现的。另外随着数据量的膨胀，整个系统设计的时候，我们是通过 Raft 算法，比如说这个数据慢慢长大，我会把它切成两块，再慢慢 Auto-balance 到其它的节点上，然后新的那一块会再长大......这相当于一个细胞一样，一个细胞分裂成两个细胞，成千上万的细胞会均匀的分布在整个集群里面。如果你要删数据可以直接删，如果你不想删的话，你的数据可以全都留下，你自己随便往集群里增加新的节点。这个集群很大，它会自动帮你把数据均匀的分到这儿。所有的历史数据是通过 GC 的模块把历史的版本拿出来，丢到冷的存储上。\n\n在 Google 几乎是完全不删数据的，因为存储的成本是很低的，但是数据未来说不定什么时候就用了。大概是这样，我需要有一个办法能把它存下来。\n\n### 提问：当前做的交易要使用历史的参考数据，可能量不是很大，有这样的例子吗？\n\n黄东旭：当然有。像 MVCC 在访问历史，它其实提供了一个 Lock-free 的 Snapshot Read, 它在读历史版本的时候是不会读线上的正在进行的读写事务，所以它是有一个无所读的机制，这也是为什么它要去采用每一个数据都要有版本号的机制去实现。它是有这个需求，而且在实现的时候也非常漂亮，不会阻塞其他的请求。\n\n### 提问：你们的 TiDB 是怎么考虑用 MySQL 或者 PG 的？当时是怎么考虑的？\n\n黄东旭：首先我们没有用 MySQL 或者 PG，刚才说的 TiDB 这个模型是谷歌的 Spanner 跟 F1 的模型。用传统的单机数据库做改造的话，有一个比较大的误区，整个 SQL 的查询优化器跟存储的数据结构，并不知道你底层是分布式的存储，它还是假设你生成 SQL 的方案都是单机的。比如最简单的例子，我需要去 count *，如果是一个单机的 MySQL 优化器，没有建索引的话会一行一行把数据拉过来计一个数，这样算下去；但是如果对一个分布式系统来说，我只要把 count * 这个逻辑推到所有存储表的数据节点上，算法再 reduce 回来就可以，更像一个 Mapreduce 这种分布式框架的 SQL 优化器。如果你没有从底到上完整的去实现 Database 的话，你很难对分布式的场景或者分布式数据存储的这些性质来去对数据库做优化。没有办法，这是一条很难的道路，但是我们也得去下走。","date":"2016-09-12","author":"黄东旭","fillInMethod":"writeDirectly","customUrl":"talk-tidb-pattern","file":null,"relatedBlogs":[]},{"id":"Blogs_135","title":"云时代数据库的核心特点","tags":["Database"],"category":{"name":"观点洞察"},"summary":"最近几年，随着云计算相关技术的发展，各种不同类型的云层出不穷，服务越来越多不同类型的企业业务，传统企业也渐渐开始探索上云的道路。在云上，作为业务最核心的数据库，相比之前的传统方案会有哪些变化呢？在正式聊云时代的数据库特点之前，我们需要了解一下目前云时代架构发生的变化","body":"## 引言\n\n最近几年，随着云计算相关技术的发展，各种不同类型的云层出不穷，服务越来越多不同类型的企业业务，传统企业也渐渐开始探索上云的道路。在云上，作为业务最核心的数据库，相比之前的传统方案会有哪些变化呢？在正式聊云时代的数据库特点之前，我们需要了解一下目前云时代架构发生的变化。\n\n畅想一下，未来的服务都跑在云端，任何的服务资源都可以像水电煤一样按需选购。从 IaaS 层的容器/虚拟机，到 PaaS 层的数据库，缓存和计算单元，再到 SaaS 层的不同类型的应用，我们只需要根据自身业务特点进行资源选配，再也不用担心应用服务支撑不住高速的业务增长，因为在云上一切都是弹性伸缩的。有了可靠的基础软件架构，我们就可以把更多精力放到新业务的探索，新模式的创新，就有可能产生更多不一样的新场景，从而催生更强大能力的云端服务，这是一件多么 cool 的事情。\n\n当然，理想要一步一步实现，未来的基础软件栈到底会怎样呢？社区在这方面正在进行积极地探索，其中最有代表性的就是基于容器（以 Docker 为代表）的虚拟化技术和微服务（Microservice）。\n\n在云时代，一切都应该是可伸缩的，使用 k8s（Kubernetes）在保证资源平衡的前提下，通过 Docker 部署我们依托于容器的微服务模块，我们不用关心服务到底跑在哪里，只需要关心我们需要多少服务资源。Docker 提供了极大的便利性，一次构建，到处运行，我们可以很好地解决开发、测试和上线的环境一致性问题。（如果不能很好地保证测试和实际上线环境的一致性，则很有可能需要花费远超过开发的时间去发现和修复问题。）k8s 更是在 Docker 构建的基础上增加了更多的云特性，包括 Docker 的升级，高可用和弹性伸缩等等。 关于 Docker/k8s 相关的讨论已经很多了，因为时间关系，关于具体的细节就不再展开。我们只需要了解，有了它，可以很轻松地解决服务的安装和部署。\n\n下面再聊聊微服务，微服务将一个服务拆分成相对独立的更小的子服务单元，不同的子服务单元之间通过统一的接口（HTTP/RPC 等）进行数据交互。\n\n相比于传统的解决方案，这种架构有很多的优点。\n\n - 更好的开发效率和可维护性。微服务将一个单独的服务进行更细力度的拆分，每一个子服务单元专注于更小的功能模块，可以更好地根据业务建立对应的数据模型，降低复杂度，使得开发变得更轻松，维护和部署变得更加友好.\n - 更好的可扩展性。每个不同的子服务单元相互独立，彼此之间没有任何依赖，所以可以根据业务的具体需要，灵活地部署多个子服务单元进行水平扩展。\n - 更强的容错性。当其中一个子服务出现故障的时候，可以通过辅助的负载均衡工具，自动路由到其他的子服务，不会影响整体服务的可用性.\n\n当然，微服务也不是一个银弹，相对来说，这种方案会使整体系统的设计更加复杂，同时也加大了网络的延迟，对整个系统测试的复杂度也会更高。\n\nDocker 提供的隔离型和可移植性，与微服务是一种天然的契合，微服务将整个软件进行拆分和解耦，而通过 Docker/k8s 可以很自然地做到独立的部署，高可用和容错性，似乎一切都可以完美地运转起来。但是真的是这样么？我们是不是忽略了什么？\n\n是的，我们在讨论前面的问题的时候忽略了一个很重要的东西：状态。\n\n从整个技术发展的角度来看，微服务是一个非常有意义的探索。每个人都期望着每个微服务的子服务都是无状态的，这样我可以自由地启停和伸缩，没有任何的心智负担，但是现实的业务情况是什么样的呢？比如一个电商网站，用户正在下单购买一件商品，此时平台是通过订单子服务的 A 应用来提供服务的，突然，因为机器故障，订单子服务的 A 应用不可用了，改由订单子服务的 B 应用提供服务，那么它是必须要知道刚才用户的订单信息的，否则正在访问自己订单页面的用户会发现自己的订单信息突然不见了。虽然我们尽量想把子服务设计成无状态的，但是很多时候状态都是不可避免的，我们不得不通过存储层保存状态，业界最主要的还是各种数据库，包括 RDBMS 和 NoSQL，比如使用 MySQL、MongoDB、HBase、Cassandra 等，特别是有些场景还要考虑数据一致性问题的时候，更加重了对存储层的依赖。\n\n由此可见，云计算时代系统的架构发生了巨大的变化，这一方面为用户提供了更优秀的特性，另一方面也对云计算的组件提出了更高的要求。数据库作为云计算最基础的组件之一，也需要适应这种架构的变化。（这里我们主要关注 SQL 数据库，云时代的数据库以下简称云数据库。）\n\n## 那么云数据库主要有一些什么样的特点呢？我认为主要有以下几点。\n\n### 弹性伸缩\n\n传统的数据库方案，常见的会选用 Oracle，MySQL，PostgreSQL。在云时代，数据量的规模有爆发性的增长，传统的数据库很容易遇到单机的存储瓶颈，不得不选用一些集群方案，常见的比如 Oracle RAC、 MySQL Sharding 等，而这些集群方案或多或少都有一些不令人满意的地方。\n\n比如说，Oracle RAC 通过共享存储的硬件方案解决集群问题，这种方式基本上只能通过停机换用更大的共享内存硬件来解决扩容问题，RAC 节点过多会带来更多的并发问题，同样也会带来更高的成本。\n\n以 MySQL Sharding 为代表的数据分片方案，很多时候不得不提前对数据量进行规划，把扩容作为很重要的一个计划来做，从 DBA 到运维到测试到开发人员，很早之前就要做相关的准备工作，真正扩容的时候，为了保证数据安全，经常会选择停服务来保证没有新的数据写入，新的分片数据同步后还要做数据的一致性校验。当然业界大公司有足够雄厚的技术实力，可以采用更复杂的方案，将扩容停机时间尽量缩短（但是很难缩减到 0），但是对于大部分中小互联网公司和传统企业，依然无法避免较长时间的停服务。\n\n在云时代，理想中所有的资源都是根据用户业务需求按需分配的，服务器资源，应用容器资源，当然也包括数据库资源。添加或者减少新的数据库资源，完全就像日常吃饭那样稀疏平常，甚至用户基本感知不到。比如作为一个电商用户，在双 11 促销活动之前，可以通过增加数据库节点的方式，扩大更多的资源池，用来部署相应的容器服务，当活动结束之后，再将多余的资源移除去支持其他的服务，这样可以极大地提高资源的利用率，同样可以弹性地支撑各种峰值业务。\n\n### 高可用\n\n传统的 MySQL 方案，数据复制的时候默认采用异步的方式，对于一个写入的请求，主库写入成功后就会返回成功信息给客户端，但是这个时候数据可能还没有同步给从库，一旦主库这个时候挂掉了，启动从库的时候就会有丢失数据的风险。当然，也有人会选择半同步的复制方式，这种方式在正常情况下是同步的，但是在遇到数据压力比较大的时候，依然会退化为异步的方式，所以本质上来说，同样有丢失数据的风险。其他也有一些多主的同步方案，比如在应用层做数据同步，但是这种方式一是需要应用层的配合，二是在对网络超时的处理非常复杂，增加心智负担。\n\n在云时代，因为所有的数据库资源都是分布式存储的，每个数据库节点出现问题都是很正常的事情，所以就必须有一种可以实现数据一致性的数据复制方式来保证服务的高可用，业界给出的答案就是：Paxos/Raft（关于 Paxos 和 Raft 的实现细节我们不在这里展开）。PingCAP 在做的 TiDB 就是选择了 Raft 协议，Raft 协议看起来更像是一个多副本的自适应的主从复制协议，对于每次写请求，Raft 都会保证大多数写成功才会返回客户端，即使 Raft Group的Leader 挂掉了，在一个有限的时间范围内，会很快地选出一个新的 Leader 出来，继续提供服务。同样，对于一个 3 副本的 Raft Group，只要 2 个写入成功，就可以保证成功，而大多数情况下，最先写入成功的往往是与 Leader 网络情况最好的那个副本，所以这种 Majority 写的方式，可以很自然地选择速度最快的副本进行数据同步复制。另外，Raft 协议本身支持 Config Change，增加一个新的节点，可以很容易地做副本数据分布的变更，而不需要停止任何服务。\n\n同样，在云时代，数据库的 DDL 操作也会是一个非常有趣的事情。以一个常见的 Add Column 操作为例，在表规模已经很大的情况下，在传统的实现方案中，比较有参考意义的是，通过一些工具，创建类似表级别的触发器，将原表的数据同步到一个新的临时表中，当数据追平的时候，再进行一个锁表操作，将临时表命名为原表，这样一个 Add Column 操作就完成了。但是在云时代，分布式的数据存储方式决定了这种方案很难实现，因为每个数据库节点很难保证 Schema 状态变更的一致性，而且当数据规模增长到几十亿，几百亿甚至更多的时候，很短的阻塞时间都有可能会导致很大的负载压力变化，所以 DDL 操作必须是保证无阻塞的在线操作。值得欣慰的是，Google 的 F1 给我们提供了很好的实现参考，TiDB 即是根据 F1 的启发进行的研发，感兴趣的同学可以看下相关的内容。\n\n### 易用透明\n我们可以将云数据库想象成一个提供无限大容量的数据库，传统数据库遇到单机数据存储瓶颈的问题将不复存在。已有的程序基本上不怎么需要修改已有的代码，就可以很自然地接入到云数据库中来获得无限 Scale 的能力。增减数据库节点，或者节点的故障恢复，对于应用层来说完全透明。另外，云数据库的监控、运维、部署、备份等等操作都可以在云端通过高效的自动化工具来自动完成，极大地降低了运维成本。\n\n### 多租户\n云数据库本身应该是可以弹性伸缩的，所以很自然的，从资源利用率的角度来考虑，多个不同用户的数据库服务底层会跑在一个共享的云数据库中。因此多租户技术会成为云数据库的标配。但是这里面就有一个不得不面对的问题，如何做到不同用户的隔离性？用户数据隔离是相对比较容易的，比如还是以电商用户（这里说的是电商企业，不是顾客客户）为例，每个用户都有一个唯一的 ID，这样在云数据库的底层存储中，可以保证每个用户数据都带有自己 ID 前缀，用户登陆进来的时候可以根据这个前缀规则，获取他对应的数据，同时他看不到其他用户的数据。\n\n在一个真实的多租户环境下面，纯粹的数据隔离往往是不够的，你还需要做到资源公平性的隔离。比如有的用户写一个 SQL，这个 SQL 没有做优化，主要做的事情是一个全表描扫，这个表的数据量特别特别大，这样他会吃掉很多的 CPU、Memory、IO 等资源，导致其他用户很轻量级的 SQL 操作都可能会变得很慢，影响到其他用户实际的体验。那么针对这种情况怎么做隔离？与此类似的还有，网络带宽怎么做隔离？大家都是跑在一个云数据库上面的，如果一个用户存放的数据特别大，他把带宽都吃掉了，别人就显得非常慢了。\n\n还有一种情况，如果我本身作为一个租户，内部又怎么做隔离，大家知道 MySQL 可以建很多 Database，不同的 Database 给不同的团队来用，那么他们之间内部隔离又怎么做，这个问题就进一步更加复杂了。\n\n目前来讲没有特别好的方法，在一个分布式的环境下面去做很好的隔离，有两个方向可以考虑：\n\n第一种是最简单也是有效的方法，制定一些规则，把某些用户特别大的数据库表迁移到独享的服务器节点上面，这样就不会影响其他用户的服务，但是这里面就涉及到定制化的事情了，本身理念其实与云数据库并不相符。\n\n第二种就是依靠统计信息，做资源隔离和调度，但是这里面对技术的要求就比较高了。因为云数据库是分布式的，所以一般的统计都要横跨很多的机器，因为网络原因，不可能做到完全准确的统计，所有统计都是有延迟的。比如说对于某个用户，现在统计到的流量是 1 个 G，他可能突然就有一次峰值的网络访问，可能下一次统计消耗的流量是 5 个 G（这里面只是举例说明问题），如果你给他流量限制是 1 个 G，中间统计的间隔是多少比较合适，如果间隔比较小，那么这个对整个系统的压力就比较大，可能影响正常的用户 SQL 访问，另外本身这个流量限制的系统也是很复杂的系统。\n\n调度算法一直是整个分布式系统领域很困难的一个问题，如何做到隔离性和公平调度也是未来云数据库非常有挑战的一个事情。\n\n### 低成本\n低成本应该是云时代基础设施最明显的特点。首先，云数据库的高可用和容错能力，使得我们不再需要昂贵的硬件设备，只需要普通的 X86 服务器就可以提供服务。然后，受益于 Docker 的虚拟化技术，使得不同类型的应用容器可以跑在同一个物理机上，这样可以极大地提高资源的利用率。其次，多租户的支持，使得不同的用户可以共用一套底层的数据库存储系统，在数据库层面再一次提高了资源的利用效率。再次，云数据库的自动化运维工具，降低了整个核心数据库的运维成本。最后，云数据库资源是按需分配的，用户完全可以根据自身的业务特点，选购合适的服务资源。\n\n### 高吞吐\n\n云数据库虽然可以做到弹性扩容，但是本身是分布式存储的，虽然可以通过 Batch Write、Pipeline 和 Router Cache 等方式加快访问 SQL 请求的数据，但是相对传统单机的数据库来说，在数据访问链路上至少也要多走一次网络，所以大部分并发量不大的小数据量请求，都会比单机延迟要高一些。也就是说，当没有足够高的并发 SQL 访问的话，其实不能完全体现云数据库的性能优势，所以这也是我们在选用云数据库的时候需要认识到的问题，云数据库更多的是追求高吞吐，而不是低延迟。当并发大到一定规模，云数据库高吞吐特性就显现出来了，即使在很高的并发下，依然可以维持相当稳定的延迟，而不会像单机数据库那样，延迟线性增长。当然，延迟的问题，在合理的架构设计方案下，可以通过缓存的方式得到极大的缓解。\n\n### 数据安全\n云数据库的物理服务器分布在多个机房，这就为跨数据库中心的数据安全提供了最基础的硬件支持。谈到金融业务，大家耳熟能详的可能就是两地三中心，比如北京有两个机房，上海有一个。未来一切服务都跑在云上，金融类的业务当然也不例外。相比其他业务，金融类业务对数据安全要求就要高得多。当然，每个公司内部都有核心的业务，所以如果上云的话，也会有同样的强烈需要。这样，对云数据库来说，数据的一致性、分布式事务、跨数据中心的数据安全等更高端的需求有可能会日益强烈。常见的数据备份也有可能会被其他新的模式所取代或者弱化，比如基于 Paxos/Raft 的多副本方案，本身就保证了会有多份备份。\n\n### 自动负载平衡\n对于云数据库来说，负载平衡是一个很重要的问题，它直接决定了整个云数据库系统性能的好坏，如果一个数据库节点的数据访问过热的话，就需要考虑把数据迁移到其他的数据库节点来分担负载，不然就很容易出现性能瓶颈。整个负载平衡是一个动态的过程，调度算法需要保证资源配比的最大平衡，还有保证数据迁移的过程对系统整体的负载影响最小。这在未来也是云数据库需要解决的一个核心问题。\n\n## 小结\n从目前已有的 SQL 数据库实现方案来看，NewSQL 应该是最贴近于云数据库理念的实现。NewSQL 本身具有 SQL、ACID 和 Scale 的能力，天然就具备了云数据库的一些特点。但是，从 NewSQL 到云数据库，依然有很多需要挑战的难题，比如多租户、性能等。\n\n上面提到的一些云数据库的特点，也是 PingCAP 目前在着力实现的部分，TiDB 作为国内第一个 NewSQL 的开源项目，在与社区的共同努力下，我们在上月底刚刚发布了 Beta 版本，欢迎各位上 GitHub 了解我们。\n\n随着整个社区技术水平的发展和云时代新的业务需求的驱动，除了 PingCAP 的 TiDB，相信会有更多的团队在这方面进行探索， 期待早日看到云数据库成熟的那一天。\n\n## Q&A\n**问：由于客户数据环境复杂多样，在迁移到云端的时候怎么怎么做规划，以便后期统一运维管理？或者说，怎么把用户 SQL Server 或者 MongoDB 逐渐迁移到 TiDB 之类的分布式数据库？**\n**崔秋**：因为每个业务场景都不太相同，所以在选用云端服务的时候，首先要了解自身业务和云服务具体的优缺点。\n如果你的业务本身比较简单，比如你之前用的 MongoDB，现在很多云服务厂商都会提供云端的 MongoDB 服务。这个时候你就要根据业务特点来做判断，如果 MongoDB 本身容量不大，远期的业务数据不会增长过快的话，这个时候其实你可以直接使用 MongoDB 的服务的。但是如果你本身的数据量比较大，或者数据增长比较快的话，就可能要考虑数据的扩容问题，MongoDB 在这方面做的不是太好。\n你可以考虑 SQL 数据库的集群方案。比如 TiDB，它本身是支持弹性扩容，高并发高吞吐和跨数据库中心数据安全的，另外有一点明显的好处是 TiDB 兼容 MySQL 协议，所以如果你的应用程序是使用 MySQL，就基本上可以无缝地迁移到 TiDB，这方面是非常方便的。后续我们会提供常用的数据库迁移工具，帮用户把数据从 MongoDB/SQL Server 等平滑迁移到 TiDB 上面。\n还是那个原则，不要为了上云而上云，一定要了解清楚自己的业务特点，云数据库会帮助你提供很多特性，如果真的很适用你的业务的话，就可以考虑。\n\n**问：但从产品的角度来看，云厂商提供的 RDS 产品是 Copy 客户数据库的思路，或者说是为了支持不同的数据库而支持。请问这种局面以后会有什么改变吗？**\n**崔秋**：现在确实蛮多云数据库服务其实就是在传统的 RDS 上面包了一层自动化的监控，运维和部署工具，就卖给用户提供服务了，但是实际上本身解决的仅仅是自动化管控的问题，云服务提供的数据库特性还是单机的 RDS，或者 RDS Sharing 的特性。如果本身底层的数据库满足不了你的需求的话，云服务也是满足不了的。\n如果你需要不停服务的弹性扩容，单机的 RDS 服务肯定是搞不定的，RDS Sharing 也很难帮助你做到，这就对底层的数据库有了更高的要求，当然这方面是 TiDB 的强项了。\n现在很多云上的 RDS 产品还远远没有达到理想中的云数据库的要求，不过随着社区的发展和业务需求的推动，我个人觉得，这方面最近几年会有更多的变化。如果对于这方面感兴趣的话，可以关注下 TiDB。\n\n**问：从 Oracle 分流数据到 TiDB、Oracle 增量修改、Update 的记录，如何同步到 TiDB？有没有工具推荐，比如类似 Ogg？**\n**崔秋**：目前 TiDB 还没有相应的工具。如果真的需要在线从 Oracle 这边分流的话，可以考虑使用 Oracle 的触发器，将数据的变化记录下来，然后转化为 SQL，同步到 TiDB，当然这需要一定开发的工作量。","date":"2016-08-02","author":"崔秋","fillInMethod":"writeDirectly","customUrl":"cloud-native-db","file":null,"relatedBlogs":[]}],"blogCategories":[{"name":"产品技术解读"},{"name":"公司动态"},{"name":"社区动态"},{"name":"案例实践"},{"name":"观点洞察"}],"blogRecommend":[{"blog":{"author":"黄东旭","summary":"PingCAP 联合创始人兼 CTO 黄东旭分介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念，同时探讨了 TiDB Serverless 对于中国用户的价值。","title":"黄东旭：The Future of Database，掀开 TiDB Serverless 的引擎盖","date":"2023-07-24","customUrl":"the-future-of-database-2023"}},{"blog":{"author":"张翔","summary":"本次分享在介绍 Serverless Tier 的技术细节之余，全面解析了 TiDB 的技术生态全景和在生态构建中所做的努力。阅读本文，了解有关 Serverless 的更多信息，以及 PingCAP 在技术领域的最新进展。","title":"TiDB Serverless 和技术生态全景","date":"2023-02-20","customUrl":"tidb-serverless-and-technology-ecology-overview"}},{"blog":{"author":"韩锋","summary":"本文转载自公众号：韩锋频道（hanfeng_channel）。文章从金融用户角度入手，对如何选择分布式数据库及选型后的最优实践进行了阐述。","title":"金融业分布式数据库选型及 HTAP 场景实践","date":"2022-05-19","customUrl":"distributed-database-selection-and-htap-practice-in-financial-industry"}},{"blog":{"author":"黄东旭","summary":"很多时候「品味」之所以被称为「品味」，就是因为说不清道不明，这固然是软件开发艺术性的一种体现，但是这也意味着它不可复制，不易被习得。本系列文章会试着总结一下好的基础软件体验到底从哪里来。作为第一篇，本文将围绕可观测性和可交互性两个比较重要的话题来谈。","title":"做出让人爱不释手的基础软件：可观测性和可交互性","date":"2021-10-15","customUrl":"how-to-develop-an-infrasoft-observability-and-interactivity"}},{"blog":{"author":"刘奇","summary":"我们更多时候是站在哲学层面思考整个公司的运转和 TiDB 这个产品的演进的思路。这些思路很多时候是大家看不见的，因为不是一个纯粹的技术层面或者算法层面的事情。","title":"势高，则围广：TiDB 的架构演进哲学","date":"2019-05-30","customUrl":"guiding-ideologies-in-the-evolution-of-tidb"}}],"blogMostPopular":[{"blog":{"author":"申砾","customUrl":"tidb-internal-1","date":"2017-05-15","summary":"数据库、操作系统和编译器并称为三大系统，可以说是整个计算机软件的基石。其中数据库更靠近应用层，是很多业务的支撑。这一领域经过了几十年的发展，不断的有新的进展。很多人用过数据库，但是很少有人实现过一个数据库，特别是实现一个分布式数据库。了解数据库的实现原理和细节，一方面可以提高个人技术，对构建其他系统有帮助，另一方面也有利于用好数据库。研究一门技术最好的方法是研究其中一个开源项目，数据库也不例外。单机数据库领域有很多很好的开源项目，其中 MySQL 和 PostgreSQL 是其中知名度最高的两个，不少同学都看过这两个项目的代码。但是分布式数据库方面，好的开源项目并不多。 TiDB 目前获得了广泛的关注，特别是一些技术爱好者，希望能够参与这个项目。由于分布式数据库自身的复杂性，很多人并不能很好的理解整个项目，所以我希望能写一些文章，自顶向下，由浅入深，讲述 TiDB 的一些技术原理，包括用户可见的技术以及大量隐藏在 SQL 界面后用户不可见的技术点。","title":"三篇文章了解 TiDB 技术内幕 - 说存储"}},{"blog":{"author":"申砾","customUrl":"tidb-internal-2","date":"2017-05-24","summary":"上一篇介绍了 TiDB 如何存储数据，也就是 TiKV 的一些基本概念。本篇将介绍 TiDB 如何利用底层的 KV 存储，将关系模型映射为 Key-Value 模型，以及如何进行 SQL 计算。","title":"三篇文章了解 TiDB 技术内幕 - 说计算"}},{"blog":{"author":"申砾","customUrl":"tidb-internal-3","date":"2017-06-06","summary":"任何一个复杂的系统，用户感知到的都只是冰山一角，数据库也不例外。前两篇文章介绍了 TiKV、TiDB 的基本概念以及一些核心功能的实现原理，这两个组件一个负责 KV 存储，一个负责 SQL 引擎，都是大家看得见的东西。在这两个组件的后面，还有一个叫做 PD（Placement Driver）的组件，虽然不直接和业务接触，但是这个组件是整个集群的核心，负责全局元信息的存储以及 TiKV 集群负载均衡调度。本篇文章介绍一下这个神秘的模块。这部分比较复杂，很多东西大家平时不会想到，也很少在其他文章中见到类似的东西的描述。我们还是按照前两篇的思路，先讲我们需要什么样的功能，再讲我们如何实现，大家带着需求去看实现，会更容易的理解我们做这些设计时背后的考量。","title":"三篇文章了解 TiDB 技术内幕 - 谈调度"}},{"blog":{"author":"PingCAP","customUrl":"introduction-of-open-source-license","date":"2021-10-20","summary":"PingCAP 从第一行代码开源，六年里积累了一些经验和教训，在《开源知识科普》栏目中，我们将与大家分享和交流在开源成长路径中的思考和感受，以及参与开源项目的正确姿势。本期话题就从开源的基础——开源许可证开始，希望对大家了解开源、参与开源有一定帮助。","title":"一文看懂开源许可证丨开源知识科普"}},{"blog":{"author":"唐刘","customUrl":"grpc","date":"2017-06-18","summary":"经过很长一段时间的开发，TiDB 终于发了 RC3。RC3 版本对于 TiKV 来说最重要的功能就是支持了 gRPC，也就意味着后面大家可以非常方便的使用自己喜欢的语言对接 TiKV 了。gRPC 是基于 HTTP/2 协议的，要深刻理解 gRPC，理解下 HTTP/2 是必要的，这里先简单介绍一下 HTTP/2 相关的知识，然后再介绍下 gRPC 是如何基于 HTTP/2 构建的。","title":"深入了解 gRPC：协议"}}],"allTags":[{"name":"TiDB","count":179},{"name":"社区","count":103},{"name":"TiKV","count":30},{"name":"社区动态","count":29},{"name":"TiDB 源码阅读","count":24},{"name":"TiKV 源码解析","count":21},{"name":"HTAP","count":20},{"name":"Release","count":17},{"name":"TiFlash","count":16},{"name":"Chaos Mesh","count":15},{"name":"TiDB Hackathon 2021","count":13},{"name":"Raft","count":11},{"name":"TiCDC","count":11},{"name":"TiDB 4.0 新特性","count":11},{"name":"DM 源码阅读","count":10},{"name":"Contributor","count":9},{"name":"TiDB Binlog 源码阅读","count":9},{"name":"TiFlash 源码阅读","count":9},{"name":"TiDB Hackathon 2022","count":8},{"name":"技术出海","count":8},{"name":"Serverless","count":7},{"name":"TiDB Hackathon 2020","count":7},{"name":"TiDB 性能调优","count":7},{"name":"分布式数据库","count":7},{"name":"DM","count":6},{"name":"SQL","count":6},{"name":"最佳实践","count":6},{"name":"架构","count":6},{"name":"Hackathon","count":5},{"name":"PD","count":5},{"name":"Rust","count":5},{"name":"TiDB Binlog","count":5},{"name":"TiDB Cloud","count":5},{"name":"TiDB Operator","count":5},{"name":"TiDB Operator 源码阅读","count":5},{"name":"TiSpark","count":5},{"name":"事务","count":5},{"name":"事务前沿研究","count":5},{"name":"新经济 DTC 转型","count":5},{"name":"DevCon","count":4},{"name":"Linux","count":4},{"name":"MySQL","count":4},{"name":"TiDB 易用性挑战赛","count":4},{"name":"TiKV 功能介绍","count":4},{"name":"分布式系统前沿技术","count":4},{"name":"备份恢复","count":4},{"name":"大促背后的数据库","count":4},{"name":"工具","count":4},{"name":"性能","count":4},{"name":"数据迁移","count":4},{"name":"Committer","count":3},{"name":"Go","count":3},{"name":"Kubernetes","count":3},{"name":"Percolator","count":3},{"name":"PingCAP 用户峰会","count":3},{"name":"Prometheus","count":3},{"name":"RocksDB","count":3},{"name":"TiDB Ecosystem Tools","count":3},{"name":"TiDB Serverless","count":3},{"name":"TiKV 源码阅读","count":3},{"name":"云原生","count":3},{"name":"分布式系统测试","count":3},{"name":"基础软件","count":3},{"name":"BR","count":2},{"name":"Cloud-TiDB","count":2},{"name":"Dumpling","count":2},{"name":"Flink","count":2},{"name":"K8s","count":2},{"name":"Key Visualizer","count":2},{"name":"MVCC","count":2},{"name":"PingCAP","count":2},{"name":"PingCAP  用户峰会","count":2},{"name":"Spanner","count":2},{"name":"TiDB 性能挑战赛","count":2},{"name":"TiDB-4.0","count":2},{"name":"TiUP","count":2},{"name":"WebAssembly","count":2},{"name":"gRPC","count":2},{"name":"优化器","count":2},{"name":"升级","count":2},{"name":"多业务融合","count":2},{"name":"带着问题读 TiDB 源码","count":2},{"name":"性能优化","count":2},{"name":"性能调优","count":2},{"name":"数据同步","count":2},{"name":"版本","count":2},{"name":"资源管控","count":2},{"name":"集群调度","count":2},{"name":"2PC","count":1},{"name":"AI","count":1},{"name":"Ansible","count":1},{"name":"CAP","count":1},{"name":"Chat2Query","count":1},{"name":"ChatGPT","count":1},{"name":"Cloud","count":1},{"name":"DNB","count":1},{"name":"Data Platform","count":1},{"name":"Database","count":1},{"name":"Database Branching","count":1},{"name":"Elasticsearch","count":1},{"name":"Failpoint","count":1},{"name":"Fintech","count":1},{"name":"Flink TiDB 物化视图","count":1},{"name":"GA","count":1},{"name":"Grafana","count":1},{"name":"HAProxy","count":1},{"name":"HTAP TiFlash","count":1},{"name":"Hadoop","count":1},{"name":"Horoscope","count":1},{"name":"Jepsen","count":1},{"name":"Kudu","count":1},{"name":"LSM-tree","count":1},{"name":"Lease Read","count":1},{"name":"Libbpf-tools","count":1},{"name":"Linearizability","count":1},{"name":"MPP","count":1},{"name":"Multi-Raft","count":1},{"name":"MySQL 架构演进","count":1},{"name":"NewSQL","count":1},{"name":"OpenAI","count":1},{"name":"OpenSource","count":1},{"name":"Oracle 迁移","count":1},{"name":"Partitioned Raft KV","count":1},{"name":"Partitioned-Raft-KV","count":1},{"name":"PiTR","count":1},{"name":"Redis","count":1},{"name":"Resource Control","count":1},{"name":"SMP","count":1},{"name":"SQL Plan Management","count":1},{"name":"SaaS","count":1},{"name":"Spark","count":1},{"name":"Syncer","count":1},{"name":"THP","count":1},{"name":"Talent Plan","count":1},{"name":"Test","count":1},{"name":"The Future of Database","count":1},{"name":"TiDB + Flink","count":1},{"name":"TiDB 4.0","count":1},{"name":"TiDB 4.0 捉虫竞赛","count":1},{"name":"TiDB Dashboard","count":1},{"name":"TiDB DevCon 2020","count":1},{"name":"TiDB Hackathon 2023","count":1},{"name":"TiDB 工具","count":1},{"name":"TiDB-DM","count":1},{"name":"TiDB-Lightning","count":1},{"name":"TiEM","count":1},{"name":"TiKV 性能优化","count":1},{"name":"TiPocket","count":1},{"name":"Tile","count":1},{"name":"Titan","count":1},{"name":"Tools","count":1},{"name":"futures","count":1},{"name":"java","count":1},{"name":"k8s","count":1},{"name":"knossos","count":1},{"name":"一致性","count":1},{"name":"主从","count":1},{"name":"全文检索","count":1},{"name":"内建函数","count":1},{"name":"分布式","count":1},{"name":"分布式SQL","count":1},{"name":"分布式事务","count":1},{"name":"分布式计算","count":1},{"name":"历史读","count":1},{"name":"可串行化","count":1},{"name":"合作伙伴生态","count":1},{"name":"在线 DDL","count":1},{"name":"垃圾回收","count":1},{"name":"备份","count":1},{"name":"多版本并发控制","count":1},{"name":"多租户","count":1},{"name":"大数据","count":1},{"name":"存储","count":1},{"name":"存储引擎","count":1},{"name":"安装部署","count":1},{"name":"容灾机制","count":1},{"name":"工程实践","count":1},{"name":"平凯数据库","count":1},{"name":"应用场景","count":1},{"name":"开源","count":1},{"name":"开源知识科普","count":1},{"name":"异构复制","count":1},{"name":"性能挑战赛","count":1},{"name":"悲观锁","count":1},{"name":"持续性能分析","count":1},{"name":"数字化转型","count":1},{"name":"数据分片","count":1},{"name":"数据库","count":1},{"name":"无锁快照","count":1},{"name":"智能制造","count":1},{"name":"服务可观察","count":1},{"name":"机器学习","count":1},{"name":"查询优化","count":1},{"name":"核心批量核算","count":1},{"name":"水平扩展","count":1},{"name":"测试","count":1},{"name":"测试工具","count":1},{"name":"混沌工程","count":1},{"name":"源码分析","count":1},{"name":"版本迁移","count":1},{"name":"用户实践","count":1},{"name":"监控","count":1},{"name":"线性一致","count":1},{"name":"自动化","count":1},{"name":"自动化测试","count":1},{"name":"计算","count":1},{"name":"调优","count":1},{"name":"调度","count":1},{"name":"跨数据中心","count":1},{"name":"运维","count":1},{"name":"金融","count":1},{"name":"隔离级别","count":1},{"name":"高并发","count":1}],"hotTags":[{"name":"TiDB","count":179},{"name":"社区","count":103},{"name":"TiKV","count":30},{"name":"社区动态","count":29},{"name":"TiDB 源码阅读","count":24},{"name":"TiKV 源码解析","count":21},{"name":"HTAP","count":20},{"name":"Release","count":17},{"name":"TiFlash","count":16},{"name":"Chaos Mesh","count":15},{"name":"TiDB Hackathon 2021","count":13},{"name":"Raft","count":11},{"name":"TiCDC","count":11},{"name":"TiDB 4.0 新特性","count":11},{"name":"DM 源码阅读","count":10},{"name":"Contributor","count":9},{"name":"TiDB Binlog 源码阅读","count":9},{"name":"TiFlash 源码阅读","count":9},{"name":"TiDB Hackathon 2022","count":8},{"name":"技术出海","count":8}]}},
    "staticQueryHashes": ["1327623483","1820662718","3081853212","3430003955","3649515864","4265596160","63159454"]}