写在前边

很多学员想学习TBase数据库,但是苦于没有企业版的授权文件,在编译部署开源版本的时候又遇到诸多问题,因此我写下这篇文章供大家参考。

实验环境简介

  • 硬件简介
title value
机器数量 2台腾讯CVM
操作系统版本 CentOS Linux release 7.8.2003 (Core)
内核信息 Linux VM-16-17-centos 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
CPU 8 core
RAM 16GB
DISK 50GB
  • 集群规划
 机器1:172.21.16.17
 机器2:172.21.16.25
节点名称 IP 数据目录
GTM master 172.21.16.17 /data/tbase/data/gtm
GTM slave 172.21.16.25 /data/tbase/data/gtm
CN1 172.21.16.17 /data/tbase/data/coord
CN2 172.21.16.25 /data/tbase/data/coord
DN1 master 172.21.16.17 /data/tbase/data/dn001
DN1 slave 172.21.16.25 /data/tbase/data/dn001
DN2 master 172.21.16.25 /data/tbase/data/dn002
DN2 slave 172.21.16.17 /data/tbase/data/dn002
  • 集群拓扑图

集群拓扑图.png

实验步骤

安装步骤简介:

  • 申请CVM(略)
  • 创建tbase用户
  • 安装相关rpm依赖包
  • 获取TBase开源安装包
  • 配置环境变量
  • 源码编译
  • 初始化pgxc_ctl.conf文件
  • 分发二进包
  • 初始化集群
  • 集群状态查看
  • 集群访问和创建分布式表

具体安装过程:

mkdir /data
useradd -d /data/tbase tbase
  • 安装相关rpm依赖包
yum install -y bison.x86_64 bison-devel.x86_64 flex.x86_64 flex-devel.x86_64
yum install -y readline readline-dev
yum install -y readline.x86_64 readline-devel.x86_64
yum install -y zlib.x86_64 zlib-devel.x86_64
yum install -y openssl-devel
yum install -y uuid uuid-devel
yum install -y git.x86_64
  • 获取TBase开源安装包

TBase开源源码可以在GitHub上下载,但是国外的镜像源下载速度较慢,所以本次实验采用的是国内的镜像源,大家可以登陆腾讯工蜂(git.code.tencent.com)申请账号和密码。下载方式如下:

git clone https://用户名:密码@git.code.tencent.com/tencent_open_source/tbase.git
  • 配置环境变量(使用root用户)
mkdir -p /data/tbase/install
chown -R tbase:tbase /data
export SOURCECODE_PATH=/data/tbase/TBase
export INSTALL_PATH=/data/tbase/install
  • 源码编译
  1. configure配置。运行成功之后如图所示
cd ${SOURCECODE_PATH}
 chmod +x configure*
 ./configure --prefix=${INSTALL_PATH}/tbase_bin_v2.0  --enable-user-switch --with-openssl  --with-ossp-uuid CFLAGS=-g

configure配置.png

  1. 安装
    安装成功后如下图
 make clean
 make -sj 4
 make install

安装.png

  1. contrib安装
 chmod +x contrib/pgxc_ctl/make_signature
 cd contrib
 make -sj 4

contrib_make.png

make install

make_install.png

  • 初始化pgxc_ctl.conf文件(在编译的机器上执行)
    注意这个文件行首不要出现空格!
[root@VM-16-17-centos ~]# chown tbase:tbase -R /data
[root@VM-16-17-centos ~]#  su - tbase
[tbase@VM-16-17-centos pgxc_ctl]$ cat pgxc_ctl.conf 
#!/bin/bash

pgxcInstallDir=/data/tbase/install/tbase_bin_v2.0
pgxcOwner=tbase
defaultDatabase=postgres
pgxcUser=$pgxcOwner
tmpDir=/tmp
localTmpDir=$tmpDir
configBackup=n
configBackupHost=pgxc-linker
configBackupDir=$HOME/pgxc
configBackupFile=pgxc_ctl.bak


#---- GTM ----------
gtmName=gtm
gtmMasterServer=172.21.16.17
gtmMasterPort=50001
gtmMasterDir=/data/tbase/data/gtm
gtmExtraConfig=none
gtmMasterSpecificExtraConfig=none
gtmSlave=y
gtmSlaveServer=172.21.16.25
gtmSlavePort=50001
gtmSlaveDir=/data/tbase/data/gtm
gtmSlaveSpecificExtraConfig=none

#---- Coordinators -------
coordMasterDir=/data/tbase/data/coord
coordArchLogDir=/data/tbase/data/coord_archlog

coordNames=(cn001 cn002 )
coordPorts=(30004 30004 )
poolerPorts=(31110 31110 )
coordPgHbaEntries=(0.0.0.0/0)
coordMasterServers=(172.21.16.17 172.21.16.25)
coordMasterDirs=($coordMasterDir $coordMasterDir)
coordMaxWALsernder=2
coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder )
coordSlave=n
coordSlaveSync=n
coordArchLogDirs=($coordArchLogDir $coordArchLogDir)

