ShardingSphere分库分表产品介绍

news2024/11/27 11:51:00

目录

一、ShardingSphere分库分表产品介绍

二、客户端分库分表与服务端分库分表

1、ShardingJDBC客户端分库分表

2、ShardingProxy服务端分库分表

3、ShardingSphere混合部署架构

三、分库分表,能不分就不分!

1、为什么要分库分表?

2、分库分表的优势

3、分库分表的挑战


一、ShardingSphere分库分表产品介绍

shardingsphere官网地址:Apache ShardingSphere

 

ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续开发。在国内历经了当当网、电信翼支付、京东数科等多家大型互联网企业的考验,在2017年开始开源。并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere。到2020年4月,已经成为了Apache软件基金会的顶级项目。发展至今,已经成为了业界分库分表最成熟的产品。

ShardingSphere这个词可以分为两个部分,其中Sharding就是我们之前介绍过的数据分片。从官网介绍上就能看到,他的核心功能就是可以将任意数据库组合,转换成为一个分布式的数据库,提供整体的数据库集群服务。只是给自己的定位并不是Database,而是Database plus。其实这个意思是他自己并不做数据存储,而是对其他数据库产品进行整合。整个ShardingSphere其实就是围绕数据分片这个核心功能发展起来的。

后面的Sphere是生态的意思。这意味着ShardingSphere不是一个单独的框架或者产品,而是一个由多个框架以及产品构成的一个完整的技术生态。目前ShardingSphere中比较成型的产品主要包含核心的ShardingJDBC以及ShardingProxy两个产品,以及一个用于数据迁移的子项目ElasticJob。另外现在也提供了基于公有云的云上服务ShardingSphere-on-Cloud。

ShardingSphere经过这么多年的发展,已经不仅仅只是用来做分库分表,而是形成了一个围绕分库分表核心的技术生态。他的核心功能已经包括了数据分片、分布式事务、读写分离、高可用、数据迁移、联邦查询、数据加密、影子库、DistSQL庞大的技术体系。

目前ShardingSphere已经演进到了5.x大版本。在这个大版本中,ShardingSphere的核心是可插拔。其核心设计哲学就是连接、增强以及可拔插。这是官网对于其整个设计哲学的核心描述。

二、客户端分库分表与服务端分库分表

ShardingSphere最为核心的产品有两个:一个是ShardingJDBC,这是一个进行客户端分库分表的框架。另一个是ShardingProxy,这是一个进行服务端分库分表的产品。他们代表了两种不同的分库分表的实现思路。

1、ShardingJDBC客户端分库分表

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;
  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库。

这是ShardingSphere最初的产品形态。

2、ShardingProxy服务端分库分表

ShardingSphere-Proxy 定位为透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持。 目前提供 MySQL 和 PostgreSQL 协议,透明化数据库操作,对 DBA 更加友好。

  • 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用;
  • 兼容 MariaDB 等基于 MySQL 协议的数据库,以及 openGauss 等基于 PostgreSQL 协议的数据库;
  • 适用于任何兼容 MySQL/PostgreSQL 协议的客户端,如:MySQL Command Client, MySQL Workbench, Navicat 等。

3、ShardingSphere混合部署架构

这两个产品都各有优势。ShardingJDBC跟客户端在一起,使用更加灵活。而ShardingProxy是一个独立部署的服务,所以他的功能相对就比较固定。他们的整体区别如下:

ShardingSphere-JDBC

ShardingSphere-Proxy

数据库

任意

MySQL/PostgreSQL

连接消耗数

异构语言

仅 Java

任意

性能

损耗低

损耗略高

无中心化

静态入口

另外,在产品图中,Governance Center也是其中重要的部分。他的作用有点类似于微服务架构中的配置中心,可以使用第三方服务统一管理分库分表的配置信息,当前建议使用的第三方服务是Zookeeper,同时也支持Nacos,Etcd等其他第三方产品。

由于ShardingJDBC和ShardingProxy都支持通过Governance Center,将配置信息交个第三方服务管理,因此,也就自然支持了通过Governance Center进行整合的混合部署架构。

三、分库分表,能不分就不分!

1、为什么要分库分表?

数据库,应该是一个应用当中最为核心的价值所在,也是开发过程中必须熟练掌握的工具。之前我们就学习过很多对MySQL的调优。但是随着现在互联网应用越来越大,数据库会频繁的成为整个应用的性能瓶颈。我们经常使用的MySQL数据库,也就不断面临数据量太大、数据访问太频繁、数据读写速度太快等一系列的问题。而传统的这些调优方式,在真正面对海量数据冲击时,往往就会显得很无力。因此,现在互联网对于数据库的使用也越来越小心谨慎。例如添加Redis缓存、增加MQ进行流量削峰等。但是,数据库本身如果性能得不到提升,这就相当于是水桶理论中的最短板。

