openGauss 统一数据库管理工具 :CM支持VIP仲裁

CM支持VIP仲裁

简介: VIP是虚拟IP,随主DN状态进行动态绑定和切换,即如果DN主发生了切换,原主DN上的虚拟IP可能动态绑定到新主DN上,用户可以只通过该IP与数据库连接,不用感知数据库在哪个节点上。

仲裁流程:

原主:

  1. 在原主上解绑VIP。
  2. 把VIP从数据库配置项"listen_addresses"中删除

新主:

  1. 在新主上用别名(网卡名:DN端口号)方式绑定VIP。
  2. 把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
  1. 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 提权步骤

  1. 安装集群使用的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 name="azPriority" value="1"/>
            <PARAM name="backIp1" value="10.10.10.12"/>
            <PARAM name="sshIp1" value="10.10.10.12"/>
            <PARAM name="cmDir" value="/install_path/cm"/>
        </DEVICE>

        <DEVICE sn="node4">
            <PARAM name="name" value="node4"/>
            <PARAM name="azName" value="AZ2"/>
            <PARAM name="azPriority" value="2"/>
            <PARAM name="backIp1" value="20.20.20.20"/>
            <PARAM name="sshIp1" value="20.20.20.20"/>
            <PARAM name="cmDir" value="/install_path/cm"/>
        </DEVICE>

        <DEVICE sn="node5">
            <PARAM name="name" value="node5"/>
            <PARAM name="azName" value="AZ2"/>
            <PARAM name="azPriority" value="2"/>
            <PARAM name="backIp1" value="20.20.20.21"/>
            <PARAM name="sshIp1" value="20.20.20.21"/>
            <PARAM name="cmDir" value="/install_path/cm"/>
        </DEVICE>

        <DEVICE sn="node6">
            <PARAM name="name" value="node6"/>
            <PARAM name="azName" value="AZ3"/>
            <PARAM name="azPriority" value="3"/>
            <PARAM name="backIp1" value="30.30.30.30"/>
            <PARAM name="sshIp1" value="30.30.30.30"/>
            <PARAM name="cmDir" value="/install_path/cm"/>
        </DEVICE>

        <DEVICE sn="node7">
            <PARAM name="name" value="node7"/>
            <PARAM name="azName" value="AZ3"/>
            <PARAM name="azPriority" value="3"/>
            <PARAM name="backIp1" value="30.30.30.31"/>
            <PARAM name="sshIp1" value="30.30.30.31"/>
            <PARAM name="cmDir" value="/install_path/cm"/>
        </DEVICE>
    </DEVICELIST>
</ROOT>

该示例为一个两地三中心(3az,3+2+2)的配置文件示例 其中与VIP功能相关的几个重点配置项为

<PARAM name="floatIp1" value="10.10.10.100"/>
<PARAM name="floatIp2" value="20.20.20.100"/>
<PARAM name="floatIp3" value="30.30.30.100"/>

<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)"/>

floatIp1、floatIp2、floatIp3为各节点或各az对应的VIP地址,用户需要保证VIP地址为可用VIP,即需要可对外提供服务的VIP(跟现有网卡处于同一网段中)
dataListenIp1为各节点监听ip,该选项可以不配置,若不配置,则默认使用backIp1s的值
floatIpMap1表示floatIp与dataListenIp的对应关系,其顺序与dataListenIp1的顺序要相互对应

  1. 使用xml进行安装

安装成功后VIP便会自动绑定到对应的主机上,可以使用cm_ctl show命令查看VIP状态

  • 带CM的数据库集群已安装的场景下配置VIP
  1. ifconfig提权

  2. 配置自定义资源文件cm_resource.json

通过cm_ctl res命令新增floatIp资源,仍以上述的xml中的节点情况为例

