10 几年前,互联网产业蓬勃发展,相比传统 IT 企业,互联网应用每天会产生海量的数据。

如何存储和分析这些数据成为了当时技术圈的痛点,彼时,分库分表解决方案应运而生。

当时最流行的 Java 技术论坛是 javaeye ,有位淘宝的技术人员分享了一篇分库分表的文章 ,这篇文章,我反复看了几十遍,想从中吸取更多的营养,但基于我孱弱的技术能力,总是感觉隔靴搔痒。

直到 2012年 Cobar 开源了 ,我的困惑才初步消解了。

1 Cobar 开源了

Cobar 是由 Alibaba 开源的 MySQL 分布式处理中间件,它可以在分布式的环境下看上去像传统数据库一样提供海量数据服务。

Cobar 开源后,我迫不及待的的去下载 Cobar 的部署包,配置两个库同样一张表,在两个库分别手工插入 1 条记录,然后通过 Navicat 连接 Cobar 暴露的端口,竟然发现数据表显示两条数据 。

看到 Navicat 的显示,我当时的表情如下:

虽然我极度渴望探索 Cobar 原理的奥秘 , 而且互联网上关于 Cobar 的文章其实并不多 ,我认识的同事朋友也对分库分表不熟悉,于是我想到了世界上最笨的方式:

将 Cobar 源码抄写一次,边抄边理解,直到可以将程序跑起来

于是,我建了一个新的 maven 项目,一点点去抄

最开始是模仿 Cobar 的包的结构,接着是网络通讯设计,最后是 SQL 解析 。

网络通讯模块跑通了,但当我抄到 SQL 解析模块时,因为不理解原理,抄起来实在太费劲了,轰轰烈烈的抄源码运动戛然而止,花费了接近三个月的时间。

2 抄源码的收获

虽然那时我并没有完全理解 Cobar 的实现机制,但收获还是很大的。

1、网络编程

第一次接触到 Reactor 模式,NIOAcceptor 用于处理前端请求,NIOConnector 则用于管理后端的连接,NIOProcessor 用于管理多线程事件处理,NIOReactor 则用于完成底层的事件驱动机制。

我接触到 Netty 之后,才想到 Cobar 的网络通讯层可以更加优雅点 。事实上 ,MyCat 就是重点优化了后端网络通讯层。

2、缓存池

第一次知道原来可以在网络通讯里,封装统一管理 NIO 的 Buffer 。

3、打包技巧

Cobar 这种 maven 打包方式,目录结构如下:

我自己写项目都会参考这种 maven 打包方式,因为这种方式相比原来 tomcat webapp 部署包的方式更加优雅。

4、学习 sharding-jdbc

当我对于分库分表 Proxy 的设计有了初步认识之后,再来学习当当开源的 sharding-jdbc 时就轻松很多了。

3 开源分库分表示例项目

其实,我对于分库分表技术的执念,更多在在于我强烈的渴望:当遇到需要分库分表的场景,我有足够的能力去解决这个问题

今年 3月份,我开源了一个分库分表示例项目。

github地址:https://github.com/makemyownlife/shardingsphere-jdbc-demo

这个项目的初衷是:帮助 Java 同学们快速入门分库分表,但又不止于分库分表 。

1、 Grpc ID 生成器示例

**2、 shardingsphere jdbc 4.X/5.X 分库分表例子 **

项目提供了两个模块,分别使用 jdbc 4.X 和 jdbc 5.X 两个版本。

同时,有的同学想使用原生 API 实现分库分表,每个模块里都准备了原生 API 使用的例子 ,方便同学们调试

网上有很多 shardingsphere jdbc 5.X 的例子,但很多使用方式并不标准,勇哥结合官网文档,并对比网上很多例子,花了很多天才梳理好。

3、 antlr 学习例子

shardingsphere 基于 antlr4 设计了新一代的 SQL 解析引擎,勇哥单独抽出一个模块用来演示:

后面会逐步完善 antlr 的例子,比如简单的 SQL 查询解析、JSON 格式解析等。


这个项目还在不断的进化中,后面还要添加扩容相关的知识点,比如 canal、datax ,希望能帮助大家 !

4 写到最后

有些公众号文章写到:分库分表,可能真的要退出历史舞台了!我从来也没有否认分布式数据库架构的先进性 ,但我想分库分表的更大的优势在于:简单

武汉有些小公司并没有很强的技术储备,但他们用极少的研发人员就可以处理很大的数据量。

