N 年前,为了学习分库分表,我把 Cobar 源码抄了一遍

news/2024/11/15 9:31:53/文章来源:https://www.cnblogs.com/makemylife/p/18203008

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 则用于完成底层的事件驱动机制。

Reactor 模式

我接触到 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年那个傻傻的抄写代码的我,有人说我长得像周杰伦,不过我觉得像梁朝伟 !


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709508.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4、Git之分支操作

4.1、分支的概述 在版本控制过程中,当需要同时推进多个任务时,可以为每个任务创建的单独分支。 虽然分支的底层实现是指针的引用,但是初学阶段可以将分支简单理解为副本,一个分支就是一个单独的副本。 使用分支,意味着从原来的主干上分离开,在分支上做的任何改动,在合并…

Spring 对 Junit4,Junit5 的支持上的运用

1. Spring 对 Junit4,Junit5 的支持上的运用 @目录1. Spring 对 Junit4,Junit5 的支持上的运用每博一文案2. Spring对Junit4 的支持3. Spring对Junit5的支持4. 总结:5. 最后:每博一文案 关于理想主义,在知乎上看到一句话:“他们并不是不懂别人口中的现实,他们只是不信,事…

Eclipase的JNnit导包报错

在使用Eclipase 创建项目时系统会自动帮我们生成一个module文件,JNnit单元测试时,记得删除自动生成的 module-info.java文件,不然会一直报错找不到 org

来玩 GitHub 啊,SSH 连接方式

Windows 11 git version 2.32.0.windows.2 GitHub 20240520 --今天找回了自己的 GitHub 账号密码,继续玩吧,再次加入 蓝星的开源软件基地。 使用邮箱注册的,找回密码也很方便。本文简要展示 按照官方文档的介绍 使用 SSH 连接 GitHub 的过程。 简述为:创建SSH密钥对 公钥注…

来玩 GitHub 啊,SSH 连接

今天找回了自己的 GitHub 账号密码,继续玩吧,再次加入 蓝星的开源软件基地。 使用邮箱注册的,找回密码也很方便。本文简要展示 按照官方文档的介绍 使用 SSH 连接 GitHub 的国产。主要文档 1、Connecting to GitHub with SSH https://docs.github.com/en/authentication/con…

ABC 354 (atcoder beginer 354) D、E、F

D检查: 1. 有可能是推导式有问题,比如-/+写错 2. x,y A、B、C、D 顺序可能搞反了 不要盲目调试,先用人眼看一下代码的情况,找一下错误很简单的找规律的题目。 很不能理解过的人,就这些。 x方向,y方向,都是4行/列,一个规律的循环。求(0,0)到(x,y)中的黑色块: 第0-3…

BUUCTF-WEB(21-25)

[HCTF 2018]admin 这道题目就是admin说明得管理员登录 那我直接创一个admin的账号但是显示已经存在了说明用户名就是admin,然后我们直接爆破,也是爆破出来密码就是123直接登录[MRCTF2020]你传你🐎呢 这个题就是文件上传,我们MIME绕过,后缀名都被ban了,我们上传.htaccess…

5.8-随堂练习1

1992年,姜万勐 看到 MPEG芯片 Epiphany – 用MPEG1 把图像和声音同时存储在一张小光盘上 VCD(Video Compact Disc)。 1993年9月 万燕第一批1000台VCD机下线。 几乎都被国内外家电公司买去解剖做样机 万燕VCD 100% 市场份额 1995年 各路仿制的VCD机大举进军市场,竞争激烈。 …

5.8-随堂练习-小组练习2

结合本小组项目写下能想到的所有 SWOT答案: 【第九组】 在充电桩电控系统项目中,可以想到以下所有的SMOT(Strengths, Weaknesses, Opportunities, Threats): Strengths (强项):功能丰富:系统具有多种功能,包括充电桩管理、用户充电、支付功能等。 易用性:界面设计简洁…

foobar2000 v2.1.5 汉化版

foobar2000 v2.1.5 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…

学习笔记

CPP:函数指针定义方法 int (func)(int i); int (p)(int)=func

C123【模板】扩展域并查集 P1892 [BOI2003] 团伙

视频链接: P1892 [BOI2003] 团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 扩展域并查集 #include <iostream> #include <cstring> #include <algorithm> using namespace std;int n,m,a,b,s; int p[2005];int find(int x){return p[x]==x?x:p[…