自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (1)
  • 收藏
  • 关注

原创 MySQL8.0新特性

MySQL 8.0:支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中。函数索引基于虚拟列功能实现,在MySQL中相当于新增了一个列,这个列会根据你的函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引。MySQL 8.0:InnoDB会根据服务器上检测到的内存大小自动调整 innodb_buffer_pool_size,innodb_log_file_size 等参数,尽可能的冲分利用系统资源。

2024-04-29 20:04:48 830

原创 Mysql全局优化总结

因此,在配置max_connections时,你还需要考虑open_files_limit的值,确保两者之间有适当的比例,以优化数据库服务器的性能和稳定性。缓冲池大小的调整是按照块进行的,块大小由 innodb_buffer_pool_chunk_size 变量定义,默认为 128MB。在 MySQL 的 InnoDB 存储引擎中,innodb_read_io_threads 和 innodb_write_io_threads 是两个配置参数,用于设置后台进行读和写操作的 I/O 线程的数量。

2024-04-24 23:02:45 816

原创 Innodb之Doublewrite Buffer

在某些情况下,当数据库系统正在写入一个数据页到磁盘的过程中发生崩溃,可能会导致该页只写入了一部分,从而损坏了页的内容。双写缓冲区提供了一个中间层,确保每个数据页在写入其最终位置之前,在一个单独的位置(即双写缓冲区)有一个完整的副本。因为崩溃导致的数据页的部分写损坏,而需要双写缓冲区(Doublewrite Buffer)这个问题的核心在于理解重做日志和数据页写入过程的不同目的和机制。重做日志的主要功能是记录事务对数据库所作的修改,确保这些修改可以在数据库崩溃后被重新应用(重放)以保持数据的一致性和完整性。

2024-04-23 10:10:32 587

原创 MySQL之binlog归档日志

的话题,假设我们把数据库所有数据都删除了要怎么恢复了,如果数据库之前没有备份,所有的binlog日志都在的话,就从binlog第一个文件开始逐个恢复每个binlog文件里的数据,这种一般不太可能,因为binlog日志比较大,早期的binlog文件会定期删除的,所以一般不可能用binlog文件恢复整个数据库的。设置sync_binlog为1意味着每个事务的binlog信息在提交时都会立即通过fsync操作被刷新到磁盘,确保了数据的持久性和一致性,但这可能对性能产生影响,特别是在高事务率的系统中。

2024-04-21 14:07:39 1125

原创 Innodb之redo日志

​ 通过redo log buffer和redo log文件的配合使用,InnoDB能够保证即使在数据库系统崩溃的情况下,所有已提交的事务修改都不会丢失,实现了数据库的crash-safe能力。​ redo log buffer是InnoDB存储引擎中关键的组成部分,它通过缓冲和优化日志写入操作,既提升了数据库的性能,又确保了数据的安全性和一致性。​ 在MySQL数据库中,binlog(二进制日志)和redo log(重做日志)都是关键的日志系统,但它们服务于不同的目的,具有不同的特性和工作机制。

2024-04-15 18:44:28 949

原创 MySQL底层架构

此外,在SQL语句的语法分析过程中,MySQL的解析器会进行一些初步的权限预检查(precheck),例如验证用户是否有权访问指定的数据库和表。当一个SQL语句提交给MySQL服务器时,如果未命中查询缓存(或在MySQL 8.0及以上版本,由于查询缓存功能已被移除,所有查询都会直接进入执行阶段),MySQL就会开始执行语句的准备工作,这包括解析和校验SQL语句。通过这两步解析过程,MySQL确保了它能理解用户的查询意图,并且语句是按照MySQL的规则构造的,这为后续的查询优化和执行奠定了基础。

2024-04-11 14:14:47 1168

原创 MySQL之MVCC底层机制

