腾讯云OpenCloudOS 9系统部署OpenTenBase数据库详细教程

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来安装依赖:

bash 复制代码
# 更新系统
sudo dnf update -y

编辑

编辑

markdown 复制代码
# 安装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

编辑

编辑

bash 复制代码
# 下载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"

编辑

编辑

bash 复制代码
# 下载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"

编辑

bash 复制代码
# 首先检查当前的包管理器状态
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
sql 复制代码
sudo dnf search cli11
sudo dnf install -y cli11-devel

2. 创建专用用户

所有需要安装OpenTenBase集群的机器都需要创建专用用户:

bash 复制代码
# 创建数据目录
sudo mkdir /data

# 创建opentenbase用户
sudo useradd -d /data/opentenbase -s /bin/bash -m opentenbase

# 设置密码
sudo passwd opentenbase

编辑

3. 切换到opentenbase用户

复制代码
su - opentenbase

编辑

源码编译安装

1. 获取源码

bash 复制代码
cd /data/opentenbase
git clone https://gitee.com/mirrors/OpenTenBase.git

编辑

2. 编译源码

javascript 复制代码
# 设置环境变量
export SOURCECODE_PATH=/data/opentenbase/OpenTenBase
export INSTALL_PATH=/data/opentenbase/install

编辑

bash 复制代码
# 进入源码目录
cd ${SOURCECODE_PATH}

# 配置编译选项
chmod +x configure*

编辑

编辑

bash 复制代码
# 编译和安装
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. 配置环境变量

bash 复制代码
# 编辑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. 创建集群配置目录

bash 复制代码
mkdir /data/opentenbase/pgxc_ctl
cd /data/opentenbase/pgxc_ctl

编辑

3. 创建集中式配置文件

ini 复制代码
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 复制代码
# 检查配置文件语法
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

检查环境变量

bash 复制代码
# 检查当前环境变量
echo $PATH
echo $OPENTENBASE_HOME
which initdb
which gtm_ctl

重新设置环境变量

bash 复制代码
# 退出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

永久保存环境变量

bash 复制代码
# 编辑 .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

重新创建完整的配置文件

ini 复制代码
# 删除不完整的配置文件
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 复制代码
# 检查配置文件语法
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免密登录

bash 复制代码
# 生成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连接

perl 复制代码
# 测试SSH连接是否正常
ssh opentenbase@localhost "echo 'SSH connection test successful'"

编辑

重新运行pgxc_ctl

python 复制代码
# 现在重新运行pgxc_ctl
pgxc_ctl

# 在pgxc_ctl中执行:
deploy all
init all
start all
monitor all

编辑

4. 部署和初始化集群

python 复制代码
# 启动pgxc_ctl工具
pgxc_ctl

# 在pgxc_ctl命令行中执行:
deploy all
init all
bash 复制代码
# 退出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. 验证集群状态

python 复制代码
# 在pgxc_ctl中检查集群状态
monitor all

正常情况下应该显示:

makefile 复制代码
Running: gtm master
Running: coordinator master cn001
Running: datanode master dn001

编辑

编辑

配置防火墙(可选)

如果启用了防火墙,需要开放相应端口:

ini 复制代码
# 开放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. 连接数据库

css 复制代码
psql -h localhost -p 30004 -d postgres -U opentenbase

编辑

2. 创建必要的节点组和分片组

OpenTenBase使用数据节点组来增加节点管理的灵活性。需要创建一个默认组来使用,因此需要提前创建。通常,所有数据节点都会被添加到默认组中:

sql 复制代码
-- 创建默认节点组
CREATE DEFAULT NODE GROUP default_group WITH (dn001);

-- 创建分片组
CREATE SHARDING GROUP TO GROUP default_group;

3. 创建数据库和表

sql 复制代码
-- 创建测试数据库
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. 启动集群

sql 复制代码
pgxc_ctl
start all

2. 停止集群

arduino 复制代码
pgxc_ctl
stop all

3. 清理集群(重新初始化时使用)

css 复制代码
pgxc_ctl
clean all

故障排查

1. 查看日志

如果初始化失败,可以查看日志:

bash 复制代码
# 查看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中的内存参数:

ini 复制代码
shared_buffers = 25% of RAM    # 例如8GB内存设置为2GB
effective_cache_size = 75% of RAM
work_mem = 4MB
maintenance_work_mem = 64MB

2. 连接优化

ini 复制代码
max_connections = 200          # 根据应用需求调整
max_pool_size = 1000          # 连接池大小

3. 日志优化

ini 复制代码
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

相关推荐
bobz96521 小时前
virtio-networking 4: 介绍 vDPA 1
后端
柏油1 天前
MySQL InnoDB 架构
数据库·后端·mysql
一个热爱生活的普通人1 天前
Golang time 库深度解析:从入门到精通
后端·go
一只叫煤球的猫1 天前
怎么这么多StringUtils——Apache、Spring、Hutool全面对比
java·后端·性能优化
MrHuang9651 天前
保姆级教程 | 在Ubuntu上部署Claude Code Plan Mode全过程
后端
紫穹1 天前
008.LangChain 输出解析器
后端
苏三说技术1 天前
Token,Session,Cookie,JWT,Oauth2傻傻分不清楚
后端
xcya1 天前
Java 代码设计原则:从理论到代码实践
后端
yanlele1 天前
给 35+ 程序员的绝地求生计划书
前端·后端·面试
JavaArchJourney1 天前
MySQL 索引:原理篇
java·后端·mysql