要提升数据库的性能,最直接的思路,当然是对数据库本身进行优化。例如对MySQL进行调优,优化SQL逻辑,优化索引结构,甚至像阿里等互联网大厂一样,直接优化MySQL的源码。但是这种思路在面对互联网环境时,会有很多非常明显的弊端。

  • 数据量和业务量快速增长,会带来性能瓶颈、服务宕机等很多问题。
  • 单点部署的数据库无法保证服务高可用。
  • 单点部署的数据库无法进行水平扩展,难以应对业务爆发式的增长。

这些问题背后的核心还是数据。数据库不同于上层的一些服务,他所管理的数据甚至比服务本身更重要。即要保证数据能够持续稳定的写入,又不能因为服务故障造成数据丢失。现在互联网上的大型应用,动辄几千万上亿的数据量,就算做好数据的压缩,随随便便也可以超过任何服务器的存储能力。并且,服务器单点部署,也无法真正解决把鸡蛋放在一个篮子里的问题。将数据放在同一个服务器上,如果服务器出现崩溃,就很难保证数据的安全性。这些都不是光靠优化MySQL产品,优化服务器配置能够解决的问题。

2、分库分表的优势

那么自然就需要换另外一种思路了。我们可以像微服务架构一样,来维护数据库的服务。把数据库从单体服务升级到数据库集群,这样才能真正全方位解放数据库的性能瓶颈,并且能够通过水平扩展的方式,灵活提升数据库的存储能力。这也就是我们常说的分库分表。通过分库分表可以给数据库带来很大的好处:

  • 提高系统性能:分库分表可以将大型数据库分成多个小型数据库,每个小型数据库只需要处理部分数据,因此可以提高数据库的并发处理能力和查询性能。
  • 提高系统可用性:分库分表可以将数据复制到多个数据库中,以提高数据的可用性和可靠性。如果一个数据库崩溃了,其他数据库可以接管其工作,以保持系统的正常运行。
  • 提高系统可扩展性:分库分表可以使系统更容易扩展。当数据量增加时,只需要增加更多的数据库和表,而不是替换整个数据库,因此系统的可扩展性更高。
  • 提高系统灵活性:分库分表可以根据数据的使用情况,对不同的数据库和表进行不同的优化。例如,可以将经常使用的数据存储在性能更好的数据库中,或者将特定类型的数据存储在特定的表中,以提高系统的灵活性。
  • 降低系统成本:分库分表可以使系统更加高效,因此可以降低系统的运营成本。此外,分库分表可以使用更便宜的硬件和存储设备,因为每个小型数据库和表需要的资源更少。

3、分库分表的挑战

可能你会说,分库分表嘛, 也不是很难。一个库存不下,那就把数据拆分到多个库。一张表数据太多了,就把同一张表的数据拆分到多张。至于怎么做,也不难啊。要操作多个数据库,那么建立多个JDBC连接就行了。要写到多张表,修改下SQL语句就行了。

如果你也这么觉得,那么就大错特错了。分库分表也并不是字面意义上的将数据分到多个库或者多个表这么简单,他需要的是一系列的分布式解决方案。

因为数据的特殊性,造成数据库服务其实是几乎没有试错的成本的。在微服务阶段,从单机架构升级到微服务架构是很灵活的,中间很多细节步骤都可以随时做调整。比如对于微服务的接口限流功能,你并不需要一上来就用Sentinel这样复杂的流控工具。一开始不考虑性能,自己进行限流是很容易的事情。然后你可以慢慢尝试用Guava等框架提供的一些简单的流控工具进行零散的接口限流。直到整个应用的负载真正上来了之后,流控的要求更高更复杂了,再开始引入Sentinel,进行统一流控,这都没有问题。这种试错的过程其实是你能够真正用好一项技术的基础。

但是对于数据库就不一样了。当应用中用来存储数据的数据库,从一个单机的数据库服务升级到多个数据库组成的集群服务时,需要考虑的,除了分布式的各种让人摸不着边际的复杂问题外,还要考虑到一个更重要的因素,数据。数据的安全性甚至比数据库服务本身更重要!因此,如果你在一开始做分库分表时的方案不太成熟,对数据的规划不是很合理,那么这些问题大概率会随着数据永远沉淀下去,成为日后对分库分表方案进行调整时最大的拦路虎。

