Linux KVM高可用:Keepalived+DRBD配置详解与实战


Linux KVM高可用:Keepalived+DRBD配置详解与实战

在现代数据中心和企业IT环境中,高可用性(HA)是至关重要的。对于基于Linux KVM的虚拟化平台而言,如何确保虚拟机(VM)在硬件故障或计划内维护期间持续可用是一个关键挑战。一种常用的解决方案是结合 KeepalivedDRBD 来实现KVM虚拟机的高可用性。 本文将深入探讨这种方案的配置和实战应用,并结合技术趋势,介绍性能优化和最佳实践。

KVM高可用方案的需求与挑战

想象一个场景:一个关键的业务应用运行在KVM虚拟机上,如果宿主机发生故障,会导致服务中断,造成经济损失。因此,我们需要一个高可用方案,能够在宿主机故障时自动将虚拟机切换到备用宿主机上,尽可能减少停机时间。 传统的解决方案通常依赖共享存储,但是共享存储的成本高昂,并且可能成为单点故障。而 Keepalived + DRBD 提供了一种更经济、灵活的高可用方案。

Keepalived + DRBD:原理与优势

Keepalived 负责监控主宿主机的健康状态,并在主宿主机失效时,自动将虚拟IP地址漂移到备用宿主机。它利用VRRP协议实现高可用性。 DRBD (Distributed Replicated Block Device) 则是一个基于网络的数据复制方案,它将主宿主机上的磁盘数据实时同步到备用宿主机,确保数据的一致性。 当 Keepalived 检测到主宿主机故障时,它会触发备用宿主机接管虚拟IP,同时备用宿主机上的DRBD设备变为Primary角色,虚拟机就可以在备用宿主机上启动,从而实现高可用性。

与传统的共享存储方案相比,Keepalived + DRBD 具有以下优势:

  • 成本更低:无需昂贵的共享存储设备。
  • 灵活性更高:可以部署在标准服务器硬件上。
  • 避免单点故障:减少对单一硬件的依赖。

Keepalived + DRBD 配置详解

下面详细介绍 Keepalived + DRBD 的配置步骤:

1. 环境准备

假设我们有两台宿主机:node1 (192.168.1.101) 作为主宿主机, node2 (192.168.1.102) 作为备用宿主机。我们需要配置一个虚拟IP地址 192.168.1.100,用于KVM虚拟机对外提供服务。

2. DRBD配置

首先,在两台宿主机上安装 DRBDdrbdadm 工具:


# yum install drbd drbdadm -y

然后,创建一个DRBD配置文件 /etc/drbd.d/r0.res

    
resource r0 {
  protocol C;
  meta-disk internal;

  on node1 {
    device     /dev/drbd0;
    disk       /dev/sdb1; # 替换为实际的磁盘分区
    address    192.168.1.101:7788;
  }
  on node2 {
    device     /dev/drbd0;
    disk       /dev/sdb1; # 替换为实际的磁盘分区
    address    192.168.1.102:7788;
  }
}
    
    

重要: 确保 /dev/sdb1 在两台宿主机上都存在,并且未被使用。这个分区将用于存储虚拟机的数据。

在两台宿主机上初始化DRBD设备:


# drbdadm create-md r0

node1 上将DRBD设备设置为 Primary 角色并同步数据:


# drbdadm up r0
# drbdadm primary r0
# mkfs.ext4 /dev/drbd0 # 格式化DRBD设备,根据需要选择文件系统
# mount /dev/drbd0 /mnt/kvm_data # 将DRBD设备挂载到 /mnt/kvm_data

查看DRBD状态:


# drbdadm status r0

确保 DRBD 同步完成后,再进行下一步。

3. Keepalived配置

在两台宿主机上安装 Keepalived


# yum install keepalived -y

node1 上配置 /etc/keepalived/keepalived.conf

    
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_drbd {
    script "/etc/keepalived/check_drbd.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0 # 替换为实际的网络接口
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24 # 虚拟IP地址
    }
    track_script {
        chk_drbd
    }
}
    
    

node2 上配置 /etc/keepalived/keepalived.conf

    
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_drbd {
    script "/etc/keepalived/check_drbd.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0 # 替换为实际的网络接口
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24 # 虚拟IP地址
    }
    track_script {
        chk_drbd
    }
}
    
    

创建一个 /etc/keepalived/check_drbd.sh 脚本,用于检查DRBD状态:


#!/bin/bash

if [ "$DRBD_STATUS" == "Primary" ]; then
exit 0
else
exit 1
fi

赋予脚本执行权限: