香港服务器如何利用Proxmox虚拟化平台实现Windows与Linux混合集群?

那天是周五晚上 10 点,在香港湾仔机房里,我刚把第三台节点推入 42U 机柜底部,隔壁 ISP 的同事递来一杯冻柠茶:“又加班啊?”
我笑笑没接话——因为我知道,今晚不只是“装几台机器”,而是要把一个可以托管 Windows + Linux 混合业务 的 Proxmox VE 高可用集群落在这片嘈杂里。客户要的是快、稳、可扩、可回滚,而且跨境访问还要顺滑。下面这篇,就是我从零到一的完整实操过程,带着汗味、坑点和解决办法。
目标与约束(现场真实约束)
目标:搭建一套 3~5 节点的 Proxmox VE(下文简称 PVE)集群,支撑 Windows Server(域控、IIS/SQL、RDS) 与 Linux(CentOS 7、Ubuntu LTS、Nginx、Redis、容器工作负载) 的混合运行;提供 HA、在线迁移、快照/备份、模板化批量交付。
网络:香港本地 10/25GbE 内网,BGP 走多个运营商;管理、存储、业务流量分网段/分 VLAN;跨境链路延迟 30~60ms(取决于时段)。
存储:节点内置 NVMe 提供本地高 IOPS;集群用 Ceph 做共享存储(也给后续水平扩展留口子);另外接一台 Proxmox Backup Server(PBS) 做备份与异地复制。
操作系统:
Linux 模板以 CentOS 7 为主(客户遗留系统多),同时预置 Ubuntu 22.04。
Windows 模板以 Windows Server 2019/2022 为主,内置 VirtIO 驱动与 Cloudbase-Init。
合规:Windows 授权、软件版权合规;业务数据跨境传输加密。
机架与硬件清单(我实际采购与上架的参数)
注:下面是我们这一批交付的真实“级别”,你可以按预算等比例缩放。关键是网卡与盘位的规划,不要省在刀刃上。
| 角色 | 数量 | 机型/规格 | CPU | 内存 | 系统盘 | 数据盘 | 网卡 | 备注 |
|---|---|---|---|---|---|---|---|---|
| PVE 计算+存储节点 | 3~5 台 | 1U/2U 双路(支持 AVX2/VT-d) | 2×24C | 256~512GB | 2×480GB SATA SSD(RAID1) | 4×3.84TB NVMe U.2(OSD)+ 2×1.92TB NVMe(DB/WAL) | 2×25GbE(SFP28)+ 2×1GbE | NVMe 抽拉盒便于热更 |
| PBS 备份服务器 | 1 台 | 2U | 1×16C | 128GB | 2×480GB SATA(RAID1) | 8×16TB SATA HDD(RAIDZ2)+ 2×1.92TB NVMe(cache) | 2×10GbE | 只跑备份与远程同步 |
| 交换机 | 2 台 | 25G TOR | — | — | — | — | 24×SFP28 + 4×100G 上行 | MLAG/VSX,支持 LACP |
上架顺序:自下而上,重量大在下;电源走 A/B 双路;每台服务器双电;SFP28 光模块做 25G 堆叠上连,LACP 到交换机对等聚合口(交换机侧开 mLAG/VSX,服务器侧 bond)。
网络与 VLAN 规划(能用一眼看懂的表)
我一向坚持把管理、存储、集群心跳、业务平面分开,否则现场排障要命。
| 网络用途 | VLAN | 子网 | MTU | 备注 |
|---|---|---|---|---|
| 管理(PVE GUI/SSH) | 10 | 10.10.10.0/24 | 1500 | 只允许堡垒机/VPN 进入 |
| 集群心跳(Corosync Ring0) | 20 | 10.20.20.0/24 | 9000 | 走 25G,尽量零丢包 |
| Ceph 公网(client/public) | 30 | 10.30.30.0/24 | 9000 | VM 访问存储 |
| Ceph 集群(cluster/replication) | 40 | 10.40.40.0/24 | 9000 | OSD 复制流量 |
| 业务前端(公网/内网) | 100~199 | 依业务分网段 | 1500/9000 | 前端与后端按需拆 VLAN |
ASCII 走线示意:
[ PVE Node ]===25G(bond0)===< TOR-A >==MLAG==< TOR-B >===25G(bond0)===[ PVE Node ]
\__1G(ipmi)__/ \__1G(ipmi)__/
\____________________ PBS 10G/25G _____________________/
安装与基础调优(一步步做,出错了也能回头)
1)BIOS/固件设置(别跳过)
开启 VT-x/VT-d、SR-IOV;关掉 C-States(或调 conservative),开 Turbo。
SATA 模式 AHCI,关闭主板上会偷 IO 的“怪功能”(如自动 RAID 卡写缓存)。
更新到最新 BMC/IPMI 固件,设置好带内 KVM,固定 BMC IP 到管理网段。
2)安装 Proxmox VE
用官方 ISO 引导(U 盘写入即可),系统盘做 RAID1,文件系统我选 ZFS(mirror):
优点:自带校验、压缩、快照,便于日后主机级迁移/回滚。
安装时把 ashift 设为 12(对齐 4K),压缩选 lz4。
3)Linux 网卡聚合与桥(/etc/network/interfaces)
交换机侧:mLAG/VSX 打开,端口组 LACP active,Trunk 允许 VLAN 10/20/30/40/100-199。
auto lo
iface lo inet loopback
auto enp175s0f0
iface enp175s0f0 inet manual
mtu 9000
auto enp175s0f1
iface enp175s0f1 inet manual
mtu 9000
# 25G 聚合
auto bond0
iface bond0 inet manual
bond-slaves enp175s0f0 enp175s0f1
bond-miimon 100
bond-mode 802.3ad
bond-xmit-hash-policy layer3+4
mtu 9000
# 管理桥(VLAN 10)
auto vmbr0
iface vmbr0 inet static
address 10.10.10.11/24
gateway 10.10.10.1
bridge-ports bond0.10
bridge-stp off
bridge-fd 0
mtu 1500
# 集群心跳(VLAN 20)
auto vmbr1
iface vmbr1 inet static
address 10.20.20.11/24
bridge-ports bond0.20
mtu 9000
bridge-stp off
bridge-fd 0
# Ceph 公网(VLAN 30)
auto vmbr2
iface vmbr2 inet static
address 10.30.30.11/24
bridge-ports bond0.30
mtu 9000
bridge-stp off
bridge-fd 0
# Ceph 集群网(VLAN 40)
auto vmbr3
iface vmbr3 inet static
address 10.40.40.11/24
bridge-ports bond0.40
mtu 9000
bridge-stp off
bridge-fd 0
小贴士:MTU 统一很重要。交换机、服务器、桥、VLAN 子接口必须一致,否则 Ceph 会莫名其妙抖动。
4)创建 PVE 集群与冗余心跳
在第一台节点上:
pvecm create hk-cluster
把其他节点加入(在其他节点上运行 pvecm add x.x.x.x,x 为第 1 节点管理 IP)。
集群起来后,编辑 /etc/pve/corosync.conf,加双环(ring0=VLAN20,ring1=VLAN40):
totem {
version: 2
cluster_name: hk-cluster
transport: udpu
secauth: on
token: 3000
interface {
ringnumber: 0
bindnetaddr: 10.20.20.0
mcastport: 5405
}
interface {
ringnumber: 1
bindnetaddr: 10.40.40.0
mcastport: 5406
}
}
nodelist {
node {
name: pve01
nodeid: 1
ring0_addr: 10.20.20.11
ring1_addr: 10.40.40.11
}
...
}
quorum {
provider: corosync_votequorum
two_node: 0
wait_for_all: 1
last_man_standing: 1
}
经验:双环心跳能极大降低单网口/单交换机故障的脑裂风险。
存储设计:ZFS + Ceph + PBS(各司其职)
主机系统:ZFS mirror(系统盘),稳定且可快照回滚。
共享块存储:Ceph(NVMe OSD),VM 放在 rbd 池,支持在线迁移/HA。
备份/归档:Proxmox Backup Server(HDD 为主、NVMe 做缓存),异地同步到另一个站点。
1)部署 Ceph(在 PVE 内置向导或 CLI)
每节点安装 ceph 组件,创建两张网络:
- public network = 10.30.30.0/24
- cluster network = 10.40.40.0/24
OSD 规划:每块 3.84TB NVMe 做 1 个 OSD,DB/WAL 放到独立 1.92TB NVMe。目标副本数 size=3,最小 min_size=2。
示例(以 CLI 表达思路,实际可用 WebUI 点几下):
pveceph install
pveceph init --network 10.30.30.0/24
# 创建 MON/MGR
pveceph createmon
pveceph createmgr
# 每个数据 NVMe 盘创建 OSD,并指定 DB/WAL 盘
pveceph createosd /dev/nvme0n1 --db_dev /dev/nvme2n1 --wal_dev /dev/nvme2n1
pveceph createosd /dev/nvme1n1 --db_dev /dev/nvme2n1 --wal_dev /dev/nvme2n1
# 其他节点同理
# 创建存储池,副本 3
ceph osd pool create rbd-pool 128
ceph osd pool set rbd-pool size 3
rbd pool init rbd-pool
PVE 存储配置 /etc/pve/storage.cfg 增加:
rbd: ceph-rbd
pool rbd-pool
content images,rootdir
krbd 0
nodes pve01,pve02,pve03
2)部署 PBS(备份与验证)
PBS 服务器上创建 datastore(如 hk-pbs-ds1),PVE 侧添加为备份存储,设置每日增量、每周完整与保留策略(如:日 7、周 5、月 12)。
务必做一次完整还原演练:拉起一台隔离网络的 PVE,把备份还原出来,验证 Windows/SQL、Linux 服务能启动,这一步能救命。
模板工程:一劳永逸的 Windows 与 CentOS 7
A. CentOS 7 Cloud-Init 模板
上传官方 ISO 与 cloud-init seed ISO(后者可由 PVE 自动生成)。
创建模板 VM:
qm create 7001 --name tmpl-centos7 --memory 4096 --cores 2 --sockets 1 --numa 1 \
--cpu host --machine q35 --scsihw virtio-scsi-pci --scsi0 ceph-rbd:32 \
--net0 virtio,bridge=vmbr100,tag=100 \
--serial0 socket --vga serial0 \
--ostype l26 --agent 1
qm set 7001 --ide2 local:cloudinit
qm set 7001 --boot c --bootdisk scsi0
qm set 7001 --rng0 source=/dev/urandom
qm set 7001 --balloon 2048
qm set 7001 --onboot 0
挂载 CentOS7 ISO 安装最小化系统(或直接导入 cloud image)。
安装常用工具、开启 qemu-guest-agent、chrony:
yum install -y qemu-guest-agent cloud-init chrony
systemctl enable --now qemu-guest-agent chronyd
清理机器特征(避免重复主机名/MAC):
cloud-init clean
rm -f /etc/ssh/ssh_host_*
转换为模板:
qm template 7001
常用 cloud-init user-data 示例:
#cloud-config
hostname: web-{{vm_id}}
manage_etc_hosts: true
ssh_authorized_keys:
- ssh-rsa AAAA...你的公钥
package_update: true
packages:
- wget
- vim
- net-tools
runcmd:
- sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
- systemctl disable firewalld || true
- echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
- sysctl -p
B. Windows Server 2019/2022 模板(VirtIO + Cloudbase-Init)
上传 Windows 安装 ISO 与 VirtIO 驱动 ISO。
创建 VM:
qm create 7002 --name tmpl-winsrv --memory 8192 --cores 4 --sockets 1 --numa 1 \
--cpu host --machine q35 --scsihw virtio-scsi-pci --scsi0 ceph-rbd:64 \
--net0 virtio,bridge=vmbr100,tag=100 \
--virtio0 ceph-rbd:32 \
--serial0 socket --vga std \
--agent 1 --ostype win10
qm set 7002 --ide2 local:iso/virtio-win.iso,media=cdrom
qm set 7002 --cdrom local:iso/WinSrv.iso
qm set 7002 --boot order=scsi0;ide2;virtio0
安装 Windows 时手动加载 VirtIO 存储与网卡驱动(在“加载驱动程序”选择 virtio ISO 里的 vioscsi/viostor、NetKVM)。
进系统后安装 Cloudbase-Init(支持 cloud-init 元数据),配置使用 OpenStack 元数据服务;开启 WinRM,安装 qemu-guest-agent。
sysprep 泛化:
# 以管理员身份 PowerShell
Enable-PSRemoting -Force
Set-Item WSMan:\localhost\Service\AllowUnencrypted $true
winrm set winrm/config/service/auth '@{Basic="true"}'
# 可选:时钟同步到香港 NTP
w32tm /config /syncfromflags:manual /manualpeerlist:"time.google.com,0x8" /update
w32tm /resync /force
# Sysprep 泛化
C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown
模板化:
qm template 7002
基于模板批量克隆:
# Linux
qm clone 7001 101 --name web01 --full 0 --storage ceph-rbd
qm set 101 --cipassword 'Str0ngPass!' --ciuser devops --ipconfig0 ip=192.168.100.11/24,gw=192.168.100.1
# Windows(cloudbase-init 自动接收主机名/密码)
qm clone 7002 201 --name app01 --full 0 --storage ceph-rbd
HA、在线迁移与调度策略(让故障可承受)
将关键 VM 加入 HA 组,为节点打上 group/tag(区分机柜/供电 A/B),避免同组 VM 落在同一物理故障域。
打开 磁盘缓存 = write back(有 UPS 时),或 conservative 的 write through。
迁移测试(白天低峰做):
qm migrate 101 pve02 --online
NUMA-aware:CPU type 选 host,大内存 VM 开 NUMA,必要时做 CPU pinning:
qm set 201 --cpulimit 8 --cpuunits 2048
业务网络与防火墙(Windows + Linux 共存的“秩序”)
Proxmox Datacenter → Firewall 开全局防火墙,默认拒绝,白名单放行堡垒机、PBS、监控。
VM 级别用 Security Groups 做可维护的规则集(如 sg-rdp, sg-ssh, sg-web)。
Windows 启用 NLA 的 RDP;Linux 禁用密码登录,仅 SSH Key。
需要 SR-IOV/直通 的高吞吐 VM(如边缘网关)按需配置 VF 或 PCI Passthrough(记得开 intel_iommu=on/amd_iommu=on)。
自动化:Ansible + PowerShell(交付成“流水线”)
Ansible(Linux 初始化):
- hosts: linux_web
become: yes
tasks:
- name: Update & base tools
yum:
name:
- epel-release
- htop
- git
state: present
- name: Sysctl tuning
sysctl:
name: net.core.somaxconn
value: "65535"
state: present
sysctl_set: yes
reload: yes
- name: Nginx install
yum:
name: nginx
state: latest
- name: Nginx enable
service:
name: nginx
state: started
enabled: yes
PowerShell(Windows 基线):
# 禁用旧版 TLS,打开必要功能
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -Name Enabled -Value 0 -Type DWord
Install-WindowsFeature -Name Web-Server,Web-WebSockets,NET-Framework-Features -IncludeAllSubFeature
# 配置 RDP NLA
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1
监控与日志
- Node/VM:Prometheus Node Exporter、WMI Exporter(Windows);Zabbix 也可。
- Ceph:关注 osd near full、pg stuck、slow ops;图表看延迟 ~ms 级别变化。
- PVE:Syslog 收敛到 ELK/Graylog;备份任务结果必须报警(PBS 有通知 webhook)。
性能小抄(当天晚上我就这样把抖动压下去了)
关闭不必要的 offloading(某些 NIC + VirtIO 组合下小包多会高延迟):
ethtool -K eth0 gso off gro off tso off
磁盘调度:OSD/高 IOPS 盘设置为 none 或 mq-deadline,虚拟磁盘可用 io_uring。
Windows 磁盘对齐与写缓存:设备管理器启用写缓存;SQL/日志盘独立 vdisk。
时间同步:Corosync 对时很敏感,节点统一 chrony 指向同一 NTP,Windows 用 w32tm 指同源。
我踩过的坑与现场解法(不藏私)
| 症状 | 根因 | 解决 |
|---|---|---|
| 两节点同开机就“脑裂”警报 | 单环心跳 + 交换机单板重启导致丢包 | 上 双环 Corosync(见上),心跳走不同 VLAN 与不同物理路径 |
| 迁移中断、Ceph 抖动 | MTU 不一致(交换机 9000,Linux bridge 1500) | 统一所有路径 MTU;ping -M do -s 8972 验证 |
| Windows 装不上/蓝屏 | 忘记加载 VirtIO 存储/网卡驱动 | 安装页“加载驱动程序”,选择 VirtIO ISO 对应版本 |
| 云端初始化失败 | Windows 未装 Cloudbase-Init 或 sysprep 不彻底 | 安装 Cloudbase-Init,确保 sysprep /generalize 后再模板化 |
| LACP 一直 up/down 抖动 | 交换机是 passive,服务器也是 passive | 一端设 active(推荐交换机侧 active),另一端 passive |
| Ceph “slow ops” | OSD DB/WAL 混在数据盘、写放大严重 | 独立 NVMe 做 DB/WAL;合理副本数与 PG 数 |
| PBS 备份快但恢复慢 | HDD 阵列无缓存、网络限速 | 加 NVMe cache、提升 PBS 网口至 25G,恢复走同 VLAN |
交付验收清单(我真正在机房里逐项打勾)
- 三节点以上、Quorum 正常(pvecm status)。
- 双环心跳连通,ring0/ring1 都 ACTIVE。
- Ceph 健康 HEALTH_OK,无 near full。
- 模板可克隆,Linux/Windows 首次启动能自动配置主机名/网络/密钥。
- 在线迁移 2 次以上无中断。
- HA 演练:强制关机一节点,关键 VM 在 60~120 秒内恢复。
- PBS 备份/还原演练通过。
- 防火墙基线、账号最小化、NTP 同步、监控告警联通。
成本与容量估算(实用表格)
| 项目 | 单价参考 | 数量 | 小计 | 说明 |
|---|---|---|---|---|
| 计算节点(含 4×3.84TB NVMe + 25G) | ¥5~7 万/台 | 3 | ¥15~21 万 | 可先上 3 台,后续水平扩 |
| PBS(2U + 8×16TB HDD + 25G) | ¥5 万 | 1 | ¥5 万 | 备份与异地同步 |
| 25G TOR(成对) | ¥6~10 万/对 | 1 | ¥6~10 万 | 看品牌与特性 |
| 光模块/线缆 | ¥500~1000/条 | 8 | ¥0.4~0.8 万 | 25G SFP28 |
| 机柜与带宽(月) | — | — | — | 香港按机柜/功率/带宽计费 |
备注:上面是我今年在香港两套集群落地的真实量级,波动来自供应链与汇率。
凌晨两点,HA 演练的最后一轮结束,关键 Windows 应用在另一个节点上 90 秒内起死回生;CentOS 7 的 Nginx 撑着压测的长连接稳如老狗。换好最后一个标签,我靠着机柜坐了会儿,外面港岛的夜风从卸货区缝隙钻进来,带着一点海味。
第二周客户突发一次物理节点 PSU 故障——告警响起,我只看了一眼 Proxmox 的 HA 面板,VM 已经在备用节点跑起来了。用户那边几乎无感。那一刻我知道,这套 Windows + Linux 混合集群是真的“接住了”。
附:我常用的命令与文件片段(可直接抄)
查看集群与迁移:
pvecm status
pveperf
qm list
qm migrate <vmid> <target-node> --online
Ceph 快速健康检查:
ceph -s
ceph osd df tree
rados df
PBS:手动触发备份任务(在 PVE 上):
vzdump 101 201 --storage pbs-hk --mode snapshot --compress zstd
Windows 时钟与 RDP:
w32tm /query /status
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections -Value 0
CentOS 7 ifcfg 示例(VLAN 100):
# /etc/sysconfig/network-scripts/ifcfg-eth0.100
DEVICE=eth0.100
BOOTPROTO=none
ONBOOT=yes
VLAN=yes
IPADDR=192.168.100.11
PREFIX=24
GATEWAY=192.168.100.1
如果你也在香港、深圳或任何需要低时延对外的地方要搭一套混合集群,Proxmox + Ceph + PBS 是我反复验证过的“性价比三件套”。
记住三个关键词:分平面、可回滚、可验证。把坑踩在凌晨,把稳定留给白天的业务。等你从机房出来,楼下便利店还在亮着灯——买瓶冻柠茶,给自己也打个勾 ✅。