分库分表技术方案选型

一、MyCat

官方网站,技术文档

MyCat是一款由阿里Cobar演变而来的用于支持数据库读写分离、分片的数据库中间件。它基于MySQL协议,实现了MySQL的协议和能力,并作为代理层位于应用和数据库之间,可以隐藏底层数据库的复杂性。

原理

MyCat需要独立部署,1.6版本已经支持集群模式,通过Zookeeper保障mycat各节点间的高可用性,另外Mycat还提供了后台Mycat-eye,提供对sql执行线程,mycat各节点线程,jvm,网络,磁盘的监控。

MyCat的核心原理是“拦截”和“分片”,它拦截用户发送过来的SQL语句,并根据预设的分片规则(如哈希算法、取模算法等)将SQL语句分发到不同的数据节点去执行。

优势

  • 支持多种数据库,支持MySQL、Oracle、SQLServer、PostgreSQL等关系型数据库,还支持MongoDB等非关系型数据库。
  • 社区活跃,丰富的文档和教程,易于上手使用。
  • 相对成熟,2013年发展至今历经10多年,有不少生产应用案例。

劣势

  • 资源开销:Mycat是独立部署在应用,数据库中间的代理。拦截解析sql请求,转发到各分库,聚合结果返回。需要部署额外的机器资源。
  • 性能损耗:应用和数据库中间多了一层网络转发,性能有一定损耗。官方性能损失测试报告显示1.2.3插入性能的损失率为6%-12%左右,查询性能损失率约为17%左右,更新性能损失率约为18%-25%左右。
  • 配置复杂:MyCat的配置涉及多个文件(如server.xml、schema.xml、rule.xml等),需要精细配置以满足业务需求,官方文档。
  • 开源生态集成支持较弱:例如和mysql各种高可用架构的集成,和大数据flink框架等的集成支持较弱。需要自己摸索集成方案。

二、ShardingSphereJDBC

官方文档

ShardingSphere是一套开源的分布式数据库中间件解决方案,由Apache发起和捐赠,并进入Apache顶级项目孵化器。ShardingSphere包含3个组件Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar(Sharding-Mesh)。

Sharding-JDBC

  • Sharding-JDBC是一个轻量级Java数据库访问层,它类似于JDBC驱动,嵌入到应用程序中。
  • 通过拓展原生的JDBC API,Sharding-JDBC实现了对分库分表、读写分离、分布式事务等功能的支持。
  • 它是一个去中心化的架构,没有中间代理集中统一管理连接数据库的连接资源。
  • 适用于需要分库分表但不想改变现有数据库访问层代码的Java应用程序,在单体应用、微服务架构中都可以使用。

Sharding-Proxy

  • Sharding-Proxy是ShardingSphere的一个独立的代理层,它类似于Mycat,可以作为一个独立的服务部署。
  • Sharding-Proxy代理SQL请求,将其路由到正确的数据库实例和表中,支持多种语言的应用程序,如Java、Python、PHP等。
  • 它提供了数据库二进制协议的服务端版本,用于对异构语言的支持。

Sharding-Sidecar(Sharding-Mesh)Sharding-Sidecar(也称为Sharding-Mesh)是ShardingSphere计划中的一个组件,旨在与容器化和微服务架构紧密集成。

重点讲Sharding-JDBC。

原理

Sharding-JDBC与Mycat不同,它是一个轻量级Java数据库访问层,它类似于JDBC驱动,嵌入到应用程序中。

集群模式下需要单独部署一个配置中心Sharding-JDBC-Orchestration。它提供了配置集中化与动态化、数据治理等核心功能,使得数据库的分片、读写分离等配置可以更加灵活和动态。

配置中心可以配置数据源,分库策略,分表策略,主键生成算法,SQL是否包含分库分表列审计功能,是否支持Hint路由到指定分表,广播表等丰富功能配置。具体YAML配置示例:

