跳到主要内容
OpenTenBase 企业级分布式 HTAP 数据库部署实战 | 极客日志
SQL
OpenTenBase 企业级分布式 HTAP 数据库部署实战 综述由AI生成 OpenTenBase 是腾讯开源的分布式 HTAP 数据库,基于 PostgreSQL 构建。详细记录了从环境规划、源码编译到集群部署的全流程。涵盖 Coordinator 与 Datanode 节点配置、分片策略选择、SSH 免密登录设置及 pgxc_ctl 工具使用。同时包含性能调优建议与故障排查方案,帮助开发者快速搭建高可用分布式数据库集群,满足企业级 OLTP 与 OLAP 混合负载需求。
黑客帝国 发布于 2026/3/16 更新于 2026/4/27 3 浏览OpenTenBase 企业级分布式 HTAP 数据库部署实战
OpenTenBase 是腾讯开源的分布式 HTAP 数据库,基于 PostgreSQL 构建,具备强大的横向扩展能力和对现有生态的高度兼容性。本文详细记录了从环境规划、源码编译到集群部署的全流程,涵盖 Coordinator 与 Datanode 节点配置、分片策略选择及运维监控方案。
1. 架构概述
OpenTenBase 采用典型的分布式架构,核心组件包括:
Coordinator (CN) :协调节点,负责接收客户端请求,制定执行计划,协调分布式事务。
Datanode (DN) :数据节点,负责数据存储和本地数据处理。
Global Transaction Manager (GTM) :全局事务管理器,负责分布式事务的全局一致性。
分片策略对比
分片策略 适用场景 优势 劣势 推荐指数 Hash 分片 均匀分布的 OLTP 负载 数据分布均匀,查询性能稳定 范围查询性能较差 ⭐⭐⭐⭐⭐ Range 分片 时序数据,需要范围查询 范围查询性能优秀 可能产生热点 ⭐⭐⭐⭐ List 分片 按业务维度分片 业务逻辑清晰 维护复杂度高 ⭐⭐⭐
2. 环境准备与系统要求
2.1 硬件资源规划
建议按照以下配置规划硬件资源,确保各组件资源占比合理:
最低要求 :
内存:4GB RAM
操作系统:OpenCloudOS 9 或兼容 Linux 发行版
服务器:支持虚拟化或物理机实例
2.2 操作系统配置
基础系统参数优化是确保 OpenTenBase 稳定运行的关键。主要涉及内核参数和网络缓冲区设置。
>> /etc/sysctl.conf <<
sysctl -p
cat
EOF
# 内存管理
vm.swappiness = 10
vm.dirty_background_ratio = 3
vm.dirty_ratio = 10
vm.overcommit_memory = 2
vm.overcommit_ratio = 90
# 网络参数
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
# 文件句柄限制
fs.file-max = 6815744
EOF
vm.swappiness = 10:减少 swap 使用,提高数据库性能。
网络缓冲区设置:优化分布式节点间通信。
文件句柄限制:支持高并发连接。
3. OpenTenBase 安装部署
3.1 依赖安装 由于 OpenCloudOS 支持 dnf 和 yum,推荐使用 dnf 管理依赖。
sudo dnf 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 和 lz4 压缩库:
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 "
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 LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH "
3.2 用户与目录初始化 所有需要安装 OpenTenBase 集群的机器都需要创建专用用户。
sudo mkdir /data
sudo useradd -d /data/opentenbase -s /bin/bash -m opentenbase
sudo passwd opentenbase
su - opentenbase
3.3 源码编译安装
获取源码 cd /data/opentenbase
git clone https://gitee.com/mirrors/OpenTenBase.git
编译源码
export SOURCECODE_PATH=/data/opentenbase/OpenTenBase
export INSTALL_PATH=/data/opentenbase/install
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
CFLAGS="-g -O2 -w -msse4.2 -mcrc32" \
CXXFLAGS="-g -O2 -w -msse4.2 -mcrc32" \
./configure --prefix=/data/opentenbase/install/opentenbase_bin_v2.0 \
--enable-user-switch \
--with-openssl \
--with-ossp-uuid \
--with-libxml
make
make install
chmod +x contrib/pgxc_ctl/make_signature
cd contrib
make
make install
3.4 集中式单节点集群配置
配置环境变量 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
创建集群配置目录 mkdir /data/opentenbase/pgxc_ctl
cd /data/opentenbase/pgxc_ctl
创建配置文件 创建 pgxc_ctl.conf,注意数组元素数量必须一致。
cat > /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf << 'EOF'
pgxcOwner=opentenbase
pgxcUser=$pgxcOwner
tmpDir=/tmp
localTmpDir=$tmpDir
configBackup=y
configBackupHost=localhost
configBackupDir=$HOME /pgxc
configBackupFile=pgxc_ctl.bak
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=()
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)
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
bash -n /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
echo "语法检查结果: $?"
SSH 免密登录配置
if [ ! -f ~/.ssh/id_rsa ]; then
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
fi
ssh-copy-id opentenbase@localhost
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
ssh opentenbase@localhost "echo 'SSH connection test successful'"
部署和初始化集群 deploy all
init all
start all
monitor all
验证集群状态 Running: gtm master
Running: coordinator master cn001
Running: datanode master dn001
配置防火墙(可选)
sudo firewall-cmd --permanent --add-port=50001/tcp
sudo firewall-cmd --permanent --add-port=30004/tcp
sudo firewall-cmd --permanent --add-port=31110/tcp
sudo firewall-cmd --permanent --add-port=40004/tcp
sudo firewall-cmd --permanent --add-port=41110/tcp
sudo firewall-cmd --reload
4. 数据库初始化和使用
4.1 连接数据库 psql -h localhost -p 30004 -d postgres -U opentenbase
4.2 创建必要的节点组和分片组 OpenTenBase 使用数据节点组来增加节点管理的灵活性。通常所有数据节点都会被添加到默认组中。
CREATE DEFAULT NODE GROUP default_group WITH (dn001);
CREATE SHARDING GROUP TO GROUP default_group;
4.3 创建数据库和表
CREATE DATABASE testdb;
CREATE USER testuser WITH PASSWORD 'testpass' ;
ALTER DATABASE testdb OWNER TO testuser;
\c testdb testuser
CREATE TABLE test_table(
id BIGINT ,
name TEXT,
created_time TIMESTAMP DEFAULT NOW()
) DISTRIBUTE BY SHARD(id);
INSERT INTO test_table(id, name) VALUES (1 , 'OpenTenBase' ), (2 , 'TencentCloud' ), (3 , 'OpenCloudOS' );
SELECT * FROM test_table;
5. 集群管理与运维
5.1 集群管理命令
启动集群 :pgxc_ctl start all
停止集群 :pgxc_ctl stop all
清理集群 :pgxc_ctl clean all(重新初始化时使用)
5.2 故障排查
ls ~/pgxc_ctl/pgxc_log/
cat ~/pgxc_ctl/pgxc_log/最新的日志文件
ls /data/opentenbase/data/gtm/pg_log/
ls /data/opentenbase/data/coord/pg_log/
ls /data/opentenbase/data/dn001/pg_log/
权限问题 :确保 opentenbase 用户对所有数据目录有读写权限。
端口冲突 :检查配置的端口是否被其他服务占用。
内存不足 :调整 shared_buffers 等内存参数。
网络问题 :检查防火墙和网络连接。
5.3 性能优化建议
内存优化 根据服务器配置调整 postgresql.conf 中的内存参数:
shared_buffers = 25% of RAM
effective_cache_size = 75% of RAM
work_mem = 4MB
maintenance_work_mem = 64MB
连接优化 max_connections = 200
max_pool_size = 1000
日志优化 log_min_duration_statement = 1000
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
5.4 性能监控查询
SELECT node_name, node_type, node_host, node_port,
CASE WHEN status = 'N' THEN '正常' WHEN status = 'D' THEN '下线' ELSE '未知' END AS node_status
FROM pgxc_node ORDER BY node_type, node_name;
SELECT schemaname, tablename, n_tup_ins as "插入行数", n_tup_upd as "更新行数",
n_tup_del as "删除行数", last_analyze as "最近分析时间"
FROM pg_stat_user_tables
WHERE schemaname NOT IN ('information_schema' , 'pg_catalog' )
ORDER BY n_tup_ins DESC LIMIT 10 ;
WITH node_stats AS (
SELECT node_name,
pg_stat_get_db_blocks_fetched(oid) as blocks_read,
pg_stat_get_db_blocks_hit(oid) as blocks_hit
FROM pg_database, pgxc_node
WHERE datname = current_database()
)
SELECT node_name, blocks_read, blocks_hit,
CASE WHEN (blocks_read + blocks_hit) > 0 THEN round(blocks_hit::numeric / (blocks_read + blocks_hit) * 100 , 2 ) ELSE 0 END as cache_hit_ratio
FROM node_stats ORDER BY cache_hit_ratio DESC ;
5.5 分布式表创建与分片
CREATE TABLE user_orders (
order_id BIGINT PRIMARY KEY ,
user_id INTEGER NOT NULL ,
product_id INTEGER NOT NULL ,
order_amount DECIMAL (10 ,2 ),
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
order_status VARCHAR (20 )
) DISTRIBUTE BY HASH(user_id);
CREATE TABLE sales_data (
sale_id BIGINT ,
sale_date DATE NOT NULL ,
region VARCHAR (50 ),
amount DECIMAL (12 ,2 )
) DISTRIBUTE BY RANGE (sale_date);
SELECT create_distributed_table('sales_data' , 'sale_date' , 'range' );
6. 实战经验总结 通过深度实践,OpenTenBase 在企业级应用中展现出显著优势。首先是其优秀的 PostgreSQL 兼容性,迁移成本较低,大部分现有 SQL 语句和应用程序能无缝迁移。特别是在处理复杂的 OLAP 查询时,分布式能力远超传统单机数据库。
在弹性扩展方面,支持在线扩容,对业务影响最小。数据重分布过程虽然耗时,但整体体验优于同类产品。运维监控方面,结合 Prometheus + Grafana 可构建完整体系,实时监控 CPU、内存、I/O 及分布式事务延迟等指标。
总体而言,OpenTenBase 在功能完整性、性能表现和运维便利性方面达到了企业级要求,是数字化转型过程中值得考虑的重要选择。随着社区发展,其在分布式数据库领域的作用将愈发重要。
参考链接 相关免费在线工具 SQL 美化和格式化 在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
SQL转CSV/JSON/XML 解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 工具包 CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online