首页 > 其他分享 >openGauss+KeepAlived

openGauss+KeepAlived

时间:2024-04-17 11:25:01浏览次数:21  
标签:... 00 16 Keepalived KeepAlived opengaussdb1 gauss openGauss

openGauss+KeepAlived
实验环境
操作系统: CentOS 7.6

数据库版本: openGauss 1.1.0Primary

主机/IP: opengaussdb1/...1 (openGauss 主备已部署完毕)

Standby 主机/IP: opengaussdb2/...2 (openGauss 主备已部署完毕)

说明:

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

安装 KeepAlived 软件

在所有节点执行安装

yum install keepalived -y
配置 keepalived
说明:

采用 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 地址,可以设置多个,每个一行
...0
}
}

虚拟服务器定义

virtual_server ...0 26000 { #设置虚拟服务器的 IP 和端口,用空格隔开
delay_loop 6 #设置运行情况检查时间,单位是秒

lb_algo rr #负载调度算法(轮询)

lb_kind DR #负载均衡机制(NAT、TUN、DR)

persistence_timeout 50 #会话保持时间(秒)
protocol TCP #转发协议类型
real_server ...1 26000 { #配置服务节点
weight 100 #配置服务节点的权重
notify_down /gauss/failoverdb.sh #故障响应脚本
TCP_CHECK { #使用TCP_CHECK方式进行健康检查
connect_timeout 10 #10秒无响应即超时
delay_before_retry 3 #重试间隔时间
}
}
}
主节点故障切换脚本(仅适用 openGauss 进程崩溃故障处理,不适用 Primary 操作系统宕机故障处理)。
vi /gauss/failoverdb.sh

!/bin/bash

echo "Start to failover openGauss database."
pkill keepalived
ssh ...2 "su - omm -c 'gs_ctl failover -D /gauss/data/db1'"
ssh ...2 "su - omm -c 'gs_om -t refreshconf'"
echo 'Failover operation is completed.'

chmod 764 /gauss/failoverdb.sh
备节点配置文件。

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 地址,可以设置多个,每个一行
...0
}
}

虚拟服务器定义

virtual_server ...0 26000 { #设置虚拟服务器的 IP 和端口,用空格隔开
delay_loop 6 #设置运行情况检查时间,单位是秒

lb_algo rr #负载调度算法(轮询)

lb_kind DR #负载均衡机制(NAT、TUN、DR)

persistence_timeout 50 #会话保持时间(秒)
protocol TCP #转发协议类型
real_server ...2 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)

备节点健康检查脚本[ ssh 登录主节点进行数据库连接检查 ]。
vi /gauss/check.sh

ssh ...1 "su - omm -c "gsql -d postgres -p 26000 -t -A -c 'select 1;'""

备节点故障切换脚本。
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
openGauss 配置
修改 openGauss 侦听地址。
$ gs_guc set -I all -N all -c "listen_addresses = '...'"
$ gs_guc set -I all -N all -c "local_bind_address = '...'"
修改所有节点 replconninfo 参数(避免端口冲突)。
$ vi /gauss/data/db1/postgresql.conf

修改:localport --> 26011
修改:remoteport --> 26011

重启 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 ...1 6001 /gauss/data/db1 P Primary Normal
2 opengaussdb2 ...2 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: <LOOPBACK,UP,LOWER_UP> 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 .../8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 ...1/24 brd ... scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet ...0/32 scope global ens33 ## VIP:...0
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]操作。

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 [...1]:26000 failed.
Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: TCP connection to [...1]:26000 failed.
Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Check on service [...1]:26000 failed after 1 retry.
Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Removing service [...1]:26000 from VS [...0]: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 [...1]:26000 in VS [...0]:26000
Feb 19 16:43:00 opengaussdb1 Keepalived_healthcheckers[18816]: Lost quorum 1-0=1 > 0 for VS [...0]: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
备节点[...2]检查。

检查VIP是否已漂移

