OpenTenBase简介
OpenTenBase是一个关系型数据库集群平台,提供写入可靠性和多节点数据同步功能。可以在一台或多台主机上配置OpenTenBase,并将数据存储在多个物理主机上。

OpenTenBase架构组件:
- Coordinator Node (CN) :应用程序访问入口,负责数据分布和查询计划。多个节点位于同一位置,每个节点提供相同的数据库视图
- Datanode Node (DN) :每个DN存储用户数据的分区。在功能上,DN节点负责完成CN分发的执行请求
- GTM Node (Global Transaction Manager) :负责集群事务信息的管理,以及集群的全局对象(如序列)
系统要求
硬件要求:
- 内存 :最低4GB RAM
- 操作系统 :OpenCloudOS 9
- 服务器 :腾讯云CVM实例

软件依赖:
gcc make readline-devel zlib-devel openssl-devel uuid-devel bison flex git
环境准备
1. 更新系统并安装依赖包
由于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
2. 创建专用用户
所有需要安装OpenTenBase集群的机器都需要创建专用用户:
# 创建数据目录 sudo mkdir /data # 创建opentenbase用户 sudo useradd -d /data/opentenbase -s /bin/bash -m opentenbase # 设置密码 sudo passwd opentenbase

3. 切换到opentenbase用户
su - opentenbase

源码编译安装
1. 获取源码
cd /data/opentenbase git clone https://gitee.com/mirrors/OpenTenBase.git

2. 编译源码
# 设置环境变量 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


集中式单节点集群配置
1. 配置环境变量
# 编辑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


2. 创建集群配置目录
mkdir /data/opentenbase/pgxc_ctl cd /data/opentenbase/pgxc_ctl

3. 创建集中式配置文件
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

4. 部署和初始化集群
# 启动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.

5. 验证集群状态
# 在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
数据库初始化和使用
1. 连接数据库
psql -h localhost -p 30004 -d postgres -U opentenbase

2. 创建必要的节点组和分片组
OpenTenBase使用数据节点组来增加节点管理的灵活性。需要创建一个默认组来使用,因此需要提前创建。通常,所有数据节点都会被添加到默认组中:
-- 创建默认节点组 CREATE DEFAULT NODE GROUP default_group WITH (dn001); -- 创建分片组 CREATE SHARDING GROUP TO GROUP default_group;
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;
集群管理
1. 启动集群
pgxc_ctl start all
2. 停止集群
pgxc_ctl stop all
3. 清理集群(重新初始化时使用)
pgxc_ctl clean all
故障排查
1. 查看日志
如果初始化失败,可以查看日志:
# 查看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/
2. 常见问题解决
- 权限问题 :确保opentenbase用户对所有数据目录有读写权限
- 端口冲突 :检查配置的端口是否被其他服务占用
- 内存不足 :调整shared _ buffers等内存参数
- 网络问题 :检查防火墙和网络连接
性能优化建议
1. 内存优化
根据服务器配置调整postgresql.conf中的内存参数:
shared_buffers = 25% of RAM # 例如8GB内存设置为2GB effective_cache_size = 75% of RAM work_mem = 4MB maintenance_work_mem = 64MB
2. 连接优化
max_connections = 200 # 根据应用需求调整 max_pool_size = 1000 # 连接池大小
3. 日志优化
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