coordExtraConfig=coordExtraConfig
cat > $coordExtraConfig <<EOF
#================================================
# Added to all the coordinator postgresql.conf
# Original: $coordExtraConfig

include_if_exists = '/data/tbase/global/global_tbase.conf'

wal_level = replica
wal_keep_segments = 256 
max_wal_senders = 4
archive_mode = on 
archive_timeout = 1800 
archive_command = 'echo 0' 
log_truncate_on_rotation = on 
log_filename = 'postgresql-%M.log' 
log_rotation_age = 4h 
log_rotation_size = 100MB
hot_standby = on 
wal_sender_timeout = 30min 
wal_receiver_timeout = 30min 
shared_buffers = 1024MB 
max_pool_size = 2000
log_statement = 'ddl'
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
listen_addresses = '*'
max_connections = 2000

EOF

coordSpecificExtraConfig=(none none)
coordExtraPgHba=coordExtraPgHba
cat > $coordExtraPgHba <<EOF

local   all             all                                     trust
host    all             all             0.0.0.0/0               trust
host    replication     all             0.0.0.0/0               trust
host    all             all             ::1/128                 trust
host    replication     all             ::1/128                 trust


EOF


coordSpecificExtraPgHba=(none none)
coordAdditionalSlaves=n	
cad1_Sync=n

#---- Datanodes ---------------------
dn1MstrDir=/data/tbase/data/dn001
dn2MstrDir=/data/tbase/data/dn002
dn1SlvDir=/data/tbase/data/dn001
dn2SlvDir=/data/tbase/data/dn002
dn1ALDir=/data/tbase/data/datanode_archlog
dn2ALDir=/data/tbase/data/datanode_archlog

primaryDatanode=dn001
datanodeNames=(dn001 dn002)
datanodePorts=(40004 40004)
datanodePoolerPorts=(41110 41110)
datanodePgHbaEntries=(0.0.0.0/0)
datanodeMasterServers=(172.21.16.17 172.21.16.25)
datanodeMasterDirs=($dn1MstrDir $dn2MstrDir)
dnWALSndr=4
datanodeMaxWALSenders=($dnWALSndr $dnWALSndr)

datanodeSlave=y
datanodeSlaveServers=(172.21.16.25 172.21.16.17)
datanodeSlavePorts=(50004 54004)
datanodeSlavePoolerPorts=(51110 51110)
datanodeSlaveSync=n
datanodeSlaveDirs=($dn1SlvDir $dn2SlvDir)
datanodeArchLogDirs=($dn1ALDir/dn001 $dn2ALDir/dn002)

datanodeExtraConfig=datanodeExtraConfig
cat > $datanodeExtraConfig <<EOF
#================================================
# Added to all the coordinator postgresql.conf
# Original: $datanodeExtraConfig

include_if_exists = '/data/tbase/global/global_tbase.conf'
listen_addresses = '*' 
wal_level = replica 
wal_keep_segments = 256 
max_wal_senders = 4
archive_mode = on 
archive_timeout = 1800 
archive_command = 'echo 0' 
log_directory = 'pg_log' 
logging_collector = on 
log_truncate_on_rotation = on 
log_filename = 'postgresql-%M.log' 
log_rotation_age = 4h 
log_rotation_size = 100MB
hot_standby = on 
wal_sender_timeout = 30min 
wal_receiver_timeout = 30min 
shared_buffers = 1024MB 
max_connections = 4000 
max_pool_size = 4000
log_statement = 'ddl'
log_destination = 'csvlog'
wal_buffers = 1GB

EOF

datanodeSpecificExtraConfig=(none none)
datanodeExtraPgHba=datanodeExtraPgHba
cat > $datanodeExtraPgHba <<EOF

local   all             all                                     trust
host    all             all             0.0.0.0/0               trust
host    replication     all             0.0.0.0/0               trust
host    all             all             ::1/128                 trust
host    replication     all             ::1/128                 trust


EOF


datanodeSpecificExtraPgHba=(none none)

datanodeAdditionalSlaves=n
walArchive=n
  • 分发二进包

配置tbase用户环境变量(2个节点都要执行)

[tbase@VM-16-17-centos pgxc_ctl]$ cat ~/.bashrc 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# Use rspecific aliases and functions
export TBASE_HOME=/data/tbase/install/tbase_bin_v2.0
export PATH=$TBASE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$TBASE_HOME/lib:${LD_LIBRARY_PATH}

[tbase@VM-16-17-centos pgxc_ctl]$ cat /etc/environment 
PATH="/data/tbase/install/tbase_bin_v2.0/bin:/data/tbase/install/tbase_bin_v2.0/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/data/tbase/.local/bin:/data/tbase/bin"

进入到pgxc_ctl交互工具,然后执行deploy all

