VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

HAS配置文件参数说明

vastbase.yml

关键参数说明

Global/Universal相关配置

  • scope:集群名称。

  • name:主机名,两个节点不能相同。

  • HAS相关配置

    • ttl:主库存活时间,超出此时间主库未更新状态即执行failover。至少为loop_wait 的3倍,低于则无法启动。

    • loop_wait:HAS两次循环间隔时间,至少为5,低于5 时HAS无法启动。

    • arbitration_file_path:仲裁存储路径。

    • arbitration_file_type:仲裁存储类型,目前实现方案为raw,即裸设备仲裁。

    • node_index:该节点写入仲裁设备的分区,只能为1或2,且该值两个节点不能相同。

    • gateway:本节点HAS用以网络自检的地址。若HAS ping 该地址失败则执行failover。一般设置为网关地址。

postgresql相关配置

  • callbacks:均为回调脚本has_callback.sh路径。

  • connect_address:当前节点ip及数据库端口。

  • data_dir:数据库实例路径,备节点则为预备的挂载点中的数据实例目录。

  • config_dir:数据库实例配置文件路径。

  • bin_dir:数据库可执行文件路径。

  • vastbase_lib_dir:数据库共享库路径。

  • vastbase_home:数据库安装路径。

  • pre_promote:mount.sh脚本路径。

  • pre_demote:umount.sh脚本路径。

  • pre_switchover:switchover前置检查脚本,用于检查是否有除本实例数据库进程之外的数据库在使用挂载点目录。

  • superuser

    • username:数据库超级用户名称。

    • password:数据库超级用户密码。

vastbase.yml文件模板

scope: vastbase                                              # 集群实例名称
namespace: /vastbase/                                        # 集群实例所在的命名空间,默认是/service
name: 'vastbase_node2'                                      # 节点在集群内的名称,每个节点都必须不一样,通过hasctl list命令查看高可用集群状态时,在Member显示该名称

has:
  ttl: 30                                                     # 持有单个DCS key的最长时间,单位秒,例如主节点持有leader key,如果不能再该时间内更新leader key,那么可以认为发生failover
  loop_wait: 10                                               # patroni两次执行工作之间的时间间隔,单位秒
  retry_timeout: 10                                           # 重试次数
  arbitration_file_path: /dev/sdc
  arbitration_file_type: raw
  node_index: 1
  gateway: 172.xx.103.254

postgresql:
  callbacks:
    on_start: /home/vastbase/has/bin/has_callback.sh     # 回调脚本路径,一般用于管理VIP
    on_stop: /home/vastbase/has/bin/has_callback.sh
    on_role_change: /home/vastbase/has/bin/has_callback.sh
    on_master_check: /home/vastbase/has/bin/has_callback.sh
  listen: 0.0.0.0:5432                                      # 设置数据库的监听地址,此处的配置会覆盖postgresql.conf的listen_addresses和port参数,如果此处没有配置端口号,默认监听5432端口。此处无论是否配置端口号,postgresql.conf配置的port参数都会被覆盖
  connect_address: 172.xx.102.74:5432
  use_unix_socket: true
  pg_ctl_timeout: 600                                         # 数据库启动超时时间,根据实际情况设置
  data_dir: /data/vastbase                                # 数据库实例路径
  config_dir: /data/vastbase                              # 数据库实例配置文件路径
  bin_dir: /home/vastbase/local/vastbase/bin         # 数据库可执行文件路径
  vastbase_lib_dir: /home/vastbase/local/vastbase/lib:/home/vastbase/local/vastbase/jre/lib/aarch64:/home/vastbase/local/vastbase/jre/lib/aarch64/server         # 数据库共享库路径,根据实际路径配置
  vastbase_home: /home/vastbase/local/vastbase                # 数据库安装路径
  pre_promote: /home/vastbase/has/bin/mount.sh
  pre_demote: /home/vastbase/has/bin/umount.sh
  pre_switchover: /home/vastbase/has/bin/check_switchover.sh
  authentication:
    superuser:
      username: vbadmin
      password: Vbase@admin

