
简介介绍:
PanWeiDB数据库:https://www.panwei.tech/
PanWeiDB是基于openGauss,openGauss基于PostgreSQL
操作系统:BCLinux For Euler 21.10
BCLinux For Euler 21.10安装配置图解教程
https://www.osyunwei.com/archives/13044.html
磐维数据库安装包:PanWeiDB_1.0.0_BCLinuxForEuler21.10_x86.tar.gz
ptk安装工具包下载地址:
https://docs.mogdb.io/zh/ptk/v1.1/install
https://cdn-mogdb.enmotech.com/ptk/latest/ptk_linux_x86_64.tar.gz
主节点ip:10.189.189.184 主机名:panweidb-node01
从节点ip:10.189.189.185 主机名:panweidb-node02
从节点ip:10.189.189.186 主机名:panweidb-node03
准备篇(在3台服务器上都进行操作)
1、关闭selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
2、关闭firewall防火墙
vi /etc/yum/pluginconf.d/license-manager.conf
enabled=0 #把1修改为0,禁用yum源认证
:wq! #保存退出
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld
systemctl stop firewalld
yum remove firewalld -y #卸载
3、关闭swap交换分区(如果没有swap分区就不需要操作)
#执行以下命令
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
4、同步系统时间(所有节点统一时间)
rm -rf /etc/localtime #先删除默认的时区设置
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #替换上海/北京作为默认
vi /etc/sysconfig/clock #添加时区
Zone=Asia/Shanghai
:wq! #保存退出
timedatectl set-local-rtc 0
hwclock --systohc -u #系统时钟和硬件时钟同步,当前系统时区不为 UTC,是CST时间,所有要加-u参数
date #显示系统时间
date -s "2025-11-05 15:24:00" #修改时间
watch -n 1 date #显示实时时间
vi /etc/chrony.conf
#pool pool.ntp.org iburst #注释掉
#使用国内 NTP 服务器
server ntp.aliyun.com iburst #阿里云
server ntp.ntsc.ac.cn iburst #中国国家授时中心
:wq! #保存退出
systemctl restart chronyd
systemctl enable chronyd
chronyc makestep #立即校正时间
chronyc sources -v #查看同步状态
chronyc tracking #查看同步详情
chronyc sourcestats #统计各源稳定性
chronyc tracking | grep "Last offset" #验证时间同步精度(包括毫秒级偏移)
5、设置字符集
echo "export LANG=en_US.UTF-8" >> /etc/profile
# 查看字符集
cat /etc/profile | grep -i lang
export LANG=en_US.UTF-8
6、设置网卡MTU值
#高性能内网需要设置,一般不需要设置,使用默认值1500即可
#检查网卡名称
ip addr
#修改mtu后面的参数
ifconfig bond1 mtu 8192 #bond1是网卡名
#查看MTU值
ifconfig bond1|grep mtu
#备注:如果安装过程中提示scp拷贝失败,请修改回来。
7、关闭THP
#检查THP开启情况
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
#关闭THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
8、关闭RemoveIPC
8.1修改/etc/systemd/logind.conf文件中的“RemoveIPC”值为“no”
vi /etc/systemd/logind.conf
RemoveIPC=no
:wq! #保存退出
8.2在/usr/lib/systemd/system/systemd-logind.service中添加参数“RemoveIPC”值为“no”
vi /usr/lib/systemd/system/systemd-logind.service
RemoveIPC=no
:wq! #保存退出
8.3重启服务
systemctl daemon-reload
systemctl restart systemd-logind.service
8.4结果验证确认
loginctl show-session | grep RemoveIPC
systemctl show systemd-logind | grep RemoveIPC
9、系统内核优化
vi /etc/sysctl.conf #添加配置
# panweidb
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_retries1 = 5
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_retries2 = 12
vm.overcommit_memory = 0
net.ipv4.tcp_rmem = 8192 250000 16777216
net.ipv4.tcp_wmem = 8192 250000 16777216
net.core.wmem_max = 21299200
net.core.rmem_max = 21299200
net.core.wmem_default = 21299200
net.core.rmem_default = 21299200
net.ipv4.ip_local_port_range = 26000 65535
kernel.sem = 250 6400000 1000 25600
net.core.somaxconn = 65535
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 60
kernel.shmall = 1073741824
kernel.shmmax = 751619276800
net.ipv4.tcp_sack = 1
net.ipv4.tcp_timestamps = 1
vm.extfrag_threshold = 500
vm.overcommit_ratio = 90
vm.swappiness = 0
:wq! #保存退出
sysctl -p #使配置生效
10、配置资源限制
vi /etc/security/limits.conf #添加配置
# panweidb
* soft nofile 1000000
* hard nofile 1000000
* soft nproc 655360
* hard nproc 655360
* soft memlock unlimited
* hard memlock unlimited
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited
omm hard as unlimited
omm hard nofile 1000000
omm hard nproc unlimited
omm hard stack unlimited
omm soft as unlimited
omm soft nofile 1000000
omm soft nproc unlimited
omm soft stack unlimited
:wq! #保存退出
vi /etc/security/limits.d/90-nproc.conf
# panweidb
* soft nofile 1000000
* hard nofile 1000000
* soft nproc 655360
* hard nproc 655360
* soft memlock unlimited
* hard memlock unlimited
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited
:wq! #保存退出
11、安装数据库依赖包
#安装依赖包
yum install -y numactl libaio-devel flex bison ncurses-devel glibc-devel patch readline-devel python3 bzip2 gcc gcc-c++ zlib-devel ncurses-devel expect
#检查 python3 版本,如果为 Python 3.7.9 则满足要求,如果不满足则需进行编译安装
#BCLinux For Euler 21.10默认已经安装了Python 3.7.9
python3 --version #检查 python3 版本
#修改系统默认的python版本为python3
which python #查找默认的python安装路径
which pip
mv /usr/bin/python /usr/bin/python.bak
mv /usr/bin/pip /usr/bin/pip.bak
ln -sf /usr/bin/python3 /usr/bin/python
ln -sf /usr/bin/pip3 /usr/bin/pip
python --version #检查系统默认的python版本
12、修改主机名
主节点ip:10.189.189.184 主机名:panweidb-node01
从节点ip:10.189.189.185 主机名:panweidb-node02
从节点ip:10.189.189.186 主机名:panweidb-node03
hostnamectl set-hostname panweidb-node01 #主库上执行
hostnamectl set-hostname panweidb-node02 #从库上执行
hostnamectl set-hostname panweidb-node03 #从库上执行
vi /etc/hostname #编辑配置文件
panweidb-node01 #修改localhost.localdomain为panweidb-node01 ,从库修改为panweidb-node02 、panweidb-node03
:wq! #保存退出
13、修改hosts设置
vi /etc/hosts #编辑配置文件
127.0.0.1 panweidb-node01 localhost #修改localhost.localdomain为panweidb-node01,从库修改为panweidb-node02、panweidb-node03
10.189.189.184 panweidb-node01
10.189.189.185 panweidb-node02
10.189.189.186 panweidb-node03
:wq! #保存退出
14、创建用户及用户组
groupadd -g 1101 dbgrp
useradd -g dbgrp -u 1101 -m omm
echo 'DBpwd@210205'|passwd --stdin omm #密码为小于等于15个字符的字符串
15、配置主节点到2个从节点的root 用户和 omm 用户ssh互信
15.1 root用户互信
#在主节点服务器需要操作
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /root/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id root@10.189.189.184 #输入10.189.189.184的root密码
ssh-copy-id root@10.189.189.185 #输入10.189.189.185的root密码
ssh-copy-id root@10.189.189.186 #输入10.189.189.186的root密码
ssh-copy-id root@panweidb-node01 #输入10.189.189.184的root密码
ssh-copy-id root@panweidb-node02 #输入10.189.189.185的root密码
ssh-copy-id root@panweidb-node03 #输入10.189.189.186的root密码
15.2 omm用户互信
#在主节点服务器操作,切换到su - omm用户
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /home/omm/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id omm@10.189.189.184 #输入10.189.189.184的omm密码DBpwd@210205
ssh-copy-id omm@10.189.189.185 #输入10.189.189.185的omm密码
ssh-copy-id omm@10.189.189.186 #输入10.189.189.186的omm密码
ssh-copy-id omm@panweidb-node01 #输入10.189.189.184的omm密码
ssh-copy-id omm@panweidb-node02 #输入10.189.189.185的omm密码
ssh-copy-id omm@panweidb-node03 #输入10.189.189.186的omm密码
#在主服务器测试
ssh 10.189.189.184
ssh 10.189.189.185
ssh 10.189.189.186
ssh panweidb-node01
ssh panweidb-node02
ssh panweidb-node03
16、配置2个从节点到主节点的root 用户和 omm 用户ssh互信
16.1在从节点10.189.189.185执行,
16.1.1配置root互信
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /root/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id root@10.189.189.184 #输入10.189.189.184的root密码
ssh-copy-id root@panweidb-node01 #输入10.189.189.184的root密码
#在从服务器10.189.189.185上测试
ssh 10.189.189.184
ssh panweidb-node01
16.1.2配置omm互信,切换到su - omm用户
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /home/omm/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id omm@10.189.189.184 #输入10.189.189.184的omm密码DBpwd@210205
ssh-copy-id omm@panweidb-node01 #输入10.189.189.184的omm密码
#在从服务器10.189.189.185上测试
ssh 10.189.189.184
ssh panweidb-node01
16.2在从节点10.189.189.186执行,
16.2.1配置root互信
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /root/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id root@10.189.189.184 #输入10.189.189.184的root密码
ssh-copy-id root@panweidb-node01 #输入10.189.189.184的root密码
#在从服务器10.189.189.186上测试
ssh 10.189.189.184
ssh panweidb-node01
16.2.2配置omm互信,切换到su - omm用户
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /home/omm/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id omm@10.189.189.184 #输入10.189.189.184的omm密码DBpwd@210205
ssh-copy-id omm@panweidb-node01 #输入10.189.189.184的omm密码
#在从服务器10.189.189.186上测试
ssh 10.189.189.184
ssh panweidb-node01
安装篇(只在主节点操作)
使用root用户操作
su - root #切换到root用户
1、上传数据库安装包和安装工具包(主节点)
mkdir -p /data/apps/soft #创建包存放目录
mkdir -p /data/apps/ptk #创建PTK安装工具包解压目录
上传数据库安装包PanWeiDB_1.0.0_BCLinuxForEuler21.10_x86.tar.gz和安装工具包ptk_linux_x86_64.tar.gz到/data/apps/soft目录
root用户解压ptk安装工具包到/data/apps/ptk目录(主节点)
cd /data/apps/soft
tar -xf ptk_linux_x86_64.tar.gz -C /data/apps/ptk
生成加密密码
cd /data/apps/ptk
./ptk encrypt A1b2c3@2025
[root@panweidb-node01 /data/apps/ptk]# ./ptk encrypt A1b2c3@2025
DBpwd@210205: pTk6YTRhNDExM2Y9PTxBPUA9Q0pualotaHN4X0taOGNxd2xWMjV2VFNDTXctMUQ1enVKdVpvWTdwcXpiWWeq
用户配置ptk模板文件(主节点)
修改如下模版文件,例如下面是一主两备的配置文件
特别注意格式,空格缩进等
vi /data/apps/ptk/config.yaml
global:
cluster_name: "panweidb"
user: "omm"
group: "dbgrp"
db_password: "pTk6YTRhNDExM2Y9PTxBPUA9Q0pualotaHN4X0taOGNxd2xWMjV2VFNDTXctMUQ1enVKdVpvWTdwcXpiWWeq"
db_port: 5432
base_dir: "/data/apps/panweidb"
log_dir: "/data/apps/panweidb/log/omm"
cm_option:
dir: "/data/apps/panweidb/cm"
cm_server_port: 18800
db_service_vip: ""
gs_initdb_opts:
- "--encoding=UTF-8"
- "--locale=en_US.UTF8"
- "--lc-collate=en_US.UTF8"
- "--lc-ctype=en_US.UTF8"
- "--lc-messages=en_US.UTF8"
- "--dbcompatibility=PG"
ssh_option:
port: 22
user: omm
password: "pTk6YTRhNDExM2Y9PTxBPUA9Q0pualotaHN4X0taOGNxd2xWMjV2VFNDTXctMUQ1enVKdVpvWTdwcXpiWWeq"
db_servers:
- host: 10.189.189.184
role: primary
az_name: "AZ1"
az_priority: 1
db_conf:
synchronous_standby_names: 'dn_6002'
ssh_option:
port: 22
user: omm
password: "pTk6YTRhNDExM2Y9PTxBPUA9Q0pualotaHN4X0taOGNxd2xWMjV2VFNDTXctMUQ1enVKdVpvWTdwcXpiWWeq"
- host: 10.189.189.185
role: standby
az_name: "AZ1"
az_priority: 1
db_conf:
synchronous_standby_names: 'dn_6001'
ssh_option:
port: 22
user: omm
password: "pTk6YTRhNDExM2Y9PTxBPUA9Q0pualotaHN4X0taOGNxd2xWMjV2VFNDTXctMUQ1enVKdVpvWTdwcXpiWWeq"
- host: 10.189.189.186
role: standby
az_name: "AZ1"
az_priority: 1
db_conf:
synchronous_standby_names: 'ANY 2(dn_6001,dn_6002)'
ssh_option:
port: 22
user: omm
password: "pTk6YTRhNDExM2Y9PTxBPUA9Q0pualotaHN4X0taOGNxd2xWMjV2VFNDTXctMUQ1enVKdVpvWTdwcXpiWWeq"
cm_servers:
- host: 10.189.189.184
port: 18800
role: ""
- host: 10.189.189.185
port: 18800
role: ""
- host: 10.189.189.186
port: 18800
role: ""
:wq! #保存退出
#检查环境,确保无Abnormal即可
cd /data/apps/ptk/
./ptk checkos -f config.yaml
# Check Results
Item | Level
------------------------------------+----------
A1.Check_OS_Version | OK
A2.Check_Kernel_Version | OK
A3.Check_Unicode | OK
A4.Check_TimeZone | OK
A5.Check_Swap_Memory_Configure | OK
A6.Check_SysCtl_Parameter | Warning
A7.Check_FileSystem_Configure | OK
A8.Check_Disk_Configure | OK
A9.Check_Logical_Block | OK
A9.Check_BlockDev_Configure | Warning
A10.Check_NR_Request | OK
A10.Check_Asynchronous_IO_Request | OK
A10.Check_IO_Configure | Warning
A11.Check_Network_Configure | OK
A12.Check_Time_Consistency | OK
A13.Check_Firewall_Status | OK
A14.Check_THP_Status | OK
A15.Check_Dependent_Package | OK
A16.Check_CPU_Instruction_Set | OK
A17.Check_Port | OK
A18.Check_Selinux | OK
A19.Check_User_Ulimit | OK
A20.Check_Directory | OK
Total count 23, abnormal count 0, warning count 3
[root@panweidb-node01 ptk]#
#创建目录,所有节点执行
切换到root用户操作
mkdir -p /data/apps/
赋权(所有节点执行)
chown -R omm: /data/apps/
chmod 755 /data/apps/
omm用户安装数据库(主节点)
omm用户执行如下命令安装数据库:
su - omm
cd /data/apps/ptk/
./ptk install --file=/data/apps/ptk/config.yaml --skip-check-os --skip-check-distro --skip-create-user --install-cm --pkg=/data/apps/soft/PanWeiDB_1.0.0_BCLinuxForEuler21.10_x86.tar.gz
? If you continue to install the software,
you are accepting the license agreement of the software.
[Y]: Accept and continue
[C]: Show content of licence agreement
[N]: Abort installation and exit
Please enter (Default [Y]):
[Y]: 接受并继续安装。如果您同意软件的许可协议,请输入 "Y" 并按下回车键继续安装。
[C]: 查看许可协议内容。如果您想查看软件的许可协议内容,请输入 "C" 并按下回车键,然后系统会显示许可协议的具体内容。
[N]: 中止安装并退出。如果您不同意软件的许可协议或不希望继续安装,请输入 "N" 并按下回车键,安装过程将中止并退出。
? [retry: 1] please choose the authentication method to connect root@10.189.189.185: [Use arrows to move, type to filter]
> password
keyfile
选择密码验证
输入密码
? [retry: 1] please choose the authentication method to connect root@10.189.189.186: [Use arrows to move, type to filter]
> password
keyfile
选择密码验证
继续输入密码
注意:我们之前已经设置过ssh免密登录,这一步就不需要再输入密码了
Cluster Name: "panweidb"
+--------------+----------------+-------------+----------+------------+-----------------------------+----------+
| az(priority) | ip | user(group) | port | role | database dir | upstream |
+--------------+----------------+-------------+----------+------------+-----------------------------+----------+
| AZ1(1) | 10.189.189.184 | omm(dbgrp) | db:5432 | db:primary | db:/data/apps/panweidb/database | - |
| | | | cm:18800 | | cm:/data/apps/panweidb/cm | |
| | 10.189.189.185 | omm(dbgrp) | db:5432 | db:standby | db:/data/apps/panweidb/database | - |
| | | | cm:18800 | | cm:/data/apps/panweidb/cm | |
| | 10.189.189.186 | omm(dbgrp) | db:5432 | db:standby | db:/data/apps/panweidb/database | - |
| | | | cm:18800 | | cm:/data/apps/panweidb/cm | |
+--------------+----------------+-------------+----------+------------+-----------------------------+----------+
✔ Is cluster config correct (default=n) [y/n]: y
[Y]: 集群配置正确。如果您确认集群配置信息正确,请输入 "Y" 并按下回车键继续。
[N]: 集群配置不正确。如果您认为集群配置有误,请输入 "N" 并按下回车键,安装程序将中止并退出。
数据库会自动安装,请耐心等待直到安装完成。
cluste_name | host | user | port | status | message
--------------+----------------+------+------+---------------+----------
panweidb | 10.189.189.184 | omm | 5432 | start_success | success
| 10.189.189.185 | omm | 5432 | start_success | success
| 10.189.189.186 | omm | 5432 | start_success | success
[omm@panweidb-node01 ptk]$
如果需要卸载重装,卸载命令如下:
/data/apps/ptk/ptk uninstall --name=panweidb
#查看集群状态
#退出omm用户,再重新切换到omm用户
exit
su - omm
查看集群状态(主节点)
gs_om -t status --detail
#进入控制台
gsql -d postgres -p 5432 -r
安装完成后如果yum源不能使用解决办法
[root@panweidb-node02 ~]# echo $LD_LIBRARY_PATH
/data/apps/panweidb/tool/lib:/data/apps/panweidb/tool/script/gspylib/clib:
#执行这个
unset LD_LIBRARY_PATH
#再次检查,输出为空就正常了
[root@panweidb-node02 ~]# echo $LD_LIBRARY_PATH
yum install telnet #正常使用yum
#使用omm用户创建目录,三个节点都执行
mkdir -p /data/apps/panweidb/pg_audit
mkdir -p /data/apps/panweidb/archive
2、配置数据库基线参数(只在主节点执行)
cp /data/apps/panweidb/data/postgresql.conf /data/apps/panweidb/data/postgresql.conf.bak.`date +"%Y%m%d"`
vi /data/apps/gs_guc_v2.9_20230824.sh #编辑配置
#!/bin/bash
source /home/omm/.bashrc
## 备份参数文件
cp /data/apps/panweidb/database/postgresql.conf /data/apps/panweidb/database/postgresql.conf.bak.`date +"%Y%m%d"`
##连接访问相关参数
##listen_addresses : 数据库服务器监听本地的IP地址,* 监听所有IP,重启生效
##remote_read_mode : 开启远程读功能,non_authentication指不进行证书认证,重启生效
##password_encryption_type : 数据库密码加密类型,1指采用sha256和md5两种方式分别对密码加密
##password_reuse_time : 检查密码重用的天数,0表示不检查
##password_lock_time : 账号的锁定时间,0表示不锁定
##password_effect_time : 密码有效时间,0表示长期有效
##session_timeout : 不进行任何操作的会话断开时间,0表示参数不生效
function SecureAccess(){
gs_guc set -I all -N all -c "listen_addresses = '*'"
gs_guc set -I all -N all -c "password_encryption_type=1"
gs_guc set -I all -N all -c "password_reuse_time=0"
gs_guc set -I all -N all -c "password_lock_time=0"
gs_guc set -I all -N all -c "password_effect_time=0"
gs_guc set -I all -N all -c "session_timeout='0'"
}
##wal相关参数
##wal_level : 写入wal日志信息的详细程度,logical级别的wal信息支持逻辑解析,重启生效
##full_page_writes : 全量检查点情况下,第一次checkpoint后会将每个页面内容全部记录到wal日志,建议设置为off以及使用增量检查点及双写功能
##wal_log_hints : 同full_page_writes,包含提示位的非关键信息,重启生效
##xloginsert_locks : 并发写预写式日志锁的个数,提高写预写式日志的效率,重启生效
##advance_xlog_file_num : 提前初始化xlog文件的数目,在高并发情况下可减少创建xlog文件的性能影响,重启生效
function WAL(){
gs_guc set -I all -N all -c "wal_level=logical"
gs_guc set -I all -N all -c "full_page_writes=off"
gs_guc set -I all -N all -c "wal_log_hints=off"
gs_guc set -I all -N all -c "xloginsert_locks=48"
gs_guc set -I all -N all -c "advance_xlog_file_num=10"
gs_guc set -N all -I all -c "archive_mode=on"
gs_guc set -N all -I all -c "archive_dest='/data/apps/panweidb/archive'"
}
##复制相关参数
##wal_keep_segments : wal文件保留数量,每个文件16MB,增大此值,在重做备库过程中可有效避免wal被移除的错误
##max_wal_senders : 上游节点sender线程的总数量,包括流复制和逻辑复制,重启生效
##most_available_sync : 最大可用模式,当同步备库故障后自动降级为异步,不阻塞主库数据变更,重启生效
##catchup2normal_wait_time : 异步备变同步备过程中,阻塞主库数据变更的时间,0表示不阻塞,重启生效
##enable_slot_log : 将主节点的复制槽信息同步到集群内其他节点,避免集群内各节点的slot不一致
##max_replication_slots : 最大复制槽的数量,包含物理复制槽和逻辑复制槽,重启生效
##wal_receiver_timeout : wal receiver线程超时时间,增加此值可减少由于网络抖动导致的复制关系重建次数
##sync_config_strategy : 该参数用以设置主备节点间数据库参数配置信息的同步方案,由于通常环境中备库服务器配置与主库并非1:1,因此如果同步参数配置,可能导致某些参数对于备库硬件资源而言过大,设置为none_node表示不同步,重启生效
function replicatioxtdSlots(){
gs_guc set -I all -N all -c "wal_keep_segments=1024"
gs_guc set -I all -N all -c "max_wal_senders=16"
gs_guc set -I all -N all -c "most_available_sync=on"
gs_guc set -I all -N all -c "catchup2normal_wait_time=0"
gs_guc set -I all -N all -c "enable_slot_log=on"
gs_guc set -I all -N all -c "max_replication_slots=32"
gs_guc set -I all -N all -c "wal_receiver_timeout=60s"
gs_guc set -I all -N all -c "sync_config_strategy=none_node"
gs_guc set -I all -N all -c "wal_sender_timeout=10s"
}
##日志相关参数
##log_duration : 已完成SQL语句的执行时间是否要记录到日志中,需要结合log_statement使用
##log_line_prefix : 每条日志的前缀信息,时间戳、用户名、数据库名、客户端ip和端口、线程id、会话id
##log_checkpoints : 记录checkpoint信息到日志里
function dbLog(){
gs_guc set -I all -N all -c "log_duration=off"
gs_guc set -I all -N all -c "log_line_prefix='%m %u %d %r %p %S'"
gs_guc set -I all -N all -c "log_checkpoints=on"
gs_guc set -I all -N all -c "temp_file_limit=100GB"
}
##vacuum相关参数
##vacuum_cost_limit : vacuum线程开销限制,达到此值后开始休眠
##autovacuum_max_workers : autovacuum的最大并发数,每个worker都要消耗maintextce_work_mem大小的内存
##autovacuum_naptime : autovacuum的休眠时间,减少此值增加autovacuum的频率,统计信息更准确,但磁盘会更加繁忙
##autovacuum_vacuum_cost_delay : autovacuum的开销延迟,减少此值增加了autovacuum的频率
##autovacuum_io_limits : autovacuum线程每秒触发的io上限
##scale_factor 与 threshold 结合使用,触发条件一般是:表数据量 * scale_factor + threshold
##autovacuum_vacuum_scale_factor : 触发vacuum的缩放系数
##autovacuum_analyze_scale_factor : 触发analyze的缩放系数
##autovacuum_vacuum_threshold : 触发vacuum的阈值
##autovacuum_analyze_threshold : 触发analyze的阈值
function VACUUM(){
gs_guc set -I all -N all -c "vacuum_cost_limit=1000"
gs_guc set -I all -N all -c "autovacuum_max_workers=10"
gs_guc set -I all -N all -c "autovacuum_naptime=20s"
gs_guc set -I all -N all -c "autovacuum_vacuum_cost_delay=10"
gs_guc set -I all -N all -c "autovacuum_vacuum_scale_factor=0.05"
gs_guc set -I all -N all -c "autovacuum_analyze_scale_factor=0.02"
gs_guc set -I all -N all -c "autovacuum_vacuum_threshold=200"
gs_guc set -I all -N all -c "autovacuum_analyze_threshold=200"
gs_guc set -I all -N all -c "autovacuum_io_limits=104857600"
}
##性能统计相关参数
##instr_unique_sql_count : dbe_perf.statement表中的记录数
##enable_wdr_snapshot : 是否开启wdr快照功能,默认每小时执行一次,保留8天时间,类似oracle的AWR
##log_min_duration_statement : 慢sql阈值,执行时间超过这个值的sql会记录到statement_history表中
##track_activity_query_size : 当前执行query的文本字节数,重启生效
##enable_instr_rt_percentile : 是否开启计算系统中80%和95%的SQL响应时间的功能,off表示关闭sql响应时间信息计算功能
function perfStats(){
gs_guc set -I all -N all -c "instr_unique_sql_count=200000"
gs_guc set -I all -N all -c "enable_wdr_snapshot=on"
gs_guc set -I all -N all -c "log_min_duration_statement=200"
gs_guc set -I all -N all -c "track_activity_query_size=2048"
gs_guc set -I all -N all -c "enable_instr_rt_percentile=off"
gs_guc set -I all -N all -c "enable_opfusion=off"
}
##审计参数
##audit_enabled : 审计进程的开启和关闭
##audit_login_logout : 决定是否审计panweidb用户的登录(包括登录成功和登录失败)、注销
##audit_grant_revoke : 是否审计openGauss用户权限授予和回收的操作
##audit_databasebase_process : 是否对openGauss的启动、停止、切换和恢复进行审计
##audit_user_locked : 是否审计openGauss用户的锁定和解锁
##audit_user_violation : 是否审计用户的越权访问操作
##audit_system_object : 数据库对象的CREATE,ALTER,DROP操作审计
##audit_dml_state_select : SELECT操作审计
##audit_dml_state : 表的INSERT、UPDATE和DELETE操作审计
##audit_function_exec : 存储过程和自定义函数的执行审计
##audit_copy_exec : 是否审计COPY操作
##audit_set_parameter : 是否审计SET操作
##audit_xid_info : 是否记录审计日志记录事务ID功能
##audit_directory : 审计文件的存储目录
##audit_resource_policy : 审计日志的保存策略。
##audit_space_limit : 审计文件占用的磁盘空间总量
##audit_file_remain_time : 审计日志文件的最小保存时间,单位天
function audit(){
gs_guc set -N all -I all -c "audit_enabled=on"
gs_guc set -N all -I all -c "audit_login_logout=7"
gs_guc set -N all -I all -c "audit_grant_revoke=1"
gs_guc set -N all -I all -c "audit_databasebase_process=0"
gs_guc set -N all -I all -c "audit_user_locked=0"
gs_guc set -N all -I all -c "audit_user_violation=0"
gs_guc set -N all -I all -c "audit_system_object=0"
gs_guc set -N all -I all -c "audit_dml_state_select=0"
gs_guc set -N all -I all -c "audit_dml_state=0"
gs_guc set -N all -I all -c "audit_function_exec=0"
gs_guc set -N all -I all -c "audit_copy_exec=0"
gs_guc set -N all -I all -c "audit_set_parameter=0"
gs_guc set -N all -I all -c "audit_xid_info=0"
gs_guc set -N all -I all -c "audit_directory='/data/apps/panweidb/pg_audit'"
gs_guc set -N all -I all -c "audit_resource_policy=off"
gs_guc set -N all -I all -c "audit_file_remain_time=7"
gs_guc set -N all -I all -c "audit_space_limit=5GB"
}
##其他参数
##cstore_buffers : 列存共享缓存区大小,在不使用列存存储的场景可将此参数调到最低来节省内存开销,重启生效
##local_syscache_threshold : 每个会话的最大缓存大小,设置过高会引发动态内存不足,即数据库级别的OOM
##standby_shared_buffers_fraction : 备节点使用shared_buffer的比例
##checkpoint_segments : 触发全量checkpoint的wal数量,即使开启增量检查点,此参数依然有效
##checkpoint_completion_target : checkpoint间隔内完成全量checkpoint所需的时间
##max_files_per_process : 进程允许打开的最大文件数量
##behavior_compat_options : 数据库兼容性配置选项,参数值display_leading_zero会展示小数点前面的0
##lc_messages : 信息语言显示格式
##lc_monetary : 货币的显示格式
##lc_numeric : 数值的显示格式
##lc_time : 时间和时区的显示格式
function otherKeyParams(){
gs_guc set -I all -N all -c "cstore_buffers=16MB"
gs_guc set -I all -N all -c "local_syscache_threshold=32MB"
gs_guc set -I all -N all -c "standby_shared_buffers_fraction=1"
gs_guc set -I all -N all -c "checkpoint_segments=1024"
gs_guc set -I all -N all -c "checkpoint_completion_target=0.8"
gs_guc set -I all -N all -c "max_files_per_process=100000"
gs_guc set -I all -N all -c "behavior_compat_options='display_leading_zero'"
gs_guc set -I all -N all -c "lc_messages='en_US.UTF-8'"
gs_guc set -I all -N all -c "lc_monetary='en_US.UTF-8'"
gs_guc set -I all -N all -c "lc_numeric='en_US.UTF-8'"
gs_guc set -I all -N all -c "lc_time='en_US.UTF-8'"
gs_guc set -N all -I all -c "enable_save_databasechanged_timestamp=off"
gs_guc set -N all -I all -c "track_sql_count=off"
gs_guc set -N all -I all -c "enable_instr_rt_percentile=off"
gs_guc set -N all -I all -c "enable_instance_metric_persistent=off"
gs_guc set -N all -I all -c "enable_logical_io_statistics=off"
gs_guc set -N all -I all -c "enable_user_metric_persistent=off"
gs_guc set -N all -I all -c "enable_mergejoin=on"
gs_guc set -N all -I all -c "enable_nestloop=on"
gs_guc set -N all -I all -c "enable_pbe_optimization=off"
gs_guc set -N all -I all -c "enable_asp=on"
gs_guc set -N all -I all -c "recovery_max_workers=4"
gs_guc set -N all -I all -c "enable_alarm=off"
gs_guc set -N all -I all -c "enable_codegen=off"
gs_guc set -N all -I all -c "pagewriter_sleep=200"
gs_guc set -N all -I all -c "update_lockwait_timeout=1min"
gs_guc set -N all -I all -c "lockwait_timeout=1min"
gs_guc set -N all -I all -c "max_size_for_xlog_prune=104857600"
gs_guc set -N all -I all -c "gs_clean_timeout=0"
gs_guc set -N all -I all -c "enable_ustore=off"
gs_guc set -N all -I all -c "random_page_cost=1.5"
}
##max_process_memory : 整个实例允许使用的最大内存,由于要预留一部分内存给操作系统,所以这个参数需要根据RAM大小动态调整,调整规则:RAM * n% / 数据库实例数量,重启生效
##shared_buffers : 行存共享缓存区大小,建议设置为max_process_memory的40%,重启生效
##max_connections : 数据库实例允许的最大连接数,设置过高会引起动态内存不足的错误,需结合业务使用设定,重启生效
##work_mem : 工作内存一般指排序、hash或join占用的内存,对于复杂query,增大此内存可减少临时文件的使用
##maintextce_work_mem : 维护内存一般指vacuum或create index使用的内存,增加此参数可提高效率
##wal_buffers : wal缓存大小,调整此参数对数据库性能有一定影响
##max_prepared_transactions : 预编译事务的数量,建议与max_connections保持一致
## 判断RAM的大小,将数据库内存大小分4个阶梯,分别是0~4GB、4~8GB、8~64GB以及64-nGB.
## 当RAM小于等于4G,建议使用数据库默认参数
## 其他三个阶梯有相应的建议参数值
memory=`free -g|awk '{print $2}' |sed -n 2p`
if [[ $memory -le 4 ]]
then
echo "Defined values of specify parameters or use the default parameters"
else
if [[ $memory -gt 4 ]] && [[ $memory -le 8 ]]
then
gs_guc set -I all -N all -c "max_process_memory=$((memory*6/10))GB"
gs_guc set -I all -N all -c "shared_buffers=$((memory*2/10))GB"
gs_guc set -I all -N all -c "max_connections=500"
gs_guc set -I all -N all -c "work_mem=16MB"
gs_guc set -I all -N all -c "maintextce_work_mem=512MB"
gs_guc set -I all -N all -c "wal_buffers=128MB"
gs_guc set -I all -N all -c "max_prepared_transactions=500"
elif [[ $memory -gt 8 ]] && [[ $memory -le 64 ]]
then
gs_guc set -I all -N all -c "max_process_memory=$((memory*7/10))GB"
gs_guc set -I all -N all -c "shared_buffers=$((memory*2/10))GB"
gs_guc set -I all -N all -c "max_connections=1000"
gs_guc set -I all -N all -c "work_mem=32MB"
gs_guc set -I all -N all -c "maintextce_work_mem=1GB"
gs_guc set -I all -N all -c "wal_buffers=512MB"
gs_guc set -I all -N all -c "max_prepared_transactions=1000"
elif [[ $memory -gt 64 ]]
then
gs_guc set -I all -N all -c "max_process_memory=$((memory*8/10))GB"
gs_guc set -I all -N all -c "shared_buffers=$((memory*3/10))GB"
gs_guc set -I all -N all -c "max_connections=3000"
gs_guc set -I all -N all -c "work_mem=64MB"
gs_guc set -I all -N all -c "maintextce_work_mem=2GB"
gs_guc set -I all -N all -c "wal_buffers=1GB"
gs_guc set -I all -N all -c "max_prepared_transactions=3000"
else
echo "There may be a problem with the script, please contact us for support"
fi
WAL
replicatioxtdSlots
dbLog
VACUUM
perfStats
otherKeyParams
audit
fi
SecureAccess
:wq! #保存退出
#添加执行权限
chmod +x /data/apps/gs_guc_v2.9_20230824.sh
sh /data/apps/gs_guc_v2.9_20230824.sh #执行
#设置访问权限(3个节点都设置)
vi /data/apps/panweidb/data/pg_hba.conf
host all all 10.189.189.0/24 sha256
:wq! #保存退出
#或者用命令行添加IP到所有节点的pg_hba.conf(只在主节点操作)
gs_guc set -Z datanode -N all -I all -h "host all all 10.189.189.0/24 sha256"
# 重启数据库集群(只在主节点操作)
gs_om -t stop && gs_om -t start
gs_om -t status --detail
测试篇
1、创建数据库,只在主库执行
gsql -d postgres -p 5432 -r #进入数据库控制台
CREATE DATABASE test_db DBCOMPATIBILITY 'PG' ENCODING 'UTF8' LC_COLLATE 'en_US.utf8' LC_CTYPE 'en_US.utf8';
#创建数据库test_db
2、创建用户testuser并设置密码
CREATE USER testuser WITH PASSWORD 'A1b2c3@2025';
3、授予用户testuser对数据库test_db具有所有操作权限
gsql -d postgres -p 5432 -r #进入数据库控制台
\c test_db #必须要先用管理员omm账号登录控制台,再切换到test_db数据库,执行下面的命令才能生效
GRANT ALL PRIVILEGES ON DATABASE test_db TO testuser;
4、授予用户对所有表和索引具有全部权限
gsql -d postgres -p 5432 -r
#进入数据库控制台
\c test_db
#必须要先用管理员omm账号登录控制台,再切换到test_db数据库,执行下面的命令才能生效
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO testuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO testuser;
5、授予"testuser"用户对后续创建的所有表和索引具有全部权限
gsql -d postgres -p 5432 -r #进入数据库控制台
\c test_db
#必须要先用管理员omm账号登录控制台,再切换到test_db数据库,执行下面的命令才能生效
GRANT USAGE, CREATE ON SCHEMA public TO testuser;
ALTER DEFAULT PRIVILEGES FOR USER testuser IN SCHEMA public GRANT ALL ON TABLES TO testuser;
ALTER DEFAULT PRIVILEGES FOR USER testuser IN SCHEMA public GRANT ALL ON SEQUENCES TO testuser;
6、创建表panweidbtest
gsql -d test_db -p 5432 -r
#进入数据库控制台
CREATE TABLE panweidbtest (id SERIAL PRIMARY KEY,name VARCHAR(100),age INT);
GRANT ALL PRIVILEGES ON panweidbtest TO testuser;
#允许用户testuser对表具有所有操作权限
7、插入数据
INSERT INTO panweidbtest (name, age) VALUES ('John', 25);
INSERT INTO panweidbtest (name, age) VALUES ('Jane', 30);
8、查看表数据
select * from panweidbtest;
#运行以下命令查询pg_stat_replication视图,以查看当前连接到数据库的从库信息
SELECT application_name, client_addr, sync_state FROM pg_stat_replication;
#主库中执行以下SQL语句来查询流复制的状态
SELECT * FROM pg_stat_replication;
9、导入sql文件到数据库
gsql -d test_db -p 5432 -r -f /tmp/test_db_backup.sql
主备数据库部署Keepalived VIP高可用
#数据库同步模式检查
#主节点
su - omm
gsql -d postgres -p 5432 -r
PanWeiDB=# show synchronous_standby_names;
查询结果应为 dn_6002
#备 1 节点
su - omm
gsql -d postgres -p 5432 -r
PanWeiDB=# show synchronous_standby_names;
查询结果应为 dn_6001
#备 2 节点
su - omm
gsql -d postgres -p 5432 -r
PanWeiDB=# show synchronous_standby_names;
查询结果应为 ANY 2(dn_6001,dn_6002)
安装Keepalived
在主节点和备1节点上操作
yum install keepalived
#备份原有的配置文件
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak`date +"%Y%m%d"`
#主节点的配置文件
vi /etc/keepalived/keepalived.conf
vrrp_script check_primary {
script "/etc/keepalived/check_primary.sh"
interval 1
fall 3
rise 3
}
vrrp_instance VI_1 {
interface ens192 #网卡名称
virtual_router_id 140
state MASTER
nopreempt
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.189.189.184 #主节点IP
unicast_peer {
10.189.189.185 #备1节点IP
}
track_script {
check_primary
}
virtual_ipaddress {
10.189.189.183 #VIP
}
}
:wq! #保存退出
# 备 1 节点
vi /etc/keepalived/keepalived.conf
vrrp_script check_primary {
script "/etc/keepalived/check_primary.sh"
interval 1
fall 3
rise 3
}
vrrp_instance VI_1 {
interface ens192 #band/网卡名称
virtual_router_id 140
state BACKUP
nopreempt
priority 130
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.189.189.185 #备1节点IP
unicast_peer {
10.189.189.184 #主点IP
}
track_script {
check_primary
}
virtual_ipaddress {
10.189.189.183 #VIP
}
}
:wq! #保存退出
配置 Keepalived 检测脚本
# 主节点
vi /etc/keepalived/check_primary.sh
#!/bin/bash
su - omm -c "gs_ctl query -D /data/apps/panweidb/data |grep 'local_role.*Primary' > /dev/null"
if [ $? -eq 0 ];
then
exit 0
else
exit 1
fi
:wq! #保存退出
# 备 1 节点
vi /etc/keepalived/check_primary.sh
#!/bin/bash
su - omm -c "gs_ctl query -D /data/apps/panweidb/data |grep 'local_role.*Primary' > /dev/null"
if [ $? -eq 0 ];
then
exit 0
else
exit 1
fi
:wq! #保存退出
chmod +x /etc/keepalived/check_primary.sh
vi /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -f /etc/keepalived/keepalived.conf"
启动 Keepalived(主节点和备 1 节点依次执行,先主后备)
# 主节点
systemctl daemon-reload
systemctl enable keepalived
systemctl start keepalived
systemctl status keepalived
# 备 1 节点
systemctl daemon-reload
systemctl enable keepalived
systemctl start keepalived
systemctl status keepalived
检查Keepalived
# 主节点
## 检查 keepalived 软件是否启动
ps -ef | grep keepalived
## 查看 VIP 是否挂载
ip a
# 备 1 节点
## 检查 keepalived 软件是否启
ps -ef | grep keepalived
PanWeiDB高可用切换方案
10.189.189.184 主节点
10.189.189.185 备1节点
10.189.189.186 备2节点
10.189.189.183 VIP
## 主库
gsql -d postgres -p 5432 -c "show synchronous_standby_names"
gsql -d postgres -p 5432 -c "show listen_addresses"
## 备库1
gsql -d postgres -p 5432 -c "show synchronous_standby_names"
模拟主库数据库服务异常
对应数据库进程发生故障场景,使用kill的命令杀掉主库数据库服务
1、检查数据库角色及vip是否可以正常切换
2、检查主节点数据库服务是否可以自动拉起
1、主节点查看当前集群状态及VIP挂载
su - omm
gs_om -t status --detail&&ip a|grep -i 10.189.189.183
2、主节点查看数据库服务,并kill -9 模拟故障
su - omm
echo $PGDATA
date && ps -ef | grep $PGDATA | grep -v grep | awk '{print $2}' | xargs kill -9
3、备1节点查看集群状态:
## CM组件已自动切换备1节点为primary,并重新拉起主节点数据库作为standby加入集群,VIP自动漂移到备1节点
su - omm
gs_om -t status --detail&&ip a|grep -i 10.189.189.183
4、恢复最初的主从环境(主节点执行)
su - omm
cm_ctl switchover -n 1 -D /data/apps/panweidb/data
gs_om -t status --detail && ip a|grep -i 10.189.189.183
至此,BCLinux For Euler 21.10安装3节点PanWeiDB数据库集群完成。

②190706903
③203744115
