- 博客(265)
- 收藏
- 关注
原创 MySQL-MVCC
MVCC(Multi-Version Concurrency Control) 机制可以保证可重复读隔离级别下的隔离性undo日志版本链与read view机制undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链版本链比对流程当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view该视图在事务结束之
2024-09-11 09:40:37
385
原创 MySQL-InnoDB-BufferPool
为什么Mysql不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL因为来一个请求就直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差Mysql这套机制看起来复杂,但它可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件
2024-09-11 09:38:46
241
原创 MySQL-InnoDB-日志&事务
版本链:在对一条记录进行 delete mark 操作前,需要把该记录的旧的 trx_id 和roll_pointer 隐藏列的值都给记到对应的undo 日志中来,可以通过 undo 日志的old roll_pointer 找到记录在修改之前对应的 undo 日志。被删除的记录会根据记录头信息中的 next_record 属性组成一个链表(垃圾链表),Page Header 部分称之为PAGE_FREE 的属性指向由被删除记录组成的垃圾链表中的头节点。UPDATE 操作对应的 undo 日志。
2024-09-11 09:36:14
937
原创 MySQL-InnoDB-存储结构&Buffer Pool
InnoDB 的表空间:任何类型的页都有专门的地方保存页属于哪个表空间,同时表空间中的每一个页都对应着一个页号,这个页号由4 个字节组成,也就是32 个比特位,所以一个表空间最多可以拥有232 个页,如果按照页的默认大小16KB 来算,一个表空间最多支持64TB 的数据。File Header:针对各种类型的页都通用,比如页的类型,这个页的编号是多少,它的上一个页、下一个页是谁,页的校验和等。flush 链表:再创建一个存储脏页的链表,凡是修改过的缓存页对应的控制块都会作为一个节点加入到一个链表中。
2024-09-11 09:26:29
1114
原创 MySQL-高可用架构
由若干个节点共同组成一个复制组,一个事务提交后,必须经过超过半数节点的决议并通过后,才可以提交。半同步复制机制也会造成一定程度的延迟,这个延迟时间最少是一个TCP/IP请求往返的时间。MHA还提供了mater节点的在线切换功能,即按需切换master-slave节点。需要两个Master,同一时间只有一个Master对外提供服务,可以说是主备模式。MHA能够在30秒内实现故障切换,并能在故障切换过程中,最大程度的保证数据一致性。这种半同步复制相比异步复制,能够有效的提高数据的安全性。
2024-09-11 08:50:55
1417
原创 Redis-IO模型&多线程
虽然 FEH 是单线程运行,但通过 I/O 多路复用监听多个 socket,不仅实现高性能的网络通信模型,又能和 Redis 服务器中其它同样单线程运行的模块交互,保证了Redis 内部单线程模型的简洁设计。Redis 的 I/O 多路复用程序的所有功能都是通过包装常见的 select、epoll、evport 和 kqueue 这些 I/O 多路复用函数库实现的。文件事件分派器:接收 I/O 多路复用程序传来的 socket, 并根据 socket 产生的事件类型, 调用相应的事件处理器。
2024-09-10 15:55:21
1216
原创 Redis-Cluster集群
Cluster高可用集群槽位&选举&脑裂集群完整性&奇数节点&批量操作通信Cluster 高可用集群配置文件cluster‐enabled yes 开启集群模式cluster‐config‐file nodes.conf 集群节点信息文件,会自动生成cluster‐node‐timeout 10000 超过1s则认为故障
2024-09-10 15:48:00
993
原创 Redis-主从&哨兵
client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)哨兵(sentinel):不提供读写服务,主要用来监控redis实例节点。主从复制风暴:多个从节点同时复制主节点导致主节点压力过大。info命令查看主从节点信息。
2024-09-10 15:45:58
960
原创 Redis-底层数据结构
纬度产生的编码为1011 1000 1100 0111 1001,经度产生的编码为1101 0010 1100 0100 0100。最后使用用0-9、b-z(去掉a, i, l, o)这32个字母进行base32编码(将编码转换成经纬度的解码算法与之相反)通过GeoHash算法,可以将经纬度的二维坐标变成一个可排序、可比较的的字符串编码。每个字符代表一个区域,并且前面的字符是后面字符的父区域。将地理位置编码为一串简短的字母和数字。
2024-09-10 15:24:25
1031
原创 Redis-持久化
AOF(append-only file):appendonly.aof(resp协议格式)RDB:dump.rdb (二进制文件)混合持久化:RDB+AOF。
2024-09-10 15:12:13
323
原创 Seata-特性
分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。AT(强一致性,适合并发量不高的场景):业务无侵入,是一种改进后的两阶段提交(一阶段提交释放资源,二阶段日志回滚补偿 - undo_log 表)try-cancel:try 阶段首先进行预留资源,预留资源时扣减库存失败导致全局事务回滚,在 cancel 阶段释放资源。回滚通过一阶段的回滚日志进行反向补偿。
2024-09-10 14:39:38
1101
原创 Zookeeper-Leader选举
整个zookeeper选举底层可以分为选举应用层和消息传输层,应用层有自己的队列统一接收和发送选票,传输层也设计了自己的队列,但是按发送的机器分了队列,避免给每台机器发送消息时相互影响,比如某台机器如果出问题发送不成功则不会影响对正常机器的消息发。
2024-09-10 14:26:53
258
原创 Zookeeper-分布式锁&注册中心
非公平锁(羊群效应):所有的锁请求者都 watch 锁持有者,当代表锁持有者的 znode 被删除以后,所有的锁请求者都会通知到,但是只有一个锁请求者能拿到锁。由于ZooKeeper的高可用性,因此在并发量不是太高的应用场景中,还是推荐使用ZooKeeper的分布式锁。优点:具备高可用、可重入、阻塞锁特性,可解决失效死锁问题,使用起来也较为简单。在高性能、高并发的应用场景下,不建议使用ZooKeeper的分布式锁。缺点:因为需要频繁的创建和删除节点,性能上不如Redis。公平锁:临时顺序 znode。
2024-09-10 14:11:23
276
原创 Zookeeper-特性
ZooKeeper的数据模型是层次模型,层次模型常见于文件系统。并采用 ZAB 协议的原子广播协议,将事务请求以 Proposal 提议广播到所有 Follower 节点。ZooKeeper的层次模型称作Data Tree,Data Tree的每个节点叫作Znode。注意 Observer 节点只负责同步 Leader 数据,不参与 2PC 数据同步过程。Zookeeper 使用单一的主进程 Leader 来接收和处理客户端所有事务请求。follower在接到写请求时会把写请求转发给leader来处理。
2024-09-10 14:05:12
852
原创 Zookeeper-ZAB
对于客户端发送的写请求,全部由 Leader 接收,Leader 将请求封装成一个事务 Proposal,将其发送给所有 Follwer。ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 的协议。高 32 位代表了每代 Leader 的唯一性,低 32 代表了每代 Leader 中事务的唯一性。在 ZAB 协议的事务编号 ZXID 设计中,ZXID 是一个 64 位的数字。ZAB 协议的消息广播过程使用的是一个原子广播协议,类似一个 两阶段提交过程。
2024-09-09 10:46:19
746
原创 RocketMQ-整体架构
Producer的核心启动流程以及两种消息发送者的区别。Producer如何管理Borker路由信息。在发送Netty请求时,如何制定Broker。Producer的负载均衡。
2024-09-09 10:40:08
1020
原创 RocketMQ-基础
NameServer : 提供轻量级的Broker路由服务。Message Queue:相当于是Topic的分区;Consumer:消息消费者集群。通常也是业务系统中的一个功能模块。Producer:消息生产者集群。通常是业务系统中的一个功能模块。Broker:实际处理消息存储、转发等服务的核心组件。代理服务器(Broker Server)消息模型(Message Model)消息生产者(Producer)消息消费者(Consumer)Topic:区分消息的种类;消息(Message)
2024-09-09 10:29:39
752
原创 RocketMQ-核心原理
Producer发送消息时,默认会轮询目标Topic下的所有MessageQueue,并采用递增取模的方式往不同的MessageQueue上发送消息,以达到让消息平均落在不同的queue上的目的。如果有一个消费者被分配的是这些没有消息的读队列,那这些消费者就无法消费消息,造成消费者空转,极大的浪费性能。如果写队列大于读队列,就会有一部分写队列无法写入到读队列中,这一部分的消息就无法被读取,就会造成消息丢失(消息存入了,但是读不出来)引入DMA拷贝之后,在读写请求的过程中,CPU不再需要参与具体的工作。
2024-09-09 10:25:45
865
原创 RocketMQ-常见问题
通常MQ存盘时都会先写入操作系统的缓存page cache中,然后再由操作系统异步的将消息写入硬盘。1,2,4 三个场景都是跨网络的,而跨网络就肯定会有丢消息的可能。Dledger会通过两阶段提交的方式保证文件在主从之间成功同步。half消息写入成功后RocketMQ挂了。下单成功后如何优雅的等待支付成功。订单系统写数据库失败。
2024-09-09 10:14:34
1001
原创 JVM-JIT
为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。如果逃逸分析出来的对象可以在栈上分配,那么该对象的生命周期就跟随线程了,就不需要垃圾回收。如果确定一个对象不会逃逸出线程之外,那么让对象在栈上分配内存可以提高JVM的效率。从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程度。必须要符合热点代码,JIT才会优化。
2024-09-09 10:02:24
348
原创 JVM-GC-ZGC
这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。为了细粒度地控制内存的分配,和G1一样,ZGC将内存划分成小的分区,在ZGC中称为页面(page)小页面指的是2MB的页面空间,中页面指32MB的页面空间,大页面指受操作系统控制的大页。下次GC中的并发标记(同时做上次并发标记对象的重定位):基于指针着色的重定位算法。
2024-09-09 09:57:59
1105
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人