暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

在openHalo里体验PG 14内核新特性

最近PG圈里由德哥一篇爆火的文章点燃大家学习halo数据库的热情,趁放假有空编译了一把openHalo,正好也再回顾一下PG 14内核新特性。

1.客户端认证安全增强

PG长期以来一直使用MD5作为默认口令加密选项,这容易出现字典攻击和泄露问题。在openHalo里,默认强制采用scram-sha-256的加密方式:

halo0root=# show password_encryption; password_encryption --------------------- scram-sha-256 (1 row)

同时客户端需要注意使用较新的客户端驱动来支持scram-sha-256。

2.可配置的列压缩

PG数据库中数据存储的基本单位是page,它的大小默认为8kB。由于数据行不允许跨page存储,为了克服这个限制,数据行里的大字段值会被压缩或分解成多个物理行,这种设计在PG里就是“The Oversized-Attribute Storage Technique”,简称为TOAST技术。

在openHalo里,TOAST压缩算法可通过全局参数default_toast_compression配置为pglz或lz4。建表时还可以对列进行显式覆盖全局配置,示例如下:

create table tab_compression( a text compression pglz, b text compression lz4 );

注意使用lz4算法需要编译数据库时打开–with-lz4编译选项。lz4是一种以速度著称的无损压缩算法,可以有效提高压缩和解压的速度,它的压缩性能比pglz更好,且使用更少的CPU。

3.新形式的函数

在openHalo里,使用新的语法形式创建如下函数:

create function f_add2(int, int) returns int language sql begin atomic; select $1 + $2; end;

函数体使用begin atomic语法。SQL主体不再需要使用一对$$符号标记为字符串常量,而是实际的代码语句,并可以通过系统函数pg_get_function_sqlbody查看。

halo0root=# select pg_get_function_sqlbody('f_add2'::regproc); pg_get_function_sqlbody ------------------------- BEGIN ATOMIC + SELECT ($1 + $2); + END (1 row)

使用新形式的函数可以帮更好的管理用户自定义函数,防止意外删除函数时无提示,避免对有依赖引用的函数产生损坏。

4.使用libpq协议连接不同状态的节点

客户端有两种常见的协议,分别是jdbc协议和libpq协议。jdbc协议可以使用连接参数targetServerType连接指定状态的数据库节点。libpq协议同样可以使用target_session_attrs参数连接指定状态的数据库节点,可选值包括:

  • any(默认值):允许连接到任意节点。
  • read-write:只接收连接到default_transaction_read_only=off并且非standby模式的节点。
  • read-only:只接收连接到default_transaction_read_only=on或者standby模式的节点。
  • primary:只接收连接非standby模式的节点。
  • standby:只接收连接standby模式的节点。
  • prefer-standby:首先尝试连接standby模式的节点,如果失败则尝试any模式。

下面在本机环境测试选项值standby和prefer-standby

$ psql "target_session_attrs=standby host=localhost,localhost port=1410,2410 dbname=openhalo" psql: error: connection to server at "localhost" (127.0.0.1), port 1410 failed: server is not in hot standby mode connection to server at "localhost" (127.0.0.1), port 2410 failed: Connection refused Is the server running on that host and accepting TCP/IP connections?

上面只连接standby失败,因为本机环境当前只启动了primary节点。

$ psql "target_session_attrs=prefer-standby host=localhost,localhost port=1410,2410 dbname=openhalo" psql (1.0.14.10) Type "help" for help. openhalo=#

上面首先尝试连接standby模式的节点,没有可连接的standby节点,则尝试any模式,连接primary节点。

5.vacuum紧急清理模式

vacuum操作经历的这几个阶段比较耗时:

  • 首先会扫描堆,找到所有的死元组并冻结;
  • 然后进行索引的清理,扫描所有索引并从每个索引中删除元组;
  • 接下来清理堆,清除索引,截断堆,将数据块尾部的空闲空间返还给操作系统;
  • 最后会更新VM和FSM文件,以及更新统计信息等。

14内核对vacuum操作增加了一个紧急模式,当表的年龄超过vacuum_failsafe_age设置的值会触发紧急模式,表的vacuum操作会被强制加速,不受vacuum操作代价及延迟参数的限制,并且还会跳过一些不必要的维护工作,例如索引的清理工作。此时vacuum操作将以最快的速度完成freeze,以便更好的预防事务ID回卷。

在子事务环境下,也有类似的机制,通过vacuum_multixact_failsafe_age参数控制。vacuum操作更多技巧参考公众号文章:8大vacuum实用技巧助您轻松管理数据库

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论