• openGauss+KeepAlived(故障转移)


    openGauss+KeepAlived(故障转移)

    https://zhuanlan.zhihu.com/p/401672787

    操作系统: CentOS 7.6
    数据库版本: openGauss 1.1.0
    Primary 主机/IP: opengaussdb1/192.168.1.11 (openGauss主备已部署完毕)
    Standby 主机/IP: opengaussdb2/192.168.1.12 (openGauss主备已部署完毕)

    Tips:
    不建议在云环境(如:华为云)下搭建Keepalived进行测试,本人在云环境下测试发现,Keepalived的VIP无法在云环境下与其他主机通信,云环境下如何使用该VIP建议咨询云服务厂商。在踩坑之后,选择使用本地的VMWare workstation进行简单测试。

    1. 安装KeepAlived软件

    ## 在所有节点执行安装
    yum install keepalived -y
    
    • 1
    • 2

    2. 配置keepalived

    Tips: 采用nopreempt不抢占VIP,主备节点的state均设置为BACKUP。

    • 主节点配置文件
    # vi /etc/keepalived/keepalived.conf
    --------------------------------------------
    ! Configuration File for keepalived
    ## 全局定义
    global_defs {
      router_id Keepalived_openGauss          #运行 keepalived 服务器的一个标识
      script_user root                        #执行脚本的用户
    }
    
    ## VRRP实例定义
    ## 通常如果master服务Down掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次数据库切换。
    ## 建议使用nopreempt参数设置为非抢占模式,此时主库从故障中恢复后,不会从新的主库抢回VIP,但这需要将master和backup的state都设置成backup。
    vrrp_instance VI_1 {
      state BACKUP                            #指定Keepalived的角色(BACKUP需大写)
      interface eth0                          #指定 HA 监测的网络接口
      virtual_router_id 59                    #虚拟路由的数字标识,同一个 vrrp_instance 下,MASTER 和 BACKUP 一致
      nopreempt                               #非抢占模式,主库从故障中恢复后,不会从新的主库抢回VIP
      priority 100                            #优先级,备节点需要适当降低优先级 
      advert_int 1                            #MASTER 和 BACKUP 负载均衡器同步检查的时间间隔(秒)
      authentication {                        #设置验证码和验证类型
          auth_type PASS
          auth_pass 1111
      }
      virtual_ipaddress {                     #设置虚拟 IP 地址,可以设置多个,每个一行
          192.168.1.10
      }
    }
    
    ## 虚拟服务器定义
    virtual_server 192.168.1.10 26000 {        #设置虚拟服务器的 IP 和端口,用空格隔开
      delay_loop 6                             #设置运行情况检查时间,单位是秒
    # lb_algo rr                               #负载调度算法(轮询)
    # lb_kind DR                               #负载均衡机制(NAT、TUN、DR)
      persistence_timeout 50                   #会话保持时间(秒)
      protocol TCP                             #转发协议类型
       real_server 192.168.1.11 26000 {        #配置服务节点
              weight 100                       #配置服务节点的权重
              notify_down /gauss/failoverdb.sh #故障响应脚本     
              TCP_CHECK {                      #使用TCP_CHECK方式进行健康检查
                  connect_timeout 10           #10秒无响应即超时
                  delay_before_retry 3         #重试间隔时间
              }
          }
    }
    --------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 主节点故障切换脚本(仅适用openGauss进程崩溃故障处理,不适用Primary操作系统宕机故障处理)
    vi /gauss/failoverdb.sh
    --------------------------------------------
    #!/bin/bash
    echo "Start to failover openGauss database."
    pkill keepalived
    ssh 192.168.1.12 "su - omm -c 'gs_ctl failover -D /gauss/data/db1'"
    ssh 192.168.1.12 "su - omm -c 'gs_om -t refreshconf'"
    echo 'Failover operation is completed.'
    --------------------------------------------
    chmod 764 /gauss/failoverdb.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 备节点配置文件
    # vi /etc/keepalived/keepalived.conf
    --------------------------------------------
    ! Configuration File for keepalived
    ## 全局定义
    global_defs {
      router_id Keepalived_openGauss          #运行 keepalived 服务器的一个标识
      script_user root                        #执行脚本的用户
    }
    
    ## VRRP实例定义
    ## 通常如果master服务Down掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次数据库切换。
    ## 建议使用nopreempt参数设置为非抢占模式,此时主库从故障中恢复后,不会从新的主库抢回VIP,但这需要将master和backup的state都设置成backup。
    vrrp_instance VI_1 {
      state BACKUP                            #指定Keepalived的角色(BACKUP需大写)
      interface eth0                          #指定 HA 监测的网络接口
      virtual_router_id 59                    #虚拟路由的数字标识,同一个 vrrp_instance 下,MASTER 和 BACKUP 一致
      nopreempt                               #非抢占模式,主库从故障中恢复后,不会从新的主库抢回VIP
      priority 60                             #优先级,备节点需要适当降低优先级 
      advert_int 1                            #MASTER 和 BACKUP 负载均衡器同步检查的时间间隔(秒)
      authentication {                        #设置验证码和验证类型
          auth_type PASS
          auth_pass 1111
      }
      virtual_ipaddress {                     #设置虚拟 IP 地址,可以设置多个,每个一行
          192.168.1.10
      }
    }
    
    ## 虚拟服务器定义
    virtual_server 192.168.1.10 26000 {        #设置虚拟服务器的 IP 和端口,用空格隔开
      delay_loop 6                             #设置运行情况检查时间,单位是秒
    # lb_algo rr                               #负载调度算法(轮询)
    # lb_kind DR                               #负载均衡机制(NAT、TUN、DR)
      persistence_timeout 50                   #会话保持时间(秒)
      protocol TCP                             #转发协议类型
        real_server 192.168.1.12 26000 {       #配置服务节点
              weight 60                        #配置服务节点的权重
              notify_down /gauss/failoverdb.sh #虚拟服务故障响应脚本     
            MISC_CHECK {                       ## 使用 MISC_CHECK 方式自定义脚本做健康检查
                misc_path "/gauss/check.sh"    ## 检测脚本
                misc_timeout   10              ## 执行脚本的超时时间
                misc_dynamic                   ## 根据退出状态码动态调整服务器的权重
                }
          }
    }
    --------------------------------------------
    ## 备节点选择MISC_CHECK方式的原因:
    ##   测试发现,当主节点直接断电宕机后,Keepalived的VIP会漂移至备节点,此时如果使用TCP_CHECK方式做健康检查,会因为备机可读的原因使得VIP:26000连接正常,造成keepalived健康检查的误判。
    ##   最终导致主节点断电宕机后,备节点虽获取了VIP,但并没有执行openGauss的failover操作,备节点依旧只读,无法对外提供业务。
    ##   为了纠正这一点,建议使用MISC_CHECK方式自定义脚本,登录主节点做数据库健康检查(简单示例脚本:/gauss/check.sh)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 备节点健康检查脚本[ ssh登录主节点进行数据库连接检查 ]
    vi /gauss/check.sh
    -------------------------------------------
    ssh 192.168.1.11  "su - omm -c \"gsql -d postgres -p 26000 -t -A -c 'select 1;'\""
    -------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 备节点故障切换脚本
    vi /gauss/failoverdb.sh
    --------------------------------------------
    #!/bin/bash
    echo "Start to failover openGauss database."
    pkill keepalived
    su - omm -c "gs_ctl failover -D /gauss/data/db1"
    su - omm -c "gs_om -t refreshconf"
    echo 'Failover operation is completed.'
    --------------------------------------------
    chmod 764 /gauss/failoverdb.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3. openGauss配置

    • 修改openGauss监听地址
    $ gs_guc set -I all -N all -c "listen_addresses = '0.0.0.0'"
    $ gs_guc set -I all -N all -c "local_bind_address = '0.0.0.0'"
    
    • 1
    • 2
    • 修改所有节点replconninfo参数(避免端口冲突)
    $ vi /gauss/data/db1/postgresql.conf
    --------------------------------------------
    修改:localport  --> 26011    
    修改:remoteport --> 26011
    --------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 重启openGauss数据库,并检查服务器状态
    ## 重启openGauss
    [omm@prod db1]$ gs_om -t stop && gs_om -t start
    
    ## 检查openGauss状态
    [root@opengaussdb1 ~]# su - omm -c "gs_om -t status --detail"
    [   Cluster State   ]
    cluster_state   : Normal
    redistributing  : No
    current_az      : AZ_ALL
    [  Datanode State   ]
    node            node_ip         instance                state         |
    -----------------------------------------------------------------------
    1  opengaussdb1 192.168.1.11    6001 /gauss/data/db1 P Primary Normal | 
    2  opengaussdb2 192.168.1.12    6002 /gauss/data/db1 S Standby Normal
    
    ## 检查KeepAlived进程状态
    [omm@opengaussdb1 ~]$ ps -ef|grep keep|grep -v grep
    root      15664      1  0 16:15 ?        00:00:00 /usr/sbin/keepalived -D
    root      15665  15664  0 16:15 ?        00:00:00 /usr/sbin/keepalived -D
    root      15666  15664  0 16:15 ?        00:00:00 /usr/sbin/keepalived -D
    
    ## 检查VIP状态
    [root@opengaussdb1 ~]# ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:da:60:c0 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute ens33
           valid_lft forever preferred_lft forever
        inet 192.168.1.10/32 scope global ens33               ## VIP:192.168.1.10
           valid_lft forever preferred_lft forever
        inet6 2408:8270:237:ded0:c89c:adab:e7b:8bd6/64 scope global noprefixroute dynamic
           valid_lft 258806sec preferred_lft 172406sec
        inet6 fe80::c4f2:8ad1:200d:ce9b/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    4. 故障模拟测试

    • 主节点[192.168.1.11]操作
    ## kill数据库进程
    [root@opengaussdb1 ~]# ps -ef|grep gauss
    omm       18115      1  4 16:30 ?        00:00:35 /gauss/app/bin/gaussdb -D /gauss/data/db1 -M primary
    root      19254   9299  0 16:42 pts/0    00:00:00 grep --color=auto gauss
    [root@opengaussdb1 ~]# kill -9 18115
    
    ## 检查message日志[检测到故障,执行notify_down脚本,并关闭keepalived服务]
    # tail -fn 200 /var/log/messages 
    Feb 19 16:42:57 opengaussdb1 Keepalived_healthcheckers[18816]: TCP connection to [192.168.1.11]:26000 failed.
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: TCP connection to [192.168.1.11]:26000 failed.
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Check on service [192.168.1.11]:26000 failed after 1 retry.
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Removing service [192.168.1.11]:26000 from VS [192.168.1.10]:26000
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: IPVS (cmd 1160, errno 2): No such destination
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Executing [/gauss/failoverdb.sh] for service [192.168.1.11]:26000 in VS [192.168.1.10]:26000
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Lost quorum 1-0=1 > 0 for VS [192.168.1.10]:26000
    Feb 19 16:43:00 opengaussdb1 Keepalived[18815]: Stopping
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: pid 19258 exited due to signal 15
    Feb 19 16:43:00 opengaussdb1 Keepalived_vrrp[18817]: VRRP_Instance(VI_1) sent 0 priority
    Feb 19 16:43:00 opengaussdb1 Keepalived_vrrp[18817]: VRRP_Instance(VI_1) removing protocol VIPs.
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: IPVS (cmd 1156, errno 2): No such file or directory
    Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Stopped
    Feb 19 16:43:01 opengaussdb1 Keepalived_vrrp[18817]: Stopped
    Feb 19 16:43:01 opengaussdb1 Keepalived[18815]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 备节点[192.168.1.12]检查
    ## 检查VIP是否已漂移
    [root@opengaussdb2 ~]# ip a|grep 192.168
        inet 192.168.1.12/24 brd 192.168.1.255 scope global noprefixroute ens33
        inet 192.168.1.10/32 scope global ens33
    
    ## 检查数据库状态[已failover成为Primary]
    [omm@opengaussdb2 ~]$ gs_om -t status --detail
    [   Cluster State   ]
    cluster_state   : Degraded
    redistributing  : No
    current_az      : AZ_ALL
    [  Datanode State   ]
    node            node_ip         instance                state                   | 
    ---------------------------------------------------------------------------------
    1  opengaussdb1 192.168.1.11    6001 /gauss/data/db1 P Down    Manually stopped | 
    2  opengaussdb2 192.168.1.12    6002 /gauss/data/db1 S Primary Normal 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    spring boot 整合 swagger自动生成接口文档,搬砖都快乐了~
    自动化测试----unittest框架
    Day35 移动端测试(下)
    FPGA原理与结构(0)——目录与传送门
    研究研究 ES_OEMCONVERT 标志
    ElasticSearch学习(二): Mapping的数据类型和参数
    Docker之最细的基础知识入门和底层架构解析
    航顺 HK32F030C8T6 单片机MCU控制器
    让你快速高效的掌握linux内核编译过程
    金仓数据库 KingbaseGIS 使用手册(6.2. 管理函数)
  • 原文地址:https://blog.csdn.net/zxyhj/article/details/128133838