瑞克
Published on 2026-07-16 / 0 Visits
0
0

KVM虚拟化与高可用集群

KVM虚拟化与高可用集群

让一台物理机变成十台,让十台服务器像一台一样可靠


一、虚拟化概述

1.1 问题:一台服务器只跑一个应用,太浪费了吧?

想象你有一栋10层的写字楼,但每层只允许一家公司入驻——那租金得收多贵才能回本?虚拟化就是把每层隔成多个小办公室,让多家公司共用一栋楼,既节省成本又方便管理。

虚拟化的核心价值:

  • 资源利用率:物理机CPU利用率通常只有10-15%,虚拟化后可提升到60-80%
  • 快速部署:新建一台虚拟机只需几分钟(vs 采购物理服务器需要几周)
  • 隔离性:一台虚拟机崩溃不影响其他虚拟机
  • 弹性伸缩:在线添加CPU/内存/磁盘

1.2 Type 1 vs Type 2 虚拟化

Type 1(裸金属虚拟化)            Type 2(宿主虚拟化)
┌──────┐ ┌──────┐ ┌──────┐       ┌──────┐ ┌──────┐
│ VM-1 │ │ VM-2 │ │ VM-3 │       │ VM-1 │ │ VM-2 │
└──┬───┘ └──┬───┘ └──┬───┘       └──┬───┘ └──┬───┘
   └────────┼────────┘                └────────┘
┌─────────────────────┐         ┌──────────────┐
│    Hypervisor       │         │ Host OS      │
│ (直接装在硬件上)     │         │ (Windows等)  │
└─────────────────────┘         └──────┬───────┘
┌─────────────────────┐         ┌──────┴───────┐
│      Hardware       │         │  Hypervisor  │
└─────────────────────┘         └──────┬───────┘
                                       │
                                 ┌─────┴──────┐
                                 │  Hardware   │
                                 └────────────┘
对比项Type 1Type 2
类比公寓楼(直接建在地基上)帐篷(搭在别人的房间里)
代表产品KVM、VMware ESXi、XenVirtualBox、VMware Workstation
性能接近物理机(损耗<5%)有额外开销(损耗10-20%)
适用场景生产环境/数据中心个人开发/测试
是否需要宿主OS不需要需要

互动提问: 你在电脑上用过VirtualBox或VMware Workstation吗?那属于Type 2。你觉得为什么服务器环境几乎都用Type 1?(提示:想想性能和稳定性的差异)


二、KVM原理

2.1 问题:Linux内核怎么就变成了虚拟机管理器?

KVM(Kernel-based Virtual Machine)的精髓在于——它把Linux内核本身变成了Hypervisor

KVM的三大组件:

┌─────────────────────────────────────────────┐
│               KVM 架构                       │
│                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  │
│  │   QEMU   │  │  libvirt │  │   virsh  │  │
│  │(硬件模拟) │  │ (管理层)  │  │(命令行)  │  │
│  │  ↓↑      │  │  ↓↑      │  │  ↓↑      │  │
│  ├──────────┤  └──────────┘  └──────────┘  │
│  │ kvm.ko   │                               │
│  │(内核模块) │                               │
│  ├──────────┤                               │
│  │ CPU硬件  │ ← 需要CPU支持VT-x/AMD-V     │
│  │ 虚拟化   │                               │
│  └──────────┘                               │
└─────────────────────────────────────────────┘
组件类比职责
KVM(kvm.ko)发动机的涡轮增压器利用CPU硬件虚拟化加速(VT-x/AMD-V)
QEMU汽车的仪表盘和方向盘模拟网卡、磁盘、显卡等硬件设备
libvirt4S店统一管理系统提供统一的API管理各种虚拟化平台
virsh方向盘上的快捷按钮libvirt的命令行管理工具

类比: KVM+QEMU的关系就像发动机+变速箱——KVM负责CPU加速,QEMU负责IO设备模拟,两者缺一不可。

2.2 CPU虚拟化支持检查

# 检查CPU是否支持硬件虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo
# 输出>0表示支持(vmx=Intel VT-x,svm=AMD-V)

# 检查KVM内核模块是否加载
lsmod | grep kvm
# 应该看到 kvm_intel 或 kvm_amd

三、KVM安装部署

CentOS/RHEL 安装

# 第1步:安装KVM相关软件包
dnf install @virt virt-install virt-manager libvirt-client qemu-kvm

