CloudNativeEra
  • Introduction
  • 名词解释
  • Computer Science
    • Computer Organization
      • CPU
      • 二进制、电路、加法器、乘法器
      • 编译、链接、装载
      • 存储器
      • IO
    • Operating System
      • 操作系统基础知识
      • 系统初始化
      • 进程管理
      • Everything about Memory
      • 文件系统
      • 并行编程
      • Linux
        • CPU
        • IO 多路复用
        • DMA IO and Linux Zero Copy
    • Computer Network
      • 网络相关命令
      • 评估系统的网络性能
      • 网络抓包
      • Linux 最多支撑的 TCP 连接
      • 网络虚拟化
      • DHCP 工作原理
    • Data Structure and Algorithm
      • 题目列表
      • Summarize
        • 方法总结
        • 二分思想
        • 树的演化
        • 算法思想总结
      • Data Structure
        • Data Struct - Array
        • Tree
        • Heap
        • Hash
        • 字符串
      • Algorithm
        • Sorting Algorithm
        • 查找
        • 贪心算法
        • 动态规划
        • 位运算
      • Practice Topics
        • Data Struct in SDK
        • Topic - Tree
        • Topic - Graph
        • Topic - 滑动窗口
        • 剑指 Offer 题解
    • 并发编程
      • 并发模式
      • 并发模型
  • 系统设计
    • 软件设计
      • 软件架构
      • 编程范式
      • 系统设计题
      • 设计原则
      • 计算机程序的构造和解释 SICP
    • 领域驱动设计
      • 应用:在线请假考勤管理
      • 应用: library
    • 微服务与云原生
      • Designing and deploying microservices
      • 容器技术
      • Docker
      • Etcd
      • Kubernetes
        • Kubernetes - Mapping External Services
      • Istio
      • 监控
    • 分布式系统
      • 分布式理论
      • 分布式事务
    • 后端存储设计
      • 缓存设计
      • 数据库架构设计
    • CI/CD
    • 设计最佳实践
    • 测试
    • 安全
    • 综合
      • 开发实践
      • 分布式锁
      • 分布式计数服务
      • 弹幕系统设计
      • 消息队列设计
      • 分布式ID生成算法
      • 限流设计
      • 网关设计
      • 通用的幂等设计
      • 分布式任务调度
        • Timer
        • ScheduledExecutorService
        • Spring Task
        • Quartz
      • 交易系统
      • 权限设计
  • 编程语言
    • 编程语言
    • C & C++
    • Java
      • JVM
        • JVM Bytecode
      • Java 核心技术
      • Java 8 新特性
      • Java 集合框架
      • Java NIO
      • 并发编程
        • 线程生命周期与线程中断
        • 三个线程交替打印
        • 两个线程交替打印奇偶
        • 优雅终止线程
        • 等待通知机制
        • 万能钥匙:管程
        • 限流器
        • 无锁方案 CAS
    • Java 源码阅读
      • Unsafe
      • 异步计算 Future
      • Java Queue
      • CoalescingRingBuffer 分析
      • Java Collections
        • PriorityQueue 分析
        • HashMap 分析
        • TreeMap
    • Golang
    • Python
  • 框架/组件/类库
    • Guava
      • Guava Cache
      • Guava EventBus
    • RxJava
    • Apache MINA
    • Netty
      • 网络 IO 模型
      • Netty 生产问题
    • Apache Tomcat
    • MyBatis
    • 限流框架
    • Spring Framework
      • Spring Core
      • Spring 事务管理
    • Spring Boot
    • Spring Cloud
      • Feign & OpenFeign
      • Ribbon
      • Eurake
      • Spring Cloud Config
    • FixJ
    • Metrics
    • Vert.x
  • 中间件
    • Redis
      • Redis 基础
        • Redis 数据结构设计与实现
        • Redis 高性能网络模型
      • Redis checklist
      • 应用案例 - Redis 数据结构
      • 应用案例 - Redis 缓存应用
      • 应用案例 - Redis 集群
      • Redis 客户端
      • Redis 生产案例
        • [译] 在 Redis 中存储数亿个简单键值对
    • MySQL
      • MySQL 基础
      • MySQL Index
      • MySQL Transaction
      • MySQL 优化
      • MySQL 内核
      • MySQL Command
      • MySQL Checklist
      • MySQL Analysis Tool
      • 实现 MySQL
    • State Machine
    • 数据库连接池
    • MQ
      • 高性能内存队列 Disruptor
      • Kafka
      • Pulsar
      • RocketMQ
        • Broker 的设计与实现
      • NSQ
  • 实际案例
    • 线上 Case
      • Request Aborted
      • MySQL - Specified key was too long
      • Java 应用 CPU 100% 排查优化
      • 频繁 GC 导致的 Java 服务不响应
      • 导出优化
  • 大数据
    • 流计算
    • Flink
  • 其他
    • 工具
    • 读书
      • 设计数据密集型应用
      • 实现领域驱动设计
      • 精通比特币
      • 提问的智慧
    • 论文
    • 工程博客
    • 阅读源码
    • 面试
      • 如何在最短的时间里对对方有个全面的了解
    • 分享
    • 软技能
    • Todo
  • Blog
    • #算法
      • 查找
      • 位运算
      • 树
    • #架构
      • 1- 通信
    • Design & Dev & Opt
      • High Performance Data structure Design
  • Tiny Project
    • A Simple WeChat-like Instant Messaging Platform