#数据源配置,配置了两个数据源ds_0,ds_1
dataSources:ds_0:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8username: rootpassword:ds_1:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8username: rootpassword:#分库分表策略配置
rules:
- !SHARDINGtables:t_order: actualDataNodes: ds_${0..1}.t_order_${0..1} #t_order分两个库ds_0,ds_1,每个库分2张表t_order_0,t_order_1tableStrategy: standard:shardingColumn: order_id  #t_order表依据order_id列分表shardingAlgorithmName: t_order_inline  #t_order_inline是分表算法keyGenerateStrategy: #t_order表主键列,以及主键生成算法column: order_idkeyGeneratorName: snowflake #采用雪花算法生成主键auditStrategy: #审计策略配置,拦截并审核SQL语句,SQL必须包含分片列order_id,审计不通过报错auditorNames:- sharding_key_required_auditorallowHintDisable: true#控制是否禁用Hint分片路由的提示功能,启用则可以在应用线程中指定分片策略t_order_item:actualDataNodes: ds_${0..1}.t_order_item_${0..1}tableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: t_order_item_inlinekeyGenerateStrategy:column: order_item_idkeyGeneratorName: snowflakedefaultShardingColumn: order_idbindingTables:- t_order,t_order_itemdefaultDatabaseStrategy: #默认兜底数据库分库策略,依据user_id分库standard:shardingColumn: user_idshardingAlgorithmName: database_inlinedefaultTableStrategy:none:shardingAlgorithms:database_inline:type: INLINEprops:algorithm-expression: ds_${user_id % 2}t_order_inline:type: INLINEprops:algorithm-expression: t_order_${order_id % 2}t_order_item_inline:type: INLINEprops:algorithm-expression: t_order_item_${order_id % 2}keyGenerators:snowflake:type: SNOWFLAKEauditors:sharding_key_required_auditor:type: DML_SHARDING_CONDITIONS#DML_SHARDING_CONDITIONS算法要求在执行逻辑表查询时,必须带上分片键。#如果SQL语句中缺少分片键或分片键不正确,该审计策略将拒绝执行该语句,并返回相应的错误信息。#广播表配置,t_address做为广播表,在各分库中的结构数据一致
- !BROADCASTtables:- t_addressprops:sql-show: false

优势

  • 功能全面:ShardingSphere支持水平拆分、读写分离、全局表、数据加密、分布式事务等多种功能,能够很好地满足大型分布式系统的需求。
  • 性能损耗相对小:Sharding-JDBC相比Mycat,采用本地jar包嵌入本地应用程序,去中心化架构,性能损耗相对较小。
  • 社区活跃:作为Apache顶级项目,ShardingSphere拥有更庞大的社区支持,文档和教程更加丰富。

劣势

  • 配置复杂:配置还是有一定复杂度,当然相对Mycat要简单一些,官方文档。
  • 开源生态集成支持较弱:例如和mysql各种高可用架构的集成,和大数据flink框架等的集成支持较弱。需要自己摸索集成方案。

三、阿里tddl

tddl是一个分布式数据库中间件,它在阿里内部被广泛使用,淘天系几乎所有的核心应用都有使用,主要是做为链接阿里数据库AliSql链接池,分库分表组件。

原理

tddl原理和Sharding-JDBC类似,也是嵌入到应用程序中的,有一个配置中心负责应用分库分表策略的存储。由于该组件是非开源的,这里不做过多介绍。

优势

  • 性能非常强大,阿里包括交易,会员,广告等各种核心系统都是使用tddl来实现分库分表的。
  • 功能强大,支持全局唯一id高效生成,和db配合实现高可用,分库分表sql处理等。
  • 配置简单,配置非常简单,比Sharding-JDBC简单,在配置中心配置非常少量xml说明分库分表策略即可。

劣势

  • 非开源组件,目前还未开源,外部无法使用。

四、OceanBase分区表

