从0到1:用Go实现MySQL兼容的 XMySQL Server
前阵子,我花了好几个月时间,用纯Go从零开始实现了一个MySQL兼容数据库服务器,叫做XMySQL Server。今天写这篇文章,算是整理一下心路历程、踩过的坑、用过的资源,也顺便吐吐槽,大家一起开心开心。
一、为什么自己造数据库?
最初动机其实很简单。2021年面试的时候,作为一个Java开发,面试官特别喜欢刁难,尤其热衷于问各种底层数据库问题。比如:“你说下MySQL性能怎么优化?”“Java用的最多的InnoDB引擎事务隔离到底是咋实现的?”“JPA、MyBatis这些ORM框架用得熟,但你知道它们背后的MVCC底层原理吗?”
当时的感觉特别尴尬,自己用了多年Spring Boot,各种ORM框架也滚瓜烂熟,但一旦面试官深入问起底层原理,尤其是数据库这一块,基本就是“啊这……我再想想”。每次面试被问倒之后,回家总有一种说不出的沮丧。
于是下定决心,这次一定要啃透底层,干脆自己撸一个数据库服务器,一边写一边研究,彻底弄明白这些底层的东西,这样下次面试再被问到,我也能硬气地怼回去:“这些我都写过源码,咱聊聊底层具体实现?”
二、XMySQL Server都有啥本事?
- MySQL协议栈全手工打造:实现握手、身份认证、命令执行、结果返回,全部自己写。(协议部分参考了PingCAP的TiDB源码,加深了对协议的理解)
- 自研InnoDB风格的存储引擎:B+树索引结构、页管理、事务、MVCC、回滚日志,都一手操办。
- 自主实现查询优化器:SQL解析使用了开源项目sqlparser,在此基础上进行了进一步的定制与优化。
- 支持多核并发:利用Go的协程和锁机制,做到企业级并发性能。
三、感谢Cursor和OpenAI(ChatGPT)帮忙
写代码过程中,用了两个好工具:
- Cursor编辑器:写Go代码特别顺滑,跳转、重构超级舒服。
- OpenAI辅助开发:遇到算法问题或复杂的bug,ChatGPT辅助排查,大幅提升了开发效率。
四、目前的项目状态
坦白讲,这个项目现在还只是个雏形,还远没有到真正部署和使用的阶段。功能还在不断完善,代码也有很多地方需要重构优化。目前只是自己本地跑跑测试、实验功能,还没有正式用在生产环境。
五、参考的关联资料大放送
项目实现过程中,学习参考了一堆宝贵资源,推荐给大家:
官方文档
开源项目
- MySQL官方架构(mysql/mysql-server)
- TiDB分布式数据库(pingcap/tidb)
- PostgreSQL架构(postgres/postgres)
- sqlparser(SQL解析库)
推荐书籍
- 《数据库系统内幕》– Alex Petrov
- 《设计数据密集型应用》– Martin Kleppmann
- 《高性能MySQL》– Baron Schwartz
经典架构论文
- Architecture of a Database System
- The Design and Implementation of Modern Column-Oriented Database Systems
技术博客
六、现在能跑啥功能?
目前XMySQL Server已经能够:
- 基础的CRUD语句执行
- 初步支持简单事务处理,目前隔离级别等高级事务特性还在开发中
- 初步的MVCC、B+树索引结构
- 多线程并发测试还算不错,性能继续优化中
七、未来的计划
- 完善SQL语法支持,扩展更多语法解析能力
- 实现更完善的事务控制(如死锁检测)
- 性能调优和基准测试
- 开源社区协作推进
八、谁可能感兴趣?
- 面试总被刁难、想透彻理解数据库原理的同学
- 喜欢用Go写底层系统、探究内核的开发者
- 开源爱好者,欢迎star、提issue、PR
项目地址
👉 github.com/zhukovaskychina/xmysql-server
欢迎掘金的小伙伴们一起聊聊,你也可以吐槽一下遇到过的奇葩面试官或者不给力的运维同学~