InnoDB 存储引擎是如何管理和存储数据
如何连接 Mysql ?在 Java 中,通常使用 JDBC(Java Database Connectivity)来连接数据库。JDBC 定义了一套用于访问数据库的 API,它提供了一种标准的接口,使得我们可以通过 Java 代码与各种数据库进行交互。
常见的 Java Web 系统是部署在 Tomcat 中的,那么 Tomcat 本身肯定是有多个线程来并发处理接收到的多个请求的,Mysql 是怎么处理的呢?
在 Mysql 中,引入了连接池,连接池会维护一组可重用的数据库连接,应用程序需要访问数据库时可以从连接池中获取一个可用连接,执行完毕后将连接归还给连接池。这样可以减少连接的频繁创建和销毁,提升性能。
如下所示:
Mysql 如何处理连接请求的?当 Mysql 接收到一个网络连接请求后,它是如何去处理该请求的,如何执行 SQL 的,总体的步骤可以分为一下几步:
开启一个端口监听的线程,用于网络连接以及读取请求。
Mysql 内部提供了一个 SQL 接口(SQL Interface)的组件,用来专门执行 SQL 语句的接口
通过查询优化器选择最优的查询路径来执行
调用执 ...
搞明白什么是零拷贝,就是这么简单
我们总会在各种地方看到零拷贝,那零拷贝到底是个什么东西。接下来,让我们来理一理啊。拷贝说的是计算机里的 I/O 操作,也就是数据的读写操作。计算机可是一个复杂的家伙,包括软件和硬件两大部分,软件主要指操作系统、驱动程序和应用程序。硬件那就多了,CPU、内存、硬盘等等一大堆东西。这么复杂的设备要进行读写操作,其中繁琐和复杂程度可想而知。
传统I/O的读写过程如果要了解零拷贝,那就必须要知道一般情况下,计算机是如何读写数据的,我把这种情况称为传统 I/O。数据读写的发起者是计算机中的应用程序,比如我们常用的浏览器、办公软件、音视频软件等。而数据的来源呢,一般是硬盘、外部存储设备或者是网络套接字(也就是网络上的数据通过网口+网卡的处理)。过程本来是很复杂的,所以大学课程里要通过《操作系统》、《计算机组成原理》来专门讲计算机的软硬件。
简化版读操作流程那么细的没办法讲来,所以,我们把这个读写过程简化一下,忽略大多数细节,只讲流程。
上图是应用程序进行一次读操作的过程。
应用程序先发起读操作,准备读取数据了;
内核将数据从硬盘或外部存储读取到内核缓冲区;
内核将数据从内核缓冲区拷贝到用 ...
跨越性能瓶颈:Layer2技术为区块链解决可扩展性问题
区块链有个著名的”不可能三角”问题,即一条区块链的发展很难兼顾安全、去中心化和可拓展性。
以太坊举例,虽然在去中心化和安全方面做的已经足够好,但随着用户越来越多,其交易速度变慢、交易手续费高、用户体验恶化是一直以来有待解决的问题。尤其是在 17 年出现了一款非常火爆的 Dapp 应用叫加密猫,造成以太坊主网大规模的拥堵。造成拥堵的原因是以太坊当时的 TPS 只有 15,这意味着以太坊每秒只能处理 15 笔交易,如此低的 TPS 严重限制了区块链应用的大规模落地。
想提升公链的可扩展性,有两种方式:
1、链上扩容:
扩展主网本身(Layer 1)称为链上扩容方案。主要通过提高区块链本身的交易容量来实现扩容。比如早期对比特币进行区块大小调整,隔离见证的引入,以太坊 2.0 的转 POS 和分片机制。但是 Layer 1 的扩容要么进展缓慢,要么对性能的提升没有质的变化。
2、链下扩容:
链下扩容是在底层区块链 Layer 1 上构建一个扩展层 Layer 2,通过将一部分交易或计算迁移到区块链外的第二层网络来提高可扩展性和效率。 Layer1 来保证安全和去中心化,绝对可靠、可信;它能 ...
MVCC如何应对MySQL并发问题
数据库使用事务来保持数据最终一致性,但是在并发下执行事务,会引起脏读、不可重复读、幻读等问题。为了解决这些问题,设计了四种隔离级别:
读未提交(Read uncommitted)
读已提交(Read committed)
可重复读(Repeatable read)
串行化(Serializable)
不同的隔离级别,解决了不一样的并发问题,那么不同的隔离级别是怎么解决并发问题的呢? 一个比较简单粗暴的方法是加锁,但是加锁必然会带来性能的降低。因此,数据库又引入了 MVCC(多版本并发控制)和锁配合使用,在读取数据不用加锁的情况下,实现读取数据的同时可以修改数据,修改数据时同时可以读取数据。
什么是 MVCC
MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
数据库并发场景:
读-读:不存在任何问题,不需要并发控制。
读-写:有线程安全问题,可能会造成事务隔离性问题,可能会有脏读,幻读,不可重复读。
写-写:有线程安全问题 ...
以太坊概述
以太坊基础知识什么是以太坊以太坊(Ethereum)是一个去中心化的开源的有智能合约功能的公共区块链平台。 以太坊的概念首次在 2013 至 2014 年间由程序员维塔利克·布特林(Vitalik Buterin)受比特币启发后提出,大意为“下一代加密货币与去中心化应用平台”,在 2014 年通过 ICO 众筹得以开始发展。以太坊亦被称为“第二代的区块链平台”,仅次于比特币。目前为止,以太坊是被使用最多的区块链平台。
以太币(ETH 或 Ξ)是以太坊的原生加密货币,目前是市值第二高的加密货币,仅次于比特币。
以太坊特点
以太坊是 “世界计算机”,这代表它是一个开源的、全球分布的计算基础设施。
执行称为智能合约(smart contract)的程序。
使用区块链来同步和存储系统状态以及使用名为以太币(ether)的加密货币,以计量和约束执行资源成本。
本质是一个基于交易的状态机 (transaction-based state machine)。
以太坊平台使开发人员能够构建具有内置经济功能的强大去中心化应用程序(DApp);在持续自我正常运行的同时,它还减少或消除了审查,第 ...
从CPU聊到Java内存模型
当谈到并发编程时,Java 内存模型(Java Memory Model,简称 JMM)是一个关键概念。它定义了线程如何与主内存交互以及如何在自己的工作内存中存储数据。理解和遵守 Java 内存模型对于编写正确且高效的多线程程序至关重要。
注意:Java 内存模型并不是 JVM 内存模型。JVM 内存模型指的是 JVM 内存是如何划分的,比如我们平常所说的堆、栈、方法区等。而 Java 内存模型定义了 Java 语言如何与内存进行交互,具体地说是 Java 语言运行时的变量,如何与我们的硬件内存进行交互。
从 CPU 说起缓存一致性在计算机中 CPU 负责计算,内存负责存储,每次运算 CPU 需要从内存中获取数据。但是 CUP 的运算速度远远大于内存的速度,这样会出现每次计算时 CPU 等待内存的情况。
为了弥补 CPU 和内存之间存在的速度差异,因此引入了 CPU 高速缓存,CPU 高速缓存介于 CPU 和内存之间。每次运算先从内存读取到 CPU 高速缓存中,CPU 再从 CPU 高速缓存中读取。
下面是我现在的使用的电脑,有三级缓存。
随着技术的发展,出现了多核 CPU,进一步提升 ...
SkyWalking,分布式链路追踪
随着业务的发展,软件架构也越来越复杂,为了适应海量用户高并发请求,系统中的组件也逐渐的变为分布式,单体服务变为微服务、缓存变为分布式缓存、组件通信变为分布式消息。
系统进行交互时,一个请求往往需要调用多个服务,当需要排查问题时,搞清楚服务之间的调用关系,服务与服务的调用顺序就变得重要起来。
什么是分布式链路追踪分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
链路追踪最早可以追溯到谷歌的 Dapper 系统,但是 Dapper 链路追踪系统并没有开源,不过谷歌发表了一篇论文:《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,讲述了分布式链路追踪的理论和 Dapper 的设计思想,特别是微服务架构中链路追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节。
Dapper 中有几个关键的技术点来表示链路的信息:Trace、Span、Annotations。
TraceTrace 表 ...
什么是DAPP
DAPP(分布式应用),区块链新物种,去中心化 App简单来说,DAPP 和普通的 App 原理一样,除了他们是完全去中心化的,由类似以太坊网络本身自己的节点来运作的 DAPP,不依赖于任何中心化的服务器,DAPP 是去中心化的,可以完全自动地运行。
1、DAPP(分布式应用)是什么DAPP 是 Decentralized Application 的缩写,中文叫分布式应用/去中心化应用,通常来说,不同的 DAPP 会采用不同的底层区块链开发平台和共识机制,或者自行发布代币(也可以使用基于相同区块链平台的通用代币)。
符合以下 3 个条件的应用可以认为是一个 DAPP(分布式应用):
运行在分布式网络上;
参与者信息被安全存储,隐私得到很好的保护;
通过网络节点去中心化操作。
2、DAPP 的四个特征DAPP 不同的底层区块链开发平台就好比手机的 IOS 系统和 Android 系统,是各 DAPP 的底层生态环境,DAPP 就是底层区块链平台生态上衍生的各种分布式应用,也是区块链世界中的基础服务提供方,DAPP 于区块链,就好比 APP 之于 IOS 和 Android。
一个真 ...
分布式事务框架Seata
分布式事务基础
<<分布式事务基础理论>>
<<分布式事务解决方案>>
Seata 一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata 全局框架Seata 的设计思路是将一个分布式事务理解成一个全局事务下面挂了多个分支事务,而一个分支事务是一个满足 ACID 的本地事务,因此我们可以操作分布式事务像操作本地事务一样。
在 Seata 内部定义了三个模块来处理全局事务和分支事务:
Transaction Coordinator(TC) - 事务协调者: 维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager (TM)- 事务管理器: 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager (RM) - 资源管理器: 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动 ...
分布式事务基础
事务是数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务有四个特性,习惯上被称为 ACID 特性:
Atomicity(原子性)
Consistency(一致性)
Isolation(隔离性)
Durability(持久性)
本地事物在系统发展初期,单体应用对应一个数据库,整个服务操作只涉及一个数据库资源,通过数据库自带的事务很容易实现 ACID,这类基于单个服务单一数据库资源访问的事务,被称为本地事务(Local Transaction)。
分布式事务随着互联网的发展,微服务架构大规模的普及,软件系统由原来的单体应用转变为分布式应用。分布式系统一般由多个独立的子系统组成,多个子系统通过网络通信互相协作配合完成各个功能。
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。比如在一个电商系统中,一条订单的生成涉及库存、订单、支付等不同的服务,不同的服务之间要么全成功、要么全失败,保证事务的 ACID 特性。
本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
在分布式系统中数据一致性又可以划分出 ...