李松青
作者李松青2021-09-10 16:14
软件架构设计师, 浪潮商用机器企业云创新中心

K1 Power Linux优化编译PostgreSQL并启用uuid模块

字数 3345阅读 507评论 0赞 1

开源 PostgreSQL 支持两种方式的外部插件,一种是 hook 机制插件,另一种是 C 函数扩展插件。在网上可以找到很多有用的第三方插件,也可以自定义开发插件。 PostgreSQL 数据库自身共也提供了 50 多个额外的模块插件,在 PostgreSQL 源码 contrib 子目录中找到找到他们。自 PostgreSQL v9 开始,有 40 多个模块缺省编译 contrib 模块时就会包含进去,还有几个模块编译时需要特别指定。通常因为开源 PostgreSQL 官方网站提供了包括 K1 Power Linux pcc64le 在内的多种平台的二进制软件包下载,我们可以直接下载和使用它们。但官网提供的软件普遍使用的编译器版本偏老,编译优化不够。使用 PostgreSQL 时经常会下载指定版本源码自己编译。前阵为一个用户优化 PostgreSQL 时刚好他们也用到了 uuid 插件,本文就以uuid 插件为例:

在 Makefile 模板中可以看到需要编译时设定with_uuid 选项才可以:

编译步骤,以 Redhat 8 for ppc64le 上编译 PostgreSQL v13.2 为例:

  1. 安装 advance-toolchain-at11.0 ,采用此新的 gcc v9 编译器

# yum install advance-toolchain-at11.0

# export PATH=/opt/at11.0/bin:$PATH

# type gcc

gcc is /opt/at11.0/bin/gcc

# gcc --version

gcc (GCC) 9.2.1 20190813 (Advance-Toolchain-at11 .0) [revision 274392]

  1. 安装 PostgreSQL 编译必要的依赖包

# yum -y install jemalloc jemalloc-devel cmake3 make bison zlib-devel

bzip2-devel bzip2 libevent libevent-devel libcurl-devel apr-devel

libxslt-devel libxml2-devel openssl-devel pam-devel krb5-devel perl perl-devel

flex openldap-devel bison python3 python3-devel readline-devel ncurses-devel

lz4 lz4-devel clang clang-devel libicu libicu-devel libevent-devel

tcl tcl-devel libaio-devel libtirpc-develuuid libuuid libuuid-devel uuid-devel

  1. 编译 PostgreSQL 软件

下面以下载 postgresql-13.2.tar.gz 并 编译免安装的二进制软件为例:

# tar zxvf postgresql-13.2.tar.gz

# cd postgresql-13.2

# CC=gcc

CXX=g++

CPP=cpp

CFLAGS=" -O3 -mcpu=native -mtune=native -mcmodel=large"

CXXFLAGS="-O3 -mcpu=native -mtune=native -mcmodel=large"

CPPFLAGS="-O3 -mcpu=native -mtune=native -mcmodel=large"

LDFLAGS='-ljemalloc '

./configure --prefix=/opt/postgres_at/13.1

--with-blocksize=8 --with-segsize=1 --with-wal-blocksize=8

--with-openssl --with-uuid=ossp --with-libxml --with-libxslt

--with-perl=yes --with-python=yes --with-tcl=yes --with-gssapi=yes

2>&1 |tee config.log

# make -j32 && make install

# cd contrib && make && make install

# cd /opt/pg && tar zcf postgresql13-server-13.2-1PGDG.el7a.ppc64le.at11gcc.tar.gz ./13.2

注:如果编译 RPM 包,则先下载并安装对应版本 src.rpm ,需要注意 postgresql-13.spec 文件中:缺省它写的是 power8 ,建议替换成 native ,编译器版本替换成编译时的实际版本,然后执行 rpmbuild 进行编译,并可以通过 --define 选项传递自定义参数。

创建 UUID 插件扩展并验证:

$ export PATH=/opt/at11.0/bin:/opt/pg/13.1/bin:$PATH

$ pg_ctl initdb -D /data/pgdata/testdb

$ pg_ctl -D /data/pgdata/testdb start -s -w

$ psql -U postgres -d postgres

psql (13.1)

Type "help" for help.

postgres=# create extension "uuid-ossp" ; CREATE EXTENSION

postgres=# select uuid_generate_v4();

uuid_generate_v4


a0f9b38b-b64f-4cc1-a5bc-a75b49ba02fb

(1 row)

postgres=# select uuid_generate_v1mc();

uuid_generate_v1mc


6746c81e-0d43-11ec-80b5-373590327f8c

(1 row)

postgres=# exit;

UUID**函数说明**

函数名称 函数说明
uuid_generate_v1() 生成版本 1 UUID。使用到计算机的 MAC 地址和时间戳。此类 UUID 会显示创建标识符的计算机的身份及其创建识别码的时间,这可能使其不适合某些安全敏感的应用程序。
uuid_generate_v1mc() 生成版本 1 UUID,但使用随机多广播 MAC 地址,而不是计算机的真实 MAC 地址。
uuid_generate_v3(namespace uuid, name text) 使用指定的输入名称在给定名称空间中生成版本 3 UUID。命名空间应是下文函数生成的特殊常数之一。(理论上可能是任何UID。该名称是选定名称空间中的标识符。uuidns*()
uuid_generate_v4() 生成一个版本 4 UUID,它完全来自随机数。
uuid_generate_v5(namespace uuid, name text) 生成一个版本 5 UUID,它的工作原理与版本 3 UUID 类似,但 SHA-1 用作哈希方法除外。版本 5 应优先于版本 3,因为 SHA-1 被认为比 MD5 更安全。

K1 Power Linux 上优化编译的 PostgreSQL 软件将陆续发布在 https://github.com/powerfans/PostgreSQL_binaries ,敬请关注。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

核心数据库服务器选型优先顺序调查

发表您的选型观点,参与即得50金币。