缓冲区管理器 | 学习笔记

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 快速学习缓冲区管理器

开发者学堂课程【PolarDB for PostgreSQL 开源人才初级认证培训课程缓冲区管理器学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/1077/detail/15555


缓冲区管理器


内容介绍

一、缓冲区管理器结构

二、缓冲池块替换算法


一、缓冲区管理器结构

通过学习 Polar DB  数据缓冲区的管理,可以了解到其它数据库数据缓冲区的管理方式。

首介绍缓冲区的基本的概念,缓冲区管理器所在的位置在用户和数据库存储程之间,换句话来说用户进程当它企求数据块的时候,由缓冲区管理器从数据库纯储存把数据块读到数据缓冲区提供服务。

image.png

它存放的应该是数据数据块包含表和索引的块,也包含可运性地图的块和可见性地图的块。还有包含缓冲区索引块。

(1)缓冲区管理器的结构:

注意缓冲区管理器根据它存放的数据不同,分为3层,第一层叫做缓冲区表层,第2层叫做缓冲区描述层,第3层是缓冲区池层,是把数据块从数据文件读到内存。

image.png

在3层里缓冲区描述层包含的信息非常多,也是管理最重要的一层。

image.png

缓冲区表层它有一个叫做插槽,每一个插槽会存放数据块的标记。

包含了你要访问数据块的描述,比方说是哪个数据文件第几个块,把它叫做一个标记,每一个槽就记录可以是一个或者多个标记,我们把它叫做缓冲区表层,记录的是表的一些数据块的标记。

image.png

比方说一个缓冲区的这么一个标记,比方说7的意思就是包含表数据文件的第7个块,这里的0代表,块是存放数据的块,还是存放可用空间的地图块还是可见性地图的块,如果是0就意味着它是存放数据的块,后面的16384就代表数据库的一个o i d ,表空间是16821就是放在表空间的数据库,数据块的ID就是数据文件号。

通过缓冲区标记可以弄清楚,需要读的数据块,最详细的信息。

缓冲区表层(缓冲区标记)

·RelFileNode(分别为表对象oid、数据库oid、表空间oid)

·页面的fork number(分别为0、1、2)

·页面number(即块)

示例:

缓冲区标记{(16821、16384、37721)、0、7}

标识第七个块中的页

其关系的OID和fork号分别为37721和0(0即为存放表数据的文件)

该关系包含在OID为16384的数据库中,表空间的OID为16821

(2)缓冲区描述层

①把数据块读到数据缓冲区的时候注意记录,记录叫做描述层,同时也包含了缓冲区的标记,才知道缓冲区保存的是什么数据块的信息,还有缓冲区的 buffer_id 是什么意思大家注意哈比方说这是我的缓冲区描述层.这是我的缓冲区池层就是专门放数据块.

②比方说我要记录放的是哪个数据块数据块它有一个 buffer_id   Polar DB  把数据缓存区把它分割成由数据块大小一样的若干个块,比方说你缓冲区尺寸如果是8K它就是一个8K的空间.可以理解为一个房间,每个房间都要有一个房间号 buffer_id  .

image.png

同时肯定要记一个 tag 就是你的数据块的标记,通过缓冲区描述层, buffer_id 存放的是哪一个数据块的信息,我们叫描述层除了信息以外还有一个这两个很重要,用它来描述数据文件缓冲区被访问的热度的情况,如果说缓冲区被某个进程访问过一次,会在数上面加1,它不仅仅是加1如果说我被时钟扫描过一次它就-1,用来标识你缓冲区是可用,假如过得比较久,所有的缓冲区都用满了,可能要选择之前用过的缓冲区,在使用哪个缓冲 buffer_id ,就看你 buffer_id  refcount 看参数,如果为0就意味着缓冲区可以被再次使用。

③后面讲时钟扫描是什么意思它怎么工作。Usage_count是用来统计,总的计数。

