searchusermenu
点赞
收藏
评论
分享

初探天翼云 OpenTeleDB 数据库

2026-01-06 03:06:36
0
0

初探天翼云 OpenTeleDB 数据库

OpenTeleDB:全球首个运营商级开源 OLTP 数据库

2025 年 11 月,中国电信天翼云正式开源 OpenTeleDB,标志着全球首个运营商级开源 OLTP 数据库的诞生。作为中国电信"云改数转"战略下的核心技术成果,OpenTeleDB 承载着电信级业务场景多年实战打磨的深厚积淀,其开源更是为国产数据库生态贡献力量。OpenTeleDB 数据库基于 PostgreSQL 17 深度开发,采用木兰宽松许可证 v2 发行,在保持完美兼容性的前提下,针对性解决了原生 PostgreSQL 在超大规模企业级应用中面临的三大核心痛点:并发连接瓶颈、存储空间膨胀以及高可用切换的外部依赖问题。

OpenTeleDB 的开源动机根植于真实的运营商业务需求。传统 PostgreSQL 采用进程模型,每次连接创建独立后台进程,在 16C32G 规格下,数千连接即可导致性能显著衰退,难以支撑电信业务动辄数万级的并发访问。同时,其 MVCC 机制下更新操作产生数据新版本而旧版本延迟清理,引发表空间持续膨胀,高并发场景下周期性 Vacuum 回收更会造成超过 40% 的性能波动,严重影响业务稳定性。此外,传统高可用架构依赖 ETCD 等第三方组件进行仲裁,不仅架构复杂,更存在脑裂风险和单点故障隐患。OpenTeleDB 正是为彻底攻克这些行业级难题而生,适用于复杂 SQL 处理的 OLTP 在线事务、高并发数据对象处理、金融级数据强一致性保障等严苛场景,为云原生时代的企业级数据库服务提供了新选择。

OpenTeleDB 的三大核心企业级能力

OpenTeleDB 的创新性集中体现在 XProxy、XStore、XRaft 三大企业级能力,它们与 PostgreSQL 原有架构深度融合,构成了独特的核心竞争力。

XProxy 数据库代理引擎通过事务级连接池技术,将前端海量连接复用到少量后端连接,支持十万级原生连接上限,使不同客户端在事务间共享连接,避免资源空闲。配合数据库内核插件(query_check)的模式,XProxy 在无需高开销语法解析的前提下,实现轻量级连接上下文维护与读写分离,自动识别语句读写属性并维护节点心跳,将读请求智能分发至备库,主库聚焦写入,实现线性扩展与负载均衡,资源利用率提升显著。

XStore 原位更新存储引擎,则从根本上重构了存储层全链路。针对 PostgreSQL 堆表更新产生新版本、索引项重复插入的膨胀问题,XStore 重新设计了 xheap 堆表与 xbtree 索引结构。数据更新时直接在原数据页修改,旧版本写入 Undo 日志,索引同样采用原位更新,版本信息由 Undo 管理,实现索引独立可见性查找。这一设计彻底杜绝了表与索引的空间膨胀,TPC-C 测试下表空间占用接近零增长,性能波动从 40% 压制到 5% 以内。更关键的是,由于无需再扫描全表回收垃圾,Autovacuum 的运维复杂性大幅降低,数据库可自动完成清理,性能平稳性达到电信级要求。

XRaft 高可用引擎将 Raft 共识算法深度集成至数据库内核,实现了自包含的强一致性与高可用能力。传统架构依赖外部 ETCD 仲裁,存在日志分叉、选主脑裂、第三方组件单点故障三大风险。XRaft 通过内核级日志复制确保所有节点维护唯一的、与多数派达成共识的日志序列,主备切换时绝不存在日志分叉,避免全量重建。选主过程严格遵循 Raft 选举机制,任何节点成为新主必须先与多数派完成投票,天然杜绝脑裂。去中心化的设计使集群摆脱外部依赖,单个组件故障不会导致集群整体不可用,故障切换时间缩短至秒级,SLA 服务能力显著提升。

三大能力之外,OpenTeleDB 核心架构仍遵循经典数据库设计,由连接管理、编译执行、存储引擎、事务管理四大模块协同工作,确保系统逻辑控制、查询处理、物理存取、并发与一致性保障的有机统一。

OpenTeleDB 快速上手

OpenTeleDB 提供了与 PostgreSQL 一致的源码编译安装体验,部署流程简洁高效。

以 CentOS 7.9 环境为例,首先安装必要依赖。

yum install -y curl-devel libicu-devel pam-devel krb5-devel openldap-devel systemd-devel readline-devel zlib-devel gettext-devel openssl-devel libxml2-devel libxslt-devel perl-devel tcl-devel uuid-devel gcc gcc-c++ make flex bison perl-ExtUtils* libcurl-devel asciidoc xmlto opensp mariadb-devel libtool libuuid-devel gflags-devel lcov libyaml-devel boost-devel libgsasl-devel cmake3 golang

环境就绪后,从 Gitee 或 GitHub 获取源码。

  • Gitee: https://gitee.com/teledb/openteledb
  • GitHub: https://github.com/OpenTeleDB/OpenTeleDB

示例:

[root@shawnyan ~]# git clone https://github.com/OpenTeleDB/OpenTeleDB.git --depth=1
Cloning into 'OpenTeleDB'...
remote: Enumerating objects: 8301, done.
remote: Counting objects: 100% (8301/8301), done.
remote: Compressing objects: 100% (7291/7291), done.
remote: Total 8301 (delta 1268), reused 3316 (delta 766), pack-reused 0 (from 0)
Receiving objects: 100% (8301/8301), 30.38 MiB | 8.09 MiB/s, done.
Resolving deltas: 100% (1268/1268), done.

进入源码目录执行配置编译。

# 进入源码目录
cd OpenTeleDB
# 配置编译选项
./configure --prefix=/opt/openteledb
# 编译安装
make -j4 && make -j4 install

查看程序目录下 xstore 相关文件。

[root@shawnyan ~]# find /opt/openteledb/ -name *xstore*
/opt/openteledb/lib/postgresql/xstore.so
/opt/openteledb/share/postgresql/extension/xstore.control
/opt/openteledb/share/postgresql/extension/xstore--1.0.sql
/opt/openteledb/bin/pg_xstore_waldump
/opt/openteledb/include/postgresql/server/access/xstore
/opt/openteledb/include/postgresql/server/access/xstore/xstorehook.h
[root@shawnyan ~]# 

新建用户 openteledb,并将安装目录的属主权限修改为 openteledb。

useradd openteledb
chown -R openteledb:openteledb /opt/openteledb/

切换到 openteledb 用户,创建数据目录。

[root@shawnyan ~]# su - openteledb
Last login: Wed Nov 26 21:09:15 CST 2025 on pts/0
[openteledb@shawnyan ~]$ mkdir data

初始化数据库。

[openteledb@shawnyan ~]$ /opt/openteledb/bin/initdb -D ~/data
The files belonging to this database system will be owned by user "openteledb".
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/openteledb/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 ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... 2025-11-27 00:54:52.739 CST [42776] LOG:  Begin init undo subsystem meta.
2025-11-27 00:54:52.798 CST [42776] LOG:  [INIT UNDO] Init undo subsystem meta successfully.
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XHeap" with ID 200
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XHeapUndo" with ID 201
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XBtree" with ID 203
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XBtree2" with ID 204
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "UndoLog" with ID 202
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XMulti" with ID 205
2025-11-27 00:54:52.832 CST [42776] LOG:  checkpoint undoinfo recovery  globalFrozenXid: 3 globalRecycleXid: 3
2025-11-27 00:54:52.832 CST [42776] LOG:  checkpoint xmulti_info recovery nextXMulti: 1,nextXMultiOffset: 0 
2025-11-27 00:54:52.832 CST [42776] LOG:  checkpoint undoinfo recovery  HotStandbyFrozenXid: 3
2025-11-27 00:54:53.087 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.087 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.087 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.087 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.094 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.094 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.094 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.094 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.095 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.095 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.095 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.095 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.105 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.105 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: 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:

    /opt/openteledb/bin/pg_ctl -D /home/openteledb/data -l logfile start

[openteledb@shawnyan ~]$ 

启动数据库。

[openteledb@shawnyan ~]$ /opt/openteledb/bin/pg_ctl -D /home/openteledb/data -l logfile start
waiting for server to start.... done
server started
[openteledb@shawnyan ~]$ 

检查后台进程。

[openteledb@shawnyan ~]$ ps auxf | grep postgres | grep -v grep
opentel+  44227  0.2  0.9 377052 77200 ?        Ss   02:25   0:00 /opt/openteledb/bin/postgres -D /home/openteledb/data
opentel+  44228  0.0  0.0 377184  1352 ?        Ss   02:25   0:00  \_ postgres: checkpointer 
opentel+  44229  0.0  0.0 377208  2140 ?        Ss   02:25   0:00  \_ postgres: background writer 
opentel+  44231  0.0  0.0 377052  5572 ?        Ss   02:25   0:00  \_ postgres: walwriter 
opentel+  44232  0.0  0.0 378668  2376 ?        Ss   02:25   0:00  \_ postgres: autovacuum launcher 
opentel+  44233  0.1  0.8 379268 64984 ?        Ss   02:25   0:00  \_ postgres: undo discard process 
opentel+  44234  0.0  0.0 377216  1360 ?        Ss   02:25   0:00  \_ postgres: undo launcher 
opentel+  44235  0.0  0.0 378644  2124 ?        Ss   02:25   0:00  \_ postgres: logical replication launcher 
[openteledb@shawnyan ~]$ 

使用客户端 psql 连接到 OpenTeleDB。

/opt/openteledb/bin/psql -d postgres

你也可以使用其他 GUI 工具,比如 Navicat 连接 OpenTeleDB 数据库。

到此,OpenTeleDB 数据库已安装完成,并可正常使用。

XStore 基础用法

接下来,我们尝试使用 OpenTeleDB 带来的高亮特性 XStore 存储引擎。

  1. 安装 XStore 扩展。
postgres=# create extension xstore;
CREATE EXTENSION
postgres=# \dx
                         List of installed extensions
  Name   | Version |   Schema   |                 Description                  
---------+---------+------------+----------------------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
 xstore  | 1.0     | public     | xstore -- the in-place update storage engine
(2 rows)

安装成功后,可以看到自动创建了一个新的 schema。

postgres=# \dn
      List of schemas
  Name  |       Owner       
--------+-------------------
 public | pg_database_owner
 xstore | openteledb
(2 rows)
  1. 创建 XStore 存储引擎表
postgres=# create table t1 (a int primary key, b int) using xstore;
CREATE TABLE
postgres=# 
postgres=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 a      | integer |           | not null | 
 b      | integer |           |          | 
Indexes:
    "t1_pkey" PRIMARY KEY, xbtree (a)

postgres=# 
  1. 创建 xbtree 索引
postgres=# create index idx_t1_b on t1 using xbtree(b);
CREATE INDEX
postgres=# 
postgres=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 a      | integer |           | not null | 
 b      | integer |           |          | 
Indexes:
    "t1_pkey" PRIMARY KEY, xbtree (a)
    "idx_t1_b" xbtree (b)

postgres=# 

对照实验:XStore 杜绝表膨胀

我们可通过实践验证 XStore 引擎的价值。分别创建普通表和 XStore 表,执行表膨胀的测试用例,完成一组对照实验。

步骤 1:会话 1 创建测试数据,开启事务,并保持不提交。

create table t2 (a int, b text) using xstore;
insert into t2 (a, b) values (1,'openteledb');
insert into t2 (a, b) values (2,'shawnyan');
-- 开启事务
begin;
select pg_backend_pid();
select txid_current();
-- 保持事务不提交

步骤 2:会话 2 对测试表进行持续更新,模拟高并发压力。

UPDATE t2 SET b = 'xstore';\watch 0.01

步骤 3:会话 3 查询 t2 表所占页面空间

postgres=# select ctid,xmin,xmax,cmin,cmax,a from t2;
ERROR:  xmin, xmax, cmin, and cmax are not supported for xstore tuples

需要注意的是,xstore 的表并不支持 xmin, xmax, cmin, cmax,证明 XStore 已摒弃 PostgreSQL 传统 MVCC 可见性字段,转为 Undo 机制管理版本。

通过该实验,我们可以观察到 t2 表的大小保持稳定。

创建测试表 t3,按相同的步骤完成实验。经过数分钟高并发写入后观察表大小,普通表 t3 因 MVCC 机制产生大量死元组,表大小持续膨胀。

总结

OpenTeleDB 通过 XProxy、XStore、XRaft 三大自主创新引擎,不仅完美解决了原生 PostgreSQL 长期存在的连接瓶颈、空间膨胀和高可用依赖等顽疾,更以原位更新、内核级 Raft 共识等深度优化技术,将性能稳定性、数据一致性与运维便捷性提升至电信级标准。其完美兼容 PostgreSQL 生态的特性,使现有业务系统可零成本迁移,极大降低了企业技术升级门槛。期待天翼云未来可以为全球开发者提供更优质、更普惠的数据服务。

0条评论
0 / 1000
数据库小月
29文章数
0粉丝数
数据库小月
29 文章 | 0 粉丝

初探天翼云 OpenTeleDB 数据库

2026-01-06 03:06:36
0
0

初探天翼云 OpenTeleDB 数据库

OpenTeleDB:全球首个运营商级开源 OLTP 数据库

2025 年 11 月,中国电信天翼云正式开源 OpenTeleDB,标志着全球首个运营商级开源 OLTP 数据库的诞生。作为中国电信"云改数转"战略下的核心技术成果,OpenTeleDB 承载着电信级业务场景多年实战打磨的深厚积淀,其开源更是为国产数据库生态贡献力量。OpenTeleDB 数据库基于 PostgreSQL 17 深度开发,采用木兰宽松许可证 v2 发行,在保持完美兼容性的前提下,针对性解决了原生 PostgreSQL 在超大规模企业级应用中面临的三大核心痛点:并发连接瓶颈、存储空间膨胀以及高可用切换的外部依赖问题。

OpenTeleDB 的开源动机根植于真实的运营商业务需求。传统 PostgreSQL 采用进程模型,每次连接创建独立后台进程,在 16C32G 规格下,数千连接即可导致性能显著衰退,难以支撑电信业务动辄数万级的并发访问。同时,其 MVCC 机制下更新操作产生数据新版本而旧版本延迟清理,引发表空间持续膨胀,高并发场景下周期性 Vacuum 回收更会造成超过 40% 的性能波动,严重影响业务稳定性。此外,传统高可用架构依赖 ETCD 等第三方组件进行仲裁,不仅架构复杂,更存在脑裂风险和单点故障隐患。OpenTeleDB 正是为彻底攻克这些行业级难题而生,适用于复杂 SQL 处理的 OLTP 在线事务、高并发数据对象处理、金融级数据强一致性保障等严苛场景,为云原生时代的企业级数据库服务提供了新选择。

OpenTeleDB 的三大核心企业级能力

OpenTeleDB 的创新性集中体现在 XProxy、XStore、XRaft 三大企业级能力,它们与 PostgreSQL 原有架构深度融合,构成了独特的核心竞争力。