因为没有完美的技术,只有最合适的技术 !

最后,来看看 2012年那个傻傻的抄写代码的我,有人说我长得像周杰伦,不过我觉得像梁朝伟 !


如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

N 年前,为了学习分库分表,我把 Cobar 源码抄了一遍的更多相关文章

  1. MyCat学习 ------分库分表 随笔

    垂直切分.水平切分 1.垂直分库,解决库中表太多的问题. 2.垂直分表,解决表中列太多的问题.例如 商品表 包含 产地.二维码 .时间.价格.各个列.分为不同的小表. 水平切分, 大数据表拆分为小表 ...

  2. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

    读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...

  3. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

  4. 分库分表神器 Sharding-JDBC,几千万的数据你不搞一下?

    今天我们介绍一下 Sharding-JDBC框架和快速的搭建一个分库分表案例,为讲解后续功能点准备好环境. 一.Sharding-JDBC 简介 Sharding-JDBC 最早是当当网内部使用的一款 ...

  5. 分库分表之ShardingSphere

    目录 分库分表诞生的前景 分库分表的方式(垂直拆分,水平复制) 1.垂直拆分 1.1 垂直分库 1.2 垂直分表 2.水平拆分 2.1 水平分库 2.2 水平分表 分库分库中间件 ShardingSp ...

  6. 基于AOP和HashMap原理学习,开发Mysql分库分表路由组件!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 什么?Java 面试就像造火箭 单纯了! 以前我也一直想 Java 面试就好好面试呗 ...

  7. 分库分表框架ShardingSphere入门学习1

    背景 传统的将数据集中存储至单一数据节点的解决方案,在性能.可用性和运维成本这三方面已经难于满足互联网的海量数据场景. 从性能方面来说,由于关系型数据库大多采用 B+ 树类型的索引,在数据量超过阈值的 ...

  8. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  9. DB层面上的设计 分库分表 读写分离 集群化 负载均衡

    第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的 ...

  10. 数据库分库分表(sharding)系列【转】

    原文地址:http://www.uml.org.cn/sjjm/201211212.asp数据库分库分表(sharding)系列 目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三 ...

随机推荐

  1. Noah-MP陆面过程模型建模

    [原文链接]:Noah-MP陆面过程模型建模方法与站点.区域模拟实践技术 [方式]:直播+永久回放+长期答疑群辅助+全套资料 [目标]:了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作 ...

  2. 在centOS上配置web服务器

    centos,web服务,apache,ftp服务器,mysql,makefile (1). 检查系统是否正常 # more /var/log/messages //检查有无系统内核级错误信息 # d ...

  3. 【转】CentOS安装VMware Tools

    [转]CentOS安装VMware Tools VMware 是非常好的虚拟机软件.如果系统安装了VMware Tools以后对虚拟机的性能会提升很多的.下面是如果在CentOS系统内安装VMware ...

  4. leetcode:94. 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? ...

  5. PyTorch分分钟快速安装

    PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口. 它是由Torch7团队开发,是一个以Pyth ...

  6. 接口API用例自动转locust测试用例

    做接口测试是必要的,写完接口测试用例,再写locust压测脚本,其实差异不大: 写个简单的py,把接口测试脚本转为locust压测脚本,本例只是简单的示范: 原接口校验脚本: 1 # -*- codi ...

  7. Python阿里云消息推送调用API

    很多公司测试APP推送时候,应该也是很头疼:推送环境:测试.正式,稍不注意就把测试的push到正式上,导致所有用户都收到 例子很多: 其实阿里.极光都有推送Api,直接调用API就ok,特别是有的公司 ...

  8. (已解决)安装PyMySQL出现问题--'pip' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    问题描述: 输入cmd,进入命令窗口,输入pip install pymysql时候出现下面的问题: 然后进入python环境中去输入还是报错: 问题原因:环境变量配置出错,cmd下无法调用pip程序 ...

  9. 01_Vue技术-Hello案例分析

    初始vue:       1.想让vue工作,就必须创建一个Vue实例,且要传入一个配置对象:       2.root容器里的代码依然符合html规范,只不过混入了一些特殊的vue语法:       ...

  10. Git 工具下载慢问题 & 图像化界面工具

    Git 命令行淘宝镜像:git-for-windows Mirror (taobao.org) Git 图形客户端:Download – TortoiseGit – Windows Shell Int ...