openGauss 统一数据库管理工具 :CM支持VIP仲裁
CM支持VIP仲裁
简介: VIP是虚拟IP,随主DN状态进行动态绑定和切换,即如果DN主发生了切换,原主DN上的虚拟IP可能动态绑定到新主DN上,用户可以只通过该IP与数据库连接,不用感知数据库在哪个节点上。
仲裁流程:
原主:
- 在原主上解绑VIP。
- 把VIP从数据库配置项"listen_addresses"中删除
新主:
- 在新主上用别名(网卡名:DN端口号)方式绑定VIP。
- 把VIP添加到数据库配置项 “listen_addresses” 中。
功能开启:在数据库实例节点上每一个cm_agent数据目录下生成cm_resource.json配置文件,文件中包含VIP的json字段,可通过cm_ctl工具命令生成VIP配置文件,参考命令,可以通过•执行res命令:cm_ctl show方法查看VIP信息。
说明: 在选主成功,业务恢复后,5s内VIP可以生效。
约束:
-
不支持沙箱环境。
-
不支持灾备集群。
-
VIP(网卡名:DN端口号)不允许被其他非虚拟IP占用
-
每个节点上cm_resource.json配置文件必须一致。
-
只支持重启方式加载。
-
允许配置多个VIP,但是每个实例最多支持6个。
-
只支持IPV4。
-
需要可用VIP,即需要可对外提供服务的VIP(跟现有网卡处于同一网段中)。
VIP配置操作步骤:
- 数据库集群未安装的场景下配置VIP
- ifconfig提权 修改权限文件/etc/sudoers或执行visudo命令,添加以下内容,为集群用户添加ifconfig权限。
Cmnd_Alias COMMAND_FLAG = /usr/sbin/ifconfig
集群用户名 ALL=(root) NOPASSWD: COMMAND_FLAG
也可以缩小权限范围,例如:
Cmnd_Alias COMMAND_FLAG = /usr/sbin/ifconfig * netmask * up, /usr/sbin/ifconfig * down
集群用户名 ALL=(root) NOPASSWD: COMMAND_FLAG
说明: /usr/sbin/ifconfig表示ifconfig的绝对路径,需要根据实际环境情况修改
警告: 由于需要动态绑定和解绑VIP,需要对网卡进行操作,故而需要对ifconfig进行提权,允许集群用户使用sudo ifconfig方式绑定和解绑VIP,此操作可能带来窃听、篡改、仿冒、拒绝服务等安全风险。提权操作,可参考安全设计->ifconfig 提权步骤
- 安装集群使用的xml文件中配置VIP相关配置项,一个配置示例文件如下
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<CLUSTER>
<PARAM name="clusterName" value="mycluster"/>
<PARAM name="nodeNames" value="node1,node2,node3,node4,node5,node6,node7"/>
<PARAM name="gaussdbAppPath" value="/install_path/app"/>
<PARAM name="gaussdbLogPath" value="/install_path/log"/>
<PARAM name="tmpMppdbPath" value="/install_path/tmp"/>
<PARAM name="gaussdbToolPath" value="/install_path/om"/>
<PARAM name="corePath" value="/install_path/corefile"/>
<PARAM name="backIp1s" value="10.10.10.10,10.10.10.11,10.10.10.12,20.20.20.20,20.20.20.21,30.30.30.30,30.30.30.31"/>
<PARAM name="floatIp1" value="10.10.10.100"/>
<PARAM name="floatIp2" value="20.20.20.100"/>
<PARAM name="floatIp3" value="30.30.30.100"/>
</CLUSTER>
<DEVICELIST>
<DEVICE sn="node1">
<PARAM name="name" value="node1"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
<PARAM name="backIp1" value="10.10.10.10"/>
<PARAM name="sshIp1" value="10.10.10.10"/>
<PARAM name="dataNum" value="1"/>
<PARAM name="dataPortBase" value="12600"/>
<PARAM name="dataNode1" value="/install_path/data/dn1,node2,/install_path/data/dn1/,node3,/install_path/data/dn1/"/>
<PARAM name="dataNode1_syncNum" value="1"/>
<PARAM name="dataListenIp1" value="10.10.10.10,10.10.10.11,10.10.10.12,20.20.20.20,20.20.20.21,30.30.30.30,30.30.30.31"/>
<PARAM name="floatIpMap1" value="floatIp1,floatIp1,floatIp1,floatIp2,floatIp2,floatIp3,floatIp3"/>
<PARAM name="cmDir" value="/install_path/cm"/>
<PARAM name="cmsNum" value="1"/>
<PARAM name="cmServerPortBase" value="13600"/>
<PARAM name="cmServerlevel" value="1"/>
<PARAM name="cmServerListenIp1" value="10.10.10.10,10.10.10.11,10.10.10.12,20.20.20.20,20.20.20.21,30.30.30.30,30.30.30.31"/>
<PARAM name="cmServerRelation" value="node1,node2,node3,node4,node5,node6,node7"/>
</DEVICE>
<DEVICE sn="node2">
<PARAM name="name" value="node2"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
<PARAM name="backIp1" value="10.10.10.11"/>
<PARAM name="sshIp1" value="10.10.10.11"/>
<PARAM name="cmDir" value="/install_path/cm"/>
</DEVICE>
<DEVICE sn="node3">
<PARAM name="name" value="node2"/>
<PARAM name="azName" value="AZ1"/>
<PARAM 