
日期:2025 年 9 月 11 日
作者:李枨、张瑞
作为OpenTenBase 俱乐部成员,我们基于在 CentOS 8 系统上成功编译部署 OpenTenBase 5.0 的实践经验,完成了从源码构建到功能验证的全流程技术落地,并重点解决了编译过程中因第三方组件引发的许可证兼容性问题,形成可复用的安装与配置指南。
OpenTenBase 作为一款面向高可靠性和横向扩展能力的分布式关系型数据库,其“GTM+CN+DN”架构逻辑清晰、部署灵活,仅需普通 x86 服务器即可构建完整集群,不仅适用于高校教学实验与科研验证场景,也能为校内中小型应用系统提供稳定的数据底座,充分契合校园技术实践对低成本、易维护、可拓展的综合需求。
在实际操作中,我们以 CentOS 8(或兼容的 RHEL 8 系统)为基础环境,系统完成了依赖库安装、许可证问题规避、源码编译与链接等关键步骤,成功构建 OpenTenBase 5.0 可执行程序;随后完成单机多节点集群的初始化与启动,通过精细化配置 GTM(全局事务管理器)、CN(协调节点)和 DN(数据节点)的角色与通信参数,保障了集群内部事务一致性与服务稳定性。
本指南详细记录了编译过程中常见的许可证冲突问题及其解决方案,并提供了完整的环境准备、编译步骤、集群配置与启停流程,具备强实操性与可复制性。后续我们将以此为基础,探索 OpenTenBase 在校园业务中的深度应用,推动“数据库 + AI”“分布式架构 + 教学管理”等融合场景的技术创新,助力 OpenTenBase 在高校生态中落地生根。

opentenbase 用户# 创建数据目录
sudo mkdir /data
# 创建 opentenbase 用户
sudo useradd -d /data/opentenbase -s /bin/bash -m opentenbase
# 设置密码
sudo passwd opentenbase
# 添加 sudo 权限
sudo visudo
# 在文件中添加:opentenbase ALL=(ALL) ALL
# 切换到 opentenbase 用户
su - opentenbase
# 安装基础开发工具
sudo yum groupinstall -y "Development Tools"
# 启用 powertools 仓库( 解决uuid-devel和perl-IPc-Run找不到问题 )
sudo yum config-manager --set-enabled powertools
sudo yum install -y epel-release # 安装 EPEL 仓库
sudo yum update -y # 更新仓库缓存
sudo dnf install -y \
gcc \
gcc-c++ \
make \
cmake \
readline-devel \
zlib-devel \
openssl-devel \
uuid-devel \
bison \
flex \
git \
libcurl-devel \
libxml2-devel \
libxslt-devel \
perl-IPC-Run \
perl-Test-Simple \
tcl-devel \
python3-devel \
rpm-build \
pkgconfig \
krb5-devel \
openldap-devel
# 下载zstd源码
cd /tmp
wget https://github.com/facebook/zstd/releases/download/v1.5.2/zstd-1.5.2.tar.gz
tar -xzf zstd-1.5.2.tar.gz
cd zstd-1.5.2
# 编译安装
make
sudo make install PREFIX=/usr/local
# 更新库路径
sudo ldconfig
# 设置环境变量
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"
# 下载lz4源码
cd /tmp
wget https://github.com/lz4/lz4/archive/v1.9.4.tar.gz
tar -xzf v1.9.4.tar.gz
cd lz4-1.9.4
# 编译安装
make
sudo make install PREFIX=/usr/local
# 更新库路径
sudo ldconfig
# 设置环境变量
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
# 首先检查当前的包管理器状态
sudo dnf clean all
# 安装libxml2-devel及其依赖包
sudo dnf install -y libxml2-devel libxml2 cmake-filesystem xz-devel zlib-devel pkgconfig
# 验证安装
rpm -qa | grep libxml2
# 检查xml2-config命令是否可用
which xml2-config
# 检查pkg-config是否能找到libxml-2.0
pkg-config --exists libxml-2.0 && echo "libxml2 found" || echo "libxml2 NOT found"
# 查看libxml2的配置信息
xml2-config --version
xml2-config --cflags
xml2-config --libs
# 下载CLI11源码
cd /tmp
git clone https://github.com/CLIUtils/CLI11.git
cd CLI11
mkdir build
cd build
cmake ..
make clean
make -j4
sudo make install
dnf repolist


# 获取源码
cd /data/opentenbase
git clone -b v5.0-release_new https://github.com/OpenTenBase/OpenTenBase.git
# 连接不上github的时候,可使用 gitee.com 加速(推荐)
git clone -b v5.0-release_new https://gitee.com/mirrors/OpenTenBase.git
# 设置环境变量
export SOURCECODE_PATH=/data/opentenbase/OpenTenBase
export INSTALL_PATH=/data/opentenbase/install #(不存在的话自行创建该文件夹)如果连接不上github,可以尝试用gitee,或者禁用防火墙。
以下为成功的截图

# 进入源码目录
cd ${SOURCECODE_PATH}
# 设置执行权限
chmod +x configure*
# 清理之前的编译(如果之前搞过)
make distclean 2>/dev/null || true
rm -rf /data/opentenbase/install/opentenbase_bin_v2.0
rm -f config.status config.log
# 配置编译 - 关键:添加 SSE4.2 支持和 DNOLIC 标志
CFLAGS="-g -O2 -w -msse4.2 -mcrc32 -DNOLIC" \
CXXFLAGS="-g -O2 -w -msse4.2 -mcrc32 -DNOLIC" \
./configure --prefix=/data/opentenbase/install/opentenbase_bin_v2.0 \
--enable-user-switch \
--with-openssl \
--with-ossp-uuid \
--with-libxml
# 编译主程序
make -j4
make install
# 设置执行权限
chmod +x contrib/pgxc_ctl/make_signature
# 进入 contrib 目录
cd contrib
make clean
# 编译扩展模块 - 关键:使用正确的编译标志,如果卡住请使用回车键
make -j4
# 安装扩展模块
make install
问题: 编译时出现许可证相关错误,无法创建数据库。
解决方案:
-msse4.2 -mcrc32-DNOLIC这两个标志的组合可以绕过许可证检查,允许正常使用所有功能。
pgvector 模块 C99 错误:
# 解决方案:添加 C99 标准支持
make CFLAGS+='-std=gnu99' -j4opentenbase_ctl 模块 C++17 错误:
# 解决方案:使用 devtoolset-8 提供的 GCC 8
source /opt/rh/devtoolset-8/enable
make CXXFLAGS+='-std=c++17' CMAKE=cmake3 -j4以上是解决思路
# 编辑 ~/.bashrc
vim ~/.bashrc
# 添加以下内容
export OPENTENBASE_HOME=/data/opentenbase/install/opentenbase_bin_v2.0
export PATH=$OPENTENBASE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$OPENTENBASE_HOME/lib:${LD_LIBRARY_PATH}
export LC_ALL=C
# 使环境变量生效
source ~/.bashrcsudo vim /etc/sysconfig/selinux● 临时关闭 SELinux
○ 使用命令getenforce查看 SELinux 当前状态,如果返回Enforcing,表明 SELinux 处于强制模式。
○ 执行命令setenforce 0,将 SELinux 设置为宽容模式(Permissive),即临时关闭 SELinux。此时 SELinux 会记录违反策略的行为但不会阻止它们,不过系统重新启动后 SELinux 将会恢复到之前的状态。
● 永久关闭 SELinux
○ 编辑 SELinux 配置文件/etc/selinux/config,可以使用命令vi /etc/selinux/config。
○ 在文件中找到SELINUX=enforcing这一行,将其改为SELINUX=disabled。
○ 保存文件并重启系统,命令为reboot。重启后 SELinux 就会被永久关闭。

# 开放GTM端口
sudo firewall-cmd --permanent --add-port=6666/tcp
# 开放Coordinator端口
sudo firewall-cmd --permanent --add-port=30004/tcp
# 开放Datanode端口
sudo firewall-cmd --permanent --add-port=20008/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reloadsu - opentenbase
ssh-keygen -t rsa # 一路回车即可
ssh-copy-id -i ~/.ssh/id_rsa.pub opentenbase@localhost # 回答yes
# 修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
# 测试ssh登录(如果成功则不需要输入密码)
ssh localhost
# 如果ssh登录需要密码,则检查/etc/ssh/sshd_config配置:
sudo vim /etc/ssh/sshd_config
#确保以下配置未被注释(去掉前面的#号):
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
RSAAuthentication yes
PasswordAuthentication yes
# 重启ssh服务
sudo systemctl restart sshd
# 再次测试
ssh localhost# 创建配置文件
cat > /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf << 'EOF'
#!/usr/bin/env bash
#---- OVERALL -----------------------------------------------------------------------------
pgxcOwner=opentenbase
pgxcUser=$pgxcOwner
pgxcInstallDir=/data/opentenbase/install/opentenbase_bin_v2.0
tmpDir=/tmp
localTmpDir=$tmpDir
configBackup=y
configBackupHost=localhost
configBackupDir=$HOME/pgxc
configBackupFile=pgxc_ctl.bak
#---- GTM --------------------------------------------------------------------------------
gtmName=gtm
gtmMasterServer=localhost
gtmMasterPort=6666
gtmMasterDir=/data/opentenbase/data/gtm
gtmExtraConfig=none
gtmMasterSpecificExtraConfig=none
gtmSlave=n
gtmSlaveName=gtmSlave
gtmSlaveServer=none
gtmSlavePort=20001
gtmSlaveDir=none
gtmSlaveSpecificExtraConfig=none
gtmProxy=n
gtmProxyNames=()
gtmProxyServers=()
gtmProxyPorts=()
gtmProxyDirs=()
gtmPxyExtraConfig=none
gtmPxySpecificExtraConfig=()
#---- Coordinators --------------------------------------------------------------------
coordMasterDir=/data/opentenbase/data/coord_master
coordSlaveDir=/data/opentenbase/data/coord_slave
coordArchLogDir=/data/opentenbase/data/coord_archlog
coordNames=(cn001)
coordPorts=(30004)
poolerPorts=(30014)
coordForwardPorts=(30024)
coordPgHbaEntries=(0.0.0.0/0)
coordMasterServers=(localhost)
coordMasterDirs=(/data/opentenbase/data/coord_master/cn001)
coordMaxWALsender=5
coordMaxWALSenders=(5)
coordSlave=n
coordSlaveSync=n
coordSlaveServers=(none)
coordSlavePorts=(30005)
coordSlavePoolerPorts=(30015)
coordSlaveForwardPorts=(30025)
coordSlaveDirs=(none)
coordArchLogDirs=(none)
coordExtraConfig=none
coordSpecificExtraConfig=(none)
coordSpecificExtraPgHba=(none)
#---- Datanodes -----------------------------------------------------------------------
datanodeMasterDir=/data/opentenbase/data/dn_master
datanodeSlaveDir=/data/opentenbase/data/dn_slave
datanodeArchLogDir=/data/opentenbase/data/datanode_archlog
primaryDatanode=dn001
datanodeNames=(dn001)
datanodePorts=(20008)
datanodePoolerPorts=(20018)
datanodeForwardPorts=(20028)
datanodePgHbaEntries=(0.0.0.0/0)
datanodeMasterServers=(localhost)
datanodeMasterDirs=(/data/opentenbase/data/dn_master/dn001)
datanodeMaxWalSender=5
datanodeMaxWALSenders=(5)
datanodeSlave=n
datanodeSlaveServers=(none)
datanodeSlavePorts=(20009)
datanodeSlavePoolerPorts=(20019)
datanodeSlaveForwardPorts=(20029)
datanodeSlaveDirs=(none)
datanodeArchLogDirs=(none)
datanodeExtraConfig=none
datanodeSpecificExtraConfig=(none)
datanodeSpecificExtraPgHba=(none)
walArchive=n
EOF# 启动集群管理工具
pgxc_ctl -c /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
# 在 pgxc_ctl 命令行中执行:
deploy all # 分发二进制文件
init all # 初始化集群
# 在 pgxc_ctl 中可用的命令:
monitor all # 监控集群状态
stop all # 停止集群
start all # 启动集群
clean all # 清理集群数据# 连接到协调节点
psql -h 127.0.0.1 -p 30004 -d postgres -U opentenbaseOpenTenBase使用数据节点组来增加节点管理的灵活性。需要创建一个默认组来使用,因此需要提前创建。通常,所有数据节点都会被添加到默认组中:
-- 创建默认节点组
CREATE DEFAULT NODE GROUP default_group WITH (dn001);
-- 创建分片组
CREATE SHARDING GROUP TO GROUP default_group;-- 创建数据库(包括 library217)
CREATE DATABASE library217;
-- 连接到新数据库
\c library217
-- 创建分布式表
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title VARCHAR(255),
author VARCHAR(255),
isbn VARCHAR(20)
) DISTRIBUTE BY SHARD(id);
-- 插入测试数据
INSERT INTO books (title, author, isbn) VALUES
('OpenTenBase Guide', 'TencentDB Team', '978-0000000001'),
('Distributed Database', 'Tech Author', '978-0000000002');
-- 查询数据
SELECT * FROM books;-- 安装 HTTP 扩展
CREATE EXTENSION IF NOT EXISTS http;
-- 启用 AI 扩展
CREATE EXTENSION IF NOT EXISTS opentenbase_ai;
-- 使用 AI 功能(需要配置相应的 API)
-- 具体使用方法请参考 opentenbase_ai 扩展文档# 检查已安装的扩展
ls -la /data/opentenbase/install/opentenbase_bin_v2.0/lib/postgresql/ | grep -E '(vector|ai|subscription)'
# 检查版本信息
/data/opentenbase/install/opentenbase_bin_v2.0/bin/postgres --version-- 测试基本功能
SELECT version();
-- 测试分布式功能
SELECT * FROM pgxc_node;
-- 测试扩展加载
SELECT * FROM pg_available_extensions WHERE name LIKE '%vector%' OR name LIKE '%ai%';opentenbase_ai 插件为 PostgreSQL 数据库提供了集成人工智能大语言模型能力的接口,让您能够直接在 SQL 中使用 AI 功能。该插件支持多种 AI 模型提供商(包括 OpenAI、DeepSeek、腾讯混元、阿里通义千问等),提供文本生成、翻译、情感分析、问答提取、文本摘要、嵌入向量生成以及图像分析等功能。
接下来为了方便演示,我将使用Navicat Premium 17连接数据库进行插件的演示。
已成功安装 opentenbase_ai 扩展(可通过 SELECT * FROM pg_extension WHERE extname = 'opentenbase_ai'; 验证)
SecretId 和 SecretKey,openai SDK则为"sk-...."),前往腾讯云控制台申请,参考混元大模型官方文档。
SELECT ai.add_completion_model(
model_name => 'hunyuan_chat', -- 自定义模型名称
uri => 'https://api.hunyuan.cloud.tencent.com/v1/chat/completions', -- API接口地址
default_args => '{"model": "hunyuan-lite"}'::jsonb, -- 默认参数(指定模型版本)
token => 'your_hunyuan_api_key', -- 替换为你的混元API密钥,推荐使用格式 'SecretId|SecretKey'
model_provider => 'tencent' -- 模型提供商
);执行成功后,返回 t 表示模型定义添加成功。

SET ai.completion_model = 'hunyuan_chat';
# 临时生效(当前会话)
SET http.timeout = 5000; -- 单位:毫秒,5000 = 5秒
# 永久生效(需修改配置文件)
# 1. 打开数据库配置文件(以 OpenTenBase 为例)
sudo vim /data/opentenbase/data/coord_master/cn001/postgresql.conf
# 2. 添加或修改以下配置
http.timeout = 5000
# 3. 重启 Coordinator 节点使配置生效
pgxc_ctl -c /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
pgxc_ctl (PGXC: default) > stop coord cn001
pgxc_ctl (PGXC: default) > start coord cn001配置好默认混元大模型后就可以开始体验。
文本生成
SELECT ai.generate_text('为高校开源技术社团写一段招新宣传文案,要求:
1. 突出「零基础友好」「技术实战」「社区协作」三大亮点;
2. 包含具体活动形式(如开源项目贡献、技术分享会、代码 hackathon);
3. 语言活泼有感染力,适合学生群体,结尾附加入方式引导。');
情感分析
SELECT ai.sentiment('这次开源项目复盘会特别好!主讲人把项目中遇到的 Bug 排查过程讲得很细,还分享了很多开源协作中的避坑技巧,感觉收获比自己闷头看文档多太多了~ 唯一小建议是下次可以增加互动环节,比如让大家现场提问讨论,这样理解更深入~');
文本摘要
SELECT ai.summarize('Git进阶技巧分享会纪要:
主讲人:张同学(社区活跃贡献者)
核心内容:
1. 分支管理:建议采用Git Flow工作流,主分支(main)保持稳定,开发分支(develop)用于集成功能,feature分支命名格式统一为"feature/功能名-日期";
2. 提交规范:演示了Angular提交信息规范(type(scope): subject),推荐使用commitlint工具校验;
3. 高级操作:讲解了rebase与merge的区别(rebase适合本地分支整理,merge适合团队协作),以及stash暂存工作区的实用场景;
4. 问题排查:分享了如何用bisect定位引入Bug的提交,以及用cherry-pick选择性合并提交;
互动问答:
- 问:多人修改同一文件冲突时如何处理?答:优先pull最新代码,手动解决冲突后标记为已解决(add)再提交;
- 问:如何撤销已push的错误提交?答:使用revert创建反向提交,避免直接reset已推送的历史。');
指定返回类型生成
多态 generate 函数目前支持设置的返回类型有:
SELECT ai.generate('列出3个知名开源数据库,用数组返回', NULL::text);
插件提供了多种方式添加 AI 模型:
SELECT ai.add_completion_model(
model_name => 'gpt-4',
uri => 'https://api.openai.com/v1/chat/completions',
default_args => '{"model": "gpt-4", "temperature": 0.7}'::jsonb,
token => 'your_openai_api_key',
model_provider => 'openai'
);SELECT ai.add_embedding_model(
model_name => 'text-embedding-ada-002',
uri => 'https://api.openai.com/v1/embeddings',
default_args => '{"model": "text-embedding-ada-002"}'::jsonb,
token => 'your_openai_api_key',
model_provider => 'openai'
);SELECT ai.add_image_model(
model_name => 'gpt-4-vision',
uri => 'https://api.openai.com/v1/chat/completions',
default_args => '{"model": "gpt-4-vision-preview", "max_tokens": 300}'::jsonb,
token => 'your_openai_api_key',
model_provider => 'openai'
);-- 列出所有已配置的模型
SELECT * FROM ai_model_list;
-- 获取特定模型的详细信息
SELECT * FROM ai.get_model_details('hunyuan_chat');
-- 更新模型配置
-- 示例:更新 gpt-4 模型的默认 temperature 参数
SELECT ai.update_model(
'gpt-4',
'default_args',
'{"model": "gpt-4", "temperature": 0.5}'::jsonb
);
-- 删除模型
SELECT ai.delete_model('model_name'); --输入对应的模型名称
ai_model_list 表来存储所有支持openai模型的配置信息
CREATE TABLE public.ai_model_list (
model_name TEXT PRIMARY KEY, -- 模型名称
model_provider TEXT, -- 模型提供商
request_type TEXT NOT NULL, -- 请求类型(GET/POST 等)
request_header http_header[], -- HTTP 请求头
uri TEXT NOT NULL, -- API 端点 URL
content_type TEXT NOT NULL, -- 内容类型
default_args JSONB NOT NULL, -- 默认参数
json_path TEXT NOT NULL -- JSON 响应路径
)opentenbase_ai 插件支持通过 ai.add_model 函数添加非 OpenAI 兼容格式的大模型。这允许您集成任何自定义 API 格式的模型服务
SELECT ai.add_model(
model_name => 'custom_model', -- 模型名称
request_header => ARRAY[ -- 请求头
http_header('Authorization', 'Bearer your_token'),
http_header('X-Custom-Header', 'value')
],
uri => 'https://api.example.com/v1/endpoint', -- API 端点
default_args => '{"key": "value"}'::jsonb, -- 默认参数
model_provider => 'custom', -- 提供商
request_type => 'POST', -- 请求类型
content_type => 'application/json', -- 内容类型
json_path => 'SELECT %L::jsonb->''result''->''text''::TEXT' -- 响应解析路径 (根据 http response 的实际路径填写)
);问题 1: 许可证错误,无法创建特定数据库
-DNOLIC 标志问题 2: C99/C++17 编译错误
devtoolset-8 并添加相应的标准标志问题 3: 仓库连接失败
vault.centos.org# 查看集群状态
pgxc_ctl monitor all
# 查看节点日志
tail -f /data/opentenbase/data/coord_master/cn001/pg_log/postgresql-*.log
tail -f /data/opentenbase/data/dn_master/dn001/pg_log/postgresql-*.log# 调整系统参数
echo 'vm.swappiness = 1' | sudo tee -a /etc/sysctl.conf
echo 'vm.overcommit_memory = 2' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p-- 调整连接数和内存参数
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
SELECT pg_reload_conf();通过本指南,您应该能够:
关键成功因素:
-msse4.2 -mcrc32)-DNOLIC)devtoolset-8)原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。