# @virt 是一个包组,包含KVM核心组件
# virt-install:创建虚拟机的命令行工具
# virt-manager:图形化管理界面(可选)
# libvirt-client:提供virsh命令

# 第2步:启动libvirtd服务
systemctl enable --now libvirtd

# 第3步:验证安装
virsh version          # 查看版本信息
virsh list --all       # 列出所有虚拟机(应该为空)

# 第4步:确认KVM模块已加载
lsmod | grep kvm

Ubuntu/Debian 安装

# 第1步:安装KVM
apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils

# bridge-utils:网络桥接工具(Ubuntu需要单独安装)

# 第2步:启动服务
systemctl enable --now libvirtd

# 第3步:将当前用户加入libvirt组(免sudo管理)
usermod -aG libvirt $(whoami)
# 重新登录生效

# 第4步:验证
virsh list --all

安装差异提示:

  • CentOS用@virt包组一次安装所有组件
  • Ubuntu需要分别安装各组件
  • 网络桥接工具包名不同:CentOS的bridge-utils,Ubuntu也叫bridge-utils但可能需要netplan配置

四、虚拟机管理

4.1 创建虚拟机

# 使用virt-install创建虚拟机
virt-install \
  --name=centos7-web \
  --memory=2048 \
  --vcpus=2 \
  --disk path=/var/lib/libvirt/images/centos7-web.qcow2,size=20 \
  --cdrom=/opt/CentOS-7-x86_64-Minimal.iso \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0,port=5900 \
  --os-variant centos7.0

# 参数说明:
# --name:     虚拟机名称(就像给新生儿取名)
# --memory:   内存大小(MB)
# --vcpus:    CPU核心数
# --disk:     磁盘镜像路径和大小
# --cdrom:    安装ISO文件
# --network:  网络模式(bridge桥接)
# --graphics: 远程图形界面(VNC)

4.2 virsh日常管理命令

# 查看虚拟机列表
virsh list              # 只显示运行中的
virsh list --all        # 显示所有(包括关机的)

# 生命周期管理(就像管理一台"虚拟电脑")
virsh start centos7-web      # 开机(按下电源键)
virsh shutdown centos7-web   # 正常关机(发送ACPI信号)
virsh destroy centos7-web    # 强制关机(拔电源!慎用)
virsh reboot centos7-web     # 重启

# 定义与管理
virsh define vm.xml          # 从XML配置文件定义虚拟机
virsh undefine centos7-web   # 删除虚拟机定义(但保留磁盘)
virsh undefine centos7-web --remove-all-storage  # 删除并清除磁盘

# 信息查看
virsh dominfo centos7-web    # 查看虚拟机详细信息
virsh domblklist centos7-web # 查看磁盘列表
virsh domiflist centos7-web  # 查看网卡列表

# 编辑配置
virsh edit centos7-web       # 编辑虚拟机XML配置
# 注意:某些修改需要关机后才生效

# 资源动态调整(热调整,无需关机)
virsh setmem centos7-web 4096000  # 调整内存(单位KB)
virsh setvcpus centos7-web 4      # 调整CPU数量

互动提问: shutdowndestroy有什么区别?类比到现实生活中——一个是正常关机(像点"开始→关机"),另一个是直接拔电源。你觉得哪个对数据更安全?

4.3 虚拟机XML配置文件

<!-- /etc/libvirt/qemu/centos7-web.xml(自动生成) -->
<domain type='kvm'>
  <name>centos7-web</name>
  <memory unit='MiB'>2048</memory>
  <vcpu placement='static'>2</vcpu>

  <os>
    <type arch='x86_64'>hvm</type>
    <boot dev='hd'/>
  </os>

  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/centos7-web.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>

    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>

    <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'/>
  </devices>
</domain>

五、虚拟机克隆

5.1 问题:需要10台一样的服务器,一台台装太慢了吧?

克隆就是复制粘贴虚拟机——就像用复印机复印文件。

# 前提:源虚拟机必须关机
virsh shutdown centos7-web   # 先关机

# 方法一:virt-clone(推荐)
virt-clone \
  --original centos7-web \
  --name centos7-web-clone \
  --file /var/lib/libvirt/images/centos7-web-clone.qcow2 \
  --auto-clone

# 方法二:手动克隆(更灵活)
# 1. 复制磁盘镜像
cp /var/lib/libvirt/images/centos7-web.qcow2 \
   /var/lib/libvirt/images/centos7-db.qcow2

# 2. 导出XML配置
virsh dumpxml centos7-web > /tmp/centos7-db.xml

# 3. 修改XML中的UUID、MAC地址、磁盘路径和名称
# 删除<uuid>行(让系统重新生成)
# 删除<mac address>行
# 修改<name>和<source file>

# 4. 定义新虚拟机
virsh define /tmp/centos7-db.xml

# 启动克隆的虚拟机
virsh start centos7-web-clone

注意: 克隆后记得修改新虚拟机的IP地址和主机名,否则会和源虚拟机冲突!


六、虚拟机快照

6.1 问题:改配置前想留个"后悔药"怎么办?

快照就是存档点——就像游戏里的存档,改坏了可以随时读档重来。

# 前提:磁盘格式必须是qcow2(raw格式不支持快照)

# 创建快照(存档)
virsh snapshot-create-as centos7-web \
  --name "before-upgrade" \
  --description "升级Nginx前的快照"

# 查看快照列表
virsh snapshot-list centos7-web
# 输出示例:
#  Name               Creation Time             State
# ────────────────────────────────────────────────────
#  before-upgrade     2024-01-15 10:30:00 +0800 running

# 查看快照详细信息
virsh snapshot-info centos7-web --snapshotname before-upgrade

# 恢复到某个快照(读档)
virsh snapshot-revert centos7-web --snapshotname before-upgrade

# 删除快照(删除存档,释放空间)
virsh snapshot-delete centos7-web --snapshotname before-upgrade

经验之谈: 快照不是免费的午餐!每个快照都会占用额外的磁盘空间。生产环境中不要保留太多快照,定期清理不需要的旧快照。


七、qemu-img磁盘镜像管理

7.1 问题:如何高效管理虚拟机的"硬盘"?

qemu-img是KVM的磁盘管理瑞士军刀

# 创建磁盘镜像
qemu-img create -f qcow2 /var/lib/libvirt/images/data.qcow2 50G
# -f qcow2: 使用qcow2格式(支持快照、精简配置)
# 50G: 虚拟大小50G(实际不占用50G空间)

# 查看镜像信息
qemu-img info /var/lib/libvirt/images/data.qcow2
# 输出:
# file format: qcow2
# virtual size: 50 GiB
# disk size: 196 KiB         ← 实际占用很小!

# 调整镜像大小(只能增大,不能缩小)
qemu-img resize /var/lib/libvirt/images/data.qcow2 +20G

# 格式转换(qcow2 → raw,用于迁移到其他平台)
qemu-img convert -f qcow2 -O raw source.qcow2 destination.raw

# 检查镜像完整性
qemu-img check /var/lib/libvirt/images/data.qcow2

# 压缩qcow2镜像(回收未使用的空间)
qemu-img convert -O qcow2 source.qcow2 compressed.qcow2

qcow2 vs raw 对比:

特性qcow2raw
类比压缩包(用多少占多少)整块砖头(不管用多少都占满)
精简配置支持(写时分配)不支持(立即分配)
快照支持不支持
性能略低(有额外开销)更高(无额外开销)
适用场景一般用途高性能需求

八、KVM网络配置

8.1 问题:虚拟机怎么上网?怎么被外部访问?

KVM支持两种主要网络模式:

NAT模式(默认)                    桥接模式(生产推荐)
┌───────────┐                     ┌───────────┐
│ 虚拟机     │                     │ 虚拟机     │
│ 192.168.  │                     │ 10.0.0.x  │
│ 122.x     │                     │ (与宿主机  │
│  ↓ NAT    │                     │  同网段)   │
│ 宿主机     │                     │  ↓         │
│ 10.0.0.1  │                     │  br0桥接   │
│  ↓        │                     │ 10.0.0.1  │
│ 物理网卡   │                     │  ↓         │
└───────────┘                     │ 物理网卡   │
                                  └───────────┘

NAT:虚拟机通过宿主机"代理上网"
     外部无法直接访问虚拟机
     类比:合租房里的人只能通过户主收发快递

桥接:虚拟机直接接入物理网络
     拥有独立IP,外部可直接访问
     类比:每间公寓都有独立门牌号

桥接网络配置

# 方法一:使用nmcli(CentOS 8+/RHEL 8+推荐)

# 1. 创建网桥
nmcli connection add type bridge con-name br0 ifname br0

# 2. 将物理网卡加入网桥(假设物理网卡是eth0)
nmcli connection add type bridge-slave con-name br0-eth0 ifname eth0 master br0

# 3. 配置IP(将原来eth0的IP移到br0上)
nmcli connection modify br0 ipv4.addresses 10.0.0.100/24
nmcli connection modify br0 ipv4.gateway 10.0.0.1
nmcli connection modify br0 ipv4.dns "8.8.8.8"
nmcli connection modify br0 ipv4.method manual

# 4. 激活网桥
nmcli connection up br0

# 方法二:Ubuntu使用netplan
cat > /etc/netplan/01-bridge.yaml << 'EOF'
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  bridges:
    br0:
      interfaces: [eth0]
      addresses: [10.0.0.100/24]
      gateway4: 10.0.0.1
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]
EOF
netplan apply

# 验证桥接
brctl show       # 查看网桥信息(老工具)
bridge link      # 查看网桥信息(新工具)
ip addr show br0 # 查看br0 IP

经验之谈: 生产环境强烈建议使用桥接模式!NAT模式下虚拟机无法被外部直接访问,不适合做服务器。


九、虚拟机迁移

9.1 问题:服务器要维护,上面的虚拟机怎么办?

迁移就是把虚拟机从一台物理机搬到另一台——就像搬家。

冷迁移(关机迁移)

# 在源主机上操作
# 1. 关闭虚拟机
virsh shutdown centos7-web

# 2. 导出配置文件
virsh dumpxml centos7-web > /tmp/centos7-web.xml

# 3. 复制磁盘镜像到目标主机
scp /var/lib/libvirt/images/centos7-web.qcow2 root@target-host:/var/lib/libvirt/images/

# 4. 复制配置文件到目标主机
scp /tmp/centos7-web.xml root@target-host:/tmp/

# 在目标主机上操作
# 5. 定义并启动虚拟机
virsh define /tmp/centos7-web.xml
virsh start centos7-web

# 在源主机上清理
virsh undefine centos7-web

热迁移(在线迁移,不停机!)

# 前提条件:
# 1. 两台主机共享存储(NFS/iSCSI/光纤)
# 2. 网络互通且CPU型号兼容
# 3. libvirtd已配置允许迁移

# 配置libvirtd允许TCP连接(两台主机都要配置)
vim /etc/libvirt/libvirtd.conf
# listen_tcp = 1
# listen_tls = 0
# auth_tcp = "none"

# 配置QEMU监听迁移端口
vim /etc/libvirt/qemu.conf
# vnc_listen = "0.0.0.0"

systemctl restart libvirtd

# 执行热迁移
virsh migrate --live --persistent --undefinesource \
  centos7-web \
  qemu+ssh://target-host/system

# --live:          在线迁移(不停机)
# --persistent:    在目标主机上持久化定义
# --undefinesource: 从源主机删除定义

# 查看迁移进度
virsh domjobinfo centos7-web

热迁移原理小科普: 热迁移过程中,虚拟机的内存页面会被逐页复制到目标主机。在最后的"切换瞬间"(通常<100ms),源主机暂停虚拟机,将最后一批脏页发送过去,然后目标主机接管。对用户来说几乎感觉不到中断!


十、嵌套虚拟化

10.1 问题:虚拟机里还能再开虚拟机?

嵌套虚拟化就是虚拟机中的俄罗斯套娃——在虚拟机里再运行KVM!

# 检查当前是否开启嵌套虚拟化
cat /sys/module/kvm_intel/parameters/nested
# 输出 N 表示未开启,Y 表示已开启

# Intel CPU开启嵌套虚拟化
# 先关闭所有虚拟机,然后:
modprobe -r kvm_intel
modprobe kvm_intel nested=1

# 持久化配置
echo "options kvm_intel nested=1" > /etc/modprobe.d/kvm.conf

# AMD CPU:
echo "options kvm_amd nested=1" > /etc/modprobe.d/kvm.conf

# 创建嵌套虚拟化虚拟机时,CPU模型需设置为host-passthrough
virt-install --name=nested-test --cpu host-passthrough ...
# 或在XML中:
# <cpu mode='host-passthrough'/>

使用场景: CI/CD流水线中需要在虚拟机里运行Docker(Docker依赖内核特性),嵌套虚拟化可以实现这一点。


十一、集群概念:LB、HA、HPC

11.1 问题:一台服务器扛不住了怎么办?一台挂了怎么办?

三种集群类型(就像三种团队合作方式):

负载均衡集群(LB)         高可用集群(HA)           高性能计算集群(HPC)
"大家一起分担工作"         "你倒了我顶上"             "合起来做大事"

  用户请求                   ┌── 主节点 ──┐           ┌── CPU-1 ──┐
    │                       │   (Active)  │           │   CPU-2   │
    ↓                   ┌──→│            │──┐         │   CPU-3   │
  LB调度器 ──→ 服务器A   │   └────────────┘  │         │    ...    │
         ──→ 服务器B   │   ┌── 备节点 ──┐  │         │  CPU-N    │
         ──→ 服务器C   └──→│  (Standby) │──┘         └───────────┘
                           └────────────┘
类比:                      类比:                      类比:
餐厅多个厨师分担订单        医院的主治医生和备用医生      多人合力搬一块巨石
集群类型目标关键技术代表软件
LB分担流量调度算法LVS、HAProxy、Nginx
HA消除单点故障心跳检测+故障切换Keepalived、Pacemaker
HPC并行计算MPI消息传递Slurm、OpenMPI

十二、LVS(Linux Virtual Server)

12.1 问题:如何在Linux内核层实现负载均衡?

LVS工作在内核层(四层),性能极高——就像高速公路上的智能分流系统

LVS工作模式

NAT模式(网络地址转换)              DR模式(直接路由)
  Client → LVS → RealServer           Client → LVS → RealServer
                    ↓                                    ↓
  Client ← LVS ← RealServer           Client ← RealServer(直接回)

NAT:进出都经过LVS(LVS压力大)       DR:回包直接走(LVS压力小)
类比:前台收发所有快递                  类比:前台只负责分配,你自己去取
适合:少量服务器                       适合:大规模集群

LVS调度算法

算法说明适用场景
rr (轮询)按顺序一个接一个服务器配置相同
wrr (加权轮询)按权重分配服务器配置不同
lc (最少连接)分给连接数最少的长连接应用
wlc (加权最少连接)按权重+连接数最常用的默认算法
sh (源地址哈希)同一IP始终分给同一服务器需要会话保持

ipvsadm配置

# 安装
# CentOS:
dnf install ipvsadm
# Ubuntu:
apt install ipvsadm

# === LVS-DR模式配置示例 ===

# 在LVS调度器上:
# 1. 配置VIP(虚拟IP)
ip addr add 10.0.0.100/32 dev lo   # VIP绑定到lo回环接口

# 2. 创建LVS服务(wlc调度算法)
ipvsadm -A -t 10.0.0.100:80 -s wlc

# 3. 添加后端真实服务器
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.11:80 -g -w 3  # -g表示DR模式
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.12:80 -g -w 2
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.13:80 -g -w 1

# 在真实服务器上(每台都要配):
# 配置VIP到lo接口 + ARP抑制
ip addr add 10.0.0.100/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 常用管理命令
ipvsadm -ln               # 查看当前规则
ipvsadm -ln --stats       # 查看统计信息
ipvsadm -C                # 清空所有规则
ipvsadm-save > /etc/sysconfig/ipvsadm  # 保存规则

十三、HAProxy

13.1 问题:LVS配置复杂,有没有更灵活的七层负载均衡?

HAProxy工作在应用层(七层),可以做基于内容的智能调度——就像餐厅的领位员,不仅分配桌子,还知道谁点了什么菜。

# 安装
# CentOS:
dnf install haproxy
# Ubuntu:
apt install haproxy

核心配置

# /etc/haproxy/haproxy.cfg

global
    log 127.0.0.1 local0
    maxconn 4096
    daemon

defaults
    mode http                 # 七层模式(也支持tcp四层模式)
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    option httplog            # 记录HTTP日志
    option forwardfor         # 传递客户端真实IP

# 前端配置(监听入口)
frontend web_front
    bind *:80
    # ACL规则:基于域名/路径的智能路由
    acl is_api path_beg /api
    acl is_static path_end .css .js .jpg .png
    acl host_www hdr(host) -i www.example.com

    # 根据ACL选择不同的后端
    use_backend api_servers if is_api
    use_backend static_servers if is_static
    default_backend web_servers

# 后端配置(真实服务器池)
backend web_servers
    balance roundrobin        # 轮询算法
    option httpchk GET /health  # 健康检查
    server web1 10.0.0.11:80 check inter 3000 fall 3 rise 2 weight 3
    server web2 10.0.0.12:80 check inter 3000 fall 3 rise 2 weight 2
    server web3 10.0.0.13:80 check inter 3000 fall 3 rise 2 weight 1
    # check:       启用健康检查
    # inter 3000:  每3秒检查一次
    # fall 3:      连续3次失败才标记为down
    # rise 2:      连续2次成功才标记为up
    # weight:      权重

backend api_servers
    balance leastconn         # 最少连接算法
    server api1 10.0.0.21:8080 check
    server api2 10.0.0.22:8080 check

# 统计页面(非常实用!)
listen stats
    bind *:8404
    stats enable
    stats uri /stats           # 访问地址
    stats auth admin:password  # 认证
    stats refresh 5s           # 自动刷新
# 启动
systemctl enable --now haproxy

# 重载配置(不中断连接)
systemctl reload haproxy

# 验证配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg

互动提问: 如果你有一个视频网站,视频文件应该走哪个后端?用户API请求呢?(提示:想想不同内容对服务器的压力类型)


十四、Keepalived高可用

14.1 问题:负载均衡器自己挂了怎么办?

Keepalived解决的是调度器自身的单点故障问题——就像给交警配一个"替班",主交警晕倒了副交警立即顶上。

VRRP协议原理

VRRP(虚拟路由器冗余协议):
┌──────────┐              ┌──────────┐
│ MASTER   │  ← 心跳 →   │ BACKUP   │
│ (VIP拥有者)│  (每秒发)  │ (监听者)  │
│ 优先级100 │             │ 优先级90  │
└──────────┘              └──────────┘
     ↑                         ↑
     └──────── VIP ────────────┘
          10.0.0.100

正常:MASTER持有VIP,对外提供服务,定期发送心跳
异常:MASTER停止发心跳 → BACKUP超时未收到心跳 → BACKUP接管VIP
恢复:MASTER恢复后,根据抢占模式决定是否重新夺回VIP

Keepalived安装与配置

# 安装
# CentOS:
dnf install keepalived
# Ubuntu:
apt install keepalived
# /etc/keepalived/keepalived.conf (MASTER节点)

global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from keepalived@example.com
    smtp_server 127.0.0.1
    router_id LVS_MASTER
}

# 健康检查脚本(检测Nginx/Haproxy是否正常)
vrrp_script check_nginx {
    script "/usr/bin/killall -0 nginx"  # 检查进程是否存在
    interval 2                          # 每2秒检查一次
    weight -20                          # 失败时优先级降低20
    fall 3                              # 连续3次失败才算down
}

vrrp_instance VI_1 {
    state MASTER            # 角色:MASTER或BACKUP
    interface eth0          # 绑定网卡
    virtual_router_id 51    # 虚拟路由器ID(MASTER和BACKUP必须一致)
    priority 100            # 优先级(MASTER > BACKUP)
    advert_int 1            # 心跳间隔(秒)

    authentication {
        auth_type PASS
        auth_pass mypassword
    }

    # 虚拟IP地址
    virtual_ipaddress {
        10.0.0.100/24 dev eth0 label eth0:1
    }

    # 关联健康检查脚本
    track_script {
        check_nginx
    }
}
# /etc/keepalived/keepalived.conf (BACKUP节点)
# 大部分配置相同,只需要修改:

vrrp_instance VI_1 {
    state BACKUP            # 角色为BACKUP
    priority 90             # 优先级低于MASTER
    # ... 其余配置与MASTER相同 ...
}
# 启动
systemctl enable --now keepalived

# 查看VIP归属
ip addr show eth0 | grep 10.0.0.100

# 查看Keepalived日志
tail -f /var/log/messages | grep Keepalived   # CentOS
tail -f /var/log/syslog | grep Keepalived      # Ubuntu

经典故障切换场景:

  1. Nginx挂掉 → check_nginx脚本检测到 → 优先级降低20 → BACKUP优先级反超 → VIP漂移 → 用户无感知
  2. 网线断开 → 心跳超时 → BACKUP接管VIP → 网络恢复后MASTER重新抢占VIP

十五、Pacemaker + Corosync 简介

15.1 问题:需要管理多个服务的高可用,Keepalived够吗?

当你的高可用需求变得复杂(比如同时管理数据库+Web+VIP+共享存储),就需要更强大的工具——Pacemaker + Corosync

┌─────────────────────────────────────────┐
│          Pacemaker + Corosync 架构       │
│                                         │
│  ┌──────────────────────────────────┐   │
│  │        Pacemaker(决策大脑)      │   │
│  │  - 管理资源(VIP、服务、存储)    │   │
│  │  - 约束规则(哪些资源不能同节点) │   │
│  │  - 故障恢复策略                   │   │
│  └──────────┬───────────────────────┘   │
│             │                           │
│  ┌──────────┴───────────────────────┐   │
│  │       Corosync(通信管道)        │   │
│  │  - 集群成员管理                   │   │
│  │  - 心跳检测                       │   │
│  │  - 消息传递                       │   │
│  └──────────────────────────────────┘   │
└─────────────────────────────────────────┘
# 安装(CentOS)
dnf install pacemaker pcs corosync

# 安装(Ubuntu)
apt install pacemaker pcs corosync

# 初始化集群
systemctl enable --now pcsd
echo "password" | passwd --stdin hacluster
pcs host auth node1 node2    # 节点间认证
pcs cluster setup mycluster node1 node2  # 创建集群
pcs cluster start --all      # 启动集群

# 创建资源
pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=10.0.0.100 cidr_netmask=24
pcs resource create WebServer ocf:heartbeat:nginx configfile=/etc/nginx/nginx.conf

# 设置约束
pcs constraint colocation add WebServer with VirtualIP  # Web和VIP必须在同一节点
pcs constraint order VirtualIP then WebServer           # VIP先启动,Web后启动

# 查看集群状态
pcs status

运维常用命令精选

# ===== KVM 管理 =====
virsh list --all                    # 列出所有虚拟机
virsh start/shutdown/destroy vm     # 开/关/强关虚拟机
virsh dominfo vm                    # 查看虚拟机信息
virsh snapshot-list vm              # 查看快照列表
virsh migrate --live vm qemu+ssh://target/system  # 热迁移
qemu-img info /path/to/disk.qcow2  # 查看磁盘信息

# ===== LVS/HAProxy/Keepalived =====
ipvsadm -ln                        # 查看LVS规则和统计
ipvsadm -ln --stats                # 查看连接统计
systemctl reload haproxy           # 重载HAProxy配置
haproxy -c -f /etc/haproxy/haproxy.cfg  # 验证配置
ip addr show | grep "scope global" # 查看VIP归属
tail -f /var/log/messages | grep Keepalived  # 查看心跳日志

# ===== 集群诊断 =====
pcs status                         # Pacemaker集群状态
crm_mon -1                         # 集群资源状态快照
corosync-cfgtool -s                # Corosync通信状态

趣味命令

# 实时查看KVM虚拟机的CPU和内存使用情况
virt-top
# (类似top命令,但专门用于监控KVM虚拟机)

# 查看宿主机上所有虚拟机的网络流量
virt-manager  # 图形化工具,可以看到网络IO图表

# 用virsh console连接虚拟机(不需要SSH/VNC)
virsh console centos7-web
# 提示:需要先配置虚拟机的serial console

# 给虚拟机"拍张照"(获取当前屏幕截图,需要VNC或SPICE)
# 使用virt-viewer连接后可以截图

# 查看KVM宿主机的硬件虚拟化能力详情
lscpu | grep -i virtualization
# 输出类似:Virtualization: VT-x

# 用一条命令查看所有虚拟机的状态概览
virsh list --all --name | while read vm; do echo "[$vm] $(virsh domstate $vm)"; done

# 实时监控某个虚拟机的磁盘IO
iotop -p $(pgrep -f "qemu.*vm-name")

小结: 虚拟化让硬件资源利用率最大化,KVM作为Linux原生的Type 1虚拟化方案,性能接近物理机。LVS/HAProxy实现负载均衡,Keepalived保障调度器自身的高可用,Pacemaker+Corosync管理复杂集群。掌握虚拟化+高可用,是运维工程师从"管几台机器"到"管一个数据中心"的质的飞跃。


Comment