has_callback.sh

关键配置项含义

  • After:指定HAS服务在‘network’启动成功后启动。
  • Type:一般设置为simple即可,如操作系统支持exec,则配置为exec。
  • User:HAS运行过程中可能会初始化或者启动数据库,这些操作不能以‘root’用户执行,故指定该服务的用户跟数据库用户一致为‘vastbase’。
  • ExecStopPost:指定HAS进程终止后执行的命令,需要使用绝对路径指定命令路径,在HAS服务中,用于释放VIP与取消数据存储挂载。
  • ExecStartPre:指定HAS进程执行前执行的命令,需要使用绝对路径指定命令路径,在HAS服务中,用于检测与添加仲裁设备的读写权限。
  • TimeoutStopSec:设置等待关闭的超时时间。

文件模板

#!/bin/bash
# -------------------------------------------------------------------------------
# Filename:    has_callback.sh
# Revision:    1.0
# Date:        2019/10/09
# Description: 
# Notes:       
#      callback 仅实现vip 的 添加和移除        
#              
# -------------------------------------------------------------------------------
# 
# -------------------------------------------------------------------------------
readonly cb_name=$1
readonly role=$2
readonly scope=$3


VIP=172.xx.102.5  # vip 地址
#VIP=2001::e1:172:16:102:5
VIPBRD=172.xx.103.255 # 广播地址
VIPNETMASKBIT=22   # 掩码
VIPDEV=ens33     # 网络接口名称,vip会绑定到该接口
VIPLABEL=1   # 接口标签,默认为1

PING_TIMEOUT=2 # 设置为不高于vastbase.yml配置文件里loop_wait的40%,如果loop_wait设置为10,PING_TIMEOUT建议设置为3,如果loop_wait设置为5,建议设置为2

function usage() {
    echo "Usage: $0 <on_start|on_stop|on_role_change> <role> <scope>";
    exit 1;
}

function addvip(){
    echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` INFO: /sbin/ip addr add ${VIP}/${VIPNETMASKBIT} brd ${VIPBRD} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}"
    sudo /sbin/ip addr add ${VIP}/${VIPNETMASKBIT} brd ${VIPBRD} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}
    sudo /usr/sbin/arping -q -A -c 1 -I ${VIPDEV} ${VIP}
    #sudo /sbin/iptables -F

}

function delvip(){
    echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` INFO: sudo /sbin/ip addr del ${VIP}/${VIPNETMASKBIT} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}"
    sudo /sbin/ip addr del ${VIP}/${VIPNETMASKBIT} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}
    sudo /usr/sbin/arping -q -A -c 1 -I ${VIPDEV} ${VIP}
    #sudo /sbin/iptables -F
    
}

if [[ $cb_name != 'on_master_check'  ]]; then
    echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` WARNING: has callback $cb_name $role $scope"
fi

case $cb_name in
    on_stop)
        delvip
        ;;
    on_start)
	if [[ $role == 'master' ]]; then
	    addvip
	fi
        ;;
    on_role_change)
        if [[ $role == 'master' ]]; then
            addvip
        elif [[ $role == 'slave' ]]||[[ $role == 'replica' ]]||[[ $role == 'logical' ]]; then
            delvip
        fi
        ;;
    on_master_check)
        if [[ $role == 'master' ]]; then
            vip_status=`ip addr|grep ${VIP}`
            if [[ ${vip_status} == '' ]]; then
                echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` WARNING: has callback $cb_name $role $scope"
                echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` WARNING: The vip was lost,bind vip because i am leader"
                /usr/bin/ping -I ${VIPDEV} -q -c 3 -W ${PING_TIMEOUT} ${VIP}
                is_vip_used=$?
                if [[ $is_vip_used -eq 0 ]]; then
                    echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` WARNING: The vip bind failed, ${VIP} is in use"
                else
                    addvip
                fi
            fi
        fi
        ;;  
    *)
        usage
        ;;
esac

mount.sh脚本

文件模板

#!/bin/bash

#-------------------------
# 在启动数据库前挂载共享数据存储
#-------------------------

