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