[tbase@VM-16-17-centos pgxc_ctl]$ pgxc_ctl 
/bin/bash
Installing pgxc_ctl_bash script as /data/tbase/pgxc_ctl/pgxc_ctl_bash.
Installing pgxc_ctl_bash script as /data/tbase/pgxc_ctl/pgxc_ctl_bash.
Reading configuration using /data/tbase/pgxc_ctl/pgxc_ctl_bash --home /data/tbase/pgxc_ctl --configuration /data/tbase/pgxc_ctl/pgxc_ctl.conf
Finished reading configuration.
   ******** PGXC_CTL START ***************

Current directory: /data/tbase/pgxc_ctl
PGXC deploy all

执行成功之后如图所示:

deployall_成功.png

  • 初始化集群
    进入到pgxc_ctl命令交互工具,执行init all命令,执行成功之后截图如下(本次实验GTM slave节点没有拉起来,暂时未找到原因,后续找到原因会进行更新。GTM slave是备节点,不会影响数据库的使用,只是无法进行GTM组件容灾的演练)
[tbase@VM-16-17-centos pgxc_ctl]$ pgxc_ctl 
/bin/bash
Installing pgxc_ctl_bash script as /data/tbase/pgxc_ctl/pgxc_ctl_bash.
Installing pgxc_ctl_bash script as /data/tbase/pgxc_ctl/pgxc_ctl_bash.
Reading configuration using /data/tbase/pgxc_ctl/pgxc_ctl_bash --home /data/tbase/pgxc_ctl --configuration /data/tbase/pgxc_ctl/pgxc_ctl.conf
Finished reading configuration.
   ******** PGXC_CTL START ***************

Current directory: /data/tbase/pgxc_ctl
PGXC init all

image.png

  • 集群状态查看

进入pgxc_ctl命令交互界面,执行monitor all命令可以查看各个组件的运行情况。

[tbase@VM-16-17-centos pgxc_ctl]$ pgxc_ctl 
/bin/bash
Installing pgxc_ctl_bash script as /data/tbase/pgxc_ctl/pgxc_ctl_bash.
Installing pgxc_ctl_bash script as /data/tbase/pgxc_ctl/pgxc_ctl_bash.
Reading configuration using /data/tbase/pgxc_ctl/pgxc_ctl_bash --home /data/tbase/pgxc_ctl --configuration /data/tbase/pgxc_ctl/pgxc_ctl.conf
Finished reading configuration.
   ******** PGXC_CTL START ***************

Current directory: /data/tbase/pgxc_ctl
PGXC monitor all
  • 集群访问和创建分布式表
[tbase@VM-16-17-centos pgxc_ctl]$ psql -h172.21.16.17 -p 30004 -d postgres -U tbase
postgres=# create default node group default_group  with (dn001,dn002);
postgres=# create sharding group to group default_group;
postgres=# create table t1(id int primary key,name varchar(20));
postgres=# insert into t1 select generate_series(1,100);

create_table.png

错误处理

  1. 报错如下
    Without Bison you will not be able to build PostgreSQL from Git nor
    Without Flex you will not be able to build PostgreSQL from Git nor
yum install -y bison.x86_64 bison-devel.x86_64 flex.x86_64 flex-devel.x86_64

image.png

  1. configure: error: readline library not found
yum install -y readline readline-dev;

image.png

  1. configure: error: library 'crypto' is required for OpenSSL
    解决方案
yum install -y openssl-devel
  1. configure: error: library 'ossp-uuid' or 'uuid' is required for OSSP UUID
    解决方案
yum install -y uuid uuid-devel
  1. deploy all期间报错
...
tar: share/doc/postgresql/extension/autoinc.example: Cannot open: File exists
tar: share/doc/postgresql/extension/insert_username.example: Cannot open: File exists
tar: share/doc/postgresql/extension/moddatetime.example: Cannot open: File exists
tar: share/doc/postgresql/extension/refint.example: Cannot open: File exists
tar: share/doc/postgresql/extension/timetravel.example: Cannot open: File exists
tar: share/doc/postgresql/extension: Cannot utime: Operation not permitted
tar: share/doc/postgresql: Cannot utime: Operation not permitted
tar: share/doc: Cannot utime: Operation not permitted
tar: share: Cannot utime: Operation not permitted
tar: Exiting with failure status due to previous errors
Deployment done.

解决方案: 修改目录权限:chown tbase:tbase -R /data/

image.png

  1. /data/tbase/pgxc_ctl/pgxc_ctl.conf: line 169: warning: here-document at line 45 delimited by end-of-file (wanted `EOF')
    解决方案
检查pgxc_ctl.conf文件,尤其注意行首空格问题。因为EOF前边有空格的时候,不会被识别为输入重定向的结束符。
  1. 在执行init db时,提示找不到pg_ctl命令。
    解决方案
把tbase用户的$PATH环境变量添加到 /etc/environment

cat /etc/environment
PATH="/data/tbase/install/tbase_bin_v2.0/bin:/data/tbase/install/tbase_bin_v2.0/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/data/tbase/.local/bin:/data/tbase/bin"

文章来源于腾讯云开发者社区,点击查看原文