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 1 | Type 2 |
|---|---|---|
| 类比 | 公寓楼(直接建在地基上) | 帐篷(搭在别人的房间里) |
| 代表产品 | KVM、VMware ESXi、Xen | VirtualBox、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 | 汽车的仪表盘和方向盘 | 模拟网卡、磁盘、显卡等硬件设备 |
| libvirt | 4S店统一管理系统 | 提供统一的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数量
互动提问:
shutdown和destroy有什么区别?类比到现实生活中——一个是正常关机(像点"开始→关机"),另一个是直接拔电源。你觉得哪个对数据更安全?
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 对比:
| 特性 | qcow2 | raw |
|---|---|---|
| 类比 | 压缩包(用多少占多少) | 整块砖头(不管用多少都占满) |
| 精简配置 | 支持(写时分配) | 不支持(立即分配) |
| 快照 | 支持 | 不支持 |
| 性能 | 略低(有额外开销) | 更高(无额外开销) |
| 适用场景 | 一般用途 | 高性能需求 |
八、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
经典故障切换场景:
- Nginx挂掉 → check_nginx脚本检测到 → 优先级降低20 → BACKUP优先级反超 → VIP漂移 → 用户无感知
- 网线断开 → 心跳超时 → 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管理复杂集群。掌握虚拟化+高可用,是运维工程师从"管几台机器"到"管一个数据中心"的质的飞跃。