Read View的主要作用是确保在事务中执行查询操作时,能够看到一个一致的数据快照,而不会被其他并发事务中的修改所影响。这意味着,即使在当前事务执行过程中,其他事务提交了新的更改,当前事务的查询操作仍然返回事务开始时的数据状态。任何ID小于低水位标记的修改都是对当前事务可见的,因为这些修改必定是在当前事务开始之前提交的。假设第一条的DB_TRX_ID 大于高水位标记,表示这行数据是在当前查询之后启动的事务,是不可见的,继续比对undo日志的下一条该行数据。

2024-04-07 09:56:52 567

原创 MySQL锁机制

在InnoDB存储引擎中,行锁实际上是索引锁。此外,RR级别也试图通过使用间隙锁来避免幻读问题,幻读是指当事务在读取某范围内的记录时,另一个事务在这个范围内插入了新的记录,导致第一个事务在再次读取这个范围的记录时会发现新的“幻影”记录。不过,需要注意的是,不当的锁使用策略可能导致性能下降,特别是在高并发的环境下。要理解为什么在RR(可重复读)隔离级别下MySQL可能会从行锁升级为表锁,而在RC(读已提交)隔离级别下不会,我们需要先了解两个隔离级别处理数据一致性问题的机制差异,以及索引的作用在这其中的影响。

2024-04-06 10:43:32 1082

原创 深入理解MySQL事务

将UPDATE放在末尾,可以在出错时减少需要回滚的操作数量,从而降低回滚的开销。综上所述,合理控制事务的大小和持续时间,以及优化事务中的操作顺序和方式,是提高数据库性能和并发处理能力的关键。在某些场景下,将数据的查询、校验等操作先行执行,最后再进行UPDATE操作,可以保证在实际修改数据之前,所有的前置条件都已经满足,这有助于保持事务逻辑的清晰和健壮性。总的来说,将UPDATE操作放在事务的末尾,是一种优化事务执行和锁管理的策略,旨在减少锁的持有时间,减轻对并发事务的影响,同时提高系统的整体性能和稳定性。

2024-04-04 09:05:32 487

原创 JVM常量池

因为有 "zhuge"字面量,创建对象 s的时候,JVM通过 equals(key),判断常量池中是否有相同的对象。从Java 7开始,字符串常量池被移动到了Java堆内,这意味着字符串常量池的大小不再受JVM方法区大小的限制,有助于更灵活地管理内存。与Class常量池和运行时常量池相类似,字符串常量池的目的是为了优化内存使用和提高性能,但它专门服务于字符串实例。字符串常量池底层是hotspot C++实现的,底层类似一个 HashTable,保存的本质上是字符串对象的引用。放的是对象在常量池中的地址,

2024-03-21 16:52:00 439

原创 JVM内存模型

Java虚拟机(JVM)内存模型是JVM管理和执行Java程序所使用的内存布局。它定义了不同类型的数据应该存储在内存的哪个部分,以及这些数据如何、何时从一个地方移动到另一个地方。

2024-03-21 16:43:37 289

原创 Java执行全流程

深入JVM概览Java执行全流程

2024-03-21 16:25:48 167

原创 深入Canal解构消息队列单点性能瓶颈

那么我就来测试验证我发现的坑,这个坑就是"如果是ddl就会固定发到0号队列",这里直接贴出我测试的结果,其中1号队列的2026条消息是增删改,而0号队列的2条消息,分别是我操作的TRUNCATE操作以及修改字段名。如果你有上述的类似问题,看到这里心情一定非常愉悦了,感觉可以直接开干了,但是当我看完 canal完整的源码,发现里面还是有坑的。0号队列",这里直接贴出我测试的结果,其中1号队列的2026条消息是增删改,而0号队列的2条消息,分别是我操作的TRUNCATE操作以及修改字段名。

2024-01-24 11:08:54 496

原创 企业级ETL同步

最后更新批量插入标识和更新开始时间。

2023-08-22 17:08:04 142

原创 生产级MySQL海量数据表结构变更实战

Mysql下,对于海量数据的大表(这里亲测的是千万级),需要导出表数据,并且需要对表字段进行加工处理,比如增、删、改等操作。

2023-08-21 16:38:34 159

原创 ReentrantLock

多线程访问共享资源的同步器框架,是一个依赖状态的同步器。

2023-06-19 19:34:35 172

原创 ZK底层架构剖析(基于3.5.8版本)

4. ZK 集群启动之多级队列架构设计解读。3. ZK 集群启动流程和选举机制源码分析。6. ZK 服务端处理请求责任链流程分析。5. ZK 客户端发起写请求流程分析。7. ZAB协议流程分析。

2023-06-19 19:18:51 170

原创 大名鼎鼎的Zookeeper

如果在集群环境下,当客户端与A机器建立连接,Session也会同步到B机器,此时假设当A机器出现宕机,并且客户端在Session超时范围内,又重新连接到B机器上时,因为session不会变,还是能看到临时节点,继续业务操作。log.,因为日志文件是顺序写入的,所以这个最大事务ID也是整个事务日志文件中最小的事务ID,日志满了即下一次事务日志文件的创建。第一个是Znode目录的监听,如果只是修改Znode数据,是不会触发监听的,只有节点列表发生变化时,才会触发监听。临时节点会被删除,如果想再次获取,会报错。

2023-05-31 10:26:12 142

原创 说英语的思路(狂飙版)

在疑问的环境下,一定要有人冲锋陷阵,但是大哥那么尊贵的人是绝对不会冲的,都是助理或者代理大哥冲,且他们冲的时候就要表明时态和肯/否定的信息。A类助理:情态动词,can、could、will、would、must、may、might、shall、should、ought to。大哥:中文概念里的动词,love、tell、say、konw、look、open、read......,明确知道它是一个动作的动词。代理大哥:系动词,am、is、are、be、was、were、been,大哥不在的时候,代一下。

2023-03-29 11:24:20 199

原创 虚拟机搭建超详细

点击ROOT PASSWORD设置root密码(一定要记住设置的密码,在Linux中root用户相当于上帝,神奇至极,无所不能,有root就几乎拥有了一切)重启网络 service network restart,这时候输入ifconfig 显示ip地址了,如果能ping通百度,说明网络已通。可以像我这样建2层目录,vm_centos是大文件夹,然后按照每个虚拟机的名字独建一个目录存储,这样文件不会凌乱。桥接网络:本机网关相同,网段一样,相当于在我本机的局域网内新增一台机器,能和本机互通。

2022-11-16 19:02:29 7296 3

原创 23种设计模式-访问者模式

② 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。那么上述代码就要修改show方法,添加我是几号女仆的信息,这样的设计显然不符合“开-闭”原则,即某个方法操作的改变,会使得必须去更改每个元素类。上面的代码能够解决刚才提出的场景,但是需求是时刻变化的,如果以后,顾客除了想知道女仆的声音类型,还想知道女仆是几号方便下次直接微信预约。既然这种场景只是行为的改变,而每个元素的数据结构是不变的。

2022-09-09 00:03:45 232

原创 记一次NoHttpResponseException:xxx failed to respond

① 确认服务端的空闲超时时间:案例中服务端指的是kettle的远程carte服务,通过本地模拟Http请求调用carte服务,抓包看出运行服务的web容器是内嵌的Jetty。在我找到原因之后,由于我们公司使用的是kettle开源工具,没有定制它的源码,所以我们在项目中只是将服务端的超时时间适当的配大了一点,尽量减少异常的次数。上述案例,服务端配置的闲置超时时间=3000,所以在某种情况超过这个闲置时间,服务端会主动关闭TCP连接,但是客户端依然在复用这个连接,就会导致这个异常。...

2022-08-16 22:33:07 1634

原创 kettle 运行时内存溢出问题调优经验总结

大概意思就是说,JVM花费了98%的时间进行垃圾回收,而只得到2%可用的内存,频繁的进行内存回收(最起码已经进行了5次连续的垃圾回收),JVM就会曝出java.lang.OutOfMemoryError: GC overhead limit exceeded错误。objectTimeout=1440 默认一天,即将执行完成的Job对象保留一天时间,可以在kettle.properties中自定义该属性的值,这边改的是5分钟,即任务执行完成后5分钟就会被扫描成过期的对象,让它尽量在年轻代就被回收掉。.....

