数据库设计以及分布式事务的产生

news2024/10/5 16:20:35

一、数据库架构的演进

单点时代

1
在早期互联网或者当前小型网站,一般数据库和APP都采用单点方式进行部署,系统简单,容易维护

读写分离

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
随着互联网的发展,网站访问量越来越大,数据库最先达到瓶颈,这时候开始设计数据库集群方案,读写分离是一个不错的解决方案

由图可以看出一共有两台MySQL,也可以是多台,一台MySQL设计成主库,其他设计成从库;主库用户写操作,从库用于读操作,实现了数据库访问的读写分离.

这时候又会产生一个新问题,我们应用访问数据库的时候(比如发送insert/update/delete/select),将怎么区分这些请求,把他们转发到不同的MySQL服务上呢?

看图里面有一个中间件(或者叫数据库中间件),他可以帮助我们进行请求的转发以及查询的负载均衡,而我们应用直接访问中间件即可,和访问单点数据库一样,不需要做复杂的调整,甚至可以做到不调整.

当前互联网上提供的中间件有很多,下面简单说下:
1. 奇虎360的Atlas
   1.1 Atlas是360团队基于MySQL官网的mysql-proxy之上开发而来
   1.2 在360内部得以广泛引用,每天承载的请求多大几十亿条.是一个比较成熟的方案
   1.3 360对外开源但是不在维护,不过是一个比较成熟的方案(支持MySQL的版本不能低于5.1不能高于5.6)
   1.4 地址: https://gitee.com/qihoo360/Atlas/blob/master/README_ZH.md
   1.5 防止出现单点故障,可以使用keepalived进行VIP方案设计
   
2. 美团的DBProxy
   2.1 DBProxy中间件是基于奇虎360的Atlas进行的二次开发
   2.2 当前在美团内部也得到了大规模使用,同样开源出来的对MySQL的版本有限制不能超过5.6版本

3. MyCat
   3.1 这个中间件个人不是很清楚,不知道哪个大公司在用,有没有成熟的技术落地方案
   3.2 查看官网文档,有点草根,不清楚哪些公司在用,所以不知道是否稳定
   3.3 个人不建议使用,如果不了解一个技术,最好别用,前面不知道有多少坑在等着你.
   3.4 增加开发和运维成本,拖累团队和公司
   
4. MySQL官方的 MySQL Router
   4.1 MySQL官网提供的一个数据库中间件,在提供了MySQL Router之后mysql-proxy就不维护了
   4.2 在我们MYSQL服务器的安装(Linux)文章中有介绍,想了解可以自己看下,适用于MySQL的InnoDB Cluster集群设置.

分库分表

 

1
2
3
4
随着互联网的发展,数据库访问量持续增加,从最开始的单点,到读写分离,也已经不能满足当前的系统要求,这时候可以将整合的系统进行差分,将数据库里面的表拆分到不同的数据库里,进一步降低单点的访问压力.


虽然数据库的压力降低了但是又有新的问题产生了,那就是数据库事务问题,可能在一个业务需求里面要操作多个数据库,这时候多个数据库就不能保证事务的正确性,这时分布式事务产生.

二、分布式事务

2.1 分布式事务产生的原因

1
2
3
分库分表
1. 当数据库访问量特别大,并且数据库里面的数据剧增的时候,这个时候为了降低系统压力,提高查询效率就要考虑分库分表
2. 但是这里注意,如果能不进行分库分表就尽量不要分库分表,或者是只进行分库,尽量不要分表,如果设计成分库分表之后,当前系统复杂度就不是上升一个两个的级别,涉及到开发,运维等各种问题.

分库分表产生的多数据源造成的分布式事务

 

1
2
3
4
多数据源问题产生的分布式事务
1. 首先就是一个业务中涉及到多个数据库操作(多个数据库涉及到多个数据库连接)
2. 如上图所以的操作,比如说一个下单的业务,需要向订单表插入数据,还需要从库存表中减库存
3. 恰好订单表在订单的数据库中,库存表在库存的数据库中,分别在两个数据库中,这个下单操作就不能保证事务

分布式框架产生的多服务造成的分布式事务

 