# 新增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=10.10.10.100"
cm_ctl res --add --res_name="VIP_az2" --res_attr="resources_type=VIP,float_ip=20.20.20.100"
cm_ctl res --add --res_name="VIP_az3" --res_attr="resources_type=VIP,float_ip=30.30.30.100"
# 编辑各自定义VIP资源VIP_az1、VIP_az2、VIP_az3,添加节点,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=10.10.10.10"
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=2,res_instance_id=6002" --inst_attr="base_ip=10.10.10.11"
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=3,res_instance_id=6003" --inst_attr="base_ip=10.10.10.12"
cm_ctl res --edit --res_name="VIP_az2" --add_inst="node_id=4,res_instance_id=6004" --inst_attr="base_ip=20.20.20.20"
cm_ctl res --edit --res_name="VIP_az2" --add_inst="node_id=5,res_instance_id=6005" --inst_attr="base_ip=20.20.20.21"
cm_ctl res --edit --res_name="VIP_az3" --add_inst="node_id=6,res_instance_id=6006" --inst_attr="base_ip=30.30.30.30"
cm_ctl res --edit --res_name="VIP_az3" --add_inst="node_id=7,res_instance_id=6007" --inst_attr="base_ip=30.30.30.31"

执行完成后,建议使用cm_ctl res --check命令进行检查。自定义资源文件要求每个节点都要有且一致,检查完成没有错误后,需要手动将该文件分发到其他节点,分发完成后需要重启集群才能生效。该配置文件对格式要求比较严格,所以该操作不建议使用直接修改文件的方式配置,建议配置后使用cm_ctl res --check命令进行校验。

执行完成后,在cmdataPath/cm_agent/目录下会生成一个自定义资源配置文件cm_resource.json,示例如下:

{
    "resources":
        [{"name": "VIP_az1",
          "resources_type": "VIP",
          "instances":
              [{"node_id":      1,
                "res_instance_id":      6001,
                "inst_attr":    "base_ip=10.10.10.10"
              },
              {"node_id":      2,
                "res_instance_id":      6002,
                "inst_attr":    "base_ip=10.10.10.11"
              },
              {"node_id":      3,
                "res_instance_id":      6003,
                "inst_attr":    "base_ip=10.10.10.12"
              }],
          "float_ip":     "10.10.10.100"
        },
        {
          "name": "VIP_az2",
          "resources_type": "VIP",
          "instances":
              [{"node_id":      4,
                "res_instance_id":      6004,
                "inst_attr":    "base_ip=20.20.20.20"
              },
              {"node_id":      5,
                "res_instance_id":      6005,
                "inst_attr":    "base_ip=20.20.20.21"
              }],
          "float_ip":     "20.20.20.100"
        },
        {
          "name": "VIP_az3",
          "resources_type": "VIP",
          "instances":
              [{"node_id":      6,
                "res_instance_id":      6006,
                "inst_attr":    "base_ip=30.30.30.30"
              },
              {"node_id":      7,
                "res_instance_id":      6007,
                "inst_attr":    "base_ip=30.30.30.31"
              }],
          "float_ip":     "30.30.30.100"
        }]
}
  1. 在数据库pg_hba.conf文件中以sha256方式添加floatIp

 说明: 对于多中心集群,如果没有额外的硬件网络设施支持,一个VIP无法同时服务于多个中心,所以需要为每个中心或az配置一个VIP。

模式:

  • CM支持的DN仲裁模式主要分为:
    • Quorum 模式:基于多数派模式仲裁,选出同步备

      • 简介:CM 基于Quorum模式进行仲裁,当DN分片处于无主场景时,CM在多数派DN redo完成后,选择 term和lsn最大的节点(同步备)发送failover升主。
      • 约束:最小满足一主两备集群
    • DCF 模式:

      • 自动选主模式:基于paxos 协议:

        • 简介:dcf模式自动选主,在此场景下,CM不再进行对DN选主,只负责数据采集,假死检测等。
        • 约束:switchover只能使用cm_ctl switchover -n NODEID -D DATADIR
        • CM配置:enable_dcf=ON、dn_arbitrate_mode=paxos
        • DN配置:enable_dcf=ON
      • 总体约束:

        • 最小满足一主两备集群
      • 默认安装:DCF自动选主模式

    • 资源池化模式:

      • 简介:在此场景下,CM不再进行对DN选主,只负责数据采集,假死检测等。
      • CM配置:dn_arbitrate_mode=share_disk
      • 介绍和约束:参考资源池化。
posted @ 2024-10-14 14:29  openGauss-bot  阅读(121)  评论(0)    收藏  举报