#uuid,通过blkid查看
uuid=55d511bd-4a14-4779-b22f-8c6d2ee09c48
mount_point=/data
#物理卷名
vg_name=vg1

sudo mountpoint -q ${mount_point}
mountstatus=$?

if [ ${mountstatus} -ne 0 ]; then
    sudo vgchange -ay ${vg_name}
    sudo mount -U ${uuid} ${mount_point}
fi
exit 0

umount.sh脚本

文件模板

#!/bin/bash

#-----------------------------------
# 在切换或停库后进行umount操作
#-----------------------------------

# 脚本执行模式,分为once 和 loop
readonly mode=$1

#挂载点路径
mount_point=/data
#物理卷名
vg_name=vg1
#sd_hasctl路径
ctl_path=/home/vastbase/has/bin/sd_hasctl
#配置文件路径
config_path=/home/vastbase/has/etc/vastbase.yml

#先打印正在使用挂载点的进程
sudo lsof ${mount_point}

# 先删掉正在使用挂载点的进程
mount_count=`sudo lsof ${mount_point}|wc -l`
if [ ${mount_count} -gt 1 ]; then
    echo "start to kill process using mount point ${mount_point}"
    sudo lsof ${mount_point}|awk 'NR==1 {next} {print $2}'| xargs sudo kill -9
fi

sudo umount ${mount_point}
sudo mountpoint -q ${mount_point}
umountstatus=$?

if [ ${mode} == "once" ]; then
    if [ ${umountstatus} -ne 0 ]; then
        sudo vgchange -an ${vg_name}
        exit 0
    else
        exit 1
    fi
#循环尝试umount,通过umountstatus查看挂载点状态
elif [ ${mode} == "loop" ]; then
    while [ ${umountstatus} -eq 0 ]; do
        sleep 2
        sudo umount ${mount_point}
        sudo mountpoint -q ${mount_point}
        umountstatus=$?
    done
    sudo vgchange -an ${vg_name}
else
    echo "Error: mode must be once or loop."
    exit 1
fi

check_arbitrator.sh

文件模板

#!/bin/bash

#验证仲裁设备权限,如无权限则添加

arbitrator='/dev/sdc'

#检查读权限
if [ ! -r ${arbitrator} ]
then
    sudo chmod o+r ${arbitrator}
fi

#检查写权限
if [ ! -w ${arbitrator} ]
then
    sudo chmod o+w ${arbitrator}
fi

exit 0

check_switchover.sh

文件模板

#!/bin/bash

#-----------------------------------
# switchover时检查是否能够进行umount
#-----------------------------------

readonly db_pid=$1

#挂载点路径
mount_point=/data
mount_count=0
if [ ${db_pid} == '0' ]; then
    mount_count=`sudo lsof ${mount_point}|awk 'NR==1 {next} {print $2}'|wc -l`
else
    mount_count=`sudo lsof ${mount_point}|awk 'NR==1 {next} {print $2}'|grep -v ${db_pid}|wc -l`
fi

if [ ${mount_count} -gt 0 ]; then
    exit 1
fi

has.service

文件模板

[Unit]
Description=Vastbase HAS server daemon

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=vastbase
EnvironmentFile=-/etc/sysconfig/vastbase-has
ExecStartPre=/usr/bin/bash /home/vastbase/has/bin/check_arbitrator.sh
ExecStart=/home/vastbase/has/bin/sd_has $CONFIG_FILE
ExecStopPost=/usr/bin/bash /home/vastbase/has/bin/umount.sh loop
ExecStopPost=/bin/sudo /usr/sbin/ip addr del ${VIP}/${VIPNETMASKBIT} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}
Restart=no
LimitMEMLOCK=infinity
LimitNOFILE=1024000
TimeoutStopSec=1024000

vastbase-has

文件模板

CONFIG_FILE=/home/vastbase/has/etc/vastbase.yml
VIP=172.xx.102.5
VIPBRD=172.xx.103.255
VIPNETMASKBIT=22
VIPDEV=ens33
VIPLABEL=1