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。