OceanBase是由蚂蚁集团完全自主研发的国产原生分布式数据库,始创于2010年。支付宝大部分核心系统,包括交易采用的都是OceanBase,已连续10年平稳支撑双11。oceanbase官网

原理

OceanBase通过节点多副本和Paxos协议来确保写入时WAL日志写入到多数节点确保高可靠性,充分利用内存来存储新写入数据,等待写入低峰刷内存数据批量刷磁盘来确保高性能写入,查询时通过内存,磁盘数据合并保障数据一致性。官方文档

OceanBase数据库本身天然支持分区策略,且天然支持高可用架构,且支持关系数据库的事务特性。在实际联机事务处理系统中,建议采用手动指定分区策略的方式,尽量避免跨分片的事务。

下图假设业务只有一张表t_order,手动将表分成了 8 个分区 P1-P8,那么 P1-P8 就分别均衡每个 Zone 到两个 OBServer 上,每个分区三个副本,从中选出一个 Leader,通过 Paxos 协议进行数据同步。同一台机器上的多个 Leader 一般会在同一个 Log Stream 中,这种跨分片级别的事务,仍然是本地事务,如 P1 和 P2 的关联查询。

分区表创建示例:

CREATE TABLE sales_orders (order_id INT,customer_id INT,order_date DATE,total_amount DECIMAL(10, 2),PRIMARY KEY(order_id, order_date)
) PARTITION BY RANGE(order_date) (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01', 'YYYY/MM/DD')),PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01', 'YYYY/MM/DD')),PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01', 'YYYY/MM/DD')),PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01', 'YYYY/MM/DD')),PARTITION MMAX VALUES LESS THAN (MAXVALUE)
);

优势

  • 使用简单:相比较Sharding-JDBC、MyCat + mysql的方式,不需要大量复杂的配置运维工作,也不需要在考虑如何与mysql高可用组件集成方式,只需要创建表时指定好分区策略即可。
  • 可靠稳定,经过阿里双11流量洪峰的考验。只要分区策略配置合理,确保数据库操作访问被路由到单机节点,在保证高可用的前提下,能提供较好的性能。
  • 阿里系生态集成较好,在阿里云上和阿里各种大数据技术集成较好。可简单的实现阿里云环境下db数据同步到离线、实时数仓中。

劣势

  • 费用昂贵:OB服务器需要万兆网络,LSM树结构的元数据管理库占据内存较大,需要购买专用的云服务器。
  • 备份恢复繁琐:备份恢复为单独的组件,运行机制为逻辑备份恢复,配置繁琐,备份恢复均较慢。
  • OLTP事务处理能力不如PolarDB:OB也能提供高并发联机事务处理能力,但在某些特定场景下可能不如PolarDB优化得更好。

五、PolarDB

PolarDB是阿里巴巴自研的新一代云原生数据库,脱胎于淘天系经过10多年考验的xdb,综合各方面对比,PolarDB个人认为是需要分库分表场景下,对于小公司性价比最高,最简单有效的技术方案。官方文档

原理

PolarDB在内核实现层面更接近于mysql内核,脱胎于淘天系经过10多年考验的xdb,内核使用了X-Paxos、基于Batching & Pipelining 进行异地网络优化、基于代价的CBO优化器实现索引选择等黑科技,在控制成本的前提下实现了极致的性能。技术架构

PolarDB数据库本身也是天然支持分区策略,且天然支持高可用架构,支持关系数据库的事务特性。在实际联机事务处理系统中,建议采用手动指定分区策略的方式,尽量避免跨分片的事务。

分区表创建示例:

CREATE TABLE `orders` (`o_orderkey` int(11) NOT NULL,`o_custkey` int(11) NOT NULL,`o_orderstatus` char(1) DEFAULT NULL,`o_totalprice` decimal(10,2) DEFAULT NULL,`o_orderDATE` date NOT NULL,`o_orderpriority` char(15) DEFAULT NULL,`o_clerk` char(15) DEFAULT NULL,`o_shippriority` int(11) DEFAULT NULL,`o_comment` varchar(79) DEFAULT NULL,PRIMARY KEY (`o_orderkey`,`o_orderDATE`,`o_custkey`),KEY `o_orderkey` (`o_orderkey`),KEY `i_o_custkey` (`o_custkey`),KEY `i_o_orderdate` (`o_orderDATE`)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(o_orderdate))
(PARTITION item1 VALUES LESS THAN (TO_DAYS('1992-01-01')),PARTITION item2 VALUES LESS THAN (TO_DAYS('1993-01-01')),PARTITION item3 VALUES LESS THAN (TO_DAYS('1994-01-01')),PARTITION item4 VALUES LESS THAN (TO_DAYS('1995-01-01')),PARTITION item5 VALUES LESS THAN (TO_DAYS('1996-01-01')),PARTITION item6 VALUES LESS THAN (TO_DAYS('1997-01-01')),PARTITION item7 VALUES LESS THAN (TO_DAYS('1998-01-01')),PARTITION item8 VALUES LESS THAN (TO_DAYS('1999-01-01')),PARTITION item9 VALUES LESS THAN (MAXVALUE));
​EXPLAIn select * from orders where o_orderDATE = '1992-03-01';
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | orders | item2      | ref  | i_o_orderdate | i_o_orderdate | 3       | const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------+

优势

  • 使用简单:相比较Sharding-JDBC、MyCat + mysql的方式,也不需要大量复杂的配置运维工作,也不需要在考虑如何与mysql高可用组件集成方式,只需要创建表时指定好分区策略即可。
  • 可靠稳定,只要分区策略配置合理,确保数据库操作访问被路由到单机节点,在保证高可用的前提下,能提供较好的性能。
  • 阿里系生态集成较好,在阿里云上和阿里各种大数据技术集成较好。可简单的实现阿里云环境下db数据同步到离线、实时数仓中。
  • 费用相较OceanBase低,PolarDB费用远低于OceanBase。因为PolarDB内核原理接近于mysql,X-Paxos协议相较OceanBase Paxos同步全部副本网络交互次数少,且PolarDB不会像OceanBase将大量写、更新数据长时间放到内存中,因此对网络,内存要求不高,不需要专用服务器。
  • 极致弹性:通过存储与计算分离的架构,实现了分钟级别的弹性伸缩能力,用户可以根据业务需求快速调整资源规模。

劣势

  • OLAP处理能力不如OceanBase:PolarDB在OLAP(联机分析处理)场景下的表现可能稍逊一筹,其数据处理和复杂查询能力可能不如OceanBase强大。

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

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

相关文章

【智力测试——二分、前缀和、乘法逆元、组合计数】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …

IBM DB2常用命令(windows版),包含建库、建表、增删改查等命令

安装IBM DB2可以参考我上篇博客&#xff1a;IBM Db2 & IBM Db2 Data Management Console(可视化管理工具)的下载与安装&#xff08;简洁版&#xff09;-CSDN博客 使用管理员权限打开cmd窗口 G: cd G:\IBM\SQLLIB\BIN db2cmd首先&#xff0c;在服务端需要配置好服务名、监…

Flutter Scaffold 页面结构

Material是一套设计风格&#xff0c;提供了大量的小部件&#xff0c;这里用Material风格搭建一个常见的应用页面结构。 创建Material应用 import package:flutter/material.dart;class App extends StatelessWidget {overrideWidget build(BuildContext context) {return Mat…

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…

STM32 DMA+AD多通道

接线图 代码配置 ADC单次扫描DMA单次转运模式 uint16_t AD_Value[4]; //DMAAD多通道 void DMA_Config(void) {//定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体变量 DMA_InitTypeDef DMA_In…

浅谈《图解HTTP》

感悟 滑至尾页的那一刻&#xff0c;内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂&#xff0c;但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说&#xff0c;《图解HTTP》适合作为第一本网络协议书。确实&#xff0c;它就像一座桥梁&#xff0c;连接…

Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱

文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…

自动化软件测试的基本流程

一、自动化测试的准备 1.1 了解测试系统 首先对于需要测试的系统我们需要按照软件需求说明书明确软件功能。这里以智慧养老系统作为案例进行测试&#xff0c;先让我们看看该系统的登录界面和用户管理界面。 登录界面&#xff1a; 登录成功默认界面&#xff1a; 用户管理界面…

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

计算机网络中常见高危端口有哪些?如何封禁高危端口?

保障网络安全&#xff0c;从封禁高危端口开始&#xff01; 在计算机网络中&#xff0c;端口是设备与外界通信的“大门”&#xff0c;但某些端口因常被黑客利用而成为高危入口。封禁这些端口是防御网络攻击的关键一步。本文将详解 10个常见高危端口&#xff0c;并提供多平台封禁…

CommonJS

CommonJS 是由 JavaScript 社区于 2oo9 年提出的包含模块、文件、IO、控制台在内的一系列标准。Node.js 的实现中采用了 CommonJS 标准的一部分&#xff0c;并在其基础上进行了一些调整。我们所说的 CommonJS 模块和 Node.js 中的实现并不完全一样&#xff0c;现在一般谈到 Com…

[SAP ABAP] ABAP SQL跟踪工具

事务码ST05 操作步骤 步骤1&#xff1a;使用事务码ST05之前&#xff0c;将要检测的程序生成的页面先呈现出来&#xff0c;这里我们想看下面程序的取数操作&#xff0c;所以停留在选择界面 步骤2&#xff1a; 新建一个GUI窗口&#xff0c;输入事务码ST05&#xff0c;点击 Acti…

蓝桥杯备考:高精度算法之除法

我们除法的高精度其实也不完全是高精度&#xff0c;而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9&#xff0c;当它真正是1e9的时候&#xff0c;t是有可能超过1e9的&#xff0c;所以要用long long

算法竞赛(Python)-堆栈

文章目录 一 基础知识二 题目有效的括号字符串解码 一 基础知识 堆栈&#xff08;Stack&#xff09;&#xff1a;简称为栈。一种线性表数据结构&#xff0c;是一种只允许在表的一端进行插入和删除操作的线性表。   我们把栈中允许插入和删除的一端称为 「栈顶&#xff08;top…

SpringBoot 中的测试jar包knife4j(实现效果非常简单)

1、效果图 非常快的可以看见你实现的接口 路径http://localhost:8080/doc.html#/home 端口必须是自己的 2、实现效果 2.1、导入jar包 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-star…

16.1.STM32F407ZGT6-CAN基础概念

参考&#xff1a; https://blog.csdn.net/sunlight_vip/article/details/128639144 前言&#xff1a; 学习总结CAN的知识点&#xff1a; 1.can是什么&#xff0c;历史由来和背景 2.can的物理层&#xff0c;链路层 3.初始化的流程和关键点 4.波特率怎么设置 5.can id怎么过滤 6…

Linux环境下的Java项目部署技巧:Nginx 详解

Nginx 的启动 Nginx 启动会生成 2 个进程&#xff1a;主进程与守护进程 主进程&#xff1a;常用于提供反向代理服务。特点&#xff1a;占内存大守护进程&#xff1a;防止主进程以外关闭。特点&#xff1a;占内存小 Nginx 启动需要占用 80 端口: 当 Ngnix 启动失败时&#xff0…

【Pytorch和Keras】使用transformer库进行图像分类

目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理&#xff0c;transformer库能关联到huggface中对应的模型&am…

relational DB与NoSQL DB有什么区别?该如何选型?

Relational Database(关系型数据库,简称RDB)与NoSQL Database(非关系型数据库)是两类常见的数据库类型。它们在设计理念、数据存储方式、性能优化、扩展性等方面有许多差异。下面我们将会详细分析它们的区别,以及如何根据应用场景进行选型。 一、数据模型的区别 关系型…