1
由图可以看出,服务造成的分布式事务和多数据源造成的分布式事务产生的原因是不一样的,可以有不同的解决方案.

2.2 分布式事务解决方案

2.2.1 多数据源问题产生的分布式事务解决方案

1
2
3
4
5
6
1. 多数据源的分布式事务,Java语言提供了JTA(Java Transaction API)的解决方案
2. SpringBoot通过使用Atomikos或Bitronix嵌入式事务管理器支持跨多个XA资源的分布式JTA事务
3. 需要保证数据库支持XA MySQL数据库5.x以上支持XA协议
4. SpringBoot通过使用Atomikos或Bitronix官网地址:
   https://docs.spring.io/spring-boot/docs/2.1.18.RELEASE/reference/html/boot-features-jta.html


2.2.2 多服务问题产生的分布式事务解决方案

1
2
3
4
5
6
7
8
9
10
1. 补偿事务(TCC)
2. MQ 事务消息
3. Seata

由于多服务问题产生的分布式事务,当前比较流行的解决方案是TCC事务补偿,基于TCC事务补偿框架也有很多,但是一般代码侵入性都比较大,很多公司都喜欢自己实现TCC的业务.

常见的TCC框架有:
1. tcc-transaction(官网没说是否兼容JTA)
2. ByteTCC (兼容JTA)
3. Seata(开源的社区共建的一个分布式事务解决方案,不知道后期会不会一直繁荣下去)

以上内容涉及到的内容不止是数据库设计的发展还有应用服务的发展,后面有时间给大家说一下分布式的解决方案的实战.

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

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

相关文章

jenkins环境基本配置

上一篇文章讲解了jenkins的安装,这一篇文章介绍jenkins安装后的基本配置 1.进入jenkins之后,选择右上角admin下拉框选择设置 2.修改密码,并重新登录 3. jenkins的汉化 3.1 Dashboard ➥ Mange Jenkins ➥ Manage Plugins插件管理 ➥ 已安装…

github上有什么好的unity开源项目?

大量项目来袭 一、github上的Unity开源项目 github上的Unity开源项目 项目名称:《TowerDefense》《TowerDefense》 项目链接:《TowerDefense》项目链接 项目简介: 基于 Unity 的塔防示例游戏,此项目主要用来上手和学习基于 Un…

为什么WordPress要禁止编辑主题和插件?如何进行设置呢?

一淘模板问大家为什么WordPress要禁止编辑主题和插件?如何进行设置呢?接下来我们一起了解一下。 首先,为了安全起见,WordPress的安全是非常重要的,禁止编辑主题和插件的许可,即使有人进来,也不…

C# 数据库 类库

