云原生是一个美好的希望,但对于传统企业大量的传统应用,lift & shift才是初期上云的最快、业务影响最小的方式,然后再逐步做面对云架构的优化。
lift & shift需要云端和企业本地类似的it架构,而在传统架构广泛使用的共享磁盘一直很难在云端实现。虽然云端有smb、nfs等共享空间的方式,但很多块级应用例如oracle rac等无法用共享空间。虽然有一些第三方的虚拟存储控制器解决方案,但性能和稳定性都很难满足要求,而且有额外的成本。
近期,Azure推出了Shared Disk内测,解决了云端共享磁盘的问题,本文就通过搭建Windows Server故障转移集群的方式测试Shared Disk。
Azure Shared Disk简介
20200410补充,美西Region开始Ultra Shared disks preview
最早 Azure CTO Mark Russinovich在2018 Tech Ready介绍Ultra SSD时,讲到Shared Disk是Ultra SSD的一个重要功能,可以挂载到多台VM,支持一写多读。
经过漫长的等待,终于开始内测,和最初说法不一样,内测首先支持Premium SSD,支持多读多写(使用 SCSI PR 建立仲裁并读取/写入磁盘)磁盘参数多了一项maxShares,指定同一块磁盘可以最多挂载到几台VM。对不同容量磁盘,maxShares最大值不一样:
当一块磁盘属于多台VM时,IOPS和带宽之和不超过该磁盘的上限。
在内测阶段,Shared Disk有如下限制:
- 目前仅适用于高级 SSD。
- 目前仅在美国中西部地区得到支持。
- 共享磁盘的所有虚拟机都必须部署在同一接近放置组中。
- 只能在数据磁盘上启用,不能在 OS 磁盘上启用。
- 只有基本磁盘可用于某些版本的 Windows 服务器故障转移群集。
- 只读主机缓存不适用于具有maxShares>1的高级 SSD。
- 可用性集和虚拟机规模集只能与设置为 1FaultDomainCount一起使用。
- Azure 备份和 Azure 站点恢复支持尚不可用。
Azure Shared Disk测试
测试环境
本次测试架构如下:
˛
此架构中包含3台VM,均为Windows Server 2016,连接至ClusterVNet(192.168.0.0/16)中的ClusterSubnet(192.168.1.0/24):
- AD:用作域控和DNS,ip配置192.168.1.4,DNS后缀cluster.lab
- vm01及vm02:Cluster成员,ip配置192.168.1.5及192.168.1.6,DNS指向192.168.1.4;加入cluster.lab域;连接至名为ClusterDisk的Azure Shared Disk;使用Azure Storage Account作为仲裁(云见证);同属于名为ClusterAVSet的AV set
- Cluster IP:配置为192.168.1.11
严格来说,该架构还缺乏NSG网络安全组、用作浮动IP的LB等,但本次测试目标为Shared Disk,所以先忽略。测试过程
Azure Share Disk现只在美国中西Region提供内测,所以所有资源均创建在美国中西Region。资源组创建
创建名为ClusterDemoRG的资源组:az group create -n ClusterDemoRG -l westcentralus
网络创建
创建名为ClusterVNet的vnet和名为ClusterSubnet的subnet:az network vnet create -n ClusterVNet -g ClusterDemoRG -l westcentralus --address-prefixes 192.168.0.0/
16 --subnet-name ClusterSubnet --subnet-prefixes 192.168.1.0/24
接近主机组及可用性集创建
Azure Shared Disk 要求连接至同一个Shared Disk的VM必须在同一个接近主机组(PPG)和可用性集(AV Set),并且可用性集的FD为1。
创建名为ClusterPPG的接近主机组:az ppg create -n ClusterPPG -g ClusterDemoRG -l westcentralus
创建名为ClusterAVSet的可用性集并连接ClusterPPG。这里CLI有个小Bug,不能直接创建FD为1的可用性集,所以用Portal创建:
注意FD一定要设置为1(红圈部分)
连接至创建好的PPG
确认无误后点击创建。
存储账户创建
Windows 2016增加了一个新功能——云见证,使用Azure的存储账户作为Cluster的仲裁,大大简化了Cluster的部署方式。
云见证对任意位置的Cluster均可实施,只需要Cluster Node可以访问存储账户即可。
存储账户创建如下:az storage account create -n cloudwitnessdemo -g ClusterDemoRG
存储账户无需和Cluster在同一个Region,所以可以不用指定
Azure Shared Disk创建
目前阶段Shared Disk只能通过如下模板创建:{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"dataDiskName": {
"type": "string",
"defaultValue": "mySharedDisk"
},
"dataDiskSizeGB": {
"type": "int",
"defaultValue": 1024
},
"maxShares": {
"type": "int",
"defaultValue": 2
}
},
"resources": [
{
"type": "Microsoft.Compute/disks",
"name": "[parameters('dataDiskName')]",
"location": "[resourceGroup().location]",
"apiVersion": "2019-07-01",
"sku": {
"name": "Premium_LRS"
},
"properties": {
"creationData": {
"createOption": "Empty"
},
"diskSizeGB": "[parameters('dataDiskSizeGB')]",
"maxShares": "[parameters('maxShares')]"
}
}
]
}
在Azure Portal里创建此模板:
然后部署:
填写相关参数(如前所述,注意Max Shares要和磁盘容量对应):
创建完成可以看到该磁盘:
AD域控服务器创建配置
服务器创建
创建一台名为AD的Windows 2016服务器:az vm create -n AD -g ClusterDemoRG -l westcentralus --size Standard_D4s_v3 --image Win2016Datacenter --admin-username ad --admin-password Password=123
安装域控功能
RDP连接至服务器:
选择“Add roles and features”:
按向导保持默认往下走,一直到”Server Roles”这一步,选择“Active Directory Domain Service”并弹出菜单保持默认:
“Comfirmation”页面勾选“Restart the destination server automatically if requested”,然后点击Install:
安装完成点击“Close”退回服务器管理页面:
配置域控
服务器管理页面右上角三角旗边会出来一个黄色惊叹号,点开再点击“Promote this server to a domian controller”开始配置域控:
添加一个新的林,域名cluster.lab:
配置恢复模式密码:
一路“Next”,到“Prerequisites Check”会出现一些警告,不用管,直接“Install”:
配置完成VM会自动重启,然后使用域账户(cluster.lab\AD)登录:
登录后可以看到AD及DNS服务正常启动:
AD域控至此配置完成。
Cluster安装配置
Node创建
虚机创建
创建两台虚机vm01、vm02,注意创建时需要加入可用性集:az vm create -n vm01 -g ClusterDemoRG -l westcentralus --size Standard_D4s_v3 --image Win2016Datacenter --admin-username ad --admin-password Password=123 --availability-set ClusterAVSet
az vm create -n vm02 -g ClusterDemoRG -l westcentralus --size Standard_D4s_v3 --image Win2016Datacenter --admin-username ad --admin-password Password=123 --availability-set ClusterAVSet
虚机磁盘配置
创建虚机时没有配置数据盘,现在Azure Portal里给虚机添加数据盘。
在Portal选在vm01,进入磁盘选项,点击”Add Data disk”,在“Name”点击下拉,可以列出所有可添加的磁盘:
可以看到,磁盘的属性里除了以前的容量和类型以外,多了一个disk shares used,显示该磁盘可以附加到多少台VM以及已经附加了多少台VM,以ClusterDisk为例,该参数是0/2,表示可以附加到2台VM(max share参数),现在还没有附加到任何一台VM
选择ClusterDisk,并保存:
注意这里有个小坑,Shared Disk的cache必须设置为None,否则添加时会报错
同样为vm02添加数据磁盘:
远程桌面检查vm01和vm02,可以看到新加的数据盘:
加入域
修改vm01和vm02的网络配置,将DNS指向AD(192.168.1.4):
修改后可能VM会断开网络,需要在Azure去执行一遍restart
修改vm01和vm02的属性,加入域cluster.lab:
加入域时需要属于有加入域权限的用户名和口令,这里直接用域控管理员的账户:
成功加入:
系统重启后用域账户登录。
Cluster安装配置
Cluster安装及创建
在vm01和vm02用“add roles and features”添加故障转移集群功能:
在vm01选择Tools-Failover Cluster Manager配置Cluster:
从右侧菜单选择创建集群:
将vm01和vm02添加进来:
选择不进行校验:
Cluster名字ClusterDemo:
然后继续“Next”创建集群:
Cluster配置
网络配置
成功创建集群,可以看到自动Online:
展开检查发现现在的Cluster IP是DHCP,分配了192.168.1.6,和vm02有冲突,需要修改:
右键属性将Cluster IP修改为规划的192.168.1.11:
配置完成并生效:
Cluster仲裁配置
为了保证Cluster的安全,避免node间通讯问题导致脑裂,需要配置一个第三站点的仲裁来判断node的健康情况。
Windows 2016开始支持使用Azure存储账户做仲裁,按如下配置:
点击右边菜单的“More Actions”,选择创建仲裁:
这里需要选择高级配置:
对所有node生效:
选择云仲裁:
填入预先创建的存储账户的名字和key,注意如果不是Global Azure,需要修改对应的endpoint:
完成配置:
共享磁盘配置
在Failover Cluster Manager里选择Storage-Disks,
选择Add Disk,自动扫描出数据盘:
添加完毕:
到vm01的磁盘管理器检查,可以看到磁盘已经online,处于Reserved状态:
而在vm02,磁盘offline:
共享磁盘配置完成。
Azure Shared Disk切换测试
现在测试一下在node间磁盘的切换。
回到vm01,分区并格式化磁盘,注意,由于该磁盘被Cluster接管,所以操作前先要把磁盘置于maintenance模式:
在Cluster管理器里关闭maintenance模式,然后分配盘符,完成后资源管理器里多出E盘:
进入E盘,可正常创建目录:
此时,vm02里看不到E盘:
现在模拟故障,将vm01关机:
稍等一会儿,E盘自动挂载到vm02:
vm01创建的目录正常显示:
并且可正常创建新目录:
共享磁盘切换成功。
总结
通过以上测试可以看出,Azure Shared Disk使用起来和本地数据中心的共享盘阵等方式基本没区别,简化了用户上云迁移系统架构更改的难度。内测阶段虽然还有些使用限制和小bug,但瑕不掩瑜。
需要测试的同学,可通过以下链接申请:
Azure Shared Disk内测申请