avatar

青青子衿的拾枝杂谈

A text-focused Halo theme

  • 首页
  • linux基础
  • Linux系统
  • Linux高级
  • nginx
  • k8s
  • 网络
Home 监控虚拟化与集群
文章

监控虚拟化与集群

Posted recently Updated recently
By 青青子衿
92~119 min read

监控系统、虚拟化与集群存储 -- 运维实战指南


第一部分:监控系统 -- 给服务器做"体检"

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界面:

  1. 配置 → 数据源 → 添加数据源 → 选择Zabbix
  2. 填入Zabbix API地址:http://Zabbix的IP/zabbix/api_jsonrpc.php
  3. 输入用户名密码 → 保存并测试

导入预制仪表盘

  1. 访问 https://grafana.com/grafana/dashboards 搜索需要的仪表盘
  2. Grafana → 仪表盘 → 导入 → 输入仪表盘ID(如11074)
  3. 选择数据源 → 导入

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_totalCPU时间原始数据
rate(node_cpu_seconds_total[5m])5分钟内CPU使用速率
100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) * 100CPU使用率
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对比:

对比项KVMVMware ESXi
开源/收费开源免费商业收费
内核集成Linux内核原生模块独立Hypervisor
性能接近物理机95%接近物理机
生态libvirt/virsh/virt-managervCenter/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存储区域网络光纤/iSCSISCSI数据块高性能、可扩展、成本高

存储性能指标:

指标含义比喻
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算法会自动帮你找到。

核心组件

组件全称功能比喻
MONMonitor维护集群状态和CRUSH Map图书馆管理员
OSDObject Storage Daemon实际存储数据的进程书架
MDSMetadata 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 Server10051Server与Agent通信
Zabbix Agent10050Agent被动接收请求
Zabbix Web80/443Web界面
Prometheus9090Web界面和API
Node Exporter9100主机指标暴露
AlertManager9093告警管理界面
Grafana3000可视化仪表盘
iSCSI Target3260存储服务
Ceph Monitor6789Monitor通信
GlusterFS24007节点通信
HAProxy Stats80/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            # 卷信息

linux服务
容器 自动化
License:  CC BY 4.0
Share

Further Reading

Jul 4, 2026

监控虚拟化与集群

监控系统、虚拟化与集群存储 -- 运维实战指南 第一部分:监控系统 -- 给服务器做"体检" 1.1 为什么需要监控系统? 生活类比:想象你是一个学校的校医,负责1000名学生的健康。如果每天都要一个个量体温、测心率,你肯定累趴了。最好的办法是:每个学生戴一个智能手环,实时把健康数据发到你办公室的大

Jul 4, 2026

Docker与Kubernetes

Docker容器与Kubernetes集群 -- 从零开始的实战指南 目录 第一部分:Docker容器技术 容器概念:为什么我们需要容器? Docker介绍与安装 Docker客户端操作

Jul 4, 2026

Shell脚本与版本控制

Shell 脚本编程与版本控制实战指南 环境假设:CentOS 7/8 或 RHEL 系列 Linux 目录 第一部分:Shell 脚本编程 1. Shell 脚本介绍 2. 脚本基础知识及变量

OLDER

NEWER

Docker与Kubernetes

Recently Updated

  • 监控虚拟化与集群
  • Docker与Kubernetes
  • Nginx与Tomcat
  • 网络协议与安全
  • 数据库与自动化运维

Trending Tags

安全 Linux系统 nginx 日志管理 Linux服务 网络 Linux高级 pxe 中间件 python

Contents

©2026 青青子衿的拾枝杂谈 . Some rights reserved.

Using the Halo theme Chirpy