AntDB/PostgreSQL内部原理:表Page结构解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AntDB/PostgreSQL内部原理:表Page结构解析相关的知识,希望对你有一定的参考价值。

参考技术A

PostgreSQL 中 Page 是一个磁盘 Block 上的一个抽象结构,用于描述 Block 内部的数据结构与组织形式。
所有数据块在读写时,必须按 Page 格式进行访问操作。

PostgreSQL 11 的 Page 格式(包含 3 行数据)如下:

行指针之前的 Page Header 总空间消耗为: (64 + 16 * 6 + 32) bit / 8 = 24 Byte

以下分别对这些结构以及对应的标志位的值进行说明:

Tuple 类型和行中各列数据的头部信息共享相同的数据结构,所以可以用相同的方法来构建和检查。但需求略有不同,数据不需要事务可见性信息,它需要一个长度字段和一些嵌入式类型信息。我们可以通过覆盖 Heap Tuple 上的 xmin/cmin/xmax/cmax/xvac 字段来实现数据上的需求。

Heap tuple 的头部信息,为了避免空间浪费,应该将字段以一种避免结构扩充的方式来布局。
通常,内存中所有的 tuples 都会使用数据字段进行初始化,当一个 tuple 需要写入表中时,事务相关的字段将会被写入,并覆盖数据字段。

Heap tuple 的整体结构包括:

通过 pageinspect 扩展模块,可以在低层次观察 page 中的实际数据,而不用考虑事务及相关可见性限制,这通常用于 DEBUG 目的的数据研究。

其常用函数说明如下:

创建模块

创建测试表

查看 Page Header

数据含义解析:

查看 Page 中的记录(Tuple)

数据含义解析:

解析 Tuple 数据

尝试多次更新同一条一条数据

再次查看页面数据

数据含义解析:

删除一条数据

再次查看页面数据

数据含义解析:

通过跟踪 t_xmin, t_xmax, t_ctid 三个字段的变化,可以得到 Tuple 数据的多版本变化历史,这也是 PostgreSQL 的 MVCC 实现原理

PostgreSQL 的多版本(MVCC)与 Oracle 有很大的不同,在于其将多版本信息与表数据存储在一起,这种多版本实现方式有其优势与局限性。
优势

劣势

CentOS平台源码编译安装AntDB数据库

CentOS平台源码编译安装AntDB数据库

准备工作

1.创建用户
在root用户下执行:useradd antdb 进行antdb用户的创建。

执行:passwd antdb 修改antdb用户密码。

2.配置用户limit参数
编辑/etc/security/limits.conf 文件,配置antdb用户参数:

antdb soft nproc 65536
antdb hard nproc 65536
antdb soft nofile 278528
antdb hard nofile 278528
antdb soft stack unlimited
antdb soft core unlimited
antdb hard core unlimited
antdb soft memlock 250000000
antdb hard memlock 250000000

保存文件后,执行su - antdb切换到antdb用户
执行ulimit -a 检查是否生效。

3.配置用户sudo权限
在安全允许的条件下,建议给antdb用户加上sudo权限。
root用户执行visudo 进行编辑界面,找到 Allow root to run any commands anywhere所在行,在行下面添加:

antdb        ALL=(ALL)       ALL

保存文件退出。su - antdb 切换到antdb用户,执行sudo id,预期会提示输入用户密码,输出为:

uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

表示sudo权限添加成功。

安装依赖

在cento或者redhat操作系统下,执行如下命令安装依赖:

yum install -y perl-ExtUtils-Embed
yum install -y flex
yum install -y bison
yum install -y readline-devel
yum install -y zlib-devel
yum install -y openssl-devel
yum install -y pam-devel
yum install -y libxml2-devel
yum install -y libxslt-devel
yum install -y openldap-devel
yum install -y python-devel
yum install -y gcc-c++ 
yum install -y libssh2-devel

安装AntDB

单机版

