利用Keepalived实现达梦主备集群高可用
本文于 22 天前发布,最后更新于 21 天前

一、问题背景

我们知道应用使用达梦主备集群的高可用是通过dm_svc.conf连接配置文件实现的(配置服务名连接),或者在无法配置dm_svc.conf文件时,直接使用连接串配置服务名连接的方式。那么如果这两种方式都不能使用的情况下要如何实现主备集群的高可用呢?可以使用Keepalived来实现,接下来通过本文了解一下。

Keepalived 简明介绍:

  • 定位:Linux 系统下的高可用(HA)与负载均衡工具,基于 VRRP 协议实现服务冗余。
  • 核心目标:确保关键服务在节点故障时无缝切换,避免单点故障。

核心功能:

  • 故障检测:支持 TCP/HTTP/SMTP 端口检测及自定义脚本,实时监控服务状态。
  • VIP 漂移:通过虚拟 IP(VIP)在主备节点间切换,对外提供不间断服务。
  • 负载均衡支持:与 LVS 配合,构建高可用负载均衡集群。

二、环境说明

银河麒麟V10两台:主库primary(192.168.241.131),备库standby(192.168.241.132)

虚拟IP(VIP):192.168.241.111

三、配置过程

3.1 准备工作

关闭网卡IPv6

编辑文件/etc/sysctl.conf,在文件最后添加如下两行:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

应用生效

sysctl -p

验证

ifconfig | grep inet6
或者
ip addr show | grep net6

3.2 安装Keepalived

yum -y install keepalived

3.3 配置Keepalived

Keepalived配置文件位置:/etc/keepalived/keepalived.conf

primary节点:

备份配置文件

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

新建/etc/keepalived/keepalived.conf并编辑内容如下

global_defs {
    router_id dm_primary  # 唯一标识,主备不同即可
    enable_script_security
    script_user root    # 确保脚本以 root 执行
}

# 主库状态检测脚本配置
vrrp_script chk_dm_primary {
    script "/etc/keepalived/chk_dm_primary.sh"
    interval 2
    weight 20
    fall 1
    rise 1
    timeout 5
}

vrrp_instance VI_1 {
    state BACKUP          # 初始状态设为 BACKUP(统一非抢占模式)
    interface ens33       # 网卡名必须与实际一致
    virtual_router_id 111 # 主备必须相同
    priority 100          # 主节点初始优先级(高于备节点)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111  # 主备密码必须一致
    }
    virtual_ipaddress {
        192.168.241.111/24  # 虚拟 VIP
    }
    track_script {
        chk_dm_primary  # 绑定检测脚本
    }
}

standby节点:

同样备份配置文件

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

新建/etc/keepalived/keepalived.conf并编辑内容如下

global_defs {
    router_id dm_standby  # 唯一标识,主备不同即可
    enable_script_security
    script_user root    # 确保脚本以 root 执行
}

# 主库状态检测脚本配置
vrrp_script chk_dm_primary {
    script "/etc/keepalived/chk_dm_primary.sh"
    interval 2
    weight 20
    fall 1
    rise 1
    timeout 5
}

vrrp_instance VI_1 {
    state BACKUP          # 初始状态设为 BACKUP(统一非抢占模式)
    interface ens33       # 网卡名必须与实际一致
    virtual_router_id 111 # 主备必须相同
    priority 90           # 主节点初始优先级(高于备节点)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111  # 主备密码必须一致
    }
    virtual_ipaddress {
        192.168.241.111/24  # 虚拟 VIP
    }
    track_script {
        chk_dm_primary  # 绑定检测脚本
    }
}
  • 主备配置除router_idpriority外全部一致
  • /etc/keepalived/chk_dm_primary.sh是要执行的自定义脚本
  • 其余配置可以根据注释进行了解

3.4 自定义检测脚本

用来检测当前节点达梦数据库主备模式,脚本内容如下

#!/bin/bash
# 严格遵循您的原始查询命令,日志保存到/etc/keepalived

# 配置参数
DM_INTERFACE="ens33"       # 网卡名
LOG_DIR="/etc/keepalived"
LOG_FILE="${LOG_DIR}/check_dm_primary.log"

# 新增变量定义(数据库连接信息)
DB_USER="SYSDBA"          # 数据库用户名
DB_PASSWORD="SYSDBA"      # 数据库密码
DB_PORT="5236"            # 数据库端口

# 提取ens33的第一个IPv4地址
DM_HOST=$(ip -4 addr show $DM_INTERFACE | grep -Po 'inet \K[\d.]+' | head -n1)

# 记录日志(覆盖写入)
echo "===== Check at $(date) =====" > $LOG_FILE
echo "Target IP: ${DM_HOST}:${DB_PORT}" >> $LOG_FILE  # 端口改为变量

# 执行原始查询命令(完全保持您的格式)
output=$(su - dmdba -c "disql ${DB_USER}/${DB_PASSWORD}@${DM_HOST}:${DB_PORT} -E \"SELECT MODE\\\$ FROM V\\\$INSTANCE;\" 2>&1")
echo "Command output:" >> $LOG_FILE
echo "$output" >> $LOG_FILE

# 判断主库状态
if echo "$output" | grep -q "PRIMARY"; then
    echo "Result: PRIMARY (exit 0)" >> $LOG_FILE
    exit 0
else
    echo "Result: NOT PRIMARY (exit 1)" >> $LOG_FILE
    exit 1
fi

3.5 设置Keepalived服务异常自启功能

编辑文件/usr/lib/systemd/system/keepalived.service,添加如下内容

[Service]
Restart=always
RestartSec=5s

重新加载配置

systemctl daemon-reload

重启Keepalived服务

systemctl restart keepalived.service

设置Keepalived服务开机自启

systemctl enable keepalived.service

此时配置完成,应用连接串只需要填写Keepalived的虚拟IP(VIP)即可。Keepalived通过虚拟 IP(VIP)在主备节点间切换而实现达梦主备集群对外提供不间断的服务。

四、验证

此时从主库查询网络信息可以看到虚拟IP(VIP)

[root@dwp ~]# 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 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:6e:51:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.241.131/24 brd 192.168.241.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.241.111/24 scope global secondary ens33
       valid_lft forever preferred_lft forever

或者从远程服务器通过虚拟IP(VIP)进行连接数据库的操作

好了,就是这么简单,更复杂的验证与测试就不在这里记录了,敬请关注后续LVS的部分。

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