0 说明
panweidb集中式集群为了防止主备切换后应用连接无法切换到新主库,需要配置vip,应用可以只通过该ip与数据库连接,不用感知数据库在哪个节点上。
panweidb中配置 VIP主要依赖 CM 组件的 VIP 仲裁功能,通过回调脚本在主备切换时自动完成 VIP 的漂移。当 cm_agent 监测到本地数据库由备升主后,可执行回调脚本或配置参数将 VIP 绑定到本节点;当本地数据库由主降备后,则自动解除该 VIP 的绑定。
注意:
- 要安装有
net-tools
依赖包,并为集群用户添加ifconfig权限。 - VIP(网卡名:DN端口号)不允许被其他非虚拟IP占用
- 每个节点上cm_resource.json配置文件必须一致。
- 只支持重启方式加载。
- 允许配置多个VIP,但是每个实例最多支持6个。
- 只支持IPV4。
维集中书集群配置vip的总体流程如下:
1 权限配置
ifconfig提权,修改权限文件/etc/sudoers或执行visudo命令,添加以下内容,为集群用户添加ifconfig权限。
root 用户执行:
# 安装网络工具包
yum install -y net-tools# 编辑/etc/sudoers文件
visudo
在文件中找到 root ALL=(ALL) ALL,在该行下方添加以下内容:
omm ALL=(ALL:ALL) NOPASSWD:/sbin/ip,/usr/sbin/arping,/sbin/iptables,/sbin/ifconfig# 赋予各命令执行权限
chmod u+s /usr/bin/sudo
chmod +x /usr/sbin/ip
chmod +x /usr/sbin/arping
chmod +x /usr/sbin/iptables
chmod +x /usr/sbin/ifconfig
2 添加VIP
有三种方式添加VIP:
- 集群安装前配置(推荐)
- 回调脚本绑定
- CM工具配置
2.1 集群安装前配置
这是在数据库集群未安装的场景下配置VIP,通过 cluster_config.xml配置文件指定 VIP 地址。
关注cluster_config.xml文件中的以下参数:
配置项 | 说明 |
---|---|
floatIp | 虚拟 IP 地址 |
dataListenIp | 可选参数,各节点监听 IP,若不配置,则默认使用 backIp1s的值 |
floatIpMap | 可选参数,配置 VIP 时需要配置,表示 floatIp 与 dataListenIp 的对应关系,其顺序与 dataListenIp1 的顺序要相互对应 |
XML示例如下:
正常成功安装好集群后,vip会自动配置好:
2.2 回调脚本绑定
确认网卡信息:
使用数据库安装用户omm,在集群内所有节点的 cm_agent 的配置文件目录下创建 VIP 绑定功能的回调 shell 脚本 cm_callback.sh 文件。
su - omm
cd /database/panweidb/cm/cm_agent
vi cm_callback.sh
添加以下内容,注意根据实际情况调整要绑定的 VIP 网卡名称、广播地址、掩码等参数值:
#!/bin/bash
# -------------------------------------------------------------------------------
# Filename: cm_callback.sh
# Revision: 1.0
# Date: 2019/10/09
# Description:
# Notes:
# callback 仅实现vip 的 添加和移除
#
# -------------------------------------------------------------------------------
#
# -------------------------------------------------------------------------------readonly cb_name=$1
readonly role=$2
readonly scope=$3VIP=192.168.131.18 # vip 地址
VIPBRD=192.168.131.255 # 广播地址
VIPNETMASKBIT=24 # 掩码
VIPDEV=ens33 # 网络接口名称,vip会绑定到该接口
VIPLABEL=1 # 接口标签,默认为1PING_TIMEOUT=2 # 设置为不高于panweidb.yml配置文件里loop_wait的40%,如果loop_wait设置为10,PING_TIMEOUT建议设置为3,如果loop_wait设置为5,建议设置为2function 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"
#ficase $cb_name inon_stop)delvip;;on_start)
if [[ $role == "master" ]]; thenaddvip
fi;;on_role_change)if [[ $role == "master" ]]; thenaddvipelif [[ $role == "slave" ]]||[[ $role == "replica" ]]||[[ $role == "logical" ]]; thendelvipfi;;on_master_check)if [[ $role == "master" ]]; thenvip_status=`/sbin/ip addr|grep ${VIP}`if [[ ${vip_status} == "" ]]; thenecho "`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 ]]; thenecho "`date +%Y-%m-%d\ %H:%M:%S,%3N` WARNING: The vip bind failed, ${VIP} is in use"elseaddvipfififi;; on_slave_check)if [[ $role == "slave" ]]; thenvip_status=`/sbin/ip addr|grep ${VIP}`if [[ ${vip_status} != "" ]]; thendelvipfifi;; *)usage;;
esac
给脚本文件赋执行权限,用于在本节点数据库主备角色发生变化时,自动由集群管理服务执行绑定和释放 VIP 的操作:
chmod u+x cm_callback.sh
接下来,修改集群中每个节点的 cm_agent 配置文件cm_agent.conf 中的 callback_bin_path 参数,将cm_callback.sh脚本路径写入到CM配置文件中。
omm用户执行,切换至数据库安装目录,执行如下命令:
cd /database/panwei/cm/cm_agentvi cm_agent.conf
修改内容:
callback_bin_path = /database/panwei/cm/cm_agent/cm_callback.shvi $GAUSSHOME/bin/alarmConfig.conf
修改内容:
callback_bin_path = /database/panwei/cm/cm_agent/cm_callback.sh
使用数据库安装用户 omm 用户重启集群使 VIP 功能的配置生效:
cm_ctl stop
cm_ctl start
查看vip:
主库在结点3.
在主库查看IP:
2.3 CM工具配置
这个方式主要是带CM的数据库集群已安装的场景下配置VIP,通过cm_ctl res命令新增floatIp资源。
在每个节点上用数据库安装用户执行以下命令:
# 新增VIP资源,res_name为资源名称,资源类型resources_type必须指定为VIP,float_ip表示该自定义VIP资源的虚拟ip
cm_ctl res --add --res_name="VIP_az1" --res_attr="resources_type=VIP,float_ip=192.168.131.18"# 编辑各自定义VIP资源VIP_az1,添加节点,node_id表示对应的节点id,res_instance_id用于告知CM绑定的DN实例id,需要与对应的DN实例id对应
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=1,res_instance_id=6001" --inst_attr="base_ip=192.168.131.14"
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=2,res_instance_id=6002" --inst_attr="base_ip=192.168.131.15"
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=3,res_instance_id=6003" --inst_attr="base_ip=192.168.131.16"# 使用cm_ctl res --check命令进行检查
cm_ctl res --check
执行完成后,在/database/panweidb/cm/cm_agent/目录下会生成一个自定义资源配置文件cm_resource.json,示例如下:
{"resources": [{"name": "VIP_az1","resources_type": "VIP","instances": [{"node_id": 1,"res_instance_id": 6001,"inst_attr": "base_ip=192.168.131.14"}, {"node_id": 2,"res_instance_id": 6002,"inst_attr": "base_ip=192.168.131.15"}, {"node_id": 3,"res_instance_id": 6003,"inst_attr": "base_ip=192.168.131.16"}],"float_ip": "192.168.131.18"}]
使用数据库安装用户 omm 用户重启集群使 VIP 功能的配置生效:
cm_ctl stop
cm_ctl start
3 修改
需要先删除再添加,直接使用edit命令不生效。
在每个数据库节点,使用数据库管理用户执行,删除VIP资源:
cm_ctl res --del --res_name="VIP_az1"
新增VIP资源,res_name为资源名称,资源类型resources_type必须指定为VIP,float_ip表示该自定义VIP资源的虚拟ip:
cm_ctl res --add --res_name="VIP_az1" --res_attr="resources_type=VIP,float_ip=192.168.131.18"
编辑各自定义VIP资源VIP_az1,添加节点,node_id表示对应的节点id,res_instance_id用于告知CM绑定的DN实例id,需要与对应的DN实例id对应:
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=1,res_instance_id=6001" --inst_attr="base_ip=192.168.131.14"
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=2,res_instance_id=6002" --inst_attr="base_ip=192.168.131.15"
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=3,res_instance_id=6003" --inst_attr="base_ip=192.168.131.16"
使用cm_ctl res --check命令进行检查:
cm_ctl res --check
check后检查自定义资源配置文件cm_resource.json是否有配置了。
配置无误后重启集群生效。
cm_ctl stop
cm_ctl start
4 删除
删除vip的场景应该不多,除非是配置的VIP与其他IP冲突了。
在每个节点上用数据库安装用户执行以下命令:
cm_ctl res --del --res_name="VIP_az1"
cm_ctl res --check
删除后查看资源提示null:
并且自定义资源配置文件cm_resource.json是空的:
依旧是重启生效。
5 总结
通过以上配置,磐维数据库集中式集群能够实现 VIP 的自动漂移,保障数据库高可用性,简化应用连接管理,提升系统稳定性与可靠性。
此外,对于多中心集群,如果没有额外的硬件网络设施支持,一个VIP无法同时服务于多个中心,所以需要为每个中心或az配置一个VIP。