前言

本文详细阐述了openGauss通过CM管理,实现的VIP故障转移全过程

📣 ## 1.文章前言

📣 ## 2.CM管理两节

✨ 2.1 何为CM

✨ 2.2 CM的特点

高可用:CM易用性提升

	支持一键式关闭CM集群服务;
	支持和内核的安装部署解耦;
	支持按事件调用用户自定义脚本;
	支持CM组件单独升级,增强数据库集群可靠性;
	CM根据配置信息,支持用户自定义组件的监控和管
	
需要注意的是,一主一备模式下,CM只支持基本的安装,启停,检测能力,其他功能不支持。
                                                                         
高可用:CM支持VIP管理
	通过VIP可以直接找到主机,连接重连更准更快(毫秒级别);
	支持主机故障,CM选出新主时,VIP漂移到新的主上;
	当出现双主时,依然可以通过VIP访问到唯一一个主机,降低了双主丢数据的风险。

✨ 2.3 XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <!-- openGauss整体信息 -->
    <CLUSTER>
        <!-- 数据库名称 -->
        <PARAM name="clusterName" value="opengauss" />
        <!-- 数据库节点名称(hostname) -->
        <PARAM name="nodeNames" value="opengauss51m,opengauss51b" />
        <!-- 数据库安装目录,与数据库所需其它路径相互独立,没有包含关系-->
        <PARAM name="gaussdbAppPath" value="/openGauss/app" />
        <!-- 日志目录-->
        <PARAM name="gaussdbLogPath" value="/openGauss/log/omm" />
        <!-- 临时文件目录-->
        <PARAM name="tmpMppdbPath" value="/openGauss/tmp"/>
        <!-- 数据库工具目录-->
        <PARAM name="gaussdbToolPath" value="/openGauss/om" />
        <!-- 数据库core文件目录-->
        <PARAM name="corePath" value="/openGauss/corefile"/>
        <!-- 节点IP,与数据库节点名称列表一一对应 -->
        <PARAM name="backIp1s" value="192.168.6.11,192.168.6.12"/> 
    </CLUSTER>
    <!-- 每台服务器上的节点部署信息 -->
    <DEVICELIST>
        <!-- 节点1上的部署信息 -->
        <DEVICE sn="opengauss51m">
            <!-- 节点1的主机名称 -->
            <PARAM name="name" value="opengauss51m"/>
            <!-- 节点1所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点1的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <PARAM name="backIp1" value="192.168.6.11"/>
            <PARAM name="sshIp1" value="192.168.6.11"/>
            
            <!-- cm主 -->
            <PARAM name="cmsNum" value="1"/>
            <PARAM name="cmDir" value="/openGauss/cm"/>
            <PARAM name="cmServerPortBase" value="15300"/>
            <PARAM name="cmServerListenIp1" value="192.168.6.11,192.168.6.12"/>
            <PARAM name="cmServerHaIp1" value="192.168.6.11,192.168.6.12"/>
            <!-- cmServerlevel目前只支持1 -->
            <PARAM name="cmServerlevel" value="1"/>
            <!-- cms主及所有备的hostname -->
            <PARAM name="cmServerRelation" value="opengauss51m,opengauss51b"/>
            
	      <!--dn-->
      		<PARAM name="dataNum" value="1"/>
	    		<PARAM name="dataPortBase" value="15400"/>
	    		<PARAM name="dataNode1" value="/openGauss/data/dn,opengauss51b,/openGauss/data/dn"/>
          <PARAM name="dataNode1_syncNum" value="0"/>
        </DEVICE>

        <!-- 节点2上的节点部署信息,其中"name"的值配置为主机名称 -->
        <DEVICE sn="opengauss51b">
            <!-- 节点2的主机名称 -->
            <PARAM name="name" value="opengauss51b"/>
            <!-- 节点2所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点2的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <PARAM name="backIp1" value="192.168.6.12"/>
            <PARAM name="sshIp1" value="192.168.6.12"/>
        
        <!-- cm -->
        <PARAM name="cmDir" value="/openGauss/cm"/>
        <PARAM name="cmServerPortStandby" value="15300"/>
        </DEVICE>
    </DEVICELIST>
</ROOT>

openGauss通过VIP实现的故障转移-LMLPHP

📣 ## 3.集群VIP管理

✨ 3.1 增加sudo权限

给omm用户增加sudo权限,所有节点都执行
echo "omm ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers
echo "Cmnd_Alias COMMAND_FLAG = /usr/sbin/ifconfig" >> /etc/sudoers

✨ 3.2 添加VIP

