一、闲扯
公司有项目要用到TBase数据库集群,本来是我们组一个前辈搭好的,然后dn1和dn2总是没法同步,或者说是同步不完全(dn1建的表写入数据,dn2里会有不完整的表结构,但是没有其他的,后来找到原因是最大连接数的配置问题),一直找不到原因,项目经理大笔一挥,重新部署一套。然而我们组那个前辈去重保某个重要项目了,我赶鸭子上架,以前用都不会用,现在要两天内搭一套集群出来,还得带负载均衡。
其实说起来并不困难,主要是难在我经验过少,又是踩坑无数的学习过程,现在我搭的集群已经开始正常运行了,这篇文章拿来做个记录。
二、前期准备
1. 什么是TBase
TBase是腾讯基于postgresql数据库二次开发的,其他的大家自行百度或谷歌,大把大把的资料。
2. 集群规划
使用两台虚拟机搭建1GTM主+1GTM备+2CN主(CN主之间对等,因此无需备CN)+2DN主+2DN备的集群,该集群为具备容灾能力的最小配置。机器IP规划为
测试机01:172.16.8.247 tbase01
测试机02:172.16.8.248 tbase02
官方文档和腾讯内部文档要求资源给8C16G+50G系统盘+CentOS 7.3最小化+3.10内核,我自己的测试环境里还有TDSQL集群,资源确实不够,于是开了两台2C16G的虚拟机,其他都一样。各节点规划为:
3. 基本配置
PS:虚拟机安装及基本网络配置等过程略。
3.1 安装基本依赖包及简单优化
更换国内yum源参考:
CentOS-7系统配置华为云yum源
由于是CentOS 7.3最小化安装,所以需要补充安装一些依赖包
yum -y install gcc gcc-c++ pcre-devel openssl-devel #基本环境依赖
yum -y install net-tools vim unzip wget lrzsz #部分常用工具
tbase所需依赖包
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
ssh连接优化:
vim /etc/ssh/sshd_config
:set nu #使vim编辑器显示文件行数
修改以下内容:
GSSAPIAuthentication no
UseDNS no
3.2 修改主机名,配置账号
为了方便,我把247改成tbase01,把248改成tbase02
hostname #查看当前主机名
hostnamectl set-hostname tbase01 #修改主机名为tbase01
hostname #查看当前主机名
修改好后xshell重新连接,显示的机器名就是你刚刚修改的了。
为了方便看,可以改一下字体颜色,具体操作移步这篇:https://blog.youkuaiyun.com/aidream1239/article/details/107810095
3.3 创建tbase用户并配置权限
创建tbase用户及用户目录,并添加密码(必须有,而且两台都要)
mkdir /data #新建文件夹
useradd -d /data/tbase tbase #添加新用户并指向/data/tbase
passwd tbase #给tbase用户添加密码
chown -R tbase:tbase /data #这一步权限涉及后面分发二进制包等,很重要
3.4 配置虚拟机互信
(注意:除第①和第②步在root下进行,其他操作均在tbase用户下进行,且需提前关闭firewalld和selinux)
① root下,两台机器分别编辑/etc/ssh/sshd_config文件:
vim /etc/ssh/sshd_config
:set nu #使vim编辑器显示文件行数
修改以下内容:
RSAAuthentication yes #启用rsa认证,如果sshd_config里没有这一项可以忽略
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径,一般默认不需修改
② 然后两台机器分别重启sshd服务:
systemctl restart sshd
③ 两台机器分别切换到tbase用户下,查看~下有没有.ssh目录,没有就新建一个,注意权限问题。
su tbase
cd ~
mkdir .ssh
chmod 700 .ssh #.ssh需要700权限
ssh-keygen -t rsa #生成公钥私钥
注意提示的密钥保存路径。
④ 247与248,247与247互相分发密钥(主节点也需要给自己配置互信),执行命令后需要输入一次目标机器tbase用户的密码:
ssh-copy-id -i /data/tbase/.ssh/id_rsa.pub tbase@172.16.8.248 #在247上执行,密钥路径建议使用绝对路径
ssh-copy-id -i /data/tbase/.ssh/id_rsa.pub tbase@172.16.8.247 #在248上执行,密钥路径建议使用绝对路径
ssh-copy-id -i /data/tbase/.ssh/id_rsa.pub tbase@172.16.8.247 #在247上执行,密钥路径建议使用绝对路径
大小写问题我输错了好几次~~
⑤ 配置权限
分发密钥后,.ssh下会有一个authorized_keys文件,需要添加600或644权限
cd ~/.ssh
chmod 644 authorized_keys
⑥测试互信
ssh 'tbase@172.16.8.248' #247上执行
ssh 'tbase@172.16.8.247' #248上执行
ssh 'tbase@172.16.8.247' #247上执行
两台机器能够互相免密,则互信配置成功。
三、安装部署
1. 获取TBase安装包
① 可以从git或腾讯工蜂直接wget,我直接用之前的V2.1.0版本。
cd /data/tbase
任选一个:
wget https://git clone https://用户名:密码@git.code.tencent.com/Tencent_Open_Source/TBase.git #腾讯工蜂
wget git clone https://github.com/Tencent/TBase #GIT,可能会慢一些
https://pan.baidu.com/s/1FTRykAe0D_UEw9x7bKXhgA 提取码: z31m #我的网盘,TBase版本V2.1.0
② 解压
cd /data/tbase
unzip mirrors-tbase-v2.1.0-release.zip
mv mirrors-tbase-v2.1.0-release.zip /opt #个人习惯把原始安装包统一放在/opt下面
2. 源码编译安装configure
2.1 编译configure
cd /data/tbase/tbase #进入刚刚解压的安装包
chmod +x configure*
./configure --prefix=/data/tbase/tbase_bin_v2.1 --enable-user-switch --with-openssl --with-ossp-uuid CFLAGS=-g #执行脚本编译
大量刷屏后执行完毕。
2.2 安装configure
make clean
make && make install
出现下图时第一步成功了。
3. 安装contrib:
chmod +x contrib/pgxc_ctl/make_signature
cd contrib
make -sj
make install
出现下图则成功。
4. 配置环境变量
tbase用户下的~/.bashrc添加下列配置(所有机器都需要,注意根据自己实际配置添加)
export TBASE_HOME=/data/tbase/tbase_bin_v2.1
export PATH=$TBASE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$TBASE_HOME/lib:${LD_LIBRARY_PATH}
使配置生效:
source ~/.bashrc
截至目前,所有所需基本环境已配置完毕,进入集群初始化阶段。
5. 生成pgxc_ctl模板配置文件
主节点进入pgxc_ctl工具,此时会提醒缺少配置文件,使用命令自动生成模板文件:
pgxc_ctl #进入pgxc_ctl工具
prepare config #生成模板文件
exit #退出pgxc_ctl工具
根据自己实际情况修改pgxc_ctl模板配置文件:
cd /data/tbase/pgxc_ctl
vim pgxc_ctl.conf
:set nu #vim中显示行数
6. 分发二进制包并初始化集群
主节点下,进入pgxc_ctl工具,使用deploy all分发二进制包,使用init all初始化集群:
pgxc_ctl #进入pgxc工具
deploy all #分发二进制包
init all #初始化集群
初始化集群会产生大量刷屏的数据,刷屏结束后,可以使用monitor all 命令查看集群情况。
本次有节点没起来,后面再研究哪里出的问题,估计是pgxc_ctl.conf。
monitor all #查看集群状态
7. 集群访问,创建分布式表
psql -h 172.28.16.239 -p 30004 -d postgres -U tbase
create default node group default_group with (dn001,dn002);
create sharding group to group default_group;
create table t1(id int primary key,name varchar(20));
insert into t1 select generate_series(1,100);
TBase集群起来后,需要创建分布式表才能够使用。
----------2023.7.7 新增一下pgxc_ctl.conf,刚发现以前没放上来。。。。。。
PS:上面文章里的集群已经停止使用了,毕竟三年过去了,所以这份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