ShardingSphere 5.x 系列【3】分库分表中间件技术选型

有道无术,术尚可求,有术无道,止于术。

本系列Spring Boot 版本 3.1.0

本系列ShardingSphere 版本 5.4.0

源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo

文章目录

    • 1. 前言
    • 2. My Cat
    • 3. ShardingSphere
    • 4. Dble
    • 5. Vitess
    • 6. 大厂开源
      • 6.1 Cobar
      • 6.2 Atlas
      • 6.3 Oceanus
      • 6.4 TSharding
      • 6.5 Ctrip DAL
    • 7. 总结

1. 前言

在使用分库分表时,已经有成熟的开源解决方案,接下来我们进行相关技术选型。

2. My Cat

官网地址
GitHub
码云

2013年阿里发布了Cobar,但是社区发现了一些严重问题和使用限制,于是有个第一代改良版MyCat

其原理是拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析,比如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
在这里插入图片描述
典型应用场景:

  • 读写分离,主从切换
  • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
  • 多租户应用
  • 报表系统,借助于Mycat的分表能力,处理大规模报表的统计
  • 替代Hbase,分析大数据
  • 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果(除了基于主键的查询)

早些年间,Mycat打着阿里出品的旗号,可谓是大名鼎鼎。随着最近这些年的发展,味道越来越不对。首先是Mycat 1.0 2017年持续断更到2020,并遗留了很多Issues没有解决。
在这里插入图片描述
Mycat 2.0 最新的更新时间也停留在20226月。
在这里插入图片描述

3. ShardingSphere

官网地址
GitHub

Apache ShardingSphere 是一款分布式SQL事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。

发展历史

  • 2016 年,当当网发布了Sharding-JDBC 1.0版本
  • 2018 年,更名为ShardingSphere,并发布了3.0版本,支持代理端Proxy,并加入了Apache孵化器
  • 2019 年,发布4.0版本
  • 2020 年,正式成为Apache顶级项目
  • 2021 年,发布5.0版本,基于可插拔架构对内核进行了全面改造, 核心团队成立了商业公司 SphereEx (思斐软件)。