ifconfig ens33:15400 192.168.6.14 netmask 255.255.255.0 up
                                                   
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.11  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 fe80::a281:1dad:5f3f:1be8  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:56:78:64  txqueuelen 1000  (Ethernet)
        RX packets 70129  bytes 10190915 (9.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 445322  bytes 1129835756 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:15400: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.14  netmask 255.255.255.0  broadcast 192.168.6.255
        ether 00:0c:29:56:78:64  txqueuelen 1000  (Ethernet
给集群添加VIP资源 VIP作为openGauss的资源管理
cm_ctl res --add --res_name="VIP_az1" --res_attr="resources_type=VIP,float_ip=192.168.6.14"
将每个实例加到资源中
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=1,res_instance_id=6001" --inst_attr=base_ip=192.168.6.11
cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=2,res_instance_id=6002" --inst_attr=base_ip=192.168.6.12
[omm@opengauss51m ~]$ cm_ctl res --check
cm_ctl: resource config is valid.

执行check完成后,在cmdataPath/cm_agent/目录下会生成一个自定义资源配置文件cm_resource.json,
检查完成没有错误后,需要手动scp将该文件分发到其他节点

✨ 3.3 配置参数

配置/openGauss/data/dn/pg_hba.conf
在数据库pg_hba.conf文件中以sha256方式添加floatIp

host    all    all    192.168.6.14/32     sha256
                                                                                  
--cm集群故障自动切换配置前提条件,通过三方网管实现
cd /openGauss/cm/cm_server
vi cm_server.conf
                                                                                  
third_party_gateway_ip = 192.168.6.8
cms_enable_failover_on2nodes = true         
cms_network_isolation_timeout = 20  

✨ 3.4 重启集群

[omm@opengauss51m ~]$ gs_om -t stop
Stopping cluster.
=========================================
Successfully stopped cluster.
=========================================
End stop cluster.
[omm@opengauss51m ~]$ gs_om -t start
Starting cluster.
======================================================================
Successfully started primary instance. Wait for standby instance.
======================================================================
.
Successfully started cluster.
======================================================================
cluster_state      : Normal
redistributing     : No
node_count         : 2
Datanode State
    primary           : 1
    standby           : 1
    secondary         : 0
    cascade_standby   : 0
    building          : 0
    abnormal          : 0
    down              : 0

Successfully started cluster.
                                                                           查询VIP在哪个节点
[omm@opengauss51m ~]$ cm_ctl show

[  Network Connect State  ]

Network timeout:       6s
Current CMServer time: 2023-11-18 21:03:20
Network stat('Y' means connected, otherwise 'N'):
|  \  |  Y  |
|  Y  |  \  |


[  Node Disk HB State  ]

Node disk hb timeout:    200s
Current CMServer time: 2023-11-18 21:03:21
Node disk hb stat('Y' means connected, otherwise 'N'):
|  N  |  N  |

[  FloatIp Network State  ]

node            instance base_ip      float_ip_name float_ip     
-----------------------------------------------------------------
1  opengauss51m 6001     192.168.6.11 VIP_az1       192.168.6.14 

📣 ## 4.测试故障转移

##本次实验,我们直接对主库关机,验证高可用
[omm@opengauss51b ~]$ gs_om -t status --detail
[  CMServer State   ]

node            node_ip         instance                     state
--------------------------------------------------------------------
1  opengauss51m 192.168.6.11    1    /openGauss/cm/cm_server Down
2  opengauss51b 192.168.6.12    2    /openGauss/cm/cm_server Primary

[   Cluster State   ]

cluster_state   : Degraded
redistributing  : No
balanced        : No
current_az      : AZ_ALL

[  Datanode State   ]

node            node_ip         instance                state            
-------------------------------------------------------------------------
1  opengauss51m 192.168.6.11    6001 /openGauss/data/dn P Down    Unknown
2  opengauss51b 192.168.6.12    6002 /openGauss/data/dn S Primary Normal
                                                                                  
##备库变为主库,VIP也飘逸过来了                                               [omm@opengauss51b ~]$ cm_ctl show

[  Network Connect State  ]

Network timeout:       6s
Current CMServer time: 2023-11-18 22:41:44
Network stat('Y' means connected, otherwise 'N'):
|  \  |  Y  |
|  Y  |  \  |


[  Node Disk HB State  ]

Node disk hb timeout:    200s
Current CMServer time: 2023-11-18 22:41:45
Node disk hb stat('Y' means connected, otherwise 'N'):
|  N  |  N  |

[  FloatIp Network State  ]

node            instance base_ip      float_ip_name float_ip     
-----------------------------------------------------------------
2  opengauss51b 6002     192.168.6.12 VIP_az1       192.168.6.14 

##然后我们启动主库,恢复集群
                                                                           --启动集群
[omm@opengauss51m ~]$ gs_om -t start
[omm@opengauss51b ~]$ gs_om -t status --detail
[  CMServer State   ]

node            node_ip         instance                     state
--------------------------------------------------------------------
1  opengauss51m 192.168.6.11    1    /openGauss/cm/cm_server Standby
2  opengauss51b 192.168.6.12    2    /openGauss/cm/cm_server Primary

[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
balanced        : No
current_az      : AZ_ALL

[  Datanode State   ]

node            node_ip         instance                state            
-------------------------------------------------------------------------
1  opengauss51m 192.168.6.11    6001 /openGauss/data/dn P Standby Normal
2  opengauss51b 192.168.6.12    6002 /openGauss/data/dn S Primary Normal
11-19 08:48