在 Windows 上本地使用 Ceph
由于Cloudbase Solutions和Suse 的合作,當前Ceph 16 (Pacific)提供了 Windows 原生支持。
Ceph 可能是最常用的軟件定義存儲解決方案。根據調查(https://www.openstack.org/analytics),超過 70% 的 OpenStack 部署由 Ceph 提供支持??紤]到它可以在商用硬件上運行,而且能夠擴展到數百個存儲節點并提供不錯的性能,這也就不足為奇了。
在 Windows 上使用 Ceph 一直是一個痛點,以往需要iSCSI網關等代理或使用 Samba重新導出CephFS。這些方法提供了次優的性能并使部署架構過于復雜?,F在所有麻煩都沒有了,因為RBD和 CephFS 可以原生地在 Windows 上使用。
為獲得最佳性能和功能,建議使用Windows Server 2019。Windows Server 2016也受支持,但有一些已知限制。較舊的 Windows Server 版本以及客戶端版本(如 Windows 10)可能也能正常工作,但目前不受支持。
安裝:
這個 MSI 安裝程序(https://cloudbase.it/ceph-for-windows/)是在 Windows 上安裝 Ceph 的推薦方式。除了 Ceph 二進制文件,它還捆綁了WNBD驅動程序,用于映射 RBD 鏡像。
如果您更喜歡手動構建和安裝Ceph(https://github.com/ceph/ceph/blob/master/README.windows.rst)和WNBD(https://github.com/cloudbase/wnbd),請參考這些指南。
配置:
在 Windows 上使用 Ceph 需要最少的配置。默認配置文件位置是`C:\ProgramData\ceph\ceph.conf*。
這是一個配置示例。不要忘記填寫正確的 Ceph Monitor 地址并在指定位置提供 Ceph 密鑰環文件。目前,必須使用斜杠“/”而不是反斜杠“\”作為路徑分隔符。
- [global]
- logtostderr=true
- ;UncommentthefollowingtouseWindowsEventLog
- ;logtosyslog=true
- rundir=C:/ProgramData/ceph/out
- crashdir=C:/ProgramData/ceph/out
- ;Usethefollowingtochangethecephfsclientloglevel
- ;debugclient=2
- [client]
- keyring=C:/ProgramData/ceph/keyring
- ;logfile=C:/ProgramData/ceph/out/$name.$pid.log
- adminsocket=C:/ProgramData/ceph/out/$name.$pid.asok
- ;client_permissions=true
- ;client_mount_uid=1000
- ;client_mount_gid=1000
- [global]
-
monhost=
RBD:
Rados 塊設備 (RBD)一直是這項工作的主要重點。您可能已經熟悉的相同 CLI 可用于創建 RBD 映像并將它們附加到主機和Hyper-V虛擬機。
以下 PowerShell 示例創建一個 RBD 映像,將其附加到主機并在頂部添加一個NTFS分區。
- rbdcreateblank_image--size=1G
- rbddevicemapblank_image
- $mappingJson=rbd-wnbdshowblank_image--format=json
- $mappingJson=$mappingJson|ConvertFrom-Json
- $diskNumber=$mappingJson.disk_number
- #Thediskmustbeonlinebeforecreatingoraccessingpartitions.
- Set-Disk-Number$diskNumber-IsOffline$false
- #Initializethedisk,partitionitandcreateafileystem.
- Get-Disk-Number$diskNumber|`
- Initialize-Disk-PassThru|`
- New-Partition-AssignDriveLetter-UseMaximumSize|`
- Format-Volume-Force-Confirm:$false
默認情況下,所有 RBD 映射都是持久的??梢允褂蒙鲜?MSI 安裝程序部署的“ ceph-rbd ”服務負責在主機重新啟動后重新附加 RBD 映像。這還允許調整 Windows 服務啟動順序,以便在啟動可能依賴它的服務之前映射 RBD 映像。
以下屏幕截圖顯示了附加到 Hyper-V 虛擬機的 RBD 鏡像以及基準測試結果。我們將在以后的文章中深入研究基準測試。
WNBD:
RBD 映像通過使用WNBD Storport Miniport 驅動程序(https://github.com/cloudbase/wnbd)公開為 SCSI 磁盤,作為此移植工作的一部分編寫。
WNBD 驅動程序提供的一項有趣功能是 NBD 客戶端功能,允許它用于附加任意 NBD 導出。在實施更有效的機制之前,這是附加 RBD 圖像的默認方式。由于它的實用性,這個特性被保留了下來,盡管它可能在某個時候被移到驅動程序之外,利用與rbd-wnbd相同的 API 。
要掛載獨立的 NBD 映像,請使用以下命令:
- wnbd-clientmapexport_name$nbdAddress--port$nbdPort
CephFS:
Windows 上的CephFS支持是我們的第二個主要目標,目前處于試驗階段。我們正在使用類似于 FUSE 的Dokany以及看似廢棄的 ceph-dokan項目的改進版本。
以下簡單命令使用“X:”驅動器號掛載 CephFS:
- ceph-dokan.exe-lx
當前限制:
雖然移植的當前狀態已經涵蓋了大多數的情況,但您應該注意一些限制。這些缺失的功能可能會在后續版本中實現。
- RBD鏡像還不能用于備份群集共享卷(CSV)在Windows Server故障轉移群集(WSFC) ,這需要SCSI永久保留的支持
- WNBD 磁盤無法實時調整大小
- Python 綁定不可用
- Ceph CLI工具還不能以本機方式使用。但是,它可以通過Windows Subsystem for Linux與正在運行的服務聯系。
Windows 上的 Ceph – 性能
在此 Ceph Windows 移植之前,從 Windows 訪問 Ceph 存儲的唯一方法是使用Ceph iSCSI 網關,這很容易成為性能瓶頸。我們的目標是超越 iSCSI 網關并盡可能接近本機 Linux RBD 吞吐量。
測試環境:
在展示一些實際結果之前,讓我們先談談測試環境。我們使用了 4 個相同的裸機服務器,具有以下規格:
-
CPU
- Intel(R) Xeon(R) E5-2650 @ 2.00GHz
- 2 sockets
- 8 cores per socket
- 32 vcpus
-
memory
- 128GB
- 1333Mhz
-
network adapters
- Chelsio T420-C
- 2 x 10Gb/s
- LACP bond
- 9000 MTU
您可能已經注意到我們沒有提到存儲磁盤,那是因為 Ceph OSD 被配置為使用內存支持池。請記住,我們將重點放在 Ceph 客戶端性能上,而不是 Linux OSD 端的存儲 iops。
我們使用了一個運行在 Ubuntu 20.04 之上的一體化 Ceph 16 集群。在客戶端,我們涵蓋了Windows Server 2016、Windows Server 2019以及Ubuntu 20.04。
基準測試是使用fio工具執行的。它是高度可配置的,常用于 Ceph 基準測試,最重要的是,它是跨平臺的。
下面是一個示例 FIO 命令行調用,供有興趣重復測試的任何人使用。我們正在使用直接 IO、2MB 塊、64 個并發異步 IO 操作,測試超過 8GB 塊的各種 IO 操作。測試塊設備時,我們使用原始磁盤設備,而不是使用 NTFS 或 ReFS 分區。請注意,這在 Windows 上可能需要 fio>=3.20。
fio --randrepeat=1 --direct=1 --gtod_reduce=1 --name=test --bs=2M --iodepth=64 --size=8G --readwrite=randwrite --numjobs=1 --filename=\\.\PhysicalDrive2
Windows 調優:
以下設置可以提高 IO 吞吐量:
Windows 電源計劃——很少有人認為這是服務器的問題,但默認情況下,“高性能”電源計劃默認不啟用,這會導致 CPU 節流
將 Ceph 和 FIO 二進制文件添加到 Windows Defender 白名單
使用巨型幀 - 我們注意到性能提高了 15%
在 Windows Server 2016 上啟用 CUBIC TCP 擁塞算法
檢測結果:
裸機 RBD 和 CephFS IO
讓我們直接看 RBD 和 CephFS 基準測試結果。請注意,我們使用 MB/s 來測量速度(越高越好)。
值得一提的是,RBD 緩存已被禁用。正如我們所見,Windows Server 2019 設法提供了令人印象深刻的 IO 吞吐量。Windows Server 2016 沒有那么快,但它仍然設法勝過 Linux RBD 客戶端,包括 krbd。我們在 CephFS 方面看到了相同的模式。
我們已經使用多合一的 Ceph 集群測試了 iSCSI 網關??紤]到 iSCSI 網關不能很好地擴展,性能瓶頸可能會隨著更大的 Ceph 集群變得更加嚴重。
- +-----------+------------+--------+-------+--------+-------+
- |OS|tool|rand_r|seq_r|rand_w|seq_w|
- +-----------+------------+--------+-------+--------+-------+
- |WS2016|rbd-wnbd|854|925|807|802|
- |WS2019|rbd-wnbd|1317|1320|1512|1549|
- |WS2019|iscsi-gw|324|319|624|635|
- |Ubuntu20|krbd|696|669|659|668|
- |Ubuntu20|rbd-nbd|559|567|372|407|
- |||||||
- |WS2016|ceph-dokan|642|605|690|676|
- |WS2019|ceph-dokan|988|948|938|935|
- |Ubuntu20|ceph-fuse|162|181|121|138|
- |Ubuntu20|kernceph|687|663|677|674|
- +-----------+------------+--------+-------+--------+-------+
虛擬機
提供虛擬機塊存儲也是 Ceph 的主要用例之一。以下是Ubuntu 20.04 上Hyper-V Server 2019和KVM的測試結果,它們都運行從 RBD 映像啟動的Ubuntu 20.04和Windows Server 2019 VM。
- +-----------------------+--------------+--------------+
- |Hypervisor\GuestOS|WS2019|Ubuntu20.04|
- +-----------------------+------+-------+------+-------+
- ||read|write|read|write|
- +-----------------------+------+-------+------+-------+
- |Hyper-V|1242|1697|382|291|
- |KVM|947|558|539|321|
- +-----------------------+------+-------+------+-------+
WS 2019 Hyper-V VM 設法獲得了幾乎原生的 IO 速度。有趣的是,即使在 KVM 上,它的表現也比 Ubuntu 客戶機要好,這可能值得研究。
WINBD
如上文所述,我們最初的方法是使用 NBD 協議附加 RBD 鏡像。這并沒有提供我們希望的性能,主要是由于Winsock Kernel (WSK)框架,這就是我們從頭開始實施更高效的 IO 通道的原因。為方便起見,您仍然可以將 WNBD 作為獨立的 NBD 客戶端用于其他目的,在這種情況下,您可能有興趣了解它的性能如何。在此測試環境中,它設法在 WS 2019 上提供 933MB/s 的速度,在 WS 2016 上提供 280MB/s 的速度。
目前,rbd-wnbd使用DeviceIoControl來檢索 IO 請求并將 IO 回復發送回 WNBD 驅動程序,這也稱為反向調用。與 RBD NBD 服務器不同,libwnbd允許調整 IO 調度工作者的數量。下表顯示了工人數量如何影響性能。請記住,在這種特定情況下,我們正在對驅動程序連接進行基準測試,因此沒有數據從/傳輸到 Ceph 集群。這讓我們大致了解了 WNBD 可以提供的最大理論帶寬,使可用 CPU 完全飽和:
- +---------+------------------+
- |Workers|Bandwidth(MB/s)|
- +---------+------------------+
- |1|1518|
- |2|2917|
- |3|4240|
- |4|5496|
- |8|11059|
- |16|13209|
- |32|12390|
- +---------+------------------+
RBD 命令
除了 IO 性能,我們還對確??梢酝瑫r管理大量磁盤感興趣。為此,我們編寫了一個簡單的 Python 腳本(https://raw.githubusercontent.com/petrutlucian94/ceph_test/master/scale_test.py),該腳本(https://raw.githubusercontent.com/petrutlucian94/ceph_test/master/scale_test.py)創建一個臨時映像,將其附加到主機,執行各種 IO 操作,然后對其進行清理。這是 1000 次迭代的測試結果,每次 50 次。該測試對于提高 RBD 性能和穩定性至關重要。
- +---------------------------------------------------------------------------------+
- |Duration(s)|
- +--------------------------+----------+----------+-----------+----------+---------+
- |function|min|max|total|mean|std_dev|
- +--------------------------+----------+----------+-----------+----------+---------+
- |TestRunner.run|283.5339|283.5339|283.5339|283.5339|0.0000|
- |RbdTest.initialize|0.3906|10.4063|3483.5180|3.4835|1.5909|
- |RbdImage.create|0.0938|5.5157|662.8653|0.6629|0.6021|
- |RbdImage.map|0.2656|9.3126|2820.6527|2.8207|1.5056|
- |RbdImage.get_disk_number|0.0625|8.3751|1888.0343|1.8880|1.5171|
- |RbdImage._wait_for_disk|0.0000|2.0156|39.1411|0.0391|0.1209|
- |RbdFioTest.run|2.3125|13.4532|8450.7165|8.4507|2.2068|
- |RbdImage.unmap|0.0781|6.6719|1031.3077|1.0313|0.7988|
- |RbdImage.remove|0.1406|8.6563|977.1185|0.9771|0.8341|
- +--------------------------+----------+----------+-----------+----------+---------+
總結:
在隨著Ceph的快速發展,跨平臺的兼容性會越來越好。
參考:
https://cloudbase.it/ceph-on-windows-performance/
https://cloudbase.it/ceph-on-windows-part-1/
原文鏈接:https://mp.weixin.qq.com/s/DsC86zt0YBgPEjsGgB2rXg