Database
ShardingSphere proxy原理
代理分为前端和后端。
类 MetaDataContextsBuilder会根据配置文件构建数据的上下文,其中包括 前端和后端数据库类型。
调用流程 FrontendChannelInboundHandler
@Override public void channelRead(final ChannelHandlerContext context, final Object message) { if (!authenticated) { authenticated = authenticate(context, (ByteBuf) message); return; } ProxyStateContext.execute(context, message, databaseProtocolFrontendEngine, connectionSession); } 然后采用JDBC代理 JDBCOKProxyState,这里使用了一个异步线程去处理。
@Override public void execute(final ChannelHandlerContext context, final Object message, final DatabaseProtocolFrontendEngine databaseProtocolFrontendEngine, final ConnectionSession connectionSession) { CommandExecutorTask commandExecutorTask = new CommandExecutorTask(databaseProtocolFrontendEngine, connectionSession, context, message); ExecutorService executorService = determineSuitableExecutorService(context, databaseProtocolFrontendEngine, connectionSession); executorService.execute(commandExecutorTask); } CommandExecutorTask
private boolean executeCommand(final ChannelHandlerContext context, final PacketPayload payload) throws SQLException { CommandExecuteEngine commandExecuteEngine = databaseProtocolFrontendEngine.
Database
ShardingSphere开发者编译指南
需要对接ShardingSphere(后简称SS)做一些开发,所以要编译这个庞大的项目。
环境 文档, 注意一点就是开启git的长文件名,不然clone到一半发现失败了。
git config --global core.longpaths true 编译 文档
因为SS使用了Antlr,需要全局编译才能触发Antlr插件,否则这部分代码编译不到。使用 release的profile。
mvn install -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Drat.skip=true -Djacoco.skip=true -DskipITs -DskipTests -Prelease 运行调试 SS的代码有200多个模块,分得非常细,我这边主要对接 proxy端,所以可以一眼发现 proxy模块。
对应的启动类位于 shardingsphere-proxy-bootstrap模块的 Bootstrap 类。
要调试的话,将 resources/conf/server.yaml 里面修改一些配置:
因为我只是本地调试其他功能,所以不需要集群模式,关于完整模式请看文档.
下面是配置SS的用户名和密码,这里配了2个用户,root和sharding。
mode: type: Memory rules: - !AUTHORITY users: - root@%:root - sharding@:sharding provider: type: ALL_PERMITTED 然后是数据源的配置,修改 conf/config-sharding.yaml:
因为这里不需要分片,所以只配了一个mysql实例,逻辑数据库名称是db,mysql里的数据库是 ds01.
databaseName: db dataSources: ds01: url: jdbc:mysql://localhost:3306/ds01 username: root password: 123456 因为需要用到mysql,这里用docker在本地起一个:
docker run --name mysql-ds01 -d -e MYSQL_DATABASE=ds01 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.
Database
如何实现一个数据库
一个数据库系统有哪些部分组成? SQL语法定义(如果和标准SQL有区别或扩展) SQL解析器 SQL优化器 执行器:分析和查询的区分 存储层 实现数据库常用的技术有哪些呢?
undo log WAL 关系模型 索引 用C构建一个sqlite数据库 如果你搜索从零构建数据库,一定会得到这个老哥的博客:Let’s Build a Simple Database
他用C语言实现了一个sqlite数据库,教程也挺完整,包括B树的实现,非常推荐。
关系模型理解 这位老哥的文章:How to Build a Relational Database From Scratch
然后他用python代码简单描述了下,可以用来学习关系模型的交并差。
用Go语言实现简单内存数据库 https://github.com/eatonphil/gosql
这哥们实现了Insert、Create、Select的语法解析,纯手写。查询只支持Filter。 存储层只实现了内存版本。
Writing a SQL database from scratch in Go Binary expressions and WHERE filters Indexes A database/sql driver 其目标是向PG前进,现在没有SQL优化器,这个进度算是5%吧。
用Go实现内存版MySQL数据库 https://github.com/dolthub/go-mysql-server
除了存储引擎是内存,其他部分基本上都包括,遵循MySQL的连接协议,还有查询计划优化。
Go实现的PG内存版测试数据库 https://github.com/proullon/ramsql
看起来很简单,也没有SQL优化部分。
Cockroach DB https://github.com/cockroachdb/cockroach
小强DB就是个完整的KV分布式数据库了,基于Go实现,已经可以用于生产。
看记录从16年就开始开源了。
用Go实现一个嵌入式时序数据库 其博客地址:Write a time-series database engine from scratch