如何写一个数据库中间件以及需要准备的知识储备

什么是数据库中间件

1.透明化
		使用方无感知,或者尽量少感知。通过现有的接入端接入已有服务
2.增量服务
		不改变数据库本身功能的前提下,提供额外的功能与服务

一个原则
		不破坏原有逻辑,并且让用户基于之前的经验可以快速上手

接入端协议的选择

		1.编程语言接口(jdbc)     2.数据库协议(数据库本身的协议,不同的数据库有不同的协议,而且有的公开,有的还不公开)
数据库         任意                    单一
异构语言       单一                    任意
连接数         高(代理)              低
性能           损耗低                  损耗略高
无中心化       是                      否
静态入口       无                      有(可独立部署)

确立目标

1.数据分片
    屏蔽数据库分片,使用无感知,应该和不分片的使用一样
2.分布式治理
    配置动态化,监控,调用链,熔断,失效转移(开着飞机换引擎),弹性伸缩
3.分布式事务
    跨片访问较大时,物理存储确实可能跨库访问
    两阶段事务,柔性事务
4.安全管控
    SQL审计(避免慢sql等),数据脱敏(脱敏和非脱敏自动转换),权限控制

数据库中间件和NewSQL的对比

			1.数据库中间件       2.NewSQL
设计理念      稳定+增量            颠覆+兼容(架构颠覆,外形兼容)
存储引擎      沿用关系型数据库     自研(大部分K-V为主)
分布式能力    增量                 原生
可信赖度      高                   待验证(需要时间检测,数据库一般十年才能说稳定)
HTAP(混用)  较难                 较易

(数据库中间件可能会有重复的问题,比如数据库分片,需要解析sql,中间件才能知道去哪片执行,
但真正的数据库层,也会解析sql,才能知道怎么执行sql,所以解析sql会有重复,不可避免)                  

ShardingSphere简单介绍(本文也是听开源者张亮同学的视频的总结)

核心功能
	数据分片,分布式事务,数据库治理
	弹性伸缩,管控界面
接入端
	Sharding-JDBC,Sharding-Proxy,Sharding-Sidecar
核心功能+接入端=(HTAP,云原生,零侵入)

接入端技术储备

编程语言接口
    		JDBC接口
    		各种数据库连接池
    		各种ORM框架和Spring相关知识(Spring自定义命名空间)
数据库协议
    		MySQL & PostgreSQL协议
    		IO  Netty
    		并发 & 多线程

数据分片技术储备

SQL解析(Lexer,Parser,AST)
SQL路由(去哪个片)
SQL改写(到了某个片)
SQL执行(多线程)
结果归并(排序算法)

分布式事务技术储备

两阶段事务
		ACID事务要素
		XA协议以及他的各种实现
		Percolator事务模型(时间戳+两阶段事务做成强一致,来自谷歌论文)
柔性事务
		BASE和CAP理论
		TCC和Saga
		自动补偿,反向SQL
		数据快照,版本控制

数据库治理技术储备

配置中心:注册中心相关,包括Zookeeper、Etcd等
服务治理:服务化相关知识可以复用,如服务发现,熔断,限流,负载均衡,失效转移等
追踪监控:分布式调用链追踪,OpenTracing协议等,数据库以及应用状态相关指标收集和暴露

基础技术储备

性能调优
	JVM GC调优
	内存泄露,资源泄露排查
质量保证
	单元测试,整合测试,压力测试,疲劳测试,性能测试体系的搭建

写中间件理念:随时准备面向开源

1.保持视野的敏锐
	了解技术社区现状,优先考虑复用和融入,而非颠覆
	保证能被人快速上手
2.保持设计解耦
	技术模块与业务模块和环境相关,在设计时即保证解耦
3.随时保持代码精炼
	面向意图编程,代码随时准备开放面向社区,并具备高可读性
一个 TCP 数据库中间件需要考虑以下几个方面: 1. 数据库连接管理:中间件需要负责管理数据库连接,包括连接池的维护、连接的获取和释放等。 2. 数据库语句解析:中间件需要能够解析客户端发送的 SQL 语句,并将其翻译成数据库可执行的语句。 3. 数据库事务处理:中间件需要负责管理事务,包括事务的开启、提交和回滚等。 4. 数据库性能优化:中间件需要数据库进行性能优化,例如缓存查询结果、预编译 SQL 语句等。 下面是一个简单的 TCP 数据库中间件的实现示例: ```python import socket import threading import queue class DatabaseMiddleware: def __init__(self, host, port, db): self.host = host self.port = port self.db = db self.connections = queue.Queue(maxsize=10) self.shutdown = False def start(self): # 启动中间件,监听客户端连接 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((self.host, self.port)) sock.listen(5) while not self.shutdown: conn, addr = sock.accept() conn_thread = threading.Thread(target=self.handle_connection, args=(conn,)) conn_thread.start() def stop(self): # 停止中间件 self.shutdown = True def handle_connection(self, conn): # 处理客户端连接 try: while not self.shutdown: data = conn.recv(1024) if not data: break statement = self.parse_statement(data) result = self.execute_statement(statement) conn.sendall(result) finally: conn.close() def parse_statement(self, data): # 解析客户端发送的 SQL 语句 return data.decode('utf-8') def execute_statement(self, statement): # 执行 SQL 语句,并返回结果 conn = self.get_connection() try: cursor = conn.cursor() cursor.execute(statement) result = cursor.fetchall() finally: self.release_connection(conn) return str(result).encode('utf-8') def get_connection(self): # 获取数据库连接 try: conn = self.connections.get(block=False) except queue.Empty: conn = self.db.connect() return conn def release_connection(self, conn): # 释放数据库连接 if self.connections.full(): conn.close() else: self.connections.put(conn) ``` 在上面的代码中,我们使用了 Python 的 `socket` 模块来监听客户端连接,并使用了 `threading` 模块来处理连接。 在 `DatabaseMiddleware` 类的 `start` 方法中,我们使用了一个循环来不断接收客户端连接,当有客户端连接时,我们会启动一个新的线程来处理这个连接。 在 `handle_connection` 方法中,我们使用了一个循环来不断接收客户端发送的数据,当客户端发送空数据时,表示连接已经断开,我们会关闭连接。 在 `parse_statement` 方法中,我们将客户端发送的二进制数据解码成字符串。 在 `execute_statement` 方法中,我们使用了 `get_connection` 方法来获取数据库连接,使用 `cursor` 对象执行 SQL 语句,并使用 `fetchall` 方法获取查询结果。查询结果会被转换成字符串类型,并使用 `encode` 方法编码成二进制数据后返回给客户端。 在 `get_connection` 方法中,我们首先尝试从连接池中获取数据库连接,如果连接池中没有可用的连接,则创建一个新的连接。 在 `release_connection` 方法中,我们将连接放回连接池中,如果连接池已满,则直接关闭连接。 这只是一个简单的示例,实际中间件的实现可能更加复杂,需要考虑更多的因素,例如并发处理、安全性等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值