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

什么是数据库中间件

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.随时保持代码精炼面向意图编程,代码随时准备开放面向社区,并具备高可读性

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

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

相关文章

HTTP断点续传

一、概述所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需…

RSA公钥文件(PEM)解析

公钥语法为: RSAPublicKey :: SEQUENCE { modulus INTEGER, //RSA合数模n publicExponent INTEGER //RSA公开幂e } 说明: 1.此语法中的modulus和publicExponent,提取自对应私钥中的同名域值。 2.PKCS1和PKCS8的公钥文件是一样的&#xff…

[spring boot] ------ 总结1

spring boot 设计目的:简化spring应用的初始搭建以及开发过程 spring环境的微服务:对原有技术的封装(spring springMVC) 简化开发,提高开发效率(原ssm--->spring boot mybatis) 自动配置&…

RSA私钥文件(PEM-PKCS#1)解析

在PKCS#1 RSA算法标准中定义RSA私钥语法 RSAPrivateKey :: SEQUENCE { version Version, //版本 modulus INTEGER, // RSA合数模 n publicExponent INTEGER, //RSA公开幂 e privateExponent INTEGER, //RSA私有幂 d prime1 INTEGER, //n的素数因子p prime2 INTEGER, //n的…

Spring的@Configuration使用cglib代理的效果和我自己写的简单实现

下面的代码,照着复制就能跑起来 今天看了下Spring的Configuration,即java类配置bean,(这个spring3的新功能,虽然现在已经spring5了,但是这种配置bean的方式也是比较火的) 做了如下测试,发现一个…

Xcode中StaticLibrary和Framework的共同点和区别

一、共同点:两者其实都是静态库。二、区别1.承载的内容范畴:(1)StaticLibrary的产出物只是一个.a文件,为二进制执行文件。分享给别人的时候,头文件、静态资源文件需要另外提供。(2)Framework为一站式分享方案,其实是一…

[分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)

雪花算法(Twitter_Snowflake) 我们知道,分布式全局唯一id的生成,一般是以下几种: 基于雪花算法生成基于数据库基于redis基于zookeeper 本文说下雪花算法,后面附源码以及测试代码。 如下图: …

非对称加解密交互故事

1.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 2.鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。 3.苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果 4.鲍勃收信后,用私钥解密&#xff0…

2019年规划

2019年规划,到2019-12-31检查: 1.至少读5本与工作无关的书(平均两个月1本),每本都产出读后感 1.1 《重构 改善代码既有设计》,2月19日~3月5日,刚好两周读完,产出两篇总结&#xff0…

RSA私钥文件(PEM-PKCS#8)解析

***此文仅针对没有执行加密的PKCS#8私钥文件***一、实例解析PKCS#8格式使用的是ASN.1结构,首先我们对一个没有执行加密的PKCS#8格式私钥文件进行一下解析,方便我们下面分析其结构。命令:openssl asn1parse -i -in privatekey.pem结果如下&…

分布式和集群的区别

分布式和集群的区别 分布式是多个不同功能的机器共同完成一件事情 集群是多个相同功能的机器完成的是相同的事情 分布式是为了分担压力 集群是为了稳定性和高可用 举个例子: 一个厨师开了一个饭店,他要负责做饭和卖饭,他的压力就比较大&am…

Sqlite3中replace语句用法详解

在本例中使用如下数据库表: (图 1) 该表的表名为student, 存储学生信息。 所有字段的数据类型都是TEXT 。 其中id和name作为复合主键。 email字段加上了唯一约束。建表语句如下: CREATE TABLE IF NOT EXISTS student …

[分布式一致性协议] ------ raft协议的解释与理解

前言 在分布式系统中,为了保证容错性,一般会维护多个副本集群,提高系统的高可用,但与之带来的问题就是多个副本的一致性(consensus)问题。 我们认为,对于一个具有一致性的的集群中,…

iOS应用图片命名规则

一、界面图片命名规则:MyImage.png 一般图片命名MyImage2x.png 高清图片命名MyImage~iphone.png iPhone 和 iPod touch版一般图片命名MyImage2x~iphone.png iPhone 和 iPod touch版高清图片命名MyImage~ipad.png …

用户自定义排序的几种实现思路

场景 每个用户,有多个分组 每个分组在页面展示,而且是有顺序的,这个顺序是由用户决定 以下是关于多种情况下的库表设计思路: 情景一:如果每改一次,就要实时修改库,而且用户可以任意修改顺序&…

重构,体现一个工程师的基本素养和底蕴

重构小记(重构,改善既有代码的设计读后总结) 我们要时时刻刻保持一颗项目要重构的心。 在非技术出身的领导看来,能用的代码就是好代码,只关注功能。 在工程师看来,代码不仅要好用,更要好看&…

应用内购买(IAP)各类型在服务端的验证规则

一、非消耗品(比如单本杂志购买,苹果服务器支持恢复) 1.先验证服务器有没有购买记录,如果有,则不处理,此次操作成功 ;2.如果服务器没有购买记录,则到苹果服务器验证(1)首先到正式验证地址验证收据,如果返回…

@Transactional事务生效条件与样例

Transactional事务生效条件 Transactional注释的方法,不能是private修饰 Transactional注释的方法,必须是有接口的方法实现(通用的Spring面向接口编程的套路) Transactional注释的方法,必须要通过接口的方式调用&…

利用.dSYM和.app文件准确定位Crash位置

当发布到iPhone上的应用程序Crash之后,iPhone会自动生成一个Crash Log(*.crash),这个文件包含了一些有用的调试信息,但对于堆栈,它只记录的函数地址,而无法显示函数名。函数名保存在一个叫dSYM的…

使用maven的profile区分本地环境和线上环境

使用maven的profile区分本地环境和线上环境 多环境开发,使用maven-profile,就可以在打包的时候通过参数的调整,最终打的包也不同。 以区分本地数据库和线上数据库为例 比如测试环境,用的是本地测试数据库;生产环境用…