创建相关目录

mkdir -p ./data/antdb/data,tools,app,soft_src 
chown -R antdb:antdb ./data/antdb
chmod -R 755 ./data/antdb

创建好后续需要用到的目录:

data:AntDB的数据目录。
tools:存放相关工具
app:程序目录
soft_src: AntDB以及其他工具的源码目录
需要根据实际情况修改目录路径。

修改环境变量
vim .bashrc

export ADB_HOME=/home/antdb/data/antdb/app/antdb
export PATH=$ADB_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ADB_HOME/lib:$LD_LIBRARY_PATH

export PGPORT=5432
export PGDATABASE=postgres


执行 source ~/.bashrc使环境变量生效。

源码安装

拉取源码:AntDB源码地址,点击前往
接着就可以进行编译安装:
在源码同级目录下创建 build 目录: mkdir build
由于用同一份代码生成了mgr,gtmcoord,所以需要在源码的同级目录下单独创建build编译目录;

在 bulid 目录下 执行 configure:

../ant-db_source/configure --prefix=/home/antdb/antdb  --enable-debug --disable-cluster

其中: --prefix 目录为准备安装的目录,可以根据需求灵活设置。-disable-cluster 表示编译的是单机版本。

编译安装: make install-world-contrib-recurse
操作完成后再 --prefix 指定的目录中,可以看到安装后的文件。便可进行数据库的初始化和使用

[antdb@local102 antdb]$ cd bin/
[antdb@local102 bin]$ ls
clusterdb   dropdb    initdb             pg_basebackup  pg_config       pg_dump        pg_isready      pg_resetwal  pg_standby      pg_upgrade       postgres    reindexdb
createdb    dropuser  oid2name           pgbench        pg_controldata  pg_dumpall     pg_receivewal   pg_restore   pg_test_fsync   pg_verifybackup  postmaster  vacuumdb
createuser  ecpg      pg_archivecleanup  pg_checksums   pg_ctl          pg_extendpage  pg_recvlogical  pg_rewind    pg_test_timing  pg_waldump       psql        vacuumlo
[antdb@local102 bin]$ initdb -D /home/antdb/data/antdb/data --wal-segsize=1024
bash: initdb: command not found...
[antdb@local102 bin]$ ./initdb -D /home/antdb/data/antdb/data --wal-segsize=1024
The files belonging to this database system will be owned by user "antdb".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /home/antdb/data/antdb/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... PRC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    ./pg_ctl -D /home/antdb/data/antdb/data -l logfile start

[antdb@local102 bin]$ ./pg_ctl -D /home/antdb/data/antdb/data start
waiting for server to start....2021-08-26 16:10:41.316 CST [46045] LOG:  starting PostgreSQL 13beta1 ADB 6.2devel 15e1a46 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
2021-08-26 16:10:41.319 CST [46045] LOG:  listening on IPv6 address "::1", port 5432
2021-08-26 16:10:41.319 CST [46045] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2021-08-26 16:10:41.321 CST [46045] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2021-08-26 16:10:41.322 CST [46046] LOG:  database system was shut down at 2021-08-26 16:10:13 CST
2021-08-26 16:10:41.323 CST [46045] LOG:  database system is ready to accept connections
 done
server started
[antdb@local102 bin]$ ./psql 
psql (13beta1)
Type "help" for help.

postgres=# 
postgres=# 
postgres=# \\d
Did not find any relations.
postgres=# 

以上是关于AntDB/PostgreSQL内部原理:表Page结构解析的主要内容,如果未能解决你的问题,请参考以下文章

十五载厚积薄发,电信级分布式数据库是这样炼成

CentOS平台源码编译安装AntDB数据库

CentOS平台源码编译安装AntDB数据库

CentOS平台源码编译安装AntDB数据库

AntDB-M数据库锁分析,不要错过!

全国超10亿用户!AntDB数据库的电信核心交易替换之路