所以在决定进行分库分表之前,一定需要提前对于所需要面对的各种问题进行考量。如果你没有考虑清楚数据要如何存储、计算、使用,或者你对于分库分表的各种问题都还没有进行过思考,那么千万不要在真实项目中贸然的进行分库分表。

分库分表,也称为Sharding。Sharding表示将数据拆分到不同的数据片中。由于数据往往是一个应用的基础,随着数据从单体服务拆分到多个数据分片,应用层面也需要面临很多新的问题。比如:

  • 主键避重问题

在分库分表环境中,由于表中数据同时存在不同数据库中,某个分区数据库生成的ID就无法保证全局唯一。因此需要单独设计全局主键,以避免跨库主键重复问题。

  • 数据备份问题

随着数据库由单机变为集群,整体服务的稳定性也会随之降低。如何保证集群在各个服务不稳定的情况下,依然保持整体服务稳定就是数据库集群需要面对的重要问题。而对于数据库,还需要对数据安全性做更多的考量。

  • 数据迁移问题

当数据库集群需要进行扩缩容时,集群中的数据也需要随着服务进行迁移。如何在不影响业务稳定性的情况下进行数据迁移也是数据库集群化后需要考虑的问题。

  • 分布式事务问题

原本单机数据库有很好的事务机制能够帮我们保证数据一致性。但是分库分表后,由于数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题。

  • SQL路由问题

数据被拆分到多个分散的数据库服务当中,每个数据库服务只能保存一部分的数据。这时,在执行SQL语句检索数据时,如何快速定位到目标数据所在的数据库服务,并将SQL语句转到对应的数据库服务中执行,也是提升检索效率必须要考虑的问题。

  • 跨节点查询,归并问题

跨节点进行查询时,每个分散的数据库中只能查出一部分的数据,这时要对整体结果进行归并时,就会变得非常复杂。比如常见的limit、order by等操作。

在实际项目中,遇到的问题还会更多。从这里可以看出,Sharding其实是一个很复杂的问题,往往很难通过项目定制的方式整体解决。因此,大部分情况下,都是通过第三方的服务来解决Sharding的问题。比如像TiDB、ClickHouse、Hadoop这一类的NewSQL产品,大部分情况下是将数据问题整体封装到一起,从而提供Sharding方案。但是这些产品毕竟太重了。更灵活的方式还是使用传统数据库,通过软件层面来解决多个数据库之间的数据问题。这也诞生了很多的产品,比如早前的MyCat,还有后面我们要学习的ShardingSphere等。

另外,关于何时要开始考虑分库分表呢?当然是数据太大了,数据库服务器压力太大了就要进行分库分表。但是这其实是没有一个具体的标准的,需要根据项目情况进行灵活设计。业界目前唯一比较值得参考的详细标准,是阿里公开的开发手册中提到的,建议预估三年内,单表数据超过500W,或者单表数据大小超过2G,就需要考虑分库分表。

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

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

相关文章

基于SpringBoot点餐系统【附源码】

基于SpringBoot点餐系统 效果如下: 系统首页界面 用户注册界面 美食信息页面 促销活动页面 管理员登录主页面 系统管理界面 订单管理界面 研究背景 随着互联网的迅猛发展和人们生活节奏的加快,传统的点餐方式已经无法满足现代消费者对快速、便捷服务的…

解决银河麒麟操作系统中无法通过管理员安装软件或运行有执行权限脚本的问题

解决银河麒麟操作系统中无法通过管理员安装软件或运行有执行权限脚本的问题 1、问题描述2、问题分析3、问题解决方法 💐The Begin💐点点关注,收藏不迷路💐 1、问题描述 在银河麒麟操作系统中,通过终端执行命令时&…

103页PPT | 智慧城市综合解决方案

智慧城市概况 PPT开篇介绍了智慧城市的发展历程,从2014年国家提出《国家新型城镇化规划(2014-2020年)》开始,到2017年提出从“智慧城市”到“新型智慧城市”的转变,再到2020年新型智慧城市建设取得显著成效。这一过程中&#xff…

3.1 显示层技术演变

文章目录 静态网站公共网关接口CGIServletJSPJSP模板引擎第三方模板引擎前后端分离Thymeleaf 今天我将与大家分享显示层技术的演变历程,以及它们在现代Web开发中的应用。 静态网站 首先,我们从静态网站开始。静态网站主要由HTML、CSS和JavaScript等静态…

JimuReport报表部署 | 升级 | 仪表盘集成 | 迁移其他项目 (图文讲解)