2022-08-10 01:45:36 7383 9

原创 Rocket MQ 集群搭建

集群搭建(三台机器56 57 58)免密登录(56机器)搭建(2主2从)配置第一组broker-a配置第二组broker-b启动集群① 修改三个节点上的bin/runserver.sh,调整里面的jvm内存配置② 直接在三个节点上启动nameServer③ 启动broker④ 验证搭建管理控制台① 下载地址:https://github.com/apache/rocketmq-externals② 进入rocket-console目录,使用maven

2022-07-12 22:06:15 894

原创 RocketMQ 单机部署

安装JDK下载RocketMQ:http://rocketmq.apache.org -> Geting Started -> Download安装

2022-07-12 21:51:46 771

原创 springmvc 父子容器的创建

什么是SPI机制?工程演示见GitHub① Tomcat 作为服务者,提供 javax.servlet.ServletContainerInitializer 这个接口② 应用程序只要实现这个接口,并且在对应目录下添加配置文件。在启动Tomcat时,Tomcat就会调用实现该接口的onStartup()方法③ spring-web 项目实现SPI机制,详见 SpringServletContainerInitializer 这个类① @HandlesTypes({WebApplicationIniti

2022-06-06 18:08:13 161

原创 Spring 底层源码之解决循环依赖(五)

在容器启动时,创建非懒加载的单例bean A,执行A的生命周期 3. 初始化前,初始化,初始化后 4. 放入单例池 4. 初始化前,初始化,初始化后 5. A放入单例池 4. 初始化前,初始化,初始化后 5. A放入单例池...

2022-06-05 20:09:19 67

原创 Spring 底层源码之bean的生命周期(四)

① 生成bean定义,合并bean定义(父子关系)② 加载类③ 实例化前④ 实例化:Supplier创建对象 || 工厂方法创建对象 || 推断构造方法⑤ bean定义的后置处理⑥ 实例化后⑦ 自动注入⑧ 处理属性:⑨ 执行Aware⑩ 初始化⑪ 初始化后① 扫描配置类中的@ComponentScan包路径,遍历扫描到的资源文件② 利用ASM技术获取到元数据:③ 构造bean定义,属性赋值:比如metaData(类的元数据)、beanClass(这里是类的全限定名,后面创建bean用这个加载)④ 进一步筛选

2022-06-05 20:01:11 114

原创 Spring 底层核心组件初步窥探(三)

① 根据传入的配置类,扫描配置类是否有@ComponentScan注解,有就扫描该注解下的包路径ZhouyuApplicationContext applicationContext = new ZhouyuApplicationContext(AppConfig.class);② 包路径下的类上标识@Component注解,才会创建bean定义,最终缓存到bean定义Map③ 如果实现 BeanPostProcessor,利用反射创建该类的实例缓存到集合List④ 遍历bean定义Map,创建bea

2022-06-05 19:46:57 143

原创 Spring 底层核心设计初步分析(二)

① bean初始化前:@PostConstruct 调用标注该注解的方法,可以属性赋值② bean初始化:实现 InitializingBean 调用afterPropertiesSet()方法,可以属性赋值③ bean初始化后:最终返回普通对象 || 代理对象① 默认使用无参的构造方法② 如果没有无参的构造方法,有2个以上有参的构造方法,会使用@Autowired 标注的。如果没有标注,启动会报错③ 如果是选择有参的构造方法创建,参数bean 根据类型查找Spring容器,不存在则启动报错 ||

2022-06-05 19:45:35 79

原创 Spring 源码编译(一)

1、下载源码包Spring 官网下载2、修改build.gradlerepositories { maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/'} maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'} mavenCentral() maven { url "https://repo.

2022-05-28 18:13:11 224

基于Kettle工具的企业级数据同步方案

数据同步工具:Kettle 适用场景: 1. 分布式企业级数据同步 2. 数据的更新时间允许重复 3. 实时性高 4. 允许偶尔丢失一两条数据,手动补偿 5. 删除数据不是物理删除 6. 能支撑海量数据同步

2022-08-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除