监控虚拟化与集群
监控系统、虚拟化与集群存储 -- 运维实战指南
第一部分:监控系统 -- 给服务器做"体检"
1.1 为什么需要监控系统?
生活类比:想象你是一个学校的校医,负责1000名学生的健康。如果每天都要一个个量体温、测心率,你肯定累趴了。最好的办法是:每个学生戴一个智能手环,实时把健康数据发到你办公室的大屏幕上。一旦有人心率异常,大屏幕自动弹出报警。
互动问题:如果你管理着1000台服务器,你能一台台登录去查看CPU、内存、磁盘使用率吗?显然不行。所以我们需要的是一套"智能手环 + 大屏幕"系统,这就是监控系统。
监控系统解决三大问题:
| 问题 | 解决方案 |
|---|---|
| 服务器运行状态怎么看? | 实时采集指标(CPU、内存、磁盘、网络) |
| 出了问题怎么第一时间知道? | 报警机制(邮件、微信、短信通知) |
| 历史趋势怎么分析? | 数据存储 + 可视化图表 |
两种核心数据类型:
- 指标(Metrics):像心率、体温这样的数字,比如"CPU使用率=85%"。轻量、连续、适合画图。
- 日志(Logs):像病历一样记录具体事件,比如"12:05 用户登录失败"。详细、文本型、适合排查问题。
两种采集模式:
| 模式 | 比喻 | 代表 | 原理 |
|---|---|---|---|
| Pull(拉取) | 老师定时去收作业 | Prometheus | 服务器主动去被监控端"拉"数据 |
| Push(推送) | 学生主动交作业 | Zabbix Agent主动模式 | 被监控端主动把数据"推"给服务器 |
1.2 Zabbix架构与安装
生活类比:Zabbix就像汽车仪表盘。汽车仪表盘实时显示车速、油量、发动机温度,Zabbix则实时显示服务器的CPU负载、内存占用、网络流量。
Zabbix的核心组件:
┌─────────────────────────────────────────────────┐
│ Zabbix Web界面 │
│ (浏览器访问,看图表、配置) │
├─────────────────────────────────────────────────┤
│ Zabbix Server(大脑) │
│ 收集数据、存入数据库、触发报警 │
├──────────┬──────────┬───────────────────────────┤
│ MySQL │ Agent │ Proxy(可选,分布式) │
│ (数据库) │(客户端) │ 代理服务器分担压力 │
└──────────┴──────────┴───────────────────────────┘
| 组件 | 作用 | 比喻 |
|---|---|---|
| Zabbix Server | 核心,收集处理数据 | 医院的主治医生 |
| Zabbix Agent | 安装在被监控主机上,采集数据 | 病人身上的传感器 |
| Zabbix Proxy | 分布式场景下的代理 | 社区诊所,收集数据后转交给医院 |
| 数据库 | 存储历史数据 | 病历档案室 |
| Web界面 | 可视化展示和配置管理 | 医院的电子显示屏 |
安装步骤(以CentOS 7 + Zabbix 4.4为例)
第一步:环境准备
# 关闭防火墙(实验环境)
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 设置主机名
hostnamectl set-hostname server.zabbix.com
# 时间同步
yum install -y ntpdate && ntpdate time.windows.com
第二步:配置YUM源并安装
# 添加Zabbix源(华为镜像)
cat > /etc/yum.repos.d/zabbix.repo << 'EOF'
[zabbix]
name=zabbix source
baseurl=https://mirrors.huaweicloud.com/zabbix/zabbix/4.4/rhel/7/x86_64/
gpgcheck=0
enabled=1
EOF
# 安装数据库和Zabbix组件
yum makecache fast
yum install -y mariadb-server
yum install -y zabbix-server-mysql
yum install -y zabbix-web-mysql
第三步:初始化数据库
# 启动MariaDB
systemctl start mariadb
systemctl enable mariadb
# 创建数据库和用户
mysql -e 'create database zabbix character set "utf8";'
mysql -e "grant all on zabbix.* to zabbix@'localhost' identified by 'zabbix';"
# 导入初始数据
zcat /usr/share/doc/zabbix-server-mysql-*/create.sql.gz | mysql -u zabbix -pzabbix zabbix
第四步:配置并启动Zabbix Server
# 编辑Server配置
cat > /etc/zabbix/zabbix_server.conf << 'EOF'
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
EOF
# 配置Apache时区
echo 'php_value date.timezone Asia/Shanghai' >> /etc/httpd/conf.d/zabbix.conf
# 启动所有服务
systemctl restart httpd
systemctl restart zabbix-server
systemctl enable httpd zabbix-server
第五步:Web初始化
浏览器访问 http://你的IP/zabbix,按向导完成配置。默认账号:Admin,密码:zabbix。
常见问题:图表中文乱码?解决方法:将Windows系统
C:\Windows\Fonts\simkai.ttf上传到服务器的/usr/share/zabbix/assets/fonts/,然后修改defines.inc.php中的字体定义。
1.3 Zabbix配置与使用
生活类比:配置Zabbix就像给学校建一套健康档案系统——先建班级(主机组),再录入学生(主机),然后确定体检项目(监控项),最后设定预警值(触发器)。
核心概念速查:
| 概念 | 解释 | 比喻 |
|---|---|---|
| Host(主机) | 被监控的设备 | 一个学生 |
| Host Group(主机组) | 主机的逻辑分组 | 一个班级 |
| Item(监控项) | 要采集的具体指标 | 体检项目(身高、体重) |
| Trigger(触发器) | 定义异常阈值 | 体温>37.3算发烧 |
| Action(动作) | 触发后的响应 | 发烧了就通知家长 |
| Template(模板) | 预设的监控项集合 | 标准体检套餐 |
添加被监控主机
在被监控端安装Agent:
# 安装Agent
yum install -y zabbix-agent
# 修改配置文件
cat > /etc/zabbix/zabbix_agentd.conf << 'EOF'
Server=192.168.10.200 # Zabbix Server的IP
ServerActive=192.168.10.200 # 主动模式指向Server
Hostname=agent1.example.com # 本机主机名(需能被Server解析)
UnsafeUserParameters=1 # 允许自定义监控项
EOF
# 启动Agent
systemctl start zabbix-agent
systemctl enable zabbix-agent
在Web界面操作:配置 → 主机 → 创建主机 → 填入主机名和IP → 关联模板 → 完成。
配置触发器
触发器用表达式定义异常条件:
{server.agent.com:system.cpu.load[all,avg1].last(0)}>3
解读:当主机 server.agent.com 的CPU 1分钟平均负载的最后一次取值大于3时,触发报警。
常用函数:
| 函数 | 含义 | 示例 |
|---|---|---|
last() | 最新一次值 | last(0) = 最近一次采集 |
avg() | 平均值 | avg(300) = 300秒内均值 |
max() | 最大值 | max(1h) = 1小时内最大 |
nodata() | 无数据检测 | nodata(300) = 5分钟无数据 |
1.4 自定义监控
生活类比:Zabbix自带的监控项就像标准体检套餐,但有时候你需要检查一些特殊项目(比如某个应用服务的连接数),这就需要自定义监控项了。
UserParameter语法
在Agent端配置文件中定义自定义Key:
# 简单示例:监控空闲内存
UserParameter=memory.free,/usr/bin/free|awk '/^Mem:/{print $4}'
# 带参数示例:监控内存的不同指标
UserParameter=memory.usage[*],/bin/cat /proc/meminfo|awk '/^$1/{print $$2}'
在Server端测试获取数据:
# 安装zabbix-get工具
yum install -y zabbix-get
# 测试简单Key
zabbix_get -s 192.168.10.201 -k "memory.free"
# 输出: 234040
# 测试带参数的Key
zabbix_get -s 192.168.10.201 -k "memory.usage[MemFree]"
# 输出: 18612
zabbix_get -s 192.168.10.201 -k "memory.usage[MemTotal]"
# 输出: 494420
实战:Nginx状态监控脚本
#!/bin/bash
# /zabbix_script/nginx_status.sh
case $1 in
Active)
curl -s 127.0.0.1/nginx_status | awk '/Active/{print $3}' ;;
accepts)
curl -s 127.0.0.1/nginx_status | awk 'NR==3{print $1}' ;;
handled)
curl -s 127.0.0.1/nginx_status | awk 'NR==3{print $2}' ;;
requests)
curl -s 127.0.0.1/nginx_status | awk 'NR==3{print $3}' ;;
esac
配置文件添加:
UserParameter=nginx.status[*],/zabbix_script/nginx_status.sh $1
监控模板
模板是预设的监控项、触发器、图形的集合。配置路径:配置 → 模板 → 创建模板。
最佳实践:把同类服务器的监控项做成模板,新加主机时直接关联模板,一键完成监控配置。
1.5 报警配置
问题:服务器出了问题,你怎么第一时间知道?答案:配置报警通知。
邮件报警
1. 配置本地邮件发送:
yum install -y postfix
cat > /etc/postfix/main.cf << 'EOF'
myhostname = server.zabbix.com
mydomain = zabbix.com
inet_interfaces = all
EOF
systemctl restart postfix
systemctl enable postfix
2. 配置互联网邮箱报警(126邮箱示例):
cat >> /etc/mail.rc << 'EOF'
set from=yourname@126.com smtp=smtp.126.com
set smtp-auth-user=yourname smtp-auth-password=授权码 smtp-auth=login
EOF
3. 在Zabbix中配置:
- 管理 → 报警媒介类型 → 创建"邮件"类型
- 管理 → 用户 → 为用户添加报警媒介(邮箱地址、触发时间段)
- 配置 → 动作 → 创建动作(条件:触发器严重度;操作:发送邮件)
企业微信报警
#!/bin/bash
# /usr/lib/zabbix/alertscripts/weixin.sh
# 企业微信报警脚本
CropID='你的企业ID'
Secret='你的应用密钥'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
# 获取access_token
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int AppID=1000002
local UserID="@all"
local PartyID=2
local Msg=$(echo "$@" | cut -d" " -f3-)
printf '{\n'
printf '\t"touser": "'"$UserID"\","'"\n"
printf '\t"toparty": "'"$PartyID"\","'"\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'"$AppID"\","\n'
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n'
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL
配置脚本路径:
# 在zabbix_server.conf中确认脚本路径
AlertScriptsPath=/usr/lib/zabbix/alertscripts
# 确保脚本有执行权限
chmod +x /usr/lib/zabbix/alertscripts/weixin.sh
报警升级策略
生活类比:学生(服务器)发烧了,先通知班主任(一线运维),10分钟没处理就通知年级组长(经理),30分钟还没处理就通知校长(CTO)。
在Zabbix中通过动作的"步骤"实现升级:
- 步骤1:发给一线运维(tom、jerry)
- 步骤2(延迟10分钟):发给经理(zorro)
- 步骤3(延迟30分钟):发给CTO(robin)
1.6 分布式监控
问题:当你监控500台服务器时,一台Zabbix Server压力太大怎么办?
生活类比:一个医院忙不过来,就在各地开社区诊所(Proxy),诊所先收集本地数据,再定期汇报给总院。
Zabbix Proxy配置
# 安装Proxy
yum install -y zabbix-proxy-mysql
# 创建数据库
mysql -e "create database zabbix_proxy character set 'utf8';"
mysql -e "grant all on zabbix_proxy.* to zbxproxy@localhost identified by 'zbxproxy';"
# 导入schema
zcat /usr/share/doc/zabbix-proxy-mysql-*/schema.sql.gz | mysql -u zbxproxy -pzbxproxy zabbix_proxy
# 配置Proxy
cat > /etc/zabbix/zabbix_proxy.conf << 'EOF'
Server=192.168.10.200 # Zabbix Server地址
Hostname=proxy.zabbix.com # Proxy主机名(需Server能解析)
DBHost=localhost
DBName=zabbix_proxy
DBUser=zbxproxy
DBPassword=zbxproxy
EOF
systemctl start zabbix-proxy
systemctl enable zabbix-proxy
Agent指向Proxy:
Server=Proxy的IP地址
ServerActive=Proxy的IP地址
自动发现与自动注册
| 功能 | 方向 | 适用场景 |
|---|---|---|
| 自动发现 | Server主动扫描客户端 | 后期维护,新增设备自动纳入监控 |
| 自动注册 | Agent主动联系Server | 批量部署阶段,服务器上线即自动监控 |
自动注册只需在Agent端配置 ServerActive 指向Server,然后在Server端创建自动注册动作即可。
1.7 Grafana可视化
生活类比:Zabbix自带图表够用,但Grafana就像是把仪表盘升级成了"豪华大屏"——更漂亮、更灵活、支持多种数据源。
安装Grafana
# 下载安装
wget https://mirrors.huaweicloud.com/grafana/9.2.0/grafana-enterprise-9.2.0-1.x86_64.rpm
rpm -ivh grafana-enterprise-9.2.0-1.x86_64.rpm
# 启动服务
systemctl start grafana-server
systemctl enable grafana-server
# 确认端口
ss -anptu | grep :3000
浏览器访问 http://Grafana的IP:3000,默认账号:admin,密码:admin。
配置Zabbix数据源
# 安装Zabbix插件
grafana-cli plugins install alexanderzobnin-zabbix-app
systemctl restart grafana-server
在Grafana界面:
- 配置 → 数据源 → 添加数据源 → 选择Zabbix
- 填入Zabbix API地址:
http://Zabbix的IP/zabbix/api_jsonrpc.php - 输入用户名密码 → 保存并测试
导入预制仪表盘
- 访问 https://grafana.com/grafana/dashboards 搜索需要的仪表盘
- Grafana → 仪表盘 → 导入 → 输入仪表盘ID(如11074)
- 选择数据源 → 导入
1.8 Prometheus概述
生活类比:如果Zabbix是传统医院的"医生主动查房"模式,那Prometheus更像是"自助体检站"——每个人随时可以自助体检(暴露metrics接口),系统定时来拉取结果。
Prometheus架构
┌──────────────────────────────────────────────┐
│ Prometheus Server │
│ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
│ │ 拉取数据 │ │ 时间序列 │ │ 告警规则 │ │
│ │ (Pull) │ │ 数据库 │ │ 引擎 │ │
│ └──────────┘ └──────────┘ └─────┬──────┘ │
└────────┬────────────────────────────┼────────┘
│ HTTP拉取 │ 告警
▼ ▼
┌──────────────┐ ┌─────────────────┐
│ Exporters │ │ AlertManager │
│ (数据采集器) │ │ (分组/抑制/静默) │
│ - node │ └────────┬────────┘
│ - mysql │ │ 通知
│ - nginx │ ▼
└──────────────┘ ┌─────────────────┐
│ 邮件/钉钉/微信 │
└─────────────────┘
安装部署
Server端:
# 解压即可使用(二进制版,超简单)
tar -xvf prometheus-2.27.0.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/prometheus-2.27.0.linux-amd64/ /usr/local/prometheus
chmod a+x /usr/local/prometheus/prometheus
# 启动
/usr/local/prometheus/prometheus \
--config.file="/usr/local/prometheus/prometheus.yml" \
--storage.tsdb.path="/home/software/prometheus-data" &
# 验证
ss -anplt | grep 9090
Agent端(被监控主机):
# 安装node_exporter
tar -xvf node_exporter-1.1.2.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/node_exporter-1.1.2.linux-amd64/ /usr/local/node_exporter
nohup /usr/local/node_exporter/node_exporter &
# 验证(端口9100)
ss -anplt | grep 9100
添加监控目标(编辑prometheus.yml):
scrape_configs:
- job_name: 'node-web'
static_configs:
- targets: ['192.168.10.102:9100']
PromQL基础查询
| 查询 | 含义 |
|---|---|
node_cpu_seconds_total | CPU时间原始数据 |
rate(node_cpu_seconds_total[5m]) | 5分钟内CPU使用速率 |
100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) * 100 | CPU使用率 |
node_memory_MemTotal_bytes - node_memory_MemFree_bytes | 已用内存 |
up{job="node-web"} | 目标是否在线(1=在线) |
AlertManager报警配置
# alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.126.com:25'
smtp_from: 'yourname@126.com'
smtp_auth_username: 'yourname@126.com'
smtp_auth_password: '你的授权码'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 20m
receiver: 'email-receiver'
receivers:
- name: 'email-receiver'
email_configs:
- to: 'admin@example.com'
告警规则文件(rules/node.yml):
groups:
- name: server-alerts
rules:
- alert: 内存使用率过高
expr: 100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "Instance {{ $labels.instance }} 内存使用率过高"
description: "当前使用率 {{ $value }}%"
- alert: CPU使用率过高
expr: 100-avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)*100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "Instance {{ $labels.instance }} CPU使用率过高"
告警收敛三大机制:
| 机制 | 作用 | 比喻 |
|---|---|---|
| 分组(Group) | 同类告警合并为一条通知 | 同一栋楼停电只报一次 |
| 抑制(Inhibition) | 重要告警压制次要告警 | 整栋楼停电了就不用报单个房间灯灭 |
| 静默(Silence) | 指定时间段内不发告警 | 维护期间暂停告警 |
第二部分:虚拟化 -- 一台电脑变多台
2.1 虚拟化概述
生活类比:虚拟化就像在一块大土地上盖一栋公寓楼。虽然地只有一块(物理服务器),但通过隔断分出了很多独立的公寓(虚拟机),每间公寓有自己的门牌号、家具、水电(独立的操作系统、CPU、内存、硬盘)。
两种虚拟化类型:
| 类型 | 比喻 | 代表 | 特点 |
|---|---|---|---|
| Type 1(裸金属) | 直接在地基上建房 | KVM、VMware ESXi | 性能好,生产环境首选 |
| Type 2(托管型) | 在已有房子里搭隔断 | VMware Workstation、VirtualBox | 方便实验,但不适合生产 |
KVM vs VMware对比:
| 对比项 | KVM | VMware ESXi |
|---|---|---|
| 开源/收费 | 开源免费 | 商业收费 |
| 内核集成 | Linux内核原生模块 | 独立Hypervisor |
| 性能 | 接近物理机95% | 接近物理机 |
| 生态 | libvirt/virsh/virt-manager | vCenter/vSphere |
| 适用场景 | Linux服务器/云平台 | 企业数据中心 |
互动问题:为什么云计算平台(如阿里云、AWS)普遍选择KVM而非VMware?答案:开源免费、性能好、与Linux深度集成。
2.2 KVM安装与使用
环境检查与安装
# 检查CPU是否支持虚拟化
grep -E --color 'svm|vmx|lm' /proc/cpuinfo
# vmx = Intel-VT,svm = AMD-V,lm = 64位支持
# 安装KVM相关软件包
yum install -y qemu-kvm qemu-img libvirt
yum install -y virt-install libvirt-python virt-manager libvirt-client
# 启动libvirtd
systemctl start libvirtd
systemctl enable libvirtd
# 确认模块加载
lsmod | grep kvm
# 应看到 kvm_intel 或 kvm_amd
# 查看NAT模式默认虚拟网卡
ifconfig virbr0
# 默认 192.168.122.1/24
创建虚拟机(命令行方式)
# 无图形界面安装(推荐)
virt-install \
--name=vm-1 \
--nographics \
--ram=1024 \
--vcpus=1 \
--disk path=/var/lib/libvirt/images/vm-1.img,size=8,format=qcow2,bus=virtio \
--network bridge=virbr0,model=virtio \
--location=http://192.168.10.251/iso \
--extra-args="ks=http://192.168.10.251/ks/ks.cfg console=ttyS0"
virsh日常管理命令
# 查看所有虚拟机
virsh list --all
# 启动虚拟机
virsh start vm-1
# 关闭虚拟机(优雅关机)
virsh shutdown vm-1
# 强制关机
virsh destroy vm-1
# 通过console连接虚拟机
virsh console vm-1
# 退出按 Ctrl+]
# 挂起/恢复
virsh suspend vm-1
virsh resume vm-1
# 删除虚拟机定义(不删磁盘文件)
virsh undefine vm-1
2.3 KVM克隆与快照
虚拟机克隆
# 克隆前必须关闭源虚拟机
virsh shutdown centos7u6-template
# 克隆
virt-clone \
--original centos7u6-template \
--name vm-new \
--file /kvm/vm-new.img
# 或者直接复制磁盘文件+配置文件(手动方式)
cp /kvm/centos7u6-template.img /kvm/vm-new.img
virsh dumpxml centos7u6-template > /etc/libvirt/qemu/vm-new.xml
# 编辑xml:修改name、UUID、MAC地址、磁盘路径
virsh define /etc/libvirt/qemu/vm-new.xml
快照管理
前提:磁盘格式必须是qcow2。
# 创建快照
virsh snapshot-create-as vm-1 vm-1-sp1
# 查看快照列表
virsh snapshot-list vm-1
# 恢复到指定快照
virsh snapshot-revert vm-1 vm-1-sp1
# 删除快照
virsh snapshot-delete vm-1 vm-1-sp1
qemu-img磁盘管理
# 创建镜像
qemu-img create -f qcow2 /kvm/test.img 10G
# 查看镜像信息
qemu-img info /kvm/test.img
# 格式转换(qcow2 → raw)
qemu-img convert -f qcow2 -O raw source.img target.img
# 基于后端镜像创建差量镜像(前端写时复制)
qemu-img create -f qcow2 -b /kvm/base.img /kvm/vm-clone.img
# 差量镜像优势:
# 1. 节省磁盘空间(多个VM共享一个base)
# 2. 瞬间创建新虚拟机
2.4 KVM网络
生活类比:KVM网络就像小区的门禁系统——NAT模式是小区统一出入口(通过门牌号转发),桥接模式是每个住户直接临街(拥有和外网一样的IP),Host-Only是只能在小区内部通信。
| 模式 | 虚拟机互通 | 虚拟机访问外网 | 外网访问虚拟机 | 适用场景 |
|---|---|---|---|---|
| NAT(virbr0) | 可以 | 可以(SNAT) | 不可以 | 实验环境 |
| Host-Only(virbr1) | 可以 | 不可以 | 不可以 | 内部隔离测试 |
| Bridge(br0) | 可以 | 可以 | 可以 | 生产环境 |
创建Host-Only网络
<!-- /etc/libvirt/qemu/networks/hostonly.xml -->
<network>
<name>hostonly</name>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.200.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.200.2' end='192.168.200.254'/>
</dhcp>
</ip>
</network>
virsh net-define hostonly.xml
virsh net-start hostonly
virsh net-autostart hostonly
virsh net-list --all
创建桥接网络
# 安装桥接工具
yum install -y bridge-utils
# 停止NetworkManager(避免冲突)
systemctl stop NetworkManager
systemctl disable NetworkManager
# 创建桥接网卡br0(基于ens33)
virsh iface-bridge ens33 br0
# 重启网络
systemctl restart network
# 验证
brctl show
临时切换虚拟机网络模式
# 查看当前虚拟网卡
brctl show
# 将vnet0从virbr0移到br0
brctl delif virbr0 vnet0
brctl addif br0 vnet0
永久修改网卡模式
编辑虚拟机XML配置文件:
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
virsh destroy vm-1
virsh edit vm-1 # 编辑配置
virsh start vm-1
2.5 KVM迁移
生活类比:虚拟机迁移就像给住户搬家——冷迁移是先让住户收拾好东西搬走(关机再搬),热迁移是住户正在做饭的时候,趁他不注意把整间房子搬到新地方(在线迁移,业务不中断)。
冷迁移
# 1. 在源宿主机上关闭虚拟机
virsh shutdown vm-1
# 2. 导出配置文件
virsh dumpxml vm-1 > /tmp/vm-1.xml
# 3. 复制磁盘文件和配置文件到目标宿主机
scp /var/lib/libvirt/images/vm-1.img target-host:/var/lib/libvirt/images/
scp /tmp/vm-1.xml target-host:/tmp/
# 4. 在目标宿主机上定义并启动
virsh define /tmp/vm-1.xml
virsh start vm-1
要求:目标宿主机环境(虚拟网络、CPU特性)须与源宿主机一致。
在线迁移(热迁移)
# 在源宿主机执行
virsh migrate --live --verbose --abort-on-error --unsafe \
vm-1 qemu+ssh://192.168.122.202/system
前提条件:
- 两台宿主机共享存储,或磁盘已同步
- 网络互通,SSH互信
- CPU型号兼容
- 虚拟机使用桥接网络(确保IP不变)
第三部分:集群与高可用 -- 人多力量大
3.1 集群介绍
生活类比:一个人搬桌子太累,叫上4个同学一起搬就是"负载均衡";如果其中一人生病请假,另一人马上顶上就是"高可用"。
三大集群类型:
| 类型 | 英文 | 比喻 | 目标 |
|---|---|---|---|
| 负载均衡集群 | LB (Load Balancing) | 大家一起抬桌子 | 分摊压力 |
| 高可用集群 | HA (High Availability) | 有人请假马上替补 | 保证不宕机 |
| 高性能计算集群 | HPC (High Performance) | 千人合作算一道题 | 超级计算 |
互动问题:一个购物网站的双十一抢购,最需要哪种集群?答案是LB(大量用户访问需要分摊)+ HA(不能宕机)。
3.2 LVS负载均衡
生活类比:LVS就像十字路口的交通警察,站在入口处(Director),根据规则把车辆(请求)分配到不同的车道(Real Server)。
LVS工作在网络第四层(传输层),直接在内核中操作数据包,性能极高。
NAT模式
原理:Director接收请求,修改目标IP为RS的IP(DNAT),RS处理后原路返回。
Client → Director(VIP) → [DNAT] → Real Server(RIP)
Real Server → Director → [SNAT] → Client
配置:
# Director上
echo 1 > /proc/sys/net/ipv4/ip_forward # 开启路由转发
yum install -y ipvsadm
# 添加虚拟服务和真实服务器
ipvsadm -A -t 10.10.10.200:80 -s rr # 创建VIP,轮询调度
ipvsadm -a -t 10.10.10.200:80 -r 192.168.10.201 -m # -m 表示NAT模式
ipvsadm -a -t 10.10.10.200:80 -r 192.168.10.202 -m
# 查看规则
ipvsadm -Ln
ipvsadm -Ln --stats # 查看统计
特点:配置简单,但入站出站流量都经过Director,压力大。
DR模式(直接路由,最常用)
原理:Director只改MAC地址转发请求,RS直接回复给客户端(不经过Director),大大减轻Director压力。
# --- Director配置 ---
# 在ens33上绑定VIP
ip addr add dev ens33 192.168.100.254/24
ipvsadm -A -t 192.168.100.254:80 -s rr
ipvsadm -a -t 192.168.100.254:80 -r 192.168.100.201 -g # -g 表示DR模式
ipvsadm -a -t 192.168.100.254:80 -r 192.168.100.202 -g
# --- 每个Real Server配置 ---
# 在lo接口绑定VIP(32位掩码)
ip addr add dev lo 192.168.100.254/32
# 抑制ARP响应(关键!防止VIP冲突)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
LVS调度算法速查
| 算法 | 缩写 | 说明 |
|---|---|---|
| 轮询 | rr | 按顺序轮流分配 |
| 加权轮询 | wrr | 按权重比例分配 |
| 最少连接 | lc | 分配给连接数最少的服务器 |
| 加权最少连接 | wlc | 考虑权重的最少连接(默认算法) |
| 源地址散列 | sh | 同一客户端始终访问同一RS(解决session问题) |
| 最短预期延迟 | sed | 基于WLC优化,考虑新连接加入后的延迟 |
3.3 HAProxy
生活类比:如果LVS是十字路口的交警(四层转发),HAProxy就是酒店前台(七层调度)——可以根据客人需求(URL、HTTP头)把客人引导到不同的楼层(后端服务器)。
安装与配置
yum install -y haproxy
配置文件示例(/etc/haproxy/haproxy.cfg):
global
log 127.0.0.1 local2
maxconn 4000
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
frontend main *:80
# ACL访问控制列表
acl html url_reg -i \.html$
acl php url_reg -i \.php$
use_backend html-server if html
use_backend php-server if php
backend html-server
balance roundrobin
option httpchk GET /index.html
server html-A 192.168.0.11:80 weight 1 check inter 2000 rise 2 fall 5
server html-B 192.168.0.12:80 weight 1 check inter 2000 rise 2 fall 5
backend php-server
balance roundrobin
option httpchk GET /index.php
server php-A 192.168.0.14:80 weight 1 check inter 2000 rise 2 fall 5
server php-B 192.168.0.15:80 weight 1 check inter 2000 rise 2 fall 5
健康检查参数说明:
| 参数 | 含义 |
|---|---|
check | 启用健康检查 |
inter 2000 | 每2秒检查一次 |
rise 2 | 连续2次成功视为可用 |
fall 5 | 连续5次失败视为不可用 |
weight 1 | 权重,值越大分配的请求越多 |
查看统计页面:访问 http://HAProxy的IP/haproxy 即可看到后端服务器的实时状态。
3.4 Keepalived高可用
生活类比:Keepalived就像公司的AB角制度——A角(Master)正常工作,一旦A角生病(服务宕机),B角(Backup)立即接手,对外只有一个"工位号"(VIP),客户完全无感知。
核心原理:VRRP
VRRP(虚拟路由冗余协议)让多台路由器组成一个虚拟路由器,对外只暴露一个虚拟IP(VIP)。Master节点持有VIP,Backup节点监听。Master故障时,Backup接管VIP。
Keepalived + HAProxy配置
Master节点(/etc/keepalived/keepalived.conf):
global_defs {
router_id HAproxy1
}
vrrp_script chk_haproxy {
script "/etc/keepalived/chk_haproxy.sh"
interval 2
}
vrrp_instance VI_1 {
state MASTER # 主节点
interface eth0
virtual_router_id 51
priority 150 # 优先级(主节点要比备节点高50以上)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_haproxy # 关联检测脚本
}
virtual_ipaddress {
192.168.122.254/24 # 浮动IP(VIP)
}
}
健康检测脚本:
#!/bin/bash
# /etc/keepalived/chk_haproxy.sh
A=$(ps -C haproxy --no-header | wc -l)
if [ $A -eq 0 ]; then
systemctl start haproxy
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
systemctl stop keepalived # HAProxy无法恢复,停掉Keepalived让VIP飘走
fi
fi
Backup节点:复制Master配置,修改:
state BACKUP
priority 100
Keepalived + LVS(DR模式)
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
virtual_ipaddress {
192.168.100.254/24
}
}
virtual_server 192.168.100.254 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.100.202 80 {
weight 1
HTTP_GET {
url { path / }
connect_timeout 3
}
}
real_server 192.168.100.203 80 {
weight 1
HTTP_GET {
url { path / }
connect_timeout 3
}
}
}
3.5 Pacemaker + Corosync
生活类比:Keepalived适合简单的主备切换,但如果集群更复杂(多节点、多资源、需要仲裁),就需要Pacemaker+Corosync这对"黄金搭档"了。Corosync负责节点间通信(像电话网),Pacemaker负责资源调度(像总指挥)。
部署步骤
# 所有节点安装
yum install -y pcs pacemaker corosync fence-agents-all
# 启动pcsd
systemctl start pcsd
systemctl enable pcsd
# 设置集群用户密码
passwd hacluster
# 节点间认证(在一个节点执行)
pcs cluster auth ha1.com ha2.com
# 创建并启动集群
pcs cluster setup --start --name my_cluster ha1.com ha2.com
pcs cluster enable --all
# 查看集群状态
pcs cluster status
pcs status corosync
禁用STONITH(实验环境):
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
配置VIP资源:
pcs resource create vip ocf:heartbeat:IPaddr2 \
ip=192.168.100.254 nic='ens33' cidr_netmask='24' \
op monitor interval=5s timeout=20s on-fail=restart
配置HAProxy资源并绑定约束:
# 创建HAProxy资源
pcs resource create haproxy systemd:haproxy op monitor interval="5s"
# 约束:VIP和HAProxy必须在同一节点
pcs constraint colocation add vip haproxy INFINITY
# 约束:先启动VIP,再启动HAProxy
pcs constraint order vip then haproxy
pcs常用命令:
| 命令 | 功能 |
|---|---|
pcs status | 查看集群和资源状态 |
pcs resource show | 查看所有资源 |
pcs constraint show | 查看约束规则 |
pcs config | 显示完整集群配置 |
pcs cluster stop --all | 停止整个集群 |
第四部分:存储 -- 数据的家
4.1 存储基础知识
生活类比:存储就像家里的柜子——DAS是你的床头柜(只有你能用),NAS是客厅的书架(全家都能用),SAN是你的私人保险箱(高性能专属通道)。
| 存储类型 | 全称 | 连接方式 | 协议 | 传输单位 | 特点 |
|---|---|---|---|---|---|
| DAS | 直接附加存储 | SCSI/光纤直连 | SCSI | 数据块 | 简单、便宜、不可共享 |
| NAS | 网络附加存储 | 以太网 | NFS/CIFS | 文件 | 即插即用、文件级共享 |
| SAN | 存储区域网络 | 光纤/iSCSI | SCSI | 数据块 | 高性能、可扩展、成本高 |
存储性能指标:
| 指标 | 含义 | 比喻 |
|---|---|---|
| IOPS | 每秒I/O操作次数 | 快递员每秒能送几个包裹 |
| 吞吐量 | 每秒传输数据量(MB/s) | 传送带每秒能运多少货物 |
| 延迟 | 单次I/O操作的响应时间 | 叫快递到送达的时间 |
存储单位换算:
1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
1 EB = 1024 PB
4.2 iSCSI配置
生活类比:iSCSI就像一条"虚拟光纤",让远端的存储设备看起来就像插在本地电脑上的一块硬盘。
存储端(Target)配置
# 安装管理工具
yum install -y targetcli
# 进入交互式配置
targetcli
# 创建存储后端
/> cd backstores/fileio
/backstores/fileio> create disk01 /iscsi_disks/disk01.img 10G
# 创建Target
/backstores/fileio> cd /iscsi
/iscsi> create iqn.2020-06.com.storage:san1
# 设置LUN
/iscsi> cd iqn.2020-06.com.storage:san1/tpg1/luns
/iscsi/.../luns> create /backstores/fileio/disk01
# 设置ACL(允许哪个客户端访问)
/iscsi/.../luns> cd ../acls
/iscsi/.../acls> create iqn.2020-06.com.storage:web.com
# 设置CHAP认证(用户名密码)
/iscsi/.../acls> cd iqn.2020-06.com.storage:web.com
/iscsi/.../web.com> set auth userid=robin
/iscsi/.../web.com> set auth password=123456
# 退出(自动保存)
/iscsi/.../web.com> exit
# 确认服务
systemctl enable target
netstat -anplt | grep :3260
应用端(Initiator)配置
# 安装客户端工具
yum install -y iscsi-initiator-utils
# 设置Initiator名称
echo "InitiatorName=iqn.2020-06.com.storage:web.com" > /etc/iscsi/initiatorname.iscsi
# 配置CHAP认证
cat >> /etc/iscsi/iscsid.conf << 'EOF'
node.session.auth.authmethod = CHAP
node.session.auth.username = robin
node.session.auth.password = 123456
EOF
# 发现Target
iscsiadm -m discovery -t st -p 192.168.0.12
# 登录
iscsiadm -m node -T iqn.2020-06.com.storage:san1 -l
# 查看会话
iscsiadm -m session -o show
# 此时系统中会出现一块新磁盘(如/dev/sdb),可以正常分区格式化
fdisk -l
mkfs.xfs /dev/sdb
mount /dev/sdb /mnt
4.3 Multipath多路径
生活类比:从家到公司有两条路,一条堵了走另一条。多路径就是为存储设备建立多条通道,既实现冗余又提高带宽。
# 安装多路径软件
yum install -y device-mapper-multipath
systemctl enable multipathd
# 配置文件 /etc/multipath.conf
blacklist {
devnode "sda" # 排除本地系统盘
}
defaults {
user_friendly_names yes # 使用友好名称(mpatha、mpathb)
path_grouping_policy multibus # 负载均衡模式
failback immediate # 路径恢复后立即切回
no_path_retry fail # 无路径时立即报错
}
# 重启服务
systemctl restart multipathd
# 查看多路径状态
multipath -ll
# 输出示例:
# mpatha dm-2 LIO-ORG,disk01
# size=10G features='0' hwhandler='0' wp=rw
# |- 33:0:0:0 sdb 8:16 active ready running
# `- 34:0:0:0 sdc 8:32 active ready running
模式切换:
| 策略 | 说明 |
|---|---|
multibus | 负载均衡(多路并行) |
failover | 主备模式(一条路工作,另一条备份) |
4.4 Ceph分布式存储
生活类比:Ceph就像一个超级图书馆——有管理员(Monitor)记录书籍索引,有书架(OSD)存放书籍,有目录服务(MDS)管理文件的目录结构。你不需要知道书在哪个书架上,CRUSH算法会自动帮你找到。
核心组件
| 组件 | 全称 | 功能 | 比喻 |
|---|---|---|---|
| MON | Monitor | 维护集群状态和CRUSH Map | 图书馆管理员 |
| OSD | Object Storage Daemon | 实际存储数据的进程 | 书架 |
| MDS | Metadata Server | 为CephFS管理元数据 | 目录索引 |
| CRUSH | 算法 | 决定数据放在哪个OSD | 智能分拣系统 |
数据存储流程:
文件 → 切分成对象(Object) → 映射到归置组(PG) → CRUSH算法决定存到哪些OSD
部署步骤
环境准备(所有节点):
# 设置主机名解析
cat >> /etc/hosts << 'EOF'
192.168.0.11 admin-node
192.168.0.12 node1 # MON
192.168.0.13 node2 # OSD
192.168.0.14 node3 # OSD
EOF
# 创建部署用户(所有节点)
useradd -d /home/robin -m robin
echo 123 | passwd --stdin robin
echo "robin ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/robin
# NTP时间同步、关闭防火墙和SELinux(所有节点)
管理节点部署:
# 安装ceph-deploy
yum install -y ceph-deploy
# 创建集群工作目录
mkdir ~/my-cluster && cd ~/my-cluster
# 创建集群(指定初始 monitor节点)
ceph-deploy new node1
# 设置副本数为2(实验环境,生产用3)
echo "osd pool default size = 2" >> ceph.conf
# 安装Ceph到所有节点
ceph-deploy install node1 node2 node3
# 初始化Monitor并收集密钥
ceph-deploy mon create-initial
# 分发配置文件和密钥
ceph-deploy --overwrite-conf admin node1 node2 node3
# 创建Manager(集群管理入口)
ceph-deploy mgr create node1
# 添加OSD(每块磁盘一个OSD)
ceph-deploy osd create --data /dev/vdb node1
ceph-deploy osd create --data /dev/vdb node2
ceph-deploy osd create --data /dev/vdb node3
验证集群:
ceph -s
# 期望输出: HEALTH_OK
# 确认所有OSD状态为 up + in
Ceph三种存储接口:
# 1. 块存储(RBD)
ceph osd pool create rbd 32
rbd create foo --size 4096 --image-feature layering
rbd map foo
mkfs.xfs /dev/rbd/rbd/foo
mount /dev/rbd/rbd/foo /mnt
# 2. 文件系统(CephFS)
ceph osd pool create cephfs_data 32
ceph osd pool create cephfs_metadata 20
ceph fs new testfs cephfs_metadata cephfs_data
mount -t ceph node1:6789:/ /mnt/cephfs -o name=admin,secretfile=admin.secret
# 3. 对象存储(RGW)
ceph-deploy rgw create node1
# 默认端口7480,可通过API访问
4.5 GlusterFS分布式文件系统
生活类比:GlusterFS就像把很多个书柜(Brick)组成一个大书架(Volume),你可以选择把书分散放(分布式卷)、每本书放两本(副本卷)、或者把一本厚书拆成几册分开放(条带卷)。
安装部署
# 所有节点安装
yum install -y centos-release-gluster9
yum install -y glusterfs-server
systemctl start glusterd
systemctl enable glusterd
# 在一个节点上添加其他节点到信任池
gluster peer probe 192.168.100.102
gluster peer probe 192.168.100.103
gluster peer probe 192.168.100.104
# 查看节点状态
gluster peer status
卷类型与创建
分布式卷(数据随机分布,扩展容量,无冗余):
gluster volume create datav1 transport tcp \
192.168.100.101:/data1 \
192.168.100.102:/data1 \
192.168.100.103:/data1 \
192.168.100.104:/data1
gluster volume start datav1
副本卷(数据完整复制,高可用):
gluster volume create datav2 replica 2 transport tcp \
192.168.100.101:/data2 \
192.168.100.102:/data2
分布式副本卷(兼顾容量扩展和数据冗余,最常用):
gluster volume create datav3 replica 2 transport tcp \
192.168.100.101:/data3 \
192.168.100.102:/data3 \
192.168.100.103:/data3 \
192.168.100.104:/data3
# 每2个brick一组副本,文件分布在不同组之间
客户端挂载
# 安装客户端
yum install -y glusterfs-client
# 挂载(原生方式,支持高可用)
mount -t glusterfs 192.168.100.101:datav3 /mnt/gluster
# 即使101宕机,其他节点仍可正常提供服务
常用管理命令
# 查看卷信息
gluster volume info
# 查看卷状态
gluster volume status
# 添加Brick扩容
gluster volume add-brick datav1 192.168.100.105:/data1
# 数据平衡
gluster volume rebalance datav1 start
# 设置配额
gluster volume quota datav1 enable
gluster volume quota datav1 limit-usage / 20GB
附录:知识速查表
端口速查
| 服务 | 端口 | 说明 |
|---|---|---|
| Zabbix Server | 10051 | Server与Agent通信 |
| Zabbix Agent | 10050 | Agent被动接收请求 |
| Zabbix Web | 80/443 | Web界面 |
| Prometheus | 9090 | Web界面和API |
| Node Exporter | 9100 | 主机指标暴露 |
| AlertManager | 9093 | 告警管理界面 |
| Grafana | 3000 | 可视化仪表盘 |
| iSCSI Target | 3260 | 存储服务 |
| Ceph Monitor | 6789 | Monitor通信 |
| GlusterFS | 24007 | 节点通信 |
| HAProxy Stats | 80/443 | 统计页面 |
常用服务管理命令
# Zabbix
systemctl start/stop/restart zabbix-server
systemctl start/stop/restart zabbix-agent
# Prometheus
systemctl start/stop/restart prometheus
systemctl start/stop/restart node_exporter
# KVM
systemctl start/stop/restart libvirtd
virsh list --all
# LVS
ipvsadm -Ln # 查看规则
ipvsadm -C # 清空规则
service ipvsadm save # 保存规则
# Keepalived
systemctl start/stop/restart keepalived
ip addr show # 查看VIP
# Pacemaker
pcs status # 集群状态
pcs resource show # 资源列表
# Ceph
ceph -s # 集群状态
ceph health detail # 健康详情
ceph osd tree # OSD树
# GlusterFS
gluster peer status # 节点状态
gluster volume info # 卷信息