Skip navigation

以前の投稿で PowerCLI を利用して、vSAN 環境の Oracle RAC VM の情報を確認する方法を紹介しました。

PowerCLI で vSphere / vSAN 環境での Oracle RAC むけ VM の構成情報を取得してみる。

 

今回は、その VM を PowerCLI で作成する方法を紹介します。

vCenter 6.5 U1 / ESXi 6.5 U1 の vSAN 環境で、

PowerCLI は、あえて Oracle Linux 7 で使用してみました。

Linux で PowerCLI 10.0 をためしてみる。

 

VM の作成 / クローン。

今回は、db00-template というテンプレートの VM を用意しています。

テンプレート VM には、Oracle Linux 7 がインストールして、

rpm パッケージのアップデートなども済ませておくとよいと思います。

 

テンプレート VM をクローンします。

最初は Get-VM にしていますが、VM を「テンプレート」に変換している場合は Get-Template になります。

DRS を有効化している環境では、ESXi ではなく クラスタ / リソースプールを指定してクローンできます。

  • 今回のクローン先とし指定している リソースプール「rp-lab」は作成ずみです。
  • 仮想マシン フォルダ「vsan-oracle-rac」も作成ずみです。
  • クローン先のデータストアは vSAN データストア「vsanDatastore-01」です。
  • テンプレート VM には OS 領域の VMDK しかないので、Thin プロビジョニングにしています。

PS /home/gowatana> Get-VM db00-template | New-VM -ResourcePool rp-lab -Datastore vsanDatastore-01 -StorageFormat Thin -Location vsan-oracle-rac -Name db01

PS /home/gowatana> Get-VM db00-template | New-VM -ResourcePool rp-lab -Datastore vsanDatastore-01 -StorageFormat Thin -Location vsan-oracle-rac -Name db02

 

作成された VM です。

下記で見られる VM のスペックは、テンプレートの VM から引き継がれています。

PS /home/gowatana> Get-VM db0? | select Name,PowerState,NumCpu,MemoryGB,Version,GuestId,VMHost | Sort-Object Name | ft -AutoSize

 

Name PowerState NumCpu MemoryGB Version GuestId              VMHost

---- ---------- ------ -------- ------- -------              ------

db01 PoweredOff      2        8     v13 oracleLinux7_64Guest hv-i21.go-lab.jp

db02 PoweredOff      2        8     v13 oracleLinux7_64Guest hv-i21.go-lab.jp

 

 

vNIC の追加。

分散ポートグループの作成と、vNIC を追加します。

  • 今回の RAC では、Public(テンプレート VM にすでに作成ずみの vNIC#1)と Private(追加する vNIC#2)の NIC を使用する想定とします。
  • ASM 用のネットワークを分離できますが、今回は Private と兼用にします。
  • 共有ディスクは VMDK ファイルの共有で用意するので、NFS / iSCSI ネットワークも用意しません。
  • Private ネットワークむけに VLAN をわけたポートグループ作成して、vNIC はそこに接続します。
    ちなみに、この環境では分散仮想スイッチ(vDS)を利用しています。

 

まだ、それぞれの VM に vNIC は 1つだけです。

PS /home/gowatana> Get-VM db0? | Get-NetworkAdapter | select Parent,Name,Type,NetworkName,@{N="StartConnected";E={$_.ConnectionState.StartConnected}},@{N="Connected";E={$_.ConnectionState.Connected}} | Sort-Object Parent,Name | ft -AutoSize

 

Parent Name                 Type NetworkName          StartConnected Connected

------ ----                 ---- -----------          -------------- ---------

db01   Network adapter 1 Vmxnet3 dvpg-vds01-vlan-1011           True     False

db02   Network adapter 1 Vmxnet3 dvpg-vds01-vlan-1011           True     False

 

 

分散ポートグループを作成します。

PS /home/gowatana> Get-VDSwitch vds01 | New-VDPortgroup -Name dvpg-vds01-vlan-4001 -VlanId 4001

 

vNIC#2 を追加します。

PS /home/gowatana> Get-VM db0? | New-NetworkAdapter -Type Vmxnet3 -Portgroup dvpg-vds01-vlan-4001 -StartConnected:$true 

 

vNIC#2 が追加されました。

PS /home/gowatana> Get-VM db0? | Get-NetworkAdapter | select Parent,Name,Type,NetworkName,@{N="StartConnected";E={$_.ConnectionState.StartConnected}},@{N="Connected";E={$_.ConnectionState.Connected}} | Sort-Object Parent,Name | ft -AutoSize

 

Parent Name                 Type NetworkName          StartConnected Connected

------ ----                 ---- -----------          -------------- ---------

db01   Network adapter 1 Vmxnet3 dvpg-vds01-vlan-1011           True     False

db01   Network adapter 2 Vmxnet3 dvpg-vds01-vlan-4001           True     False

db02   Network adapter 1 Vmxnet3 dvpg-vds01-vlan-1011           True     False

db02   Network adapter 2 Vmxnet3 dvpg-vds01-vlan-4001           True     False

 

 

VMDK の追加。(ローカル ディスクむけ)

VM に、ローカル ディスク むけの VMDK を追加します。

これは、ソフトウェアをインストールする領域として利用します。

(いわゆる ORACLE_BASE / ORACLE_HOME / GRID_HOME...)

このディスクは、特にファイルシステムを分ける必要がない場合は不要ですが、

一般的にはファイルシステムを分割するのではないかと思います。

 

VM テンプレートでは VMDK#1 だけの状態でした。

PS /home/gowatana> Get-VM db0? | Get-HardDisk | select Parent,Name,CapacityGB,Filename | Sort-Object Parent,Name

 

Parent Name        CapacityGB Filename

------ ----        ---------- --------

db01   Hard disk 1         16 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01.vmdk

db02   Hard disk 1         16 [vsanDatastore-01] cac6ab5a-1074-611f-a546-b8aeedea7a23/db02.vmdk

 

 

VMDK を追加します。

PS /home/gowatana> Get-VM db0? | New-HardDisk -Datastore vsanDatastore-01 -CapacityGB 40 -StorageFormat Thin

 

VMDK が追加されました。

PS /home/gowatana> Get-VM db0? | Get-HardDisk | select Parent,Name,CapacityGB,Filename | Sort-Object Parent,Name

 

Parent Name        CapacityGB Filename

------ ----        ---------- --------

db01   Hard disk 1         16 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01.vmdk

db01   Hard disk 2         40 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_1.vmdk

db02   Hard disk 1         16 [vsanDatastore-01] cac6ab5a-1074-611f-a546-b8aeedea7a23/db02.vmdk

db02   Hard disk 2         40 [vsanDatastore-01] cac6ab5a-1074-611f-a546-b8aeedea7a23/db02_1.vmdk

 

 

VMDK の追加。(共有ディスクむけ / db01 側)

RAC の共有ディスクとして利用するための VMDK を追加します。

共有ディスクとして利用する VMDK ファイルの作成は、1台の VM(今回は db01)で実施します。

  • 共有ディスクむけの VMDK は、仮想 SCSI コントローラ(vSCSI Controller)を分けておきます。
  • EagerZeroed Thick にしておきます。
  • スナップショットの対象外になるように「-Persistence IndependentPersistent」にしておきます。

 

デフォルトでは、vSCSI Controller は 1つだけのはずです。

PS /home/gowatana> Get-VM db0? | Get-ScsiController | select Parent,Name,Type,BusSharingMode | Sort-Object Parent

 

Parent Name                     Type BusSharingMode

------ ----                     ---- --------------

db01   SCSI controller 0 ParaVirtual      NoSharing

db02   SCSI controller 0 ParaVirtual      NoSharing

 

 

VMDK と vSCSI Controller を追加します。

PS /home/gowatana> Get-VM db01 | New-HardDisk -CapacityGB 30 -Datastore vsanDatastore-01 -StorageFormat EagerZeroedThick -Persistence IndependentPersistent | New-ScsiController -Type ParaVirtual

 

これで、vSCSI Controllr と VMDK が同時に追加されます。

PS /home/gowatana> Get-VM db01 | Get-ScsiController | select Parent,Name,Type,BusSharingMode

 

Parent Name                     Type BusSharingMode

------ ----                     ---- --------------

db01   SCSI controller 0 ParaVirtual      NoSharing

db01   SCSI controller 1 ParaVirtual      NoSharing

 

 

PS /home/gowatana> Get-VM db01 | Get-HardDisk | Get-SpbmEntityConfiguration | ft -AutoSize

 

Entity      Storage Policy    Status    Time Of Check

------      --------------    ------    -------------

Hard disk 1 vsan-policy-raid5 compliant 2018/03/16 18:45:07

Hard disk 2 vsan-policy-raid5 compliant 2018/03/16 21:21:45

Hard disk 3                   none

 

 

さらに VMDK を追加する場合は、ここで追加された 「SCSI controller 1」を指定します。

今回は、あと 5つ追加します。

PS /home/gowatana> Get-VM db01 | New-HardDisk -CapacityGB 30 -Datastore vsanDatastore-01 -StorageFormat EagerZeroedThick -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db01 | New-HardDisk -CapacityGB 30 -Datastore vsanDatastore-01 -StorageFormat EagerZeroedThick -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db01 | New-HardDisk -CapacityGB 30 -Datastore vsanDatastore-01 -StorageFormat EagerZeroedThick -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db01 | New-HardDisk -CapacityGB 30 -Datastore vsanDatastore-01 -StorageFormat EagerZeroedThick -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db01 | New-HardDisk -CapacityGB 30 -Datastore vsanDatastore-01 -StorageFormat EagerZeroedThick -Persistence IndependentPersistent -Controller "SCSI controller 1"

 

結果的に、Controller 1001 の VMDK#3~#8 が追加されました。

PS /home/gowatana> Get-VM db01 | Get-HardDisk | select Parent,Name,CapacityGB,@{N="Controller";E={$_.ExtensionData.ControllerKey}},StorageFormat,@{N="StoragePolicy";E={($_|Get-SpbmEntityConfiguration).StoragePolicy}} | Sort-Object Parent,Name | ft -AutoSize

 

Parent Name        CapacityGB Controller    StorageFormat StoragePolicy

------ ----        ---------- ----------    ------------- -------------

db01   Hard disk 1         16       1000             Thin vsan-policy-raid5

db01   Hard disk 2         40       1000             Thin vsan-policy-raid5

db01   Hard disk 3         30       1001 EagerZeroedThick

db01   Hard disk 4         30       1001 EagerZeroedThick vsan-policy-raid5

db01   Hard disk 5         30       1001 EagerZeroedThick vsan-policy-raid5

db01   Hard disk 6         30       1001 EagerZeroedThick vsan-policy-raid5

db01   Hard disk 7         30       1001 EagerZeroedThick vsan-policy-raid5

db01   Hard disk 8         30       1001 EagerZeroedThick vsan-policy-raid5

 

 

VMDK ファイルは、すべて vSAN データストアに格納されています。

PS /home/gowatana> Get-VM db01 | Get-HardDisk | select Parent,Name,Filename | Sort-Object Parent,Name | ft -AutoSize

 

Parent Name        Filename

------ ----        --------

db01   Hard disk 1 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01.vmdk

db01   Hard disk 2 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_1.vmdk

db01   Hard disk 3 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_2.vmdk

db01   Hard disk 4 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_3.vmdk

db01   Hard disk 5 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_4.vmdk

db01   Hard disk 6 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_5.vmdk

db01   Hard disk 7 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_6.vmdk

db01   Hard disk 8 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_7.vmdk

 

 

仮想マシン ストレージ ポリシーの作成。

RAC の共有ディスクむけに、仮想マシン ストレージ ポリシーを作成します。

  • オブジェクト領域予約を 100% にします。
  • 許容される障害数(FTT)を 1 にします。
  • オブジェクトあたりのディスク ストライプ数は 2 にします。

PS /home/gowatana> $r1 = New-SpbmRule -Capability (Get-SpbmCapability -Name VSAN.proportionalCapacity) -Value 100

PS /home/gowatana> $r2 = New-SpbmRule -Capability (Get-SpbmCapability -Name VSAN.hostFailuresToTolerate) -Value 1

PS /home/gowatana> $r3 = New-SpbmRule -Capability (Get-SpbmCapability -Name VSAN.stripeWidth) -Value 2

PS /home/gowatana> $rs1 = New-SpbmRuleSet -AllOfRules $r1, $r2, $r3

PS /home/gowatana> New-SpbmStoragePolicy -Name vsan-policy-rac-01 -AnyOfRuleSets $rs1

 

ポリシーが作成されました。

PS /home/gowatana> Get-SpbmStoragePolicy -Name "vsan-policy-rac-01" | select -ExpandProperty AnyOfRuleSets | %{$name = $_.Name; $_ | select -ExpandProperty AllOfRules | select @{N="RuleName";E={$Name}},Capability,Value} | ft -AutoSize

 

RuleName   Capability                  Value

--------   ----------                  -----

Rule-Set 1 VSAN.proportionalCapacity     100

Rule-Set 1 VSAN.hostFailuresToTolerate     1

Rule-Set 1 VSAN.stripeWidth                2

 

 

VMDK へのポリシー割り当て。(db01)

共有ディスクむけの VMDK にポリシーを割り当てます。

接続されている vSCSI Controller を識別したほうがよいと思いますが、

今回は Persistence を IndependentPersistent にしている VMDK に対して割り当てます。

(見分けやすいので)

PS /home/gowatana> Get-VM db01 | Get-HardDisk | where {$_.Persistence -eq "IndependentPersistent"} | Set-SpbmEntityConfiguration -StoragePolicy vsan-policy-rac-01

 

vSCSI Controller 1(Key が 1001)の VMDK のポリシーが変更されました。

PS /home/gowatana> Get-VM db01 | Get-HardDisk | select Parent,Name,CapacityGB,@{N="Controller";E={$_.ExtensionData.ControllerKey}},StorageFormat,@{N="StoragePolicy";E={($_|Get-SpbmEntityConfiguration).StoragePolicy}} | Sort-Object Parent,Name | ft -AutoSize

 

Parent Name        CapacityGB Controller    StorageFormat StoragePolicy

------ ----        ---------- ----------    ------------- -------------

db01   Hard disk 1         16       1000             Thin vsan-policy-raid5

db01   Hard disk 2         40       1000             Thin vsan-policy-raid5

db01   Hard disk 3         30       1001 EagerZeroedThick vsan-policy-rac-01

db01   Hard disk 4         30       1001 EagerZeroedThick vsan-policy-rac-01

db01   Hard disk 5         30       1001 EagerZeroedThick vsan-policy-rac-01

db01   Hard disk 6         30       1001 EagerZeroedThick vsan-policy-rac-01

db01   Hard disk 7         30       1001 EagerZeroedThick vsan-policy-rac-01

db01   Hard disk 8         30       1001 EagerZeroedThick vsan-policy-rac-01

 

 

VMDK の追加。(共有ディスクむけ / db02 側)

db02 に、仮想ディスクを接続します。

db01 の下記のディスクが対象になります。

PS /home/gowatana> Get-VM db01 | Get-HardDisk | where {$_.Persistence -eq "IndependentPersistent"} | select Name,Filename

 

Name        Filename

----        --------

Hard disk 3 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_2.vmdk

Hard disk 4 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_3.vmdk

Hard disk 5 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_4.vmdk

Hard disk 6 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_5.vmdk

Hard disk 7 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_6.vmdk

Hard disk 8 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_7.vmdk

 

 

db02 の最初の共有 VMDK を接続するときに、あわせて vSCSI Controller を追加します。

PS /home/gowatana> Get-VM db02 | New-HardDisk -DiskPath "[vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_2.vmdk" -Persistence IndependentPersistent | New-ScsiController -Type ParaVirtual

 

Type                 BusSharingMode       UnitNumber

----                 --------------       ----------

ParaVirtual          NoSharing                     4

 

 

残りの VMDK も接続します。

PS /home/gowatana> Get-VM db02 | New-HardDisk -DiskPath "[vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_3.vmdk" -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db02 | New-HardDisk -DiskPath "[vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_4.vmdk" -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db02 | New-HardDisk -DiskPath "[vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_5.vmdk" -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db02 | New-HardDisk -DiskPath "[vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_6.vmdk" -Persistence IndependentPersistent -Controller "SCSI controller 1"

PS /home/gowatana> Get-VM db02 | New-HardDisk -DiskPath "[vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_7.vmdk" -Persistence IndependentPersistent -Controller "SCSI controller 1"

 

db01、db02 両方に同じパスの VMDK ファイルが接続された状態になりました。

PS /home/gowatana> Get-VM db0? | Get-HardDisk | where {$_.Persistence -eq "IndependentPersistent"} | group Filename | select Count,@{N="VMs";E={($_.Group.Parent | Sort-Object)  -join ","}},Name | ft -AutoSize

 

Count VMs       Name

----- ---       ----

    2 db01,db02 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_2.vmdk

    2 db01,db02 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_3.vmdk

    2 db01,db02 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_4.vmdk

    2 db01,db02 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_5.vmdk

    2 db01,db02 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_6.vmdk

    2 db01,db02 [vsanDatastore-01] 60c4ab5a-6c3e-ca85-29da-b8aeedea7a23/db01_7.vmdk

 

 

VMDK へのポリシー割り当て。(db02)

db02 では、まだ想定しているポリシーが割り当てられていません。

PS /home/gowatana> Get-VM db02 | Get-HardDisk | Get-SpbmEntityConfiguration | ft -AutoSize

 

Entity      Storage Policy    Status    Time Of Check

------      --------------    ------    -------------

Hard disk 1 vsan-policy-raid5 compliant 2018/03/16 18:45:07

Hard disk 2 vsan-policy-raid5 compliant 2018/03/16 21:21:40

Hard disk 3                   none

Hard disk 4 vsan-policy-raid5 outOfDate 2018/03/17 2:11:59

Hard disk 5 vsan-policy-raid5 outOfDate 2018/03/17 2:12:15

Hard disk 6 vsan-policy-raid5 outOfDate 2018/03/17 2:12:32

Hard disk 7 vsan-policy-raid5 outOfDate 2018/03/17 2:12:48

Hard disk 8 vsan-policy-raid5 outOfDate 2018/03/17 2:13:05

 

 

ポリシーを割り当てます。

PS /home/gowatana> Get-VM db02 | Get-HardDisk | where {$_.Persistence -eq "IndependentPersistent"} | Set-SpbmEntityConfiguration -StoragePolicy vsan-policy-rac-01

 

ポリシーが割り当てれました。少しまつと Compliant になります。

PS /home/gowatana> Get-VM db02 | Get-HardDisk | Get-SpbmEntityConfiguration | ft -AutoSize

 

Entity      Storage Policy     Status    Time Of Check

------      --------------     ------    -------------

Hard disk 1 vsan-policy-raid5  compliant 2018/03/16 18:45:07

Hard disk 2 vsan-policy-raid5  compliant 2018/03/16 21:21:40

Hard disk 3 vsan-policy-rac-01 compliant 2018/03/17 2:26:09

Hard disk 4 vsan-policy-rac-01 compliant 2018/03/17 2:26:16

Hard disk 5 vsan-policy-rac-01 compliant 2018/03/17 2:26:25

Hard disk 6 vsan-policy-rac-01 compliant 2018/03/17 2:26:32

Hard disk 7 vsan-policy-rac-01 compliant 2018/03/17 2:26:39

Hard disk 8 vsan-policy-rac-01 compliant 2018/03/17 2:26:47

 

 

VMDK への multi-writer 設定。(db01 / db02 両方)

コマンドひとつで multi-writer フラグを設定できないようなので、下記のように設定します。

まず Hard disk 3 だけ設定変更します。

PS /home/gowatana> $vm = Get-VM db01

PS /home/gowatana> $disk = $vm | Get-HardDisk -Name "Hard disk 3"

PS /home/gowatana> $spec = New-Object VMware.Vim.VirtualMachineConfigSpec

PS /home/gowatana> $spec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec

PS /home/gowatana> $spec.deviceChange[0].operation = 'edit'

PS /home/gowatana> $spec.deviceChange[0].device = New-Object VMware.Vim.VirtualDisk

PS /home/gowatana> $spec.deviceChange[0].device = $disk.ExtensionData

PS /home/gowatana> $spec.deviceChange[0].device.Backing.Sharing = "sharingMultiWriter"

PS /home/gowatana> $vm.ExtensionData.ReconfigVM($spec)

 

設定されました。

PS /home/gowatana> Get-VM db01 | Get-HardDisk | select Parent,Name,@{N="Sharing";E={$_.ExtensionData.Backing.Sharing}}

 

Parent Name        Sharing

------ ----        -------

db01   Hard disk 1 sharingNone

db01   Hard disk 2 sharingNone

db01   Hard disk 3 sharingMultiWriter

db01   Hard disk 4 sharingNone

db01   Hard disk 5 sharingNone

db01   Hard disk 6 sharingNone

db01   Hard disk 7 sharingNone

db01   Hard disk 8 sharingNone

 

 

煩雑なので、下記のような PowerShell のファンクションを作成します。

function Set-MultiWriterFlag ($vm_name, $vdisk_name) {

    $vm = Get-VM $vm_name

    $disk = $vm | Get-HardDisk -Name $vdisk_name

    $spec = New-Object VMware.Vim.VirtualMachineConfigSpec

    $spec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec

    $spec.deviceChange[0].operation = 'edit'

    $spec.deviceChange[0].device = New-Object VMware.Vim.VirtualDisk

    $spec.deviceChange[0].device = $disk.ExtensionData

    $spec.deviceChange[0].device.Backing.Sharing = "sharingMultiWriter"

    $vm.ExtensionData.ReconfigVM($spec)

}

 

ひたすら設定します。(db01)

PS /home/gowatana> function Set-MultiWriterFlag ($vm_name, $vdisk_name) {

>>     $vm = Get-VM $vm_name            

>>     $disk = $vm | Get-HardDisk -Name $vdisk_name

>>     $spec = New-Object VMware.Vim.VirtualMachineConfigSpec

>>     $spec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec

>>     $spec.deviceChange[0].operation = 'edit'

>>     $spec.deviceChange[0].device = New-Object VMware.Vim.VirtualDisk

>>     $spec.deviceChange[0].device = $disk.ExtensionData

>>     $spec.deviceChange[0].device.Backing.Sharing = "sharingMultiWriter"

>>     $vm.ExtensionData.ReconfigVM($spec)

>> }

PS /home/gowatana> Set-MultiWriterFlag db01 "Hard disk 3"

PS /home/gowatana> Set-MultiWriterFlag db01 "Hard disk 4"

PS /home/gowatana> Set-MultiWriterFlag db01 "Hard disk 5"

PS /home/gowatana> Set-MultiWriterFlag db01 "Hard disk 6"

PS /home/gowatana> Set-MultiWriterFlag db01 "Hard disk 7"

PS /home/gowatana> Set-MultiWriterFlag db01 "Hard disk 8"

 

のこりの db02 も設定します。

PS /home/gowatana> Get-VM db02 | Get-HardDisk | where {$_.Persistence -eq "IndependentPersistent"} | % {Set-MultiWriterFlag $_.Parent.Name $_.Name}

 

設定されました。

PS /home/gowatana> Get-VM db0? | Get-HardDisk | select Parent,Name,@{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Sort-Object Parent,Name

 

Parent Name        Sharing

------ ----        -------

db01   Hard disk 1 sharingNone

db01   Hard disk 2 sharingNone

db01   Hard disk 3 sharingMultiWriter

db01   Hard disk 4 sharingMultiWriter

db01   Hard disk 5 sharingMultiWriter

db01   Hard disk 6 sharingMultiWriter

db01   Hard disk 7 sharingMultiWriter

db01   Hard disk 8 sharingMultiWriter

db02   Hard disk 1 sharingNone

db02   Hard disk 2 sharingNone

db02   Hard disk 3 sharingMultiWriter

db02   Hard disk 4 sharingMultiWriter

db02   Hard disk 5 sharingMultiWriter

db02   Hard disk 6 sharingMultiWriter

db02   Hard disk 7 sharingMultiWriter

db02   Hard disk 8 sharingMultiWriter

 

 

DRS ルールの作成。

クラスタで DRS を有効にしているので、DRS ルールも設定しておきます。

アンチ アフィニティ ルールで、db01 と db02 が別の ESXi ホストで稼働するようにします。

 

アンチ アフィニティ ルールを作成します。

PS /home/gowatana> Get-Cluster vsan-cluster-01 | New-DrsRule -KeepTogether:$false -Name drs-anti-affinity-rac-01 -VM db01,db02

 

ルールが作成されました。

PS /home/gowatana> Get-Cluster vsan-cluster-01 | Get-DrsRule -Name drs-anti-affinity-rac-01 | select Cluster,Name,Type,Mandatory,Enabled,@{N="VMs";E={($_.VMIds | %{(Get-VM -Id $_).Name}) -join ","}}

 

 

Cluster   : vsan-cluster-01

Name      : drs-anti-affinity-rac-01

Type      : VMAntiAffinity

Mandatory : False

Enabled   : True

VMs       : db01,db02

 

 

VM の起動。

ここで VM を起動します。

PS /home/gowatana> Get-VM db0? | Start-VM

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

db01                 PoweredOn  2        8.000

db02                 PoweredOn  2        8.000

 

 

Oracle RAC 構築。

Oracle Grid Infrastructure と Oracle Database をインストールして、RAC データベースを作成します。

(ここでは省略)

 

Oracle RAC のゲスト OS からみた VMDK の様子。

vSAN 上の VMDK ファイルによる仮想ディスクは、ゲスト OS から見ると VMFS にある仮想ディスクと同様に

「VMware Virtual disk」と認識されています。

[grid@db01 ~]$ cat /etc/oracle-release

Oracle Linux Server release 7.4

[grid@db01 ~]$ lsscsi

[2:0:0:0]    disk    VMware   Virtual disk     2.0   /dev/sda

[2:0:1:0]    disk    VMware   Virtual disk     2.0   /dev/sdb

[3:0:0:0]    cd/dvd  NECVMWar VMware SATA CD00 1.00  /dev/sr0

[4:0:0:0]    disk    VMware   Virtual disk     2.0   /dev/sdc

[4:0:1:0]    disk    VMware   Virtual disk     2.0   /dev/sdd

[4:0:2:0]    disk    VMware   Virtual disk     2.0   /dev/sde

[4:0:3:0]    disk    VMware   Virtual disk     2.0   /dev/sdf

[4:0:4:0]    disk    VMware   Virtual disk     2.0   /dev/sdg

[4:0:5:0]    disk    VMware   Virtual disk     2.0   /dev/sdh

[grid@db01 ~]$

 

共有ディスクとして追加した 30GB のディスクは下記です。

[grid@db01 ~]$ lsblk -l /dev/sd[c-h]

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sdc    8:32   0  30G  0 disk

sdd    8:48   0  30G  0 disk

sde    8:64   0  30G  0 disk

sdf    8:80   0  30G  0 disk

sdg    8:96   0  30G  0 disk

sdh    8:112  0  30G  0 disk

[grid@db01 ~]$

 

Oracle RAC の ASM で利用される Oracle ASM Filter Driver (ASMFD)では、

下記のようなラベルが付与されます。

[grid@db01 ~]$ asmcmd afd_lsdsk --all

node 'db01':

--------------------------------------------------------------------------------

Label                     Filtering   Path

================================================================================

DATA1                       ENABLED   /dev/sdf

DATA2                       ENABLED   /dev/sdg

DATA3                       ENABLED   /dev/sdh

GRID1                       ENABLED   /dev/sdc

GRID2                       ENABLED   /dev/sde

GRID3                       ENABLED   /dev/sdd

node 'db02':

--------------------------------------------------------------------------------

Label                     Filtering   Path

================================================================================

DATA1                       ENABLED   /dev/sdf

DATA2                       ENABLED   /dev/sdg

DATA3                       ENABLED   /dev/sdh

GRID1                       ENABLED   /dev/sdc

GRID2                       ENABLED   /dev/sde

GRID3                       ENABLED   /dev/sdd

[grid@db01 ~]$

 

/dev/sdc、/dev/sdd、/dev/sde で +GRID という ASM Disk Group、

/dev/sdf、/dev/sdg、/dev/sdh で +DATA という ASM Disk Group を構成してあります。

今回の例では微妙な感じになっていますが、/dev/sd? のデバイス名は永続的なものではないので、

Linux OS の再起動で別の名前に変わったりします。

仮想ハードディスクと ゲストOSのデバイス名をうまく対応させるには

最初にディスク認識させたときに識別して ASMFD のラベル付けをする必要があります。

[grid@db01 ~]$ export ORACLE_SID=+ASM1

[grid@db01 ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 12.2.0.1.0 Production on 日 3月 18 03:20:34 2018

 

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

 

Connected to:

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

 

SQL> set line 120

SQL> col label for a10

SQL> col path for a10

SQL> col DG_NAME for a10

SQL> select dg.NAME as DG_NAME,d.DISK_NUMBER,LABEL,PATH,d.TOTAL_MB from v$asm_disk d,v$asm_diskgroup dg where d.GROUP_NUMBER = dg.GROUP_NUMBER and d.TOTAL_MB > 0;

 

DG_NAME    DISK_NUMBER LABEL      PATH         TOTAL_MB

---------- ----------- ---------- ---------- ----------

GRID                 0 GRID1      AFD:GRID1       30720

GRID                 1 GRID2      AFD:GRID2       30720

GRID                 2 GRID3      AFD:GRID3       30720

DATA                 0 DATA1      AFD:DATA1       30720

DATA                 1 DATA2      AFD:DATA2       30720

DATA                 2 DATA3      AFD:DATA3       30720

 

6 rows selected.

 

SQL>

 

ちなみに、2 ノードでの 12c R2 RAC では下記のようなリソース構成になります。

[grid@db01 ~]$ crsctl stat res -t

--------------------------------------------------------------------------------

Name           Target  State        Server                   State details

--------------------------------------------------------------------------------

Local Resources

--------------------------------------------------------------------------------

ora.ASMNET1LSNR_ASM.lsnr

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.DATA.dg

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.GRID.dg

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.LISTENER.lsnr

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.chad

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.net1.network

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.ons

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.proxy_advm

               OFFLINE OFFLINE      db01                     STABLE

               OFFLINE OFFLINE      db02                     STABLE

--------------------------------------------------------------------------------

Cluster Resources

--------------------------------------------------------------------------------

ora.LISTENER_SCAN1.lsnr

      1        ONLINE  ONLINE       db01                     STABLE

ora.MGMTLSNR

      1        ONLINE  ONLINE       db01                     169.254.131.137 192.

                                                             168.41.171,STABLE

ora.asm

      1        ONLINE  ONLINE       db01                     Started,STABLE

      2        ONLINE  ONLINE       db02                     Started,STABLE

      3        OFFLINE OFFLINE                               STABLE

ora.cvu

      1        ONLINE  ONLINE       db01                     STABLE

ora.db01.vip

      1        ONLINE  ONLINE       db01                     STABLE

ora.db02.vip

      1        ONLINE  ONLINE       db02                     STABLE

ora.mgmtdb

      1        ONLINE  ONLINE       db01                     Open,STABLE

ora.orcl.db

      1        ONLINE  ONLINE       db01                     Open,HOME=/u01/app/o

                                                             racle/product/12.2.0

                                                             /dbhome_1,STABLE

      2        ONLINE  ONLINE       db02                     Open,HOME=/u01/app/o

                                                             racle/product/12.2.0

                                                             /dbhome_1,STABLE

ora.qosmserver

      1        ONLINE  ONLINE       db01                     STABLE

ora.scan1.vip

      1        ONLINE  ONLINE       db01                     STABLE

--------------------------------------------------------------------------------

[grid@db01 ~]$

 

このなかで、共有ディスクの ASM Disk Group (+DATA、+GRID)のリソースは下記の部分です。

[grid@db01 ~]$ crsctl stat res -w '(TYPE = ora.diskgroup.type)' -t

--------------------------------------------------------------------------------

Name           Target  State        Server                   State details

--------------------------------------------------------------------------------

Local Resources

--------------------------------------------------------------------------------

ora.DATA.dg

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

ora.GRID.dg

               ONLINE  ONLINE       db01                     STABLE

               ONLINE  ONLINE       db02                     STABLE

--------------------------------------------------------------------------------

[grid@db01 ~]$

 

以上、PowerCLI で Oracle RAC むけ VM を設定してみる話でした。