当前位置: 首页 > 科技观察

说说数据库组件功能设计要点

时间:2023-03-23 01:40:30 科技观察

简介数据库中间件负责应用程序与数据库之间的粘合和润滑。合理应用数据库中间件设计,运行起来如丝般顺滑,否则会拉胯。本文总结了常用数据库组件相关的功能设计点:分库分表数据复制数据同步平台全局唯一主键运维自动化可视化工藤表接受请求。尽管分库分表组件众多,但ApacheShardingSphere作为Apache的顶级项目仍然是主流。无论是直接使用还是基于其二次开发或自研,都值得研究。1、ShardingSphere-JDBC客户端直连数据库,分布式无中心化,主要针对java语言,消耗大量数据库连接。2、ShardingSphere-Proxy客户端先连接Proxy代理,通过代理连接数据库,可以跨语言,消耗数据库连接少(只有代理直接连接数据库),但主要中心化的风险也在这里。3、ShardingSphere-Sidecar网格代理还在规划中。从目前Ant提供的servicemesh商业计划来看,没有DBmesh。在下沉能力的同时,也带来了数据平面和控制面板的复杂性。https://github.com/apache/shardingsphere.git备注:目前客户端直连数据库为主流,中心化Proxy仍有部分公司采用,但占比仍然很小。至于Sidecar模型的大规模使用,还是未来的事情。二、数据复制1、单向传输将Mysql数据同步到消息队列或其他数据存储源。常用的开源组件是canal。https://github.com/alibaba/canal![](https://gitee.com/laoliangcode/md-picture/raw/master/img/mysqlbinloganalysis.png)2.双向/单向异地同步针对多活场景下数据库双向同步、跨机房容灾单向同步等场景,使用通用组件otter。https://github.com/alibaba/otter其他类似组件:dataLink、databushttps://github.com/ucarGroup/DataLinkhttps://github.com/linkedin/databus备注:通常伴随单/双向同步场景与DDL同步。3、数据同步平台随着数据同步的场景越来越多,为每个不同的数据源编写一个同步插件变得复杂且难以维护。这时候可以考虑搭建一个数据同步平台。通过ReaderPugin和WriterPlugin插件插件,只需要编写插件即可访问数据源和目标数据源。可以引入数据转换以提高吞吐量性能。可以引入Flink批处理框架。注:数据同步平台社区也有开源的DataX可供参考。https://github.com/alibaba/DataX/blob/master/introduction.mdFlink-CDChttps://github.com/ververica/flink-cdc-connectors4.分布式数据库最好使用分布式全局唯一主键全局唯一ID作为数据记录的唯一标识的原因也很简单,主要是为了避免主键冲突。跨库数据迁移避免主键冲突双活数据库双向同步时避免主键冲突合理设计唯一键对排序识别有很好的辅助作用雪花算法(snowflake)生成唯一标识符雪花算法:创建通过推特生成全球唯一ID的算法,一个SnowflakeID共有64位如下,如果不需要这么多位,可以修改缩短长度。TwitterScala版本:https://github.com/twitter-archive/snowflake/tree/scala_28https://github.com/twitter-archive/snowflake/releases/tag/snowflake-2010Snowflake算法java版本参考:https://github.com/beyondfengyu/SnowFlake/blob/master/SnowFlake.java5.运维自动化和可视化一些常用的DB相关的自动化和可视化,需要手动创建。数据库应用创建DDL变更自动化SQL执行结果导出同步任务应用自动化任务运行监控可视化