一 ADO.NET 1 System.Data名称空间 2 这种访问数据库的技术叫ADO.NET 3 ADO.NET 实现数据库的访问 ①提供标准的CRUD接口; ② 对不同的数据库提供统一的访问接口; 二 ADO.NET技术的发展 1 ODBC(Open Database Connection) 2 DAO(Data …

excel文件管理:如何进行密码保护和破解? 上篇

对于一个公司,或者个人来说,有时候我们的数据往往需要加密。比如公司的经营状况和缴纳的税收有关系,人事档案中有每位员工的个人信息和工资组成说明,这些都是不需要无关人员知道的。微软对于EXCEL的设计就比较人性化,考…

如何搭建一套完整的数据指标体系?

如何搭建一套完整的数据指标体系? 你在工作中是不是这样的经常听到这样的对话: 老板:这次宣传活动总共带来了多少流量?你:大概有一万多人吧......老板:这次活动反响怎么样?你:有很多…

Linux操作系统实验3——进程切换

实验要求: 1.编写用户态程序,程序中需设计能引起进程状态发生变化的流程。 2.编写内核态模块,定时获取输入参数指定进程的运行状态。 3.通过内核态的记录指定进程运行状态变化的情况,需记录三种以上。 实验原理: 1. l…

有向图的拓扑序列

848. 有向图的拓扑序列 - AcWing题库 昨天看了这道题L3-031 千手观音 拓扑排序哈希表_他不是混子QAQ的博客-CSDN博客 就想着也用这道题的stl方法来试下 先来我的这个笨笨的方法,就当练习stl了,后面还有一个简便的stl STL知识点(刚知道: 对于…

linux系统中uboot的基本原理与实现方法

大家好,今天主要和大家聊一聊,U-boot的操作与实现方法。 目录 第一:U-boot基本简介 第二:u-boot烧写与启动方法 第三:uboot中信息查询命令 第一:U-boot基本简介 linux系统启动必须要有一个bootloade…

举个栗子~Tableau 技巧(248):使用参数和轴实现图表坐标轴的缩放

实际业务分析场景中,使用折线图来呈现业绩趋势分析时候,经常会遇到这样问题:某一段时间的业绩数值波动范围较小,折线图趋于平缓(如下图),很难判断业绩的波动差异,也很难一眼看出哪个…

vulnhub DC系列 DC-3

总结:joomscan工具的使用,cve-2016-4557内核提权或者cve-2021-4034内核提权 下载地址 漏洞分析 信息收集 sql注入 写马 提权 反弹shell 内核提权 cve-2016-4557 cve-2021-4034 下载地址 Download:http://www.five86.com/downloads/DC-3.zip 使用…

npm发布自己的组件UI包(详细步骤,图文并茂)

目前做前端项目,一直采用npm install XXX 的方式去引用别人的组件包,调用方法。 其实在开发中,每个开发者基本都写过单独的组件,如何让自己的组件能够重复的利用,如何让别人也享受到您的成果,这里将一步一步…

【KMP算法】

KMP算法核心剖析: 关于KMP算法,建议先了解 BF算法 KMP算法是用来解决字符串匹配问题的高级算法,看完这篇文章,你应该能理解KMP算法。 KMP算法和BF算法唯一的区别在于:主串的i 并不会回退,子…

java: “abstract 抽象类” 与 “ interface 接口” 的妙用之道

java: “abstract 抽象类” 与 “ interface 接口” 的妙用之道 每博一文案 有句很扎心的话,我对这世间唯一的不满就是这世间总是让更懂事的人承受的更多。 生活中,往往你越善解人意,就越没人在乎你的委屈,时间,让你学…

Linux下使用nginx搭建文件服务器

搭建后访问效果图 安装nginx 1、安装依赖 yum install -y gcc pcre-devel zlib-devel openssl openssl-devel 2、下载nginx mkdir -p /www/nginx cd /www/nginx wget http://nginx.org/download/nginx-1.21.0.tar.gz tar -xvf nginx-1.21.0.tar.gz 3、安装nginx cd nginx…

redis远程操作常见问题

Connection error: Connection refused 出现该错误的原因是未开启远程连接,将本地ip注释掉: Connection error: The remote host closed the connection 出现该错误的原因是,需要关闭安全模式,才可运行其他ip访问: 当…

websocket简单实现

websocket简单实现 websocket是HTML5下一种新的协议,本质上websocket是一个基于tcp的协议。它实现了浏览器与服务器之间的双向通信,能更好的节省服务器资源和宽带并实现实时的通信。 websocket的几个优点? 1、使用的资源少,因为它的头更小。…

Footprint Analytics 如何帮助区块链研究人员进行数据研究

管理一个人的数字资产是区块链技术提供的主要应用,但管理的另一面是责任。 就像区块链让任何人都能完全保管他们的加密货币一样,如果你被骗、被黑或被诈骗,几乎没有追索权。链上研究是预防为主,解决问题的方法并不存在。 例如&a…

个推TechDay治数训练营直播回顾 | 企业级标签体系建设实践

标签作为当下最普遍的数据资产类型之一,对企业洞察用户画像、开展精细化运营等具有重要的支撑作用。企业标签体系的建设并非一蹴而就的,需要结合业务视角进行整体的规划,更涉及到复杂的数据治理和数据资产管理等工作。 本文对个推TechDay“治…

复习 [kuangbin带你飞]专题5 并查集

目录1. poj 2236 Wireless Network2. poj 1611 The Suspects3. hdu 1213 How Many Tables4. hdu 3038 How Many Answers Are Wrong5. poj 1182 食物链6. poj 1417 True Liars7. poj 1456 Supermarket8. poj 1733 Parity game9. poj1984 Navigation Nightmare10. poj 2912 A Bug…