MySQL8.0源码编译和Clion调试

MySQL 是最为流行的开源关系型数据库之一,有关它的使用、优化和运维处理相关的文章汗牛充栋。我个人也写过《MySQL探秘》和《MySQL死锁》系列文章,详细介绍了诸如 MySQL 内存结构、持久化机制、锁和事务等多方面的知识。不过上述知识大多数都来自《高性能MysQL》、《MySQL技术内幕:InnoDB存储引擎》等书籍以及网上一些优秀博主的文章。

所以本人也希望更进一步,进入MySQL源码层面,从源码方面了解其具体实现,为自己累计数据库内核方面的开发经验。有关 MySQL 和 RocksDB 的源码阅读其实已经持续了半年左右,所以现在希望开一个新坑,从源码层面讲解一下 MySQL。

想要了解数据库内核开发,直接去阅读MySQL巨量的源码并不是一个最优的方法,读者们可以先从诸如 Pingcap Talent 和 CMU 15-445/645 课程入手。不过我也只是一个学习者,写系列文章更多是通过记录和输出来帮助学习,所以如有纰漏,还请各位读者指出。

阅读源码过程中,最好可以手动调试,重复了解代码的实现,所以编译和调试MySQL代码很重要,不过整个过程中还是遇到了一些坑,所以这里记录一下整个过程和遇到的坑。

操作系统环境

我把个人的台式机重装了 Ubuntu 20.04 ,内核版本是 5.13.0-44-generic,内存16G,磁盘240G,有关依赖的编译工具版本如下所示。

Read More
Share

2022年记录目录

update 2022-06-04 更新一季度和量化相关目标

22 年度计划

OKR:目标和关键成果法

一、分布式数据库

分为数据库内核和分布式

  • 两大课程 MIT 6.824 CMU 15-445 及其大作业
Read More
Share

Go 结构体函数调用底层实现

《Go 语言嵌入和多态机制对比》一文中我们了解了 Go 语言的类型系统特征,下面,我们就来了解一下 Go 语言是如何实现上述类型系统特性的,我们将会深入到 Go 语言运行时和最终机器码层面对 Go 语言的结构体、嵌入、抽象接口实现以及函数动态绑定原理进行了解。

上文已经提及,Go 语言结构体并非 Java 和 C++ 语言中 class 的概念,下面我们来了解一下结构体变量声明和相关函数调用在机器码或汇编层面的体现。我们以下面代码为案例进行分析。