ShardingSphere 包含以下两大产品:

  • ShardingSphere-JDBC:在 JavaJDBC 层进行增强,应用程序引入jar包方式使用
  • ShardingSphere-Proxy:透明化的数据库代理端,介于应用程序与数据库之间,需要单独部署(类似于MyCat

核心功能:

  • 数据分片
  • 读写分离
  • 分布式事务
  • 数据迁移
  • 联邦查询
  • 数据加密
  • 影子库

产品优势:

  • 极致性能:驱动程序端历经长年打磨,效率接近原生 JDBC,性能极致。
  • 生态兼容:代理端支持任何通过MySQL/PostgreSQL 协议的应用访问,驱动程序端可对接任意实现 JDBC 规范的数据库。
  • 业务零侵入:面对数据库替换场景,ShardingSphere 可满足业务无需改造,实现平滑业务迁移。
  • 运维低成本:在保留原技术栈不变前提下,对 DBA 学习、管理成本低,交互友好。
  • 安全稳定:基于成熟数据库底座之上提供增量能力,兼顾安全性及稳定性。
  • 弹性扩展:具备计算、存储平滑在线扩展能力,可满足业务多变的需求。
  • 开放生态:通过多层次(内核、功能、生态)插件化能力,为用户提供可定制满足自身特殊需求的独有系统。

4. Dble

官方文档
GitHub

dble是一个用于MySQL分片的高可扩展性中间件,由上海爱可生信息技术股份有限公司出品和维护。

核心特性:

  • MySQL协议兼容
  • 高可用性,支持集群部署,避免单节点故障
  • SQL 92标准和MySQL方言支持,支持复杂的SQL查询,如group-byorder-bydistinctjoinunionsub-query
  • 复杂查询优化
  • 分布式事务支持

5. Vitess

官方网站
GitHub

VitessYoutube出品的一个开源分布式MySQL工具集,用于自动分片存储MySQL数据表,将单个SQL查询改写为分布式发送到多个MySQL Server上。

2011年以来,Vitess一直是YouTube数据库基础设施的核心组件,并已发展到包含数万个MySQL节点。

相关特性:

  • 连接池:将应用程序查询复用到MySQL连接池中,以优化性能,支持缓存和事务管理器
  • 安全性保护:查询重写和净化;支持自定义规则以防止潜在的问题查询访问数据库;终止返回数据所花费的时间过长的查询;支持ACL
  • 监控:提供性能分析工具监视、诊断和分析数据库性能;群集管理工具处理计划内和计划外故障切换
  • 分片:几乎无缝的动态重新分片,支持垂直和水平分片;多个分片方案,具有插入自定义方案的能力

Vitess目前只支持MySQLPercona Server for MySQL,对于目前国产化要求的政企项目并不友好。

6. 大厂开源

在十几年前的2010年,移动互联网、电子商务产业呈现高速发展的趋势,阿里、腾讯、58骗城、携程等互联网大厂迎来一大波起飞,数据量呈现爆炸式增长。对于核心业务数据存储的关系型数据库,在之前基本都是基于分库分表方案,它们大多都研发并开源了相应的中间件,不过这些开源基本都在多年前停止维护,大多都自研或替换为商业版分布式数据库。

下面会介绍下它们的前世今生,大家了解下即可,切勿尝试。

6.1 Cobar

GitHub
最后发版时间:2014年5月

2008年,当时就职于阿里的大佬陈思儒发布了Amoeba,并应用于阿里巴巴生产环境,Amoeba专注于MySQL分布式数据库代理层,实现了高可用、负载均衡、数据切片等功能,但不支持事务、存储过程。

之后,由于对游戏更感兴趣,大佬跳槽到了盛大,任职了高级研究员,从事相关分布式框架研究工作。
在这里插入图片描述
由于Amoeba作者的离职,阿里重新建立了分库分表项目组,并更新为Cobar,于20126月正式对外开源。

目前已知的,支付宝相关业务数据,使用的是OceanBase原生分布式数据库,运行着数十亿条不同的SQL、数据量达数百PB、服务器核数过百万。

6.2 Atlas

GitHub
最后发版时间:2015年5月

Atlas是由Qihoo 360公司基础架构团队开发维护的一个基于MySQL协议的数据中间件。在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。

Atlas2013发布,当时在360公司内部得到了广泛应用,每天承载的读写请求数达几十亿条。

360网盾发展期,针对业务爆发式增长的数据量,MySQL读写出现瓶颈,分库分表及大表改表实施困难。其核心业务总数据达到千亿级别,单表数据量 1.2~1.5 亿,查询维度包括时间维度、地域、行业、关键词等等,同时满足多样化的展示,基于MySQL的分库分表无法进行全局统计。

目前360已基于TiDB搭建了分布式数据库,完全解决了分库分表问题。

6.3 Oceanus

GitHub
最后发版时间:未发布正式版

2014年,58同城发布了数据库中间件Oceanus,致力于打造一个功能简单、可依赖、易于上手、易于扩展、易于集成的DB中间件解决方案。该项目在2015后,已经停止更新。

58集团目前完成了分库分表到TiDB的技术转型,目前,内部TiDB集群已经达到80套,涵盖的业务线包括 58 招聘、TEG、安居客、用户增长、信息安全、金融公司及车业务。

6.4 TSharding

GitHub
最后发版时间:2017年I月

TSharding是蘑菇街开源的一个分库分表解决方案,目前也已停止维护多年。

6.5 Ctrip DAL

GitHub
最后发版时间:22020年I月

2016年,作为中国在线旅游行业的翘楚,携程发布了数据库访问框架Ctrip DAL,支持代码生成和水平扩展。由携程技术中心框架部DAL团队开发,历经3年不断打磨,并在长期的实际使用中基于大量的用户反馈不断优化。开源范围包括代码生成器,Java客户端和C#客户端。

随着携程规模扩张和业务量的急剧增加,其中标签持久化场景采用了 TiDB 来存储业务持久化的标签,其他业务数据使用OceanBase(阿里自研关系型数据库)。

7. 总结

首先MyCat不考虑,被吹的太过,基本属于没人维护状态,听说该项目现在只是用来引流,加群付费,营销卖课。

Vitess国外开源,生态良好,更新频繁,但是只支持MySql,对于现在国内某些有数据库要求的产品来说,不太友好。

不是大型公司开源类的,不用考虑,现在经济形势这么差,谁也说不好能走多久,而且大部分都是给商用引流。

大厂开源类的,不用考虑,基本都是他们不玩了,然后拿出来乐呵乐呵的。

所以最后,只有一个选择,就是ShardingSphere,背靠Apache基金会,团队维护,生态和文档完整🤔🤔🤔🤔🤔🤔

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 类与对象(下)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3.友元 3.1友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 【本节目标】 1. 再谈构造函数 2. Static成员…

【产品升级】SmartPipe升级到版本2.0

在近一个月的攻关和测试下,SmartPipe软件轴线自动识别算法的性能大幅提升,鲁棒性和稳定性进一步增强。近一年来客户累计反馈的多种复杂管路(包括带有支管管路、带有压瘪段管路、推弯管、装配管、带有复杂孔洞管路等)现在均能够正确…

通过消息队列实现进程之间通信代码

#include <myhead.h> struct msgbuf {long int mtype; char mtext[1024]; }; //定义一个消息大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long int) int main(int argc, const char *argv[]) {//1、创建key值以便创建消息队列key_t key ftok("/", k)…

Bootstrap5 图片轮播

Bootstrap5 轮播样式表使用的是CDN资源 <title>亚丁号</title><!-- 自定义样式表 --><link href"static/front/css/front.css" rel"stylesheet" /><!-- 新 Bootstrap5 核心 CSS 文件 --><link rel"stylesheet"…

STM32WLE5JC

Sub-GHz 无线电介绍 sub-GHz无线电是一种超低功耗sub-GHz无线电&#xff0c;工作在150-960MHz ISM频段。 在发送和接收中采用LoRa和&#xff08;G&#xff09;FSK调制&#xff0c;仅在发送中采用BPSK/(G)MSK调制&#xff0c;可以在距离、数据速率和功耗之间实现最佳权衡。 这…

freeswitch对接FunASR实时语音听写

1、镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像&#xff1a; sudo docker pull \registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.7 mkdir -p ./funasr-runtime-resources/models sudo docker run -p 10096:10095 -i…

【Gephi项目实战-带数据集】利用gephi绘制微博肖战超话120位用户关系图,并计算整体网络指标与节点指标

数据集在评论区&#xff0c;B站演示视频在评论区&#xff01; 简介 最近2天需要用到gephi做社会网络分析&#xff0c;于是从0开始接触gephi并摸索出了gephi的基本使用指南。下面将结合真实的节点文件与边文件&#xff0c;利用gephi绘制社会网络并计算相关测量指标。整个过程会…

我们都是宇宙的奇迹

我们都是独一无二的个体&#xff0c;是宇宙的奇迹 如果我不关注自我&#xff0c;那我在这个宏大的宇宙中有什么意义&#xff1f; 关于你的问题&#xff0c;我想没有一个简单的答案&#xff0c;因为不同的人可能有不同的看法和感受。有些人可能认为&#xff0c;如果不关注自我&…

jbdc的简单了解

JDBC JDBC所处的位置 JDBC的本质 Java操作数据库的一套接口。 补充 ddl:数据库定义语言,例如建表,创建数据库等。 dml:数据库操作语言,例如增删改。 dql:数据库查询语言,例如查询语句。 注意 在创建Java项目后的第一个步骤是导入jar包。 导入jar包的步骤 1 创建l…

【C语言】const修饰指针的不同作用

目录 const修饰变量 const修饰指针变量 ①不用const修饰 ②const放在*的左边 ③const放在*的右边 ④*的左右两边都有const 结论 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但…

TCP/IP详细介绍以及TCP/IP寻址

目录 ​编辑 1. TCP/IP 介绍 2. 计算机通信协议&#xff08;Computer Communication Protocol&#xff09; 3. 什么是 TCP/IP&#xff1f; 4. 在 TCP/IP 内部 5. TCP 使用固定的连接 6. IP 是无连接的 7. IP 路由器 8. TCP/IP 9. TCP/IP 寻址 10. IP地址 …

LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】

文章目录 前言LeetCode、1137. 第 N 个泰波那契数【简单&#xff0c;动态规划】题目与分类思路一维动态规划 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…

记录下ibus-libpinyin输入法的重新安装

目前的版本为: 首先把现在的ibus-libpinyin卸了 sudo apt-get --purge remove ibus-libpinyin sudo apt-get autoremove 安装教程请参考 Installation libpinyin/ibus-libpinyin Wiki GitHub yilai sudo apt install pkg-config sudo apt-get install libglib2.0-de…

02-Web应用_架构构建_漏洞_HTTP数据包_代理服务器

Web应用_架构构建_漏洞_HTTP数据包_代理服务器 一、网站搭建前置知识1.1 域名1.2、子域名1.3、DNS二、web应用环境架构类三、web应用安全漏洞分类四、web请求返回过程数据包 五、演示案例5.1、架构-Web应用搭建-域名源码解析5.2、请求包-新闻回帖点赞-重放数据包5.3、请求包-移…

内网远程控制——向日葵

针对向日葵的话其实如果有本地安装的话&#xff0c;是有可能存在漏洞的。这里进行复现 攻击过程&#xff1a; 向日葵&#xff08;不可以攻击&#xff09; 遇到不可以攻击的向日葵&#xff0c;我们也有几种渗透手法&#xff1a; &#xff08;1&#xff09;窃取配置文件来进行解…

【八大排序】选择排序 | 堆排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、选择排序1.1 基本思想1.2 算法步骤 动图演示1.3 代码实现1.4 选择排序特性总结 二…

【开源】SpringBoot框架开发农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

Profinet转CANopen主站网关与堡盟编码器通讯案例

Profinet转CANopen主站网关(XD-COPNm20)为CPU与堡盟编码器的通讯提供了CANopen协议向Profinet协议转换互通的桥梁。CANopen是一种基于CAN总线的通讯协议&#xff0c;它被广泛应用于工业自动化领域&#xff0c;而Profinet是一种以太网协议&#xff0c;其优点是高速传输和广泛的可…

前端JavaScript篇之JavaScript为什么要进行变量提升,它导致了什么问题?什么是尾调用,使用尾调用有什么好处?

目录 JavaScript为什么要进行变量提升&#xff0c;它导致了什么问题&#xff1f;总结 什么是尾调用&#xff0c;使用尾调用有什么好处&#xff1f;总结 JavaScript为什么要进行变量提升&#xff0c;它导致了什么问题&#xff1f; 变量提升是JavaScript在代码执行之前对变量和函…

机器学习---半监督学习简单示例(标签传播算法)

1. 使用半监督学习方法 Label Spreading 在一个生成的二维数据集上进行标签传播 import numpy as np import matplotlib.pyplot as plt from sklearn.semi_supervised import label_propagation from sklearn.datasets import make_circles# generate ring with inner box n_s…