Sharding-Sphere vs Mycat vs TiDB

news/2024/5/19 14:50:55 标签: 分库分表, TiDB

强烈推荐TiDB,这是未来大中型公司的数据库,一定的

NewSQL

优点:

  • 传统数据库面向磁盘设计,基于内存的存储管理及并发控制,NewSQL数据库那般高效利用
  • 中间件模式SQL解析、执行计划优化等在中间件与数据库中重复工作,效率相比较低
  • 分布式事务相比于XA进行了优化,性能更高
  • 基于paxos(或Raft)协议的多副本,实现了真正的高可用、高可靠
  • 天生支持数据分片,数据的迁移、扩容都是自动化的,大大减轻了DBA的工作,同时对应用透明,无需在SQL指定分库分表
  • 最大支持 512 节点,每个节点最大支持 1000 并发,集群容量最大支持 PB 级别。

缺点:

  • NewSQL数据库一般并不支持存储过程、外键等功能(新版本已经可以支持普通视图)
  • 往往选择兼容MySQL或者PostgreSQL协议,所以SQL支持仅局限于这两种

对比

mycatsharding-JDBCSharding-ProxySharding-SidecarTiDB
官方网站官方网站官方网站官方网站官方网站官方网站
源码地址GitHubGitHubGitHubGitHubGitHub
官方文档Mycat 权威指南官方文档官方文档官方文档官方文档
github的Star数量8.5k12.2k12.2k12.2k25.4k
开发语言JavaJavaJavaJavaGo
开源协议GPL-2.0/GPL-3.0Apache-2.0Apache-2.0Apache-2.0Apache-2.0
数据库MySQL
Oracle
SQL Server
PostgreSQL
DB2
MongoDB
SequoiaDB
MySQL
Oracle
SQLServer
PostgreSQL
任何遵循 SQL92 标准的数据库
MySQL
PostgreSQL
MySQL
PostgreSQL
高度兼容MySQL
连接消耗数
应用语言任意Java任意任意任意
代码入侵需要修改代码几乎不需要修改
性能损耗略高损耗低损耗略高损耗低官方测试报告
无中心化
静态入口
管理控制台Mycat-webSharding-UISharding-UISharding-UITiDB Dashboard UI(实验特性阶段)
分库分表单库多表/多库单表✔️✔️✔️不需要,分布式数据库,天生牛逼
多租户方案✔️
读写分离✔️✔️✔️✔️
分片策略定制化✔️✔️✔️✔️
分布式主键✔️✔️✔️✔️
标准化事务接口✔️✔️✔️✔️✔️
XA强一致事务✔️✔️✔️✔️✔️
柔性事务✔️✔️✔️✔️
配置动态化开发中✔️✔️✔️实验性阶段
编排治理开发中✔️✔️✔️
数据脱敏✔️✔️✔️
可视化链路追踪✔️✔️✔️
弹性伸缩开发中开发中开发中开发中✔️
多节点操作分页
去重
排序
分组
聚合
分页
去重
排序
分组
聚合
分页
去重
排序
分组
聚合
分页
去重
排序
分组
聚合
✔️
跨库关联支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join✔️
IP 白名单✔️✔️
SQL 黑名单✔️
存储过程✔️
密码加密✔️✔️
服务降级✔️
运维实施难度一般简单简单初步上手,概念多,有一定成本

总结

如果看完以上内容,您还不知道选哪种模式,那么结合以下几个问题,先思考下NewSQL数据库解决的点对于自身是不是真正的痛点:

  • 强一致事务是否必须在数据库层解决?
  • 数据的增长速度是否不可预估的?
  • 扩容的频率是否已超出了自身运维能力?
  • 相比响应时间更看重吞吐?
  • 是否必须做到对应用完全透明?
  • 是否有熟悉NewSQL数据库的DBA团队?

如果以上有2到3个是肯定的,那么你可以考虑用NewSQL数据库了,虽然前期可能需要一定的学习成本,但它是数据库的发展方向,未来收益也会更高,尤其是互联网行业,随着数据量的突飞猛进,分库分表带来的痛苦会与日俱增。当然选择NewSQL数据库你也要做好承担一定风险的准备。

如果你还未做出抉择,不妨再想想下面几个问题:

  • 最终一致性是否可以满足实际场景?
  • 数据未来几年的总量是否可以预估?
  • 扩容、DDL等操作是否有系统维护窗口?
  • 对响应时间是否比吞吐更敏感?
  • 是否需要兼容已有的关系数据库系统?
  • 是否已有传统数据库DBA人才的积累?
  • 是否可容忍分库分表对应用的侵入?

如果这些问题有多数是肯定的,那还是分库分表吧。在软件领域很少有完美的解决方案,NewSQL数据库也不是数据分布式架构的银弹。相比而言分库分表是一个代价更低、风险更小的方案,它最大程度复用传统关系数据库生态,通过中间件也可以满足分库分表后的绝大多数功能,定制化能力更强。


http://www.niftyadmin.cn/n/1756338.html

相关文章

mysql数据库主从、全量、增量备份还原

数据库主从、全量、增量 情景一 主数据库的服务器发生停电,宕机,机房发生了地震,海啸,战争等天灾人祸 方案:主从备份 优点:数据库自带备份功能,配置简单 缺点:影响所有租户的使用 …

MyCat多租户方案

Mycat使用tar包部署 MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。 环境准备 jdk安装 先查看系统是否已有自带的jdk rpm -qa |grep javar…

脚手架模块化搭建步骤

项目地址 https://github.com/yanjingfan/sakura-boot 新建父子项目父模块pom.xml中引入依赖&#xff0c;确定各依赖的版本号<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…

获取页面url的参数

/**获取页面url的参数例如url&#xff1a;http://128.192.111.64:8101/html/manage/areanode_add.html?nodeCode430&trandom0.23213661104649708可以拿到[nodeCode[430],trandom[0.23213661104649708]]这种形式的数组通过var nodeCode getUrlVars()["nodeCode"…

验证码倒计时的处理

//获取验证码$("#codeTips").click(function () {let phoneNum $("#phoneNum").val();if (!$.trim(phoneNum)) {alert("请填写手机号!")return;}var phoneFlag handleVali(phone);if (phoneFlag false) {alert("请填写正确的手机号!&quo…

get和post请求的sql盲注防护

工程地址&#xff1a;sakura-web 网上很多方案都只拦截了get请求&#xff0c;但是涉及到post请求的资料却很少。踩了一些坑&#xff0c;这里给大家分享一波&#xff0c;希望大家少踩坑吧&#xff0c;哪里有不妥的地方&#xff0c;欢迎各位斧正 SqlInjectFilter 由于实现filter只…

springboot操作cookie

在响应中添加cookie RequestMapping(value"/casLogin", method RequestMethod.GET) public CommonResult<String> casLogin(HttpServletResponse response, RequestParam String accessToken, RequestParam String refreshToken) {try {Cookie accessTokenCook…

maven私服仓库搭建、上传或者拉取jar包

maven私服仓库搭建 参考&#xff1a;https://www.cnblogs.com/wuwei928/p/10338307.html 一、使用Docker安装Nexus docker pull sonatype/nexus3 mkdir -p /data/nexus-data chown -R 200 /data/nexus-data docker run -tid -p 8081:8081 --name nexus -e NEXUS_CONTEXTnexu…