还有存放一些锁的信息,还有注意标记,标记是标记你缓冲区的状态,比方说如果缓冲区是已经被修改过的,就标示为它是一个脏化,如果已经保存了,比如说已经被写到数据文件就标示为可用,如果正在被一个进程所修改所访问,就标示为正在被处理 。所以它包含了控制缓冲区的很重要的关键的信息。

④举个例子

在描述层每一个层是缓冲池层就是把内存分割成若干个大小的内存块,每个内存块都有个 buffer_id 存放数据都是放在缓冲区描述层,它是连接两者之间非常关键的一个层。

image.png

比方说举个例子

image.png

首先要发一个请求,请求首先要到描述层,怎么样去给你分配一个插槽,分配插槽的时候它会返回你的信息,这时候管理器就会把你标记数据块的标记,寄到描述层,同时也会去申请内存块,申请完内存块以后,就把传递给它的缓冲数据块的标记,从数据库把它读到缓冲区再把buffer_id 就使得我的块的标记与buffer_id 的标记能够进行匹配 。

(3)缓冲区池层

①假如你的数据块是8K它就会把数据缓冲区分割成若干个8K ,一个槽刚好能放得下一个数据块的数据。

image.png

Backend进程读数据块流程

image.png

要访问一个数据块它怎么读数据,首先要请求一个数据块得保证数据缓冲区地方有可用的空间,所以它跟描述层就是跟管理器提请求的时候管理器就会去找当前哪个ID是可用的空闲。同时也会要访问的数据块的标记发给它。

②接下来管理器把我找到的buffer_id 发送给用户进程,同时也把它寄到描述层。

在管理器的后台会把数据块读大,后台进程拿到了buffer_id 以我要我所请求的数据块放在哪个房间,接下来它就根据你的buffer_id 直接找到数据块,就是管理器的一个工作流程,数据块是由管理器读到数据缓冲区,把数据缓冲区的位置就是buffer_id 发给你的后端进程。后端进程拿到buffer_id 以后,去访问数据块。

这是第一次,如果说下一次要去读同样的块,我把我需要访问的buffer_id r发到管理器,管理器去扫一下数据块曾经有没有被访问过,如果有它去查一下数据块当前放在哪个buffer_id 上面如果查得到,它就直接把buffer_id 发给Backend的进程Backend的进程就直接去访问,这时候就少了这一步,它就不需要从磁盘读数据块,因为块已经在缓冲区中有。


二、缓冲池块替换算法

1.数据缓冲区它的大小是固定,所以我们不可能说把整个数据库的数据都存放到内存当中。

image.png

数据缓冲区的空间应该是轮流重复的使用。这时候会涉及到做替换要把你是哪一个数据款中区的块把它给替换掉。在数据库计算机算法一般最常用的有两种。一种叫做l iru叫做最近最少使用规则AUTO用的就是算法。还有一种叫做时钟扫描原来 Polar DB 它8.1的时候用的就是 l r u 算法,现在用的是时钟上。

在描述层都记录了数据块曾经被访问过的次数,就是有 refcount  如果被进程访问过一次就加1,但是如果被时钟扫描扫描过一次就减1,以此来判断你数据块当前的受欢迎程度。

2.它的一个工作原理比方说在我描述层记录了我当前数据缓冲区使用的情况比如说块块当前怎么样被访问了4次,比如是当前的是3次就三,比如说现在有一个进程需要看申请内存款,那我把内存块分配给它,那这时候时钟指针就会指向下一块。

下一个块有没有什么办法能用你看原来是指向,那下一次它就指向块,原来技术是2就说明它曾经被访问过两次,下面如果被时钟扫描一次会在2上面的减去1就变成1。如果是一的话就意味着缓冲区我们还不能用。那就会下一次扫描下一个,如果发现是0那就意味缓冲区可能在最近被访问的次数比较少。