func (u User) addAgeVal(a int32) int32 {

Read More
Share

Go 语言嵌入和多态机制对比

简介

面向对象语言设计最早可以追溯到 SIMULA 67,但直到 1980 年的 Smalltalk80 将其完善,并随着 Java 的崛起而全面流行起来。面向对象设计的语言大多都支持三个关键的语言特性:抽象数据类型、继承以及多态(方法动态派发)。

本文将以 Go 语言为主,讲解一下 Go 语言在面向对象领域的一些特性以及高级编程语言的一些通用领域知识。

继承

在面向对象语言中,继承是代码复用和部分修改的常见手段之一。通过继承,子类型可以获得父类型的属性和行为,并且子类型的实例可以被当做父类的实例使用。

继承一般分为基于原型的继承(prototype-based inheritance)和基于类的继承(class-based inheritance),Javascript语言就实现了基于原型的继承,而其他场景后端语言多是实现了基于类的继承。

Go 语言并未实现上述两种意义上的继承,而是提供嵌入机制。嵌入可以理解为一种组合或者代理模式的自动语法糖。

Read More
Share

ElasticSearch 如何配置Uptime 监控组件可用性

本文收录至《Elastic Stack 实战手册》,欢迎和我一起解锁开发者共创书籍,系统学习 Elasticsearch,地址点我

现在互联网架构随着用户的增加,而越来越复杂,可能要有成千上万个不同的组件和不同的实例,对这些组件可用性的监控是提供高可用服务的关键之一,Elastic 为此推出了 Uptime App。

Elasticsearch 使用 Heartbeat 进行组件的监控。

Heartbeat 也就是我们通常所说的心跳,通过 Hearteat 我们可以判断一个网络组件,当前是否存活,是否可以对外正常提供服务。

Read More
Share

ElasticSearch 如何使用 TDigest 算法计算亿级数据的百分位数?

大家好,我是历小冰。

ElasticSearch 作为一个分布式的开源搜索和分析引擎,不仅能够进行全文匹配搜索,还可以进行聚合分析。

今天,我们就来了解一下其聚合分析中较为常见的 percentiles 百分位数分析。n 个数据按数值大小排列,处于 p% 位置的值称第 p 百分位数。比如说,ElasticSearch 记录了每次网站请求访问的耗时,需要统计其 TP99,也就是整体请求中的 99% 的请求的最长耗时。

近似算法

当数据量较小或者数据集中存储在同一位置时,进行类似 TP99 这样的百分位数分析就很容易。但当数据量不断增长时,对于数据进行聚合分析就需要在数据量,精确度和实时性三个方面进行取舍,只能满足其中两项。

不可能三角

Read More
Share

ElasticSearch 如何使用 ik 进行中文分词?

大家好,我是历小冰。在《为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索》 一文中,我们讲解了 ElasticSearch 如何在数据存储方面支持全文搜索和复杂条件查询,本篇文章则着重分析 ElasticSearch 在全文搜索前如何使用 ik 进行分词,让大家对 ElasticSearch 的全文搜索和 ik 中文分词原理有一个全面且深入的了解。

全文搜索和精确匹配

ElasticSearch 支持对文本类型数据进行全文搜索和精确搜索,但是必须提前为其设置对应的类型:

  • keyword 类型,存储时不会做分词处理,支持精确查询和分词匹配查询;
  • text 类型,存储时会进行分词处理,也支持精确查询和分词匹配查询。
Read More
Share

MySQL读写分离,写完读不到问题如何解决

大家好,我是历小冰。

今天我们来详细了解一下主从同步延迟时读写分离发生写后读不到的问题,依次讲解问题出现的原因,解决策略以及 Sharding-jdbc、MyCat 和 MaxScale 等开源数据库中间件具体的实现方案。

写后读不到问题

MySQL 经典的一主两从三节点架构是大多数创业公司初期使用的主流数据存储方案之一,主节点处理写操作,两个从节点处理读操作,分摊了主库的压力。

但是,有时候可能会遇到执行完写操作后,立刻去读发现读不到或者读到旧状态的尴尬场景。这是由于主从同步可能存在延迟,在主节点执行完写操作,再去从节点执行读操作,读取了之前旧的状态。

mysql_proxy

Read More
Share

为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索

熟悉 MySQL 的同学一定都知道,MySQL 对于复杂条件查询的支持并不好。MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤,对这个过程不了解的同学可以先行阅读一下《MySQL复杂where条件分析》

上述这种处理复杂条件查询的方式因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行数据,并消耗 CPU 进行内存过滤,导致查询性能的下降。

而 ElasticSearch 因其特性,十分适合进行复杂条件查询,是业界主流的复杂条件查询场景解决方案,广泛应用于订单和日志查询等场景。

下面我们就一起来看一下,为什么 ElasticSearch 适合进行复杂条件查询。

ElasticSearch 简介

Elasticsearch 是开源的实时分布式搜索分析引擎,内部使用 Lucene 做索引与搜索。它提供”准实时搜索”能力,并且能动态集群规模,弹性扩容。

Read More
Share

编程小技巧之 Linux 文本处理命令(二)

合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

本篇文章是《Linux 文本处理命令》 续篇,在前文的基础上再介绍几款有用的 Linux 命令行工具和使用场景。

再啰嗦几句,工具能提供效率,但是有一定的学习曲线和学习成本。很多同学临时想用时,可能会陷入了不会用的尴尬境地,再去网上搜索学习,最终要花费更长时间,还不如使用笨方法处理,这是很多同学不使用这些工具的原因之一。

而且更难的是,思维上改变原有的做事习惯,一个文件中有20多行数据要生成 SQL,好像用手工处理也就是1,2分钟;快捷键记不住,我鼠标移动一下点点也挺快。但是当行数量变大或者复杂性提高时,这些手段的弊端就会显现,逼迫我们去使用正确的手段。

所以,为什么不一开始就使用更快,而且可以处理更加复杂场景的手段呢?

Read More
Share