XProxy 数据库代理引擎通过事务级连接池技术,将前端海量连接复用到少量后端连接,支持十万级原生连接上限,使不同客户端在事务间共享连接,避免资源空闲。配合数据库内核插件(query_check)的模式,XProxy 在无需高开销语法解析的前提下,实现轻量级连接上下文维护与读写分离,自动识别语句读写属性并维护节点心跳,将读请求智能分发至备库,主库聚焦写入,实现线性扩展与负载均衡,资源利用率提升显著。

XStore 原位更新存储引擎,则从根本上重构了存储层全链路。针对 PostgreSQL 堆表更新产生新版本、索引项重复插入的膨胀问题,XStore 重新设计了 xheap 堆表与 xbtree 索引结构。数据更新时直接在原数据页修改,旧版本写入 Undo 日志,索引同样采用原位更新,版本信息由 Undo 管理,实现索引独立可见性查找。这一设计彻底杜绝了表与索引的空间膨胀,TPC-C 测试下表空间占用接近零增长,性能波动从 40% 压制到 5% 以内。更关键的是,由于无需再扫描全表回收垃圾,Autovacuum 的运维复杂性大幅降低,数据库可自动完成清理,性能平稳性达到电信级要求。

XRaft 高可用引擎将 Raft 共识算法深度集成至数据库内核,实现了自包含的强一致性与高可用能力。传统架构依赖外部 ETCD 仲裁,存在日志分叉、选主脑裂、第三方组件单点故障三大风险。XRaft 通过内核级日志复制确保所有节点维护唯一的、与多数派达成共识的日志序列,主备切换时绝不存在日志分叉,避免全量重建。选主过程严格遵循 Raft 选举机制,任何节点成为新主必须先与多数派完成投票,天然杜绝脑裂。去中心化的设计使集群摆脱外部依赖,单个组件故障不会导致集群整体不可用,故障切换时间缩短至秒级,SLA 服务能力显著提升。

三大能力之外,OpenTeleDB 核心架构仍遵循经典数据库设计,由连接管理、编译执行、存储引擎、事务管理四大模块协同工作,确保系统逻辑控制、查询处理、物理存取、并发与一致性保障的有机统一。

OpenTeleDB 快速上手

OpenTeleDB 提供了与 PostgreSQL 一致的源码编译安装体验,部署流程简洁高效。

以 CentOS 7.9 环境为例,首先安装必要依赖。

yum install -y curl-devel libicu-devel pam-devel krb5-devel openldap-devel systemd-devel readline-devel zlib-devel gettext-devel openssl-devel libxml2-devel libxslt-devel perl-devel tcl-devel uuid-devel gcc gcc-c++ make flex bison perl-ExtUtils* libcurl-devel asciidoc xmlto opensp mariadb-devel libtool libuuid-devel gflags-devel lcov libyaml-devel boost-devel libgsasl-devel cmake3 golang

环境就绪后,从 Gitee 或 GitHub 获取源码。

  • Gitee: https://gitee.com/teledb/openteledb
  • GitHub: https://github.com/OpenTeleDB/OpenTeleDB

示例:

[root@shawnyan ~]# git clone https://github.com/OpenTeleDB/OpenTeleDB.git --depth=1
Cloning into 'OpenTeleDB'...
remote: Enumerating objects: 8301, done.
remote: Counting objects: 100% (8301/8301), done.
remote: Compressing objects: 100% (7291/7291), done.
remote: Total 8301 (delta 1268), reused 3316 (delta 766), pack-reused 0 (from 0)
Receiving objects: 100% (8301/8301), 30.38 MiB | 8.09 MiB/s, done.
Resolving deltas: 100% (1268/1268), done.

进入源码目录执行配置编译。

# 进入源码目录
cd OpenTeleDB
# 配置编译选项
./configure --prefix=/opt/openteledb
# 编译安装
make -j4 && make -j4 install

查看程序目录下 xstore 相关文件。