目录 前言1. 项目部署2. 项目升级3. 仪表盘集成3.1 配置类事项3.2 版本升级事项4. 迁移到ruoyi-vue-pro4.1 权限4.2 前端5. 彩蛋前言 以下针对Vue以及Java的项目 对于文中所说的nginx以及Java的相关知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(…

冷热数据分离

优质博文:IT-BLOG-CN 一、背景 随着机票业务的快速发展,订单量持续增长对业务性能带来影响,需要进行冷热数据分离。目前机票订单模块主要使用Mysql(InnoDB)作为数据库存储,历史订单信息状态修改频率低并占用大量数据库存储空间&…

第69期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

LeetCode 1928.规定时间内到达终点的最小花费:动态规划

【LetMeFly】1928.规定时间内到达终点的最小花费:动态规划 力扣题目链接:https://leetcode.cn/problems/minimum-cost-to-reach-destination-in-time/ 一个国家有 n 个城市,城市编号为 0 到 n - 1 ,题目保证 所有城市 都由双向道…

Apache DolphinScheduler社区9月进展记录

各位热爱 Apache DolphinScheduler 的小伙伴们,社区 9 月月报更新啦!这里将记录 Apache DolphinScheduler 社区每月的重要更新,欢迎关注! 月度 Merge Star 感谢以下小伙伴上个月为 Apache DolphinScheduler 做的精彩贡献&#x…

数据结构前置知识(上)

1. 初识集合框架 1.1 什么是集合框架 在了解集合框架之前,我们先来认识一下数据结构,所谓数据结构就是描述和组织数据的一个东西. 那什么是集合框架呢?在java里面集合框架(Java Collection Framework),又被称为容器container,说白了就是很多个接口,抽象类,实现类组成的一个包,…

Node脚本实现批量打包Vue项目(child_process子进程、window)

前言 前几天用pnpmworkspace实现了monorepo,也就是单仓库多个项目,并且互相之间可能存在一定的联系。所以就存在一个打包的问题,也就是说,我想在打包某个特定子项目时,其他项目也执行build的命令。主要用到的是node的…

字节跳动推机器人大模型GR-2 展现智能自主操作新高度

字节跳动研究团队近日推出的第二代机器人大模型GR-2(Generative Robot2.0)正在引发业界广泛关注。这款智能机器人不仅标志着机器人大模型技术的重大突破,更预示着智能机器人应用即将迎来一个全新纪元。 GR-2的独特之处在于其创新的学习方式。…

力扣之1355.活动参与者

题目: Sql 测试用例: Create table If Not Exists Friends (id int, name varchar(30), activity varchar(30)); Create table If Not Exists Activities (id int, name varchar(30)); Truncate table Friends; insert into Friends (id, name, acti…

FreeRTOS学习总结

背景:在裸机开发上,有时候我们需要等待某个信号或者需要延迟时,CPU的运算是白白浪费掉了的,CPU的利用率并不高,我们希望当一个函数在等待的时候,可以去执行其他内容,提高CPU的效率,同…

朝花夕拾:多模态图文预训练的前世今生

Diffusion Models专栏文章汇总:入门与实战 前言:时间来到2024年,多模态大模型炙手可热。在上一个时代的【多模态图文预训练】宛若时代的遗珠,本文的时间线从2019年到2022年,从BERT横空出世讲到ViT大杀四方,…

通过阿里云Milvus与PAI搭建高效的检索增强对话系统

阿里云Milvus现已无缝集成于阿里云PAI平台,一站式赋能用户构建高性能的RAG(Retrieval-Augmented Generation)对话系统。您可以利用Milvus作为向量数据的实时存储与检索核心,高效结合PAI和LangChain技术栈,实现从理论到…

数学建模算法与应用 第8章 时间序列分析

目录 8.1 确定性时间序列分析方法 Matlab代码示例:移动平均法提取趋势 8.2 平稳时间序列模型 Matlab代码示例:差分法与ADF检验 8.3 时间序列的Matlab相关工具箱及命令 Matlab代码示例:ARIMA模型的建立 8.4 ARIMA序列与季节性序列 Matl…

【Golang】Go语言中缓冲bufio的原理解读与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Ubuntu关闭anaconda自动进入base虚拟环境

问题描述:安装好Anconda后,每次打开终端后都会自动进入到base的虚拟环境中去 直接使用通常情况下也不会有什么影响,但是为了避免,有以下两个方法: 1.使用conda deactivate #每次使用conda deactivate,退…

鸿蒙开发(NEXT/API 12)【ArkWeb接入密码保险箱】系统安全

网页中的登录表单,登录成功后,用户可将用户名和密码保存到鸿蒙系统密码保险箱中。再次打开该网页时,密码保险箱可以提供用户名、密码的自动填充。 手机使用场景 在网站中输入用户名、密码,登陆成功后,ArkWeb会提示将用…