企业网站开发与设计网站开发分析报告
在 VMware vSphere 中配置多写入器共享磁盘(Multi-Writer Shared Disks)时,需注意以下关键点:
1. 磁盘控制器类型的要求
-
必须使用
VirtualLsiLogicSASController
多写入器共享磁盘要求控制器支持 SCSI-3 Persistent Reservations(PR),而VirtualLsiLogicSASController
(LSI Logic SAS)控制器是 VMware 官方唯一支持此功能的控制器类型。
VirtualLsiLogicController
(标准 LSI Logic)不支持多写入器模式,可能导致集群不稳定或数据损坏。
2.磁盘模式(diskMode)
磁盘模式定义了虚拟机磁盘与快照的交互行为,以及数据的持久性:
diskMode | 描述 | 数据持久性 | 适用场景 |
---|---|---|---|
独立 - 持久 (Independent - Persistent) | - 磁盘数据永久保存,不受快照影响。 - 快照操作不会包含此磁盘的更改。 | 数据永久保存 | 关键数据磁盘(如数据库文件),需确保数据独立于快照生命周期。 |
独立 - 非持久 (Independent - Nonpersistent) | - 磁盘数据在虚拟机重启后重置为初始状态。 - 所有写入操作在关机后丢失(类似临时磁盘)。 | 数据不保存(临时性) | 测试环境、临时操作(如软件安装测试),或需要恢复初始状态的场景。 |
依赖(默认) (Dependent) | - 磁盘数据与快照关联。 - 快照会捕获磁盘的更改,并允许回滚到快照状态。 | 数据受快照管理 | 常规用途,需要利用快照功能的环境(如开发、备份恢复)。 |
独享盘一般用VirtualDiskModePersistent(即Dependent),共享盘用VirtualDiskModeIndependent_persistent
3. 控制器SharedBus
属性的区别
在虚拟机磁盘控制器的高级参数中,SharedBus
定义了共享磁盘的访问模式:
-
noSharing
(默认)
禁用共享,仅允许单个虚拟机独占访问磁盘。 -
virtualSharing
同一 ESXi 主机内的虚拟机共享磁盘:-
多个虚拟机(位于同一主机)可同时挂载同一磁盘(如
.vmdk
文件)。 -
适用于测试或开发环境(例如同一主机内的集群节点)。
-
要求所有虚拟机均启用多写入器模式(
disk.EnableUUID=TRUE
且diskLib.dataCacheMaxSize=0
)。
-
-
physicalSharing
跨 ESXi 主机的虚拟机共享磁盘:-
允许多个虚拟机(位于不同主机)通过共享存储(如 SAN/NFS)访问同一磁盘(通常为 RDM 或 VMFS 上的
.vmdk
)。 -
用于生产环境跨主机集群(如跨节点的 Windows 故障转移集群、Oracle RAC)。
-
存储必须支持 SCSI PR 且配置正确(如启用原子测试单元(ATS))。
-
4. 配置注意事项
-
多写入器模式必须显式启用:
在虚拟机高级配置中添加scsiX:Y.sharedBus = "virtual"
或"physical"
(X=控制器编号,Y=磁盘编号)。 -
存储兼容性:
确保存储后端(如 VMFS、NFS、vSAN)支持多写入器操作,并遵循 VMware 的兼容性指南。 -
性能与稳定性:
多写入器模式可能导致 SCSI 预留冲突,影响性能。建议仅在集群软件明确要求时使用。
总结
-
控制器类型:必须为
VirtualLsiLogicSASController
。 -
virtualSharing
:同一主机内多虚拟机共享。 -
physicalSharing
:跨主机共享,需依赖共享存储和集群文件系统。
代码片段:
func AddDisksExt(devices object.VirtualDeviceList, disks []model.Disk) (object.VirtualDeviceList, []types.BaseVirtualDeviceConfigSpec, error) {var (deviceChange []types.BaseVirtualDeviceConfigSpeccontroller *types.VirtualLsiLogicSASController = nilnewController bool = false)ctrls := devices.SelectByType((*types.VirtualController)(nil))for _, ctrl := range ctrls {if devices.Type(ctrl) == "lsilogic-sas" {controller = ctrl.(*types.VirtualLsiLogicSASController)break}}if controller == nil {scsi, err := devices.CreateSCSIController("lsilogic-sas")if err != nil {return nil, nil, err}newController = truecontroller = scsi.(*types.VirtualLsiLogicSASController)config := NewDeviceConfigSpec(scsi, types.VirtualDeviceConfigSpecOperationAdd)deviceChange = append(deviceChange, config)}shared := falsefor _, d := range disks {file := ""sharing := string(types.VirtualDiskSharingSharingNone)diskMode := string(types.VirtualDiskModePersistent)if d.Shared {shared = truefile = d.Filesharing = string(types.VirtualDiskSharingSharingMultiWriter)diskMode = string(types.VirtualDiskModeIndependent_persistent)}disk := &types.VirtualDisk{CapacityInKB: int64(d.Size) * 1024 * 1024,VirtualDevice: types.VirtualDevice{Backing: &types.VirtualDiskFlatVer2BackingInfo{ // 通过ThinProvisioned来控制是否为精简模式DiskMode: diskMode,ThinProvisioned: types.NewBool(d.Thin),Sharing: sharing,},},}devices.AssignController(disk, controller)devices = append(devices, disk)config := &types.VirtualDeviceConfigSpec{Device: disk,Operation: types.VirtualDeviceConfigSpecOperationAdd,}if len(file) == 0 { // 支持使用现有硬盘,现有硬盘不需要创建config.FileOperation = types.VirtualDeviceConfigSpecFileOperationCreate} else if d.Shared {backing, _ := disk.VirtualDevice.Backing.(*types.VirtualDiskFlatVer2BackingInfo)backing.VirtualDeviceFileBackingInfo.FileName = file}deviceChange = append(deviceChange, config)}if shared { // 共享盘需要设置控制器ShareBus为物理共享controller.SharedBus = types.VirtualSCSISharingPhysicalSharingif !newController {config := NewDeviceConfigSpec(controller, types.VirtualDeviceConfigSpecOperationEdit)deviceChange = append(deviceChange, config)}}return devices, deviceChange, nil