[root@shawnyan ~]# find /opt/openteledb/ -name *xstore*
/opt/openteledb/lib/postgresql/xstore.so
/opt/openteledb/share/postgresql/extension/xstore.control
/opt/openteledb/share/postgresql/extension/xstore--1.0.sql
/opt/openteledb/bin/pg_xstore_waldump
/opt/openteledb/include/postgresql/server/access/xstore
/opt/openteledb/include/postgresql/server/access/xstore/xstorehook.h
[root@shawnyan ~]# 

新建用户 openteledb,并将安装目录的属主权限修改为 openteledb。

useradd openteledb
chown -R openteledb:openteledb /opt/openteledb/

切换到 openteledb 用户,创建数据目录。

[root@shawnyan ~]# su - openteledb
Last login: Wed Nov 26 21:09:15 CST 2025 on pts/0
[openteledb@shawnyan ~]$ mkdir data

初始化数据库。

[openteledb@shawnyan ~]$ /opt/openteledb/bin/initdb -D ~/data
The files belonging to this database system will be owned by user "openteledb".
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/openteledb/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 ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... 2025-11-27 00:54:52.739 CST [42776] LOG:  Begin init undo subsystem meta.
2025-11-27 00:54:52.798 CST [42776] LOG:  [INIT UNDO] Init undo subsystem meta successfully.
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XHeap" with ID 200
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XHeapUndo" with ID 201
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XBtree" with ID 203
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XBtree2" with ID 204
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "UndoLog" with ID 202
2025-11-27 00:54:52.798 CST [42776] LOG:  registered custom resource manager "XMulti" with ID 205
2025-11-27 00:54:52.832 CST [42776] LOG:  checkpoint undoinfo recovery  globalFrozenXid: 3 globalRecycleXid: 3
2025-11-27 00:54:52.832 CST [42776] LOG:  checkpoint xmulti_info recovery nextXMulti: 1,nextXMultiOffset: 0 
2025-11-27 00:54:52.832 CST [42776] LOG:  checkpoint undoinfo recovery  HotStandbyFrozenXid: 3
2025-11-27 00:54:53.087 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.087 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.087 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.087 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.094 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.094 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.094 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.094 CST [42776] STATEMENT:  CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false OID = 4 STRATEGY = file_copy;
	
2025-11-27 00:54:53.095 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.095 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.095 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.095 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.105 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
2025-11-27 00:54:53.105 CST [42776] STATEMENT:  CREATE DATABASE postgres OID = 5 STRATEGY = file_copy;
	
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint undoinfo globalFrozenXid: 3 globalRecycleXid: 3 checklen: 112
2025-11-27 00:54:53.105 CST [42776] LOG:  checkpoint xmultiinfo nextXMulti: 1 nextXMultiOffset: 0  checklen: 128
ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: 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:

    /opt/openteledb/bin/pg_ctl -D /home/openteledb/data -l logfile start

[openteledb@shawnyan ~]$ 

启动数据库。

[openteledb@shawnyan ~]$ /opt/openteledb/bin/pg_ctl -D /home/openteledb/data -l logfile start
waiting for server to start.... done
server started
[openteledb@shawnyan ~]$ 

检查后台进程。

[openteledb@shawnyan ~]$ ps auxf | grep postgres | grep -v grep
opentel+  44227  0.2  0.9 377052 77200 ?        Ss   02:25   0:00 /opt/openteledb/bin/postgres -D /home/openteledb/data
opentel+  44228  0.0  0.0 377184  1352 ?        Ss   02:25   0:00  \_ postgres: checkpointer 
opentel+  44229  0.0  0.0 377208  2140 ?        Ss   02:25   0:00  \_ postgres: background writer 
opentel+  44231  0.0  0.0 377052  5572 ?        Ss   02:25   0:00  \_ postgres: walwriter 
opentel+  44232  0.0  0.0 378668  2376 ?        Ss   02:25   0:00  \_ postgres: autovacuum launcher 
opentel+  44233  0.1  0.8 379268 64984 ?        Ss   02:25   0:00  \_ postgres: undo discard process 
opentel+  44234  0.0  0.0 377216  1360 ?        Ss   02:25   0:00  \_ postgres: undo launcher 
opentel+  44235  0.0  0.0 378644  2124 ?        Ss   02:25   0:00  \_ postgres: logical replication launcher 
[openteledb@shawnyan ~]$ 

使用客户端 psql 连接到 OpenTeleDB。

/opt/openteledb/bin/psql -d postgres

你也可以使用其他 GUI 工具,比如 Navicat 连接 OpenTeleDB 数据库。

到此,OpenTeleDB 数据库已安装完成,并可正常使用。

XStore 基础用法

接下来,我们尝试使用 OpenTeleDB 带来的高亮特性 XStore 存储引擎。

  1. 安装 XStore 扩展。
postgres=# create extension xstore;
CREATE EXTENSION
postgres=# \dx
                         List of installed extensions
  Name   | Version |   Schema   |                 Description                  
---------+---------+------------+----------------------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
 xstore  | 1.0     | public     | xstore -- the in-place update storage engine
(2 rows)

安装成功后,可以看到自动创建了一个新的 schema。

postgres=# \dn
      List of schemas
  Name  |       Owner       
--------+-------------------
 public | pg_database_owner
 xstore | openteledb
(2 rows)
  1. 创建 XStore 存储引擎表
postgres=# create table t1 (a int primary key, b int) using xstore;
CREATE TABLE
postgres=# 
postgres=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 a      | integer |           | not null | 
 b      | integer |           |          | 
Indexes:
    "t1_pkey" PRIMARY KEY, xbtree (a)

postgres=# 
  1. 创建 xbtree 索引
postgres=# create index idx_t1_b on t1 using xbtree(b);
CREATE INDEX
postgres=# 
postgres=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 a      | integer |           | not null | 
 b      | integer |           |          | 
Indexes:
    "t1_pkey" PRIMARY KEY, xbtree (a)
    "idx_t1_b" xbtree (b)

postgres=# 

对照实验:XStore 杜绝表膨胀

我们可通过实践验证 XStore 引擎的价值。分别创建普通表和 XStore 表,执行表膨胀的测试用例,完成一组对照实验。

步骤 1:会话 1 创建测试数据,开启事务,并保持不提交。

create table t2 (a int, b text) using xstore;
insert into t2 (a, b) values (1,'openteledb');
insert into t2 (a, b) values (2,'shawnyan');
-- 开启事务
begin;
select pg_backend_pid();
select txid_current();
-- 保持事务不提交

步骤 2:会话 2 对测试表进行持续更新,模拟高并发压力。

UPDATE t2 SET b = 'xstore';\watch 0.01

步骤 3:会话 3 查询 t2 表所占页面空间

postgres=# select ctid,xmin,xmax,cmin,cmax,a from t2;
ERROR:  xmin, xmax, cmin, and cmax are not supported for xstore tuples

需要注意的是,xstore 的表并不支持 xmin, xmax, cmin, cmax,证明 XStore 已摒弃 PostgreSQL 传统 MVCC 可见性字段,转为 Undo 机制管理版本。

通过该实验,我们可以观察到 t2 表的大小保持稳定。

创建测试表 t3,按相同的步骤完成实验。经过数分钟高并发写入后观察表大小,普通表 t3 因 MVCC 机制产生大量死元组,表大小持续膨胀。

总结

OpenTeleDB 通过 XProxy、XStore、XRaft 三大自主创新引擎,不仅完美解决了原生 PostgreSQL 长期存在的连接瓶颈、空间膨胀和高可用依赖等顽疾,更以原位更新、内核级 Raft 共识等深度优化技术,将性能稳定性、数据一致性与运维便捷性提升至电信级标准。其完美兼容 PostgreSQL 生态的特性,使现有业务系统可零成本迁移,极大降低了企业技术升级门槛。期待天翼云未来可以为全球开发者提供更优质、更普惠的数据服务。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0