[root@opengaussdb2 ~]# ip a|grep 192.168
inet ...2/24 brd ... scope global noprefixroute ens33
inet ...0/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 ...1 6001 /gauss/data/db1 P Down Manually stopped
2 opengaussdb2 ...2 6002 /gauss/data/db1 S Primary Normal

标签:...,00,16,Keepalived,KeepAlived,opengaussdb1,gauss,openGauss
From: https://www.cnblogs.com/helloopenGauss/p/18140122

相关文章

  • openGauss主备切换之switchover与failover
    openGauss主备切换之switchover与failoverswitchover在主备机正常时,出于维护的需要,将备机切换为主机,可保证切换过程中数据不丢失。查看集群实例主备状态:1节点为主库,2节点为备库。$gs_om-tstatus--detail[ClusterState]cluster_state:Normalredistribu......
  • openGauss在kubernetes集群环境上的部署
    opengauss实践总结学习心openGauss是一款开源关系型数据库管理系统,深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性;kubernetes也是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kuber......
  • 如何使用pgloader迁移MySQL数据库至openGauss
    pgloader介绍pgloader是一个数据导入工具,使用COPY命令将数据导入到PostgreSQL。pgloader有两种工作模式,一种是从文件导入,一种是迁移数据库。pgloader在两种情况下都使用PostgreSQL的COPY协议高效的传输数据。openGauss兼容PostgreSQL的通信协议以及绝大部分语法,可......
  • Linux架构30 Ansible jinja2模板, jinja2模板配置负载均衡, keepalived
    Ansiblejinja2模板一、Ansiblejinja2模板概述#什么是jinja2模板jinja2是Python的全功能模板引擎#Jinja2与Ansible啥关系Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用jinja2如果在100台主机上安装服务,每台服务的监听端口都不一样......
  • openGauss DBMind模式说明
    DBMind模式说明用户可通过gs_dbmind命令调用AI4DB的全部功能,该命令可实现下列基本功能:服务功能:service子命令,包括创建并初始化配置目录、启动后台服务、关闭后台服务等;调用组件:component子命令,AI4DB功能(如索引推荐、参数调优等)可通过该模式进行即时调用;设置参数:set子命令,通过......
  • openGauss DB4AI-Query-模型训练和推断
    DB4AI-Query:模型训练和推断openGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据......
  • openGauss AI特性
    AI特性人工智能技术最早可以追溯到上世纪50年代,甚至比数据库系统的发展历史还要悠久。但是,由于各种各样客观因素的制约,在很长的一段时间内,人工智能技术并没有得到大规模的应用,甚至还经历了几次明显的低谷期。到了近些年,随着信息技术的进一步发展,从前限制人工智能发展的因素已经逐......
  • openGauss AI4DB-数据库自治运维
    AI4DB:数据库自治运维如上文所述,AI4DB主要用于对数据库进行自治运维和管理,从而帮助数据库运维人员减少运维工作量。在实现上,DBMind的AI4DB框架具有监控和服务化的性质,同时也提供即时AI工具包,提供开箱即用的AI运维功能(如索引推荐)。AI4DB的监控平台以开源的Prometheus为主,DBMind提......
  • openGauss DB4AI-Snapshots数据版本管理
    DB4AI-Snapshots数据版本管理DB4AI-Snapshots是DB4AI模块用于管理数据集版本的功能。通过DB4ai-Snapshots组件,开发者可以简单、快速地进行特征筛选、类型转换等数据预处理操作,同时还可以像git一样对训练数据集进行版本控制。数据表快照创建成功后可以像视图一样进行使用,但是一经......
  • openGauss DBMind部署
    DBMind安装和部署1.安装准备1.1环境信息假设在主控节点192.168.100.4上部署DBMind,有一套端口号为19999的集群环境,环境信息如下:nodenode_ipstate主节点192.168.100.1Primary备节点1192.168.100.2Standby备节点2192.168.100.3Standby假设需要在test......