关于 PostgreSQL

PostgreSQL 最高级的开源关系数据库系统.

此文档主要介绍如何在 InnerStack 上构建并部署 PostgreSQL 9.6 服务(单机版)。

系统分析

PostgreSQL 基于 C、C++ 编程语言开发,InnerStack 默认的 g3、g2 版本容器基于 CentOS-8/rhel-8 和 CentOS-7/rhel-7, 编译 PostgreSQL 也必须兼容这几种系统之一, 此实例我们在 CentOS 8 环境中编译打包。

将要构建两个原始包

  1. postgresql96 为 PostgreSQL 包
  2. postgresql-keeper 为 InnerStack 基于 go 开发的 PostgreSQL 配置工具

注: postgresql-keeper 配置工具将屏蔽 PostgreSQL root 系统帐号,而提供一个普通权限帐号(dbuser)和固定数据库名(dbaction)的访问帐号,主要基于两个考虑

  1. 简化、安全改进
  2. 在云原生环境中,扩展数据库的方式是部署多个 App/Pod , 而在一个数据库系统中建立多个数据库或帐号并不推荐。

开始构建

注: 开始构建前,请确保你已经安装了 inpack 工具, 参考文档 inpack cli

构建 postgresql 9.6

参考代码项目 https://github.com/inpack/postgresql 开始打包 PostgreSQL Server

安装必要的依赖:

# CentOS 8
yum install -y gcc gcc-c++ readline-devel zlib-devel openssl-devel

# 如果有遗漏的依赖包,请参考编译时提示信息自行添加

inpack 编译打包

git clone https://github.com/inpack/postgresql.git
cd postgresql

inpack build --spec inpack-96.toml --version 9.6.19

Building
  package: postgresql96
  version: 9.6.19
  release: 1
  dist:    el8
  arch:    x64
  vendor:  postgresql.org
  OK
    postgresql-9.6.19-1.el8.x64.txz

如果一切顺利,上传新构建的 inpack 原始包文件

inpack push --repo <your-alias-name> --pack_path postgresql96-9.6.19-1.el8.x64.txz 

PUSH /opt/src/inpack/postgresql96/postgresql96-9.6.19-1.el8.x64.txz
  ok postgresql96 100%

构建 postgresql-keeper

安装必要的依赖:

# CentOS 8
yum install -y golang

# 如果有遗漏的依赖包,请参考编译时提示信息自行添加

inpack 编译打包

git clone https://github.com/inpack/postgresql-keeper.git
cd postgresql-keeper

inpack build --dist linux

Building
  package: postgresql-keeper
  version: 0.10.0
  release: 1
  dist:    linux
  arch:    x64
  vendor:  sysinner.com
  OK
    postgresql-keeper-0.10.0-1.linux.x64.txz

如果一切顺利,上传新构建的 inpack 原始包文件

inpack push --repo <your-alias-name> --pack_path postgresql-keeper-0.10.0-1.linux.x64.txz 

PUSH /opt/src/inpack/postgresql-keeper/postgresql-keeper-0.10.0-1.linux.x64.txz
  ok postgresql-keeper 100%

构建 postgresql AppSpec 文件

AppSpec 通过登录 InnerStack inPanel 可视化 WebUI 管理 (https://ip-address:9530/in):

进入方式: Applications / AppSpec Center / New AppSpec

一个完整的定义实例如下图:

app-new

更简单的方式: 在上面导出的 https://github.com/inpack/postgresql.git 项目根目录有一个 app-spec-v96-x1.toml 文件,可以在 WebUI/AppSpec 编辑界面的 “Advanced editing mode” 模式下直接提交该文件定义, 如下图:

app-new

注: 数据库配置逻辑脚本入口在 AppSpec/Script Executors 实现, 可参考实例文件细节

构建配置项

在 inPanel/Applications/AppSpec 列表的 Config 列点击进入(如果是通过高级编辑模式导入的原始 app-spec.toml 可跳过此项), 如下:

app-new

这里定义了4个配置变量:

  • db_name, db_user 设置为默认固定名称,旨在简化统一
  • db_auth 由系统自动生成高强度的随机密码,并自动部署到绑定的容器/App中,所以密码管理在这里可以无为而治
  • memory_usage_limit 这项配置指定将多少百分比例的 Pod 内存配额分给 PostgreSQL 运行,如果部署的 Pod 上只有 PostgreSQL 一个应用,建议设置为 50 ~ 80% 之间。如果同一个 Pod 中有多个 App 运行则根据其它应用内存使用状况降低这个比例。

如上步骤提交 AppSpec 后,就可以开始部署了.

部署

Step 1: New Instance

在 AppSpec List 找到 sysinner-postgresql-x1 , 点击 “New Instance”

app-new

Step 2: 设置 Pod 容器

如下图, 系统会提示两个选项:

  1. 新建 Pod: 将这个 App 绑定到一个全新的 Pod 中运行
  2. 绑定到已有的 Pod: 一般用于 DevOps 开发,测试,生产环境推荐一个 App 对应一个 Pod.

app-new

注: 不符合硬件规格的 Pod 将不会出现在这个列表里面

这里选择新建 Pod Instance, 提示选择 Pod 规格:

app-new

确认 Pod 信息后继续下一步.

Step 3: 配置 PostgreSQL

用户配置并确认配置信息,点击 “Next” 继续下面的操作.

app-new

Step 4: 创建完成

成功后,会自动跳转到 Pod 详情,可以在这个页面里观察 AppSpec 在这个 Pod 里面的执行情况, 请等待一段时间,没有异常的话,Pod 详情页会出现更多有关这个 AppSpec 的信息,如图:

app-new

PostgreSQL 后续操作

以上对于 InnerStack 的操作已经完成,在 Pod 详情页你可以在 “Replicas/Service Port Mapping” 项目中看到系统自动给 PostgreSQL 对外的 tcp/5432 端口分配了内网IP和端口,另外在 “Applications/Configs” 里面查看系统自动创建的密码信息,使用 PostgreSQL 客户端访问这个实例确认其有效性。

数据库作为基础中间件,在实际应用中大致有3种类型的应用方式:

  1. 传统的方式,单独部署 PostgreSQL 实例,完成后将登录信息复制出来给到前端业务系统使用
  2. 被其它 AppSpec 以 “import” 方式引用,这种情况下两个 App 会同时在一个 Pod 中运行
  3. 被其它 AppSpec 以 “remotely import” 方式引用,这种情况下两个 App 会分别在不同的 Pod 中运行

在我们提供的构建实践文档中,主要目的提供快速的示范和参考,并快速运行事例,所以大多采用第2种方式。

在实际应用中,一般推荐第 3 种,具体可以在 inPanel/AppSpec/Edit 中修改。

注: 更多的操作信息请参考 https://www.postgresql.org/

申明

  • InnerStack/AppCenter 旨在助力企业构建自主 PaaS 平台,InnerStack 自身不提供任何云服务
  • AppCenter 涉及的方案、文档、代码、数据旨在为企业构建业务系统过程中提供指导参考,这些 AppSpec 组件可能没有经过完整的功能配置、测试和安全审计, 请不要直接用于生产系统。
  • AppCenter 包含的第三方项目源码统一开放在 https://github.com/inpack