那我就可以把缓冲区分配给新的进程使用。如果假如说数据块,如果数据块在期间没有被再次访问,它的数都保持1,到我时针在扫描到你的时候它就减去1,这时候就等于0,如果是0的话下一次再扫到块的话,数据块就可以被再次使用。被访问过一次就再加1如果被扫描过一次我就减1.如果变成0那就就可以被使用。

3.不管是时钟扫描还是 L    RU 算法其实就是用它来记录你数据块在最近一段时间被被关注的一个程度.如果说数据块这一段时间怎么被访问的人很多,肯定不能把它给替换出去。我替换的肯定是最不被人关注的款。因为数据块放在内存,目的是为了再次被人访问。会被再次的使用,就不需要从池盘当中去读取。

4.数据缓冲区的数据块如果被修改以后,它的状态就被标识为脏块,有两个进程一个是专门的后台写进程,还有一个是检查点进程, oligo 也有这两个进程但是 oligo 写就是由DV ride  去写 oligo 的检查点进程是不会写脏块,它只是给数据缓冲区发信号,但它检查点除了发检查点以外也会把脏块写到数据文件。

比方说发生的检查点进程会把检查点的记录写到重做日志文件,再把相应的脏块,把它写到数据文件,因为写的操作它是属于密集型的操作,每一次写的时候可能是要写一批的数据,如果你写的太多会影响数据库的性能,所以它的写的机制一点的刷新,你的张页就是一点的写,每一次是写100个数据块,默认是200毫秒它就会写一下所以我们通过我们也可以看出它其实是很频繁。可以理解为缓冲区不断的被修改,不断的保存下来,过了一段时间我发一个检查点的时候,它会把上一次发生检查点到目前为止所有脏块都要。

检查点进程和后台写入进程将脏页刷新到存储区,检查点与后台写进程分离。

检查点进程将检查点记录写入WAL段文件,并在检查点启动时刷新脏页。后台写进程的作用是减少检查点密集写的影响。后台写进程继续一点一点地刷新脏页,对数据库活动的影响最小。

默认情况下,后台写入程序每200毫秒唤醒一次(由bgwriter_delay定义),并最多刷新为100页(由bgwriter_lru_maxpages定义)

image.png

通过参数可以控制共享缓冲区的尺寸,共享缓冲区包含数据缓冲区的内容,还有缓冲区日志缓冲区由参数指定,还有另外一个参数实际上面它不是去控制我数据缓冲区。

这节课我们就跟大家讲了一下 Polar DB  数据缓冲区管理器的工作原理。

相关实践学习
跟我学:如何一键安装部署 PolarDB-X
《PolarDB-X 动手实践》系列第一期,体验如何一键安装部署 PolarDB-X。
相关文章
|
SQL 开发框架 JSON
honeycomb使用|学习笔记
快速学习honeycomb使用
520 0
honeycomb使用|学习笔记
|
8月前
|
消息中间件 存储 NoSQL
|
12月前
|
人工智能 安全
学习笔记7
人工智能课程
59 0
|
存储 消息中间件 弹性计算
尘央大佬带你学| 学习笔记
快速学习尘央大佬带你学。
124 0
尘央大佬带你学| 学习笔记
|
NoSQL MongoDB 开发者
故障测试_1|学习笔记
快速学习故障测试_1
99 0
故障测试_1|学习笔记
|
开发工具 Android开发 iOS开发
快速开始|学习笔记
快速学习快速开始
84 0
快速开始|学习笔记
|
消息中间件 缓存 NoSQL
总结| 学习笔记
快速学习总结。
66 0
|
自然语言处理 前端开发 Java
TermQuery|学习笔记
快速学习 TermQuery。
80 0
TermQuery|学习笔记
|
云安全 安全 网络安全
总结 | 学习笔记
快速学习总结
79 0
|
JSON 分布式计算 Hadoop
BoolQuery |学习笔记
快速学习 BoolQuery。
67 0