由 GitBook 提供支持
在本页
  • MVP
  • 实现自己的 MySQL

这有帮助吗?

  1. 中间件
  2. MySQL

实现 MySQL

上一页MySQL Analysis Tool下一页State Machine

最后更新于4年前

这有帮助吗?

自己动手实现一个简版的 MySQL

MVP

学习的最佳方式是理论结合实践,并输出给别人。这段时间学习了 MySQL 的一些内部工作机制和原理,有必要使用自己熟悉的编程语言实现一个简版的 MySQL,当然我们的目标不是做一个完全一摸一样的 MySQL,我们只是利用 MySQL 的核心实现原理,实现一个类似的数据库系统,可能的应用场景是将它作为内嵌数据库使用,比如在集成测试场景中。

一个 MVP 版本的 MySQL 应该包括哪些功能呢?

  1. 需要支持基于 mysql 协议的客户端和服务端通信

  2. 需要能够解析 SQL,然后根据命令进行操作,至少需要包括:create database, create table, drop database, drop table, select, insert, delete, update 等

  3. 需要可靠的数据恢复机制

  4. 需要支持事务特性

技术 Spike

  • SQL Parser 引擎

参考

  • mysql 服务端实现

使用 Netty 作为网络通信库,实现 mysql 协议

  • B+ Tree 实现

实现自己的 MySQL

MySQL 通信协议

MySQL 基本的通信流程

  1. 客户端发起连接,进行 tcp 三次握手

  2. 认证阶段

    1. 服务端向客户端发送 handshake packet

    2. 客户端处理 handshake,向服务端发送 auth packet

    3. 认证结果,OK packet or ERR packet

  3. 命令执行阶段

    1. 客户端 -> 服务端:发送命令包 (Command Packet)

    2. 服务端 -> 客户端:发送回应包 (OK Packet, or Error Packet, or Result Set Packet)

  4. 断开连接

    1. 客户端 -> 服务端: 发送退出包

    2. 服务端断开连接

  5. 四次握手断开 tcp 连接

MySQL 的客户端和服务端通信使用了 CHAP (Challenge Handshake Authentication Protocol) 挑战握手协议,流程如下:

什么是挑战握手协议?CHAP 是在网络物理连接后进行连接安全性验证的协议。基本步骤如下:

  1. 链路建立阶段结束之后,认证者向对端点发送“challenge”消息。

  2. 对端点用经过单向哈希函数计算出来的值做应答。

  3. 认证者根据它自己计算的哈希值来检查应答,如果值匹配,认证得到承认;否则,连接应该终止。

  4. 经过一定的随机间隔,认证者发送一个新的 challenge 给端点,重复步骤 1 到 3 。

// MySQL 的通信协议:4 bytes header + n bytes payload(body)
|--- 3 bytes ---|--- 1 byte ---|--- n bytes ---|
  length of msg   sequence id       payload

协议包中的 capability flags 有特殊的用途,The capability flags are used by the client and server to indicate which features they support and want to use. MySQL 的 capability : 在认证握手过程中,客户端和服务器交换了关于对方能够或愿意做什么的信息。这使他们能够调整对同行的期望,而不是以某种不支持的格式发送数据。信息的交换是通过包含协议能力的位掩码的字段来完成的。

可见,MySQL 的通信包是使用长度前缀法来定位每个包的边界,处理粘包问题时使用长度截取,粘包的本质是在tcp层发送数据时,大于一个包大小的会拆成多个包,小于一个包大小的会组合在一起。

mysql 的包和 OS 层的 TCP 包的关系:MySQL Packet 属于应用层包,会被封装在 TCP 的数据包中,MySQL Packet 有可能被放在一个 TCP 数据包中,也有可能跨多个;有时甚至几个 MySQL Packet 在同一个 TCP 数据包中

参考:

MySQL 客户端

MySQL 客户端实现和服务端的通信,将客户端需要执行的各种操作发给服务端,比较重要的是:

  1. 实现 MySQL 的通信协议

  2. 高性能的网络模型,如使用类似于 Netty 的 Reactor 网络模型等

MySQL 服务端实现

  • 连接管理器处理网络连接,解析命令,命令路由

  • SQL 解析器,语法分析

  • 查询优化器

  • 执行器

  • 存储引擎抽象和默认引擎实现

参考:

server status flag:

动手实现 MySQL 协议

MySQL 协议 GO 实现:

GO MySQL Driver:

MySQL protocol library implementing in Go:

阿里巴巴 druid SQL Parser 引擎
https://dev.mysql.com/doc/internals/en/status-flags.html
MySQL 通信协议
Client / Server Communication
MySQL 协议 HandShake 握手篇
https://github.com/chaintechinfo/MySQL-Protocol
自己动手写 SQL 执行引擎
实现自己的数据库驱动
MySQL Protocol
https://github.com/radondb/radon
https://github.com/pubnative/mysqlproto-go
https://github.com/go-sql-driver/mysql
https://github.com/xelabs/go-mysqlstack
MySQL 客户端和服务端建立连接与认证过程
HandShake 包