การเชื่อมต่อ Dell EMC SC Series (SAN Storage) กับ Windows 2019 ด้วย iSCSI Microsoft MPIO

ทำไมต้องเชื่อมต่อ SAN Storage ด้วย MPIO มีข้อดีอย่างไร ต้องตั้งค่าอย่างไรให้ถูกต้อง

Reference :
https://www.youtube.com/watch?v=hsXtfab-xNM Dell EMC SC Series Storage : Microsoft Multipath I/0 (MPIO) Best Practice
https://downloads.dell.com/manuals/all-products/esuprt_software/esuprt_it_ops_datcentr_mgmt/general-solution-resources_white-papers3_en-us.pdf Dell EMC SC Series Storage and Microsoft Multipath I/O
https://www.youtube.com/watch?v=Z2ICF8yzFkU How-to: Configure iSCSI MPIO on Windows Server 2012 R2
https://www.starwindsoftware.com/blog/lacp-vs-mpio-on-windows-platform-which-one-is-better-in-terms-of-redundancy-and-speed-in-this-case-2 ISCSI: LACP vs. MPIO

Environment :

– Dell EMC SC5020

– Windows Server 2019 Standard Edition

  • MPIO ย่อมาจาก Multipath Input/Output เป็น Feature ของการเชื่อมต่อไม่ว่าจะเป็น iSCSI หรือ Fiber Channel ที่ต้องการให้ Server ไม่สับสนเมื่อมีการคุยกับ Storage หลายเส้นทาง (Storage ต่อเน็ตหลายเส้น และ Server ก็ต่อเน็ตหลายเส้น รวมถึงมีหลาย IP ไม่ได้ทำแบบหลายเส้นรวมเป็น Link เดียว) ซึ่งถ้าไม่ใช้ความสามารถนี้ จะทำให้ Server เห็น Volume หรือ LUN บน Storage เป็นหลาย ๆ อันทั้งที่เป็นอันเดียวกัน
  • นอกจากนี้ MPIO ยังสามารถทำ Load Balance โดยการกระจายการเชื่อมต่อโดยมีหลายวิธีให้เลือกใช้งานเช่น Round Robin (ไล่ลำดับไปเรื่อย ๆ แล้วกลับมาเริ่มที่ connection ที่ 1 เช่น 12341234)
  • ยกตัวอย่างในกรณีไม่ได้ทำ MPIO ได้ดังรูป
  • หลังจากทำ MPIO จะได้ดังรูป
  • MPIO ไม่ได้ติดตั้งโดย Default บน Windows Server โดยสามารถติดตั้งได้จาก Server Manager GUI โดยการ Add Feature ดังรูป
  • หรือติดตั้งผ่าน PowerShell ดังนี้
Enable-WindowsOptionFeature -Online -FeatureName MultipathIO
  • หลังจากติดตั้งเสร็จให้ Restart Server
  • สำหรับ Dell EMC SC Series ต้องทำการแก้ไข Registry ของ Windows ด้วย PowerShell Script ดังนี้
# MPIO Registry Settings script
# This script will apply recommended Dell Storage registry settings
# on Windows Server 2008 R2 or newer
#
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND.
# THE ENTIRE RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE
# REMAINS WITH THE USER.
# Assign variables
$MpioRegPath = "HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters"
$IscsiRegPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Class\"
$IscsiRegPath += "{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"
# General settings
Set-ItemProperty -Path $MpioRegPath -Name "PDORemovePeriod" `
-Value 120
Set-ItemProperty -Path $MpioRegPath -Name "PathRecoveryInterval" `
-Value 25
Set-ItemProperty -Path $MpioRegPath -Name "UseCustomPathRecoveryInterval" `
-Value 1
Set-ItemProperty -Path $MpioRegPath -Name "PathVerifyEnabled" `
-Value 1
# Apply OS-specific general settings
$OsVersion = ( Get-WmiObject -Class Win32_OperatingSystem ).Caption
If ( $OsVersion -match "Windows Server 2008 R2" )
{
 New-ItemProperty –Path $MpioRegPath –Name "DiskPathCheckEnabled" –Value 1 `
 –PropertyType DWORD `
 –Force
 New-ItemProperty –Path $MpioRegPath –Name "DiskPathCheckInterval" –Value 25`
 –PropertyType DWORD `
 –Force
}
Else
{
 Set-ItemProperty –Path $MpioRegPath –Name "DiskPathCheckInterval" –Value 25
}
# iSCSI settings
If ( ( Get-Service -Name "MSiSCSI" ).Status -eq "Running" )
{
 # Get the registry path for the Microsoft iSCSI initiator parameters
 $IscsiParam = Get-Item -Path $IscsiRegPath `
 | Where-Object { ( Get-ItemProperty $_.PSPath ).DriverDesc `
 -eq `
 "Microsoft iSCSI Initiator" } `
 | Get-ChildItem `
 | Where-Object { $_.PSChildName -eq "Parameters" }
 # Set the Microsoft iSCSI initiator parameters
 Set-ItemProperty -Path $IscsiParam.PSPath -Name "MaxRequestHoldTime" `
-Value 90
 Set-ItemProperty -Path $IscsiParam.PSPath -Name "LinkDownTime" `
-Value 35
 Set-ItemProperty -Path $IscsiParam.PSPath -Name "EnableNOPOut" `
-Value 1
}
Else
{
 Write-Host "iSCSI Service is not running."
 Write-Host "iSCSI registry settings have NOT been configured."
}
Write-Host "MPIO registry settings have been configured successfully."
Write-Host "The system must be restarted for the changes to take effect."
  • หลังจากรัน Script PowerShell ให้ Restart Server อีกรอบ
  • เพื่อให้เข้าใจง่ายขึ้นสามารถยกตัวอย่างการใช้งาน Multipath ได้ดัง Diagramในรูป
  • ตัวอย่างการตั้งค่าใน SAN Storage (Dell SC5020) โดยจะมีทั้งหมด 2 Controller ซึ่งแต่ละ Controller จะมี 4 Port
  • ซึ่งเมื่อตรวจสอบในฝั่ง Windows จะเห็นว่ามี Connection ที่เกิดจากการ Discovery โดยใส่ IP ของ ISCSI ปลายทาง จำนวน 8 Connection ซึ่งต้องเข้าไปตั้งค่าใน Target ให้มีการใช้งานแบบ multi-path ด้วยทุก Connection
  • ซึ่งเราสามารถเลือกใน Advance ได้อีกว่าจะให้เชื่อมต่อไปยัง IP หลัก IP ใด โดยแนะนำให้เลือกสลับไปตาม IP ที่มี
  • เมื่อตั้งค่าถูกต้องแล้วจะสามารถตรวจสอบได้ที่หน้า Properties จะเห็นว่ามี 2 Session
  • ซึ่งเราสามารถเลือกได้ว่าการเลือก Session ให้วิธีเลือกแบบไหน ในรูปจะเป็นแบบ Round Robin ซึ่งในกรณีมี Storage ซึ่ง Target Portal จะเป็น IP ที่เลือกในขั้นตอนก่อนหน้า
  • โดยสรุปแล้วสามารถมาดูได้ที่ Disk Management ใน Tab MPIO ว่ามี Path ในการ Active กี่ Path ถ้ามีมากกว่า 1 แสดงว่ามีการตั้งค่า Multi-Path เรียบร้อยแล้ว
  • สุดท้ายถ้าอยากรู้ว่าการตั้งค่า Work ไหมอาจจะต้องทำการตรวจสอบ Traffic ที่ Switch ว่ากระจายทุก Port ไหม หรือลองปิด Switch หรือถอดสายทิ้งสักข้าง หรือ ถอดสายที่ Server ออกทิ้งสัก Port ดูว่ายังสามารถทำงานได้หรือไม่ (ซึ่งผมไม่ได้ทดสอบ Capture มาให้ดู เพราะมีเวลาไม่มากพอให้ทดสอบ)

สุดท้ายอาจจะงงว่าทำไปทำไมหลัก ๆ ข้อแรกคือเพื่อ Load Balance การใช้งานให้กระจายทุก Port ที่ SAN Storage ทำให้ได้ประสิทธิภาพสูงสุด (ซึ่งต้องมี Server มาต่อหลายตัว โดยการเชื่อมต่อต้องไม่ทำ link aggregation ต้อง FIX IP ต่อ Port) ข้อสองคือในกรณีที่ Port ใดมีปัญหาก็ยังสามารถใช้งานต่อได้ ซึ่งการทำ MPIO ดีกว่าการทำ Link Aggregation ในด้าน Performance ที่ทำได้ดีกว่า เพราะสามารถกระจายได้ลึกในระดับ Session (การทำ Multi Session per Connection ผ่าน Link Aggregation ทำไม่ได้เฉพาะ Windows นะครับ อาจจะทำได้ใน OS อื่น ๆ ) สามารถอ่านเพิ่มเติมผลการทดสอบได้ที่ https://www.starwindsoftware.com/blog/lacp-vs-mpio-on-windows-platform-which-one-is-better-in-terms-of-redundancy-and-speed-in-this-case-2