OpenTenBase是一个关系型数据库集群平台,提供写入可靠性和多节点数据同步功能。可以在一台或多台主机上配置OpenTenBase,并将数据存储在多个物理主机上。
gcc make readline-devel zlib-devel openssl-devel uuid-devel bison flex git
由于OpenCloudOS支持dnf和yum两种包管理软件,强烈推荐用户更多地使用dnf,我们使用dnf来安装依赖:
# 更新系统
sudo dnf update -y
# 安装OpenTenBase编译依赖
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
sudo dnf search cli11
sudo dnf install -y cli11-devel
所有需要安装OpenTenBase集群的机器都需要创建专用用户:
# 创建数据目录
sudo mkdir /data
# 创建opentenbase用户
sudo useradd -d /data/opentenbase -s /bin/bash -m opentenbase
# 设置密码
sudo passwd opentenbase
su - opentenbase
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
# 重新配置,添加SSE4.2支持
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
# 编译contrib模块
chmod +x contrib/pgxc_ctl/make_signature
cd contrib
make
make install
# 编辑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 ~/.bashrc
mkdir /data/opentenbase/pgxc_ctl
cd /data/opentenbase/pgxc_ctl
cat > /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf << 'EOF'
#!/usr/bin/env bash
#---- OVERALL -----------------------------------------------------------------------------
pgxcOwner=opentenbase
pgxcUser=$pgxcOwner
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
# GTM Slave - disabled
gtmSlave=n
gtmSlaveName=gtmSlave
gtmSlaveServer=none
gtmSlavePort=20001
gtmSlaveDir=none
gtmSlaveSpecificExtraConfig=none
# GTM Proxy - disabled
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)
# Master Coordinators
coordMasterServers=(localhost)
coordMasterDirs=(/data/opentenbase/data/coord_master/cn001)
coordMaxWALsender=5
coordMaxWALSenders=(5)
# Coordinator Slave - disabled
coordSlave=n
coordSlaveSync=n
coordSlaveServers=(none)
coordSlavePorts=(30005)
coordSlavePoolerPorts=(30015)
coordSlaveForwardPorts=(30025)
coordSlaveDirs=(none)
coordArchLogDirs=(none)
# Configuration files
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)
# Master Datanodes
datanodeMasterServers=(localhost)
datanodeMasterDirs=(/data/opentenbase/data/dn_master/dn001)
datanodeMaxWalSender=5
datanodeMaxWALSenders=(5)
# Datanode Slave - disabled
datanodeSlave=n
datanodeSlaveServers=(none)
datanodeSlavePorts=(20009)
datanodeSlavePoolerPorts=(20019)
datanodeSlaveForwardPorts=(20029)
datanodeSlaveDirs=(none)
datanodeArchLogDirs=(none)
# Configuration files
datanodeExtraConfig=none
datanodeSpecificExtraConfig=(none)
datanodeSpecificExtraPgHba=(none)
# WAL Archive - disabled
walArchive=n
EOF
# 检查配置文件语法
bash -n /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
echo "配置文件语法检查结果: $?"
# 查看文件内容确认
head -20 /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
检查环境变量
# 检查当前环境变量
echo $PATH
echo $OPENTENBASE_HOME
which initdb
which gtm_ctl
重新设置环境变量
# 退出pgxc_ctl
quit
# 重新设置环境变量
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
# 验证命令是否可用
which initdb
which gtm_ctl
which pg_ctl
永久保存环境变量
# 编辑 .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 ~/.bashrc
重新创建完整的配置文件
# 删除不完整的配置文件
rm /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
# 重新创建完整配置文件
cat > /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf << 'EOF'
#!/usr/bin/env bash
#---- OVERALL -----------------------------------------------------------------------------
pgxcOwner=opentenbase
pgxcUser=$pgxcOwner
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
验证配置文件
# 检查配置文件语法
bash -n /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
echo "语法检查结果: $?"
# 查看文件完整性
wc -l /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
tail -10 /data/opentenbase/install/opentenbase_bin_v2.0/pgxc_ctl.conf
配置SSH免密登录
# 生成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
测试SSH连接
# 测试SSH连接是否正常
ssh opentenbase@localhost "echo 'SSH connection test successful'"
重新运行pgxc_ctl
# 现在重新运行pgxc_ctl
pgxc_ctl
# 在pgxc_ctl中执行:
deploy all
init all
start all
monitor all
# 启动pgxc_ctl工具
pgxc_ctl
# 在pgxc_ctl命令行中执行:
deploy all
init all
# 退出pgxc_ctl
exit
# 设置opentenbase用户的SSH密钥认证
su - opentenbase
# 生成SSH密钥对
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""
# 将公钥添加到authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 测试SSH连接(应该不需要密码)
ssh opentenbase@127.0.0.1 "echo 'SSH连接测试成功'"
MQgnDKIwotjP9+vkGc9jehXXIzfXSJ2+ZAnFP5IDvIc.
# 在pgxc_ctl中检查集群状态
monitor all
正常情况下应该显示:
Running: gtm master
Running: coordinator master cn001
Running: datanode master dn001
如果启用了防火墙,需要开放相应端口:
# 开放GTM端口
sudo firewall-cmd --permanent --add-port=50001/tcp
# 开放Coordinator端口
sudo firewall-cmd --permanent --add-port=30004/tcp
sudo firewall-cmd --permanent --add-port=31110/tcp
# 开放Datanode端口
sudo firewall-cmd --permanent --add-port=40004/tcp
sudo firewall-cmd --permanent --add-port=41110/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reload
psql -h localhost -p 30004 -d postgres -U opentenbase
OpenTenBase使用数据节点组来增加节点管理的灵活性。需要创建一个默认组来使用,因此需要提前创建。通常,所有数据节点都会被添加到默认组中:
-- 创建默认节点组
CREATE DEFAULT NODE GROUP default_group WITH (dn001);
-- 创建分片组
CREATE SHARDING GROUP TO GROUP default_group;
-- 创建测试数据库
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;
pgxc_ctl
start all
pgxc_ctl
stop all
pgxc_ctl
clean all
如果初始化失败,可以查看日志:
# 查看pgxc_ctl日志
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/
根据服务器配置调整postgresql.conf中的内存参数:
shared_buffers = 25% of RAM # 例如8GB内存设置为2GB
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 # 记录执行时间超过1秒的查询
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
本文围绕 OpenTenBase 的“可上手、可运维、可优化”三条主线进行了系统梳理。首先在背景层面,解释了分布式关系型数据库的现实诉求:在保证 ACID 与 SQL 生态的前提下,通过多节点协作获得横向扩展与高可用。OpenTenBase 采用 CN/DN/GTM 的分层架构,CN 负责接入与查询分发,DN 负责数据存储与并行执行,GTM 保证跨节点事务一致性与全局对象统一,简单理解就是“前台一个库、后台多台机器协同演出”,既兼顾一致性又不放弃扩展性。在方法路径上,文章以 OpenCloudOS 9 为基础环境,推荐 dnf 安装通用依赖、zstd 与 lz4 源码安装的组合策略,平衡了易用性与性能可控性;编译阶段建议开启 SSE4.2 指令优化,随后通过 pgxc_ctl 提供的标准化配置与脚本驱动完成“部署-初始化-启动-监控”的最小化闭环。为降低上手门槛,文中在每个关键节点附上截图与核对命令,并补充了环境变量、SSH 免密、libxml2 检查等高频易错点的处置步骤,确保遇到问题能“就地排查、快速复位”。在结果与运维层面,给出连接、建组、建库、分片表创建与简单查询的闭环示例,让读者能验证“连得上、查得对、分片生效”;同时整理了启动/停止/清理三类常用命令与日志路径,配以“权限/端口/内存/网络”四象限问题清单形成一套实操化的排障流程。性能方面,从内存、连接池与慢日志三条主线提供即插即用的参数建议,并强调以慢 SQL 与 EXPLAIN 为抓手推进定位与优化。最后,文中构建了包含准确性、响应速度、成本效益、易用性、稳定性五维度的量化评测框架,建议以 P95/P99 延迟、TPS/QPS、RTO/RPO、单位 QPS 成本等指标形成可复现的测试闭环。总体而言,本文在保留原有命令与图片的基础上,进行了结构重组与语言“口语化”处理,并通过 Mermaid 架构与流程图、对比表与评分体系的补强,使非专业读者也能跟随步骤完成最小化集群的搭建与验证;对于有经验的工程师,也能据此快速定位依赖与配置关键点、形成稳定的运维与优化路径,从而把 OpenTenBase 更高效地引入到生产与测试环境中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。