iSCSI 是一种存储区域网络 (SAN) 协议,可让客户端(称作发起程序)将 SCSI 命令发送到远程服务器上的 SCSI 存储设备(目标)。SUSE Enterprise Storage 包含一个可通过 iSCSI 协议向异构客户端(例如 Microsoft Windows* 和 VMware* vSphere)开放 Ceph 存储管理的工具。多路径 iSCSI 访问可让这些客户端实现可用性与可伸缩性,标准化 iSCSI 协议还在客户端与 SUSE Enterprise Storage 集群之间额外提供了一层安全隔离。该配置工具名为 lrbd
。使用 lrbd
,Ceph 存储管理员可以定义精简配置且复制的高可用性卷,用于支持只读快照、读写克隆资源,以及 Ceph RADOS 块设备 (RBD) 的自动大小调整。然后,管理员可以通过单个 lrbd
网关主机或支持多路径故障转移的多个网关主机来导出卷。Linux、Microsoft Windows 和 VMware 主机可以使用 iSCSI 协议连接到卷,因此可像任何其他 SCSI 块设备一样供您使用。这意味着,SUSE Enterprise Storage 客户可在 Ceph 上有效运行完整的块存储基础架构子系统,享用传统 SAN 的所有功能和优势,促成将来的发展。
本章详细介绍如何设置 Ceph 集群基础架构和 iSCSI 网关,使客户端主机能够通过 iSCSI 协议,像在本地存储设备上一样使用远程存储的数据。
iSCSI 是 RFC 3720 中指定的、使用因特网协议 (IP) 的小型计算机系统接口 (SCSI) 命令集的一种实施。iSCSI 以服务形式实施,其中,客户端(发起程序)在 TCP 端口 3260 上通过会话来与服务器(目标)通讯。iSCSI 目标的 IP 地址和端口称为 iSCSI 门户,其中,一个目标可通过一个或多个门户公开。一个目标与一个或多个门户的组合称为目标门户组 (TPG)。
iSCSI 的底层数据链路层协议通常为以太网。更具体地说,现代 iSCSI 基础架构使用 10 Gb 以太网或更快的网络实现最佳吞吐量。强烈建议在 iSCSI 网关与后端 Ceph 集群之间建立 10 Gb 以太网连接。
Linux 内核 iSCSI 目标最初称作 linux-iscsi.org 的 LIO,它是项目的原始域和网站。在过去一段时间,适用于 Linux 平台的 iSCSI 目标实施竞争产品不少于四个,但 LIO 作为单一 iSCSI 参照目标最终获得了压倒性优势。LIO 的主流内核代码使用简单但有点含糊的名称“目标”,旨在区分“目标核心”与各种前端和后端目标模块。
可以说,最常用的前端模块就是 iSCSI。但是,LIO 也支持光纤通道 (FC)、基于以太网的光纤通道 (FCoE) 和其他多种前端协议。目前,SUSE Enterprise Storage 仅支持 iSCSI 协议。
最常用的目标后端模块是能够方便地在目标主机上重新导出任何可用块设备的模块。此模块名为 iblock。但是,LIO 还有一个 RBD 特定的后端模块,该模块支持对 RBD 映像进行并行化多路径 I/O 访问。
本节简要介绍 Linux、Microsoft Windows 和 VMware 平台上使用的 iSCSI 发起程序。
Linux 平台的标准发起程序是 open-iscsi
。open-iscsi
会起动守护进程 iscsid
,然后,用户可以使用该守护进程来发现任何给定门户上的 iSCSI 目标、登录到目标,以及映射 iSCSI 卷。iscsid
会与 SCSI 中间层通讯以创建内核中块设备,然后,内核便可像对待系统中任何其他的 SCSI 块设备一样来处理这些设备。可以结合设备映射程序多路径 (dm-multipath
) 工具一起部署 open-iscsi
发起程序,以提供高度可用的 iSCSI 块设备。
Microsoft Windows 操作系统的默认 iSCSI 发起程序是 Microsoft iSCSI 发起程序。iSCSI 服务可通过图形用户界面 (GUI) 进行配置,并支持使用多路径 I/O 实现高可用性。
VMware vSphere 和 ESX 的默认 iSCSI 发起程序是 VMware ESX 软件 iSCSI 发起程序 vmkiscsi
。启用该发起程序后,可通过 vSphere 客户端或使用 vmkiscsi-tool
命令对其进行配置。然后,可以使用 VMFS 来格式化通过 vSphere iSCSI 存储适配器连接的存储卷,并像使用任何其他 VM 存储设备一样使用它们。VMware 发起程序也支持使用多路径 I/O 实现高可用性。
lrbd
兼具 RADOS 块设备的优势与 iSCSI 无所不包的多样性。在 iSCSI 目标主机(称为 lrbd
网关)上采用 lrbd
后,需要利用块存储的任何应用都可受益于 Ceph,即使不运行 Ceph 客户端协议也是如此。而用户可以使用 iSCSI 或任何其他目标前端协议连接到 LIO 目标,从而可以转换针对 RBD 存储的所有目标 I/O。
lrbd
本来就具有高可用性,并支持多路径操作。因此,下游发起程序主机可以使用多个 iSCSI 网关实现高可用性和可伸缩性。与包含多个网关的 iSCSI 配置通讯时,发起程序可在多个网关之间实现 iSCSI 请求的负载平衡。如果某个网关发生故障(暂时不可访问,或因为维护已被禁用),将通过另一个网关以透明方式继续处理 I/O。
包含 lrbd
的最低 SUSE Enterprise Storage 配置包括以下组件:
一个 Ceph 存储集群。该 Ceph 集群至少包括四台物理服务器,其中每台服务器至少托管八个对象存储守护进程 (OSD)。在此类配置中,有三个 OSD 节点额外充当监视器 (MON) 主机。
一台通过 lrbd
配置且运行 LIO iSCSI 目标的 iSCSI 目标服务器。
一台 iSCSI 发起程序主机,它运行 open-iscsi
(Linux)、Microsoft iSCSI 发起程序 (Microsoft Windows) 或任何其他兼容的 iSCSI 发起程序实施。
使用 lrbd
的建议 SUSE Enterprise Storage 生产配置包括:
一个 Ceph 存储集群。一个 Ceph 生产集群,它由任意数量(通常是 10 个以上)的 OSD 节点组成,其中每个节点通常运行 10-12 个对象存储守护进程 (OSD),以及至少三台专用 MON 主机。
多台通过 lrbd
配置且运行 LIO iSCSI 目标的 iSCSI 目标服务器。为实现 iSCSI 故障转移和负载平衡,这些服务器必须运行支持 target_core_rbd
模块的内核。可通过 SUSE Linux Enterprise Server 维护渠道获取更新包。
任意数量的 iSCSI 发起程序主机,这些主机运行 open-iscsi
(Linux)、Microsoft iSCSI 发起程序 (Microsoft Windows) 或任何其他兼容的 iSCSI 发起程序实施。
本节介绍在 SUSE Enterprise Storage 的基础上安装和配置 iSCSI 网关的步骤。
您可以在 Ceph 集群部署期间部署 iSCSI 网关,或者使用 DeepSea 将其添加到现有集群。
要在集群部署期间加入 iSCSI 网关,请参见第 4.5.1.2 节 “角色指定”。
要将 iSCSI 网关添加到现有集群,请参见第 1.2 节 “为节点添加新的角色”。
RBD 映像创建于 Ceph 存储区中,随后会导出到 iSCSI。建议为此使用专用的 RADOS 存储池。您可以在能使用 Ceph rbd
命令行实用程序连接到存储集群的任何主机上创建卷。这需要客户端至少有一个精简的 ceph.conf 配置文件,以及相应的 CephX 身份验证身份凭证。
要通过 iSCSI 创建一个随后可供导出的新卷,请使用 rbd create
命令并指定卷大小(以 MB 为单位)。例如,要在名为 iscsi
的存储池中创建名为 testvol
的 100 GB 卷,请运行:
root #
rbd --pool iscsi create --size=102400 testvol
上述命令将以默认格式 2 创建一个 RBD 卷。
从 SUSE Enterprise Storage 3 开始,默认卷格式为 2,格式 1 已弃用。但是,您仍可以使用 --image-format 1
选项创建采用已弃用格式 1 的卷。
要通过 iSCSI 导出 RBD 映像,请使用 lrbd
实用程序。lrbd
可用于创建、查看和修改采用 JSON 格式的 iSCSI 目标配置。
DeepSea 和 openATTIC 中看不到使用 lrbd
命令对 iSCSI 网关配置所做的任何更改。要导入您的手动更改,需要将 iSCSI 网关配置导出到一个文件:
root@minion >
lrbd -o /tmp/lrbd.conf
然后将其复制到 Salt Master 以便 DeepSea 和 openATTIC 可以看到该文件:
root@minion >
scp /tmp/lrbd.conf ses5master:/srv/salt/ceph/igw/cache/lrbd.conf
最后,编辑 /srv/pillar/ceph/stack/global.yml
并做如下设置:
igw_config: default-ui
要编辑配置,请使用 lrbd -e
或 lrbd --edit
。此命令将调用 EDITOR
环境变量定义的默认编辑器。可以通过同时设置 -E
选项和 -e
来覆盖此行为。
下面的示例配置针对以下情境:
有两个分别名为 iscsi1.example.com
和 iscsi2.example.com
的 iSCSI 网关主机,
使用 iqn.2003-01.org.linux-iscsi.iscsi.x86:testvol
的 iSCSI 限定名称 (IQN) 定义单个 iSCSI 目标,
包含单个 iSCSI 逻辑单元 (LU),
以 RADOS 存储池 rbd
中名为 testvol
的 RBD 映像为基础,
通过名为“east”和“west”的两个门户导出目标:
{ "auth": [ { "target": "iqn.2003-01.org.linux-iscsi.iscsi.x86:testvol", "authentication": "none" } ], "targets": [ { "target": "iqn.2003-01.org.linux-iscsi.iscsi.x86:testvol", "hosts": [ { "host": "iscsi1.example.com", "portal": "east" }, { "host": "iscsi2.example.com", "portal": "west" } ] } ], "portals": [ { "name": "east", "addresses": [ "192.168.124.104" ] }, { "name": "west", "addresses": [ "192.168.124.105" ] } ], "pools": [ { "pool": "rbd", "gateways": [ { "target": "iqn.2003-01.org.linux-iscsi.iscsi.x86:testvol", "tpg": [ { "image": "testvol" } ] } ] } ] }
请注意,每当您在配置中引用某个主机名时,此主机名必须与 iSCSI 网关的 uname -n
命令输出相匹配。
编辑的 JSON 存储在每个存储池的单个 RADOS 对象的扩展属性 (xattrs) 中。此对象适用于在其中编辑了 JSON 的网关主机,以及与同一 Ceph 集群连接的所有网关主机。不会将任何配置信息存储在 lrbd
网关本地。
要激活该配置,请将其存储在 Ceph 集群中,并以 root
身份执行以下其中一项操作:
从命令行运行 lrbd
命令(不带附加选项),
或者
使用 service lrbd restart
重启动 lrbd
服务。
lrbd
“服务”不会运行任何后台守护进程,只是调用 lrbd
命令。此类服务称为“一次性”服务。
您还应该启用在系统启动时自动配置 lrbd
的功能。为此,请运行 systemctl enable lrbd
命令。
上述配置反映了一种简单的单一网关设置。lrbd
配置可能要复杂且强大得多。lrbd
RPM 包随附了大量的配置示例,安装后,您可以通过查看 /usr/share/doc/packages/lrbd/samples
目录的内容来参考这些示例。也可以从 https://github.com/SUSE/lrbd/tree/master/samples 获取这些示例。
以下设置可能对某些环境有用。用于映像的属性有 uuid
、lun
、retries
、sleep
和 retry_errors
。使用前两个属性(uuid
和 lun
)可以硬编码特定映像的“uuid”或“lun”。您可为映像指定这两者中的任一属性。retries
、sleep
和 retry_errors
会影响映射 rbd 映像的尝试。
"pools": [ { "pool": "rbd", "gateways": [ { "host": "igw1", "tpg": [ { "image": "archive", "uuid": "12345678-abcd-9012-efab-345678901234", "lun": "2", "retries": "3", "sleep": "4", "retry_errors": [ 95 ], [...] } ] } ] } ]
可以为 lrbd
配置随后将传递给 LIO I/O 目标的高级参数。这些参数会划分为 iSCSI 和后备存储组件,然后可分别在 lrbd
配置的“targets”和“tpg”段落中指定。
不建议更改这些参数的默认设置。
"targets": [ { [...] "tpg_default_cmdsn_depth": "64", "tpg_default_erl": "0", "tpg_login_timeout": "10", "tpg_netif_timeout": "2", "tpg_prod_mode_write_protect": "0", } ]
选项说明如下:
默认的 CmdSN(命令顺序号)深度。限制 iSCSI 发起程序在任意时刻可拥有的未处理请求数量。
默认的错误恢复级别。
登录超时值(以秒为单位)。
NIC 故障超时(以秒为单位)。
如果设置为 1,则阻止写入到 LUN。
"pools": [ { "pool": "rbd", "gateways": [ { "host": "igw1", "tpg": [ { "image": "archive", "backstore_block_size": "512", "backstore_emulate_3pc": "1", "backstore_emulate_caw": "1", "backstore_emulate_dpo": "0", "backstore_emulate_fua_read": "0", "backstore_emulate_fua_write": "1", "backstore_emulate_model_alias": "0", "backstore_emulate_rest_reord": "0", "backstore_emulate_tas": "1", "backstore_emulate_tpu": "0", "backstore_emulate_tpws": "0", "backstore_emulate_ua_intlck_ctrl": "0", "backstore_emulate_write_cache": "0", "backstore_enforce_pr_isids": "1", "backstore_fabric_max_sectors": "8192", "backstore_hw_block_size": "512", "backstore_hw_max_sectors": "8192", "backstore_hw_pi_prot_type": "0", "backstore_hw_queue_depth": "128", "backstore_is_nonrot": "1", "backstore_max_unmap_block_desc_count": "1", "backstore_max_unmap_lba_count": "8192", "backstore_max_write_same_len": "65535", "backstore_optimal_sectors": "8192", "backstore_pi_prot_format": "0", "backstore_pi_prot_type": "0", "backstore_queue_depth": "128", "backstore_unmap_granularity": "8192", "backstore_unmap_granularity_alignment": "4194304" } ] } ] } ]
选项说明如下:
底层设备的块大小。
如果设置为 1,则启用“第三方复制”。
如果设置为 1,则启用“比较并写入”。
如果设置为 1,则打开“禁用页面写出”。
如果设置为 1,则启用“强制单元读取访问”。
如果设置为 1,则启用“强制单元写入访问”。
如果设置为 1,则使用后端设备名称作为模型别名。
如果设置为 0,则队列算法修饰符的重新排序受限。
如果设置为 1,则启用“任务已中止状态”。
如果设置为 1,则启用“精简配置 - 取消映射”。
如果设置为 1,则启用“精简配置 - 写入相同内容”。
如果设置为 1,则启用“单元警告联锁”。
如果设置为 1,则打开“启用写入快速缓存”。
如果设置为 1,则强制永久性预留 ISID。
结构一次可以传输的最大扇区数。
硬件块大小(以字节为单位)。
硬件一次可以传输的最大扇区数。
如果值为非零,则在底层硬件上启用 DIF 保护。
硬件队列深度。
如果设置为 1,则后备存储为非旋转设备。
UNMAP 的最大块描述符数。
UNMAP 的最大 LBA 数。
WRITE_SAME 的最大长度。
扇区中的最佳请求大小。
DIF 保护格式。
DIF 保护类型。
队列深度。
UNMAP 粒度。
UNMAP 粒度对齐。
对于目标,可以使用 tpg
属性优化内核参数。使用此选项时要特别小心。
"targets": [ { "host": "igw1", "target": "iqn.2003-01.org.linux-iscsi.generic.x86:sn.abcdefghijk", "tpg_default_cmdsn_depth": "64", "tpg_default_erl": "0", "tpg_login_timeout": "10", "tpg_netif_timeout": "2", "tpg_prod_mode_write_protect": "0", "tpg_t10_pi": "0" }
如果站点需要静态指定的 LUN,请对每个 LUN 指定编号。
tcmu-runner
导出 RADOS 块设备映像 #
从版本 5 开始,SUSE Enterprise Storage 针对 tcmu-runner
随附了一个用户空间 RBD 后端(有关详细信息,请参见 man 8 tcmu-runner
)。
基于 tcmu-runner
的 iSCSI 网关部署目前以技术预览的方式提供。有关使用 lrbd
进行基于内核的 iSCSI 网关部署的指导,请参见第 10 章 “安装 iSCSI 网关”。
与基于内核的 lrbd
iSCSI 网关部署不同,基于 tcmu-runner
的 iSCSI 网关不支持多路径 I/O 或 SCSI 永久性预留。
由于 DeepSea 和 openATTIC 目前不支持 tcmu-runner
部署,因此您需要手动管理安装、部署和监视。
在 iSCSI 网关节点上,安装 SUSE Enterprise Storage 5 媒体中的 tcmu-runner-handler-rbd
包,以及 libtcmu1
和 tcmu-runner
包依赖项。安装用于配置的 targetcli-fb
包。请注意,targetcli-fb
包与“non-fb”版本的 targetcli
包不兼容。
确认 tcmu-runner
systemd
服务正在运行:
root #
systemctl enable tcmu-runner
tcmu-gw:~ # systemctl status tcmu-runner
● tcmu-runner.service - LIO Userspace-passthrough daemon
Loaded: loaded (/usr/lib/systemd/system/tcmu-runner.service; static; vendor
preset: disabled)
Active: active (running) since ...
在现有的 Ceph 集群上创建一个 RADOS 块设备映像。在以下示例中,我们将使用“rbd”存储池中名为“tcmu-lu”的 10G 映像。
创建 RADOS 块设备映像后,请运行 targetcli
,并确保 tcmu-runner RBD 处理程序(插件)可用:
root #
targetcli
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> ls
o- / ................................... [...]
o- backstores ........................ [...]
...
| o- user:rbd ......... [Storage Objects: 0]
为 RBD 映像创建一个后备存储配置项:
/> cd backstores/user:rbd /backstores/user:rbd> create tcmu-lu 10G /rbd/tcmu-lu Created user-backed storage object tcmu-lu size 10737418240.
创建一个 iSCSI 传输配置项。在下面的示例中,目标限定名“iqn.2003-01.org.linux-iscsi.tcmu-gw.x8664:sn.cb3d2a3a”由 targetcli
自动生成,用作唯一的 iSCSI 目标标识符:
/backstores/user:rbd> cd /iscsi /iscsi> create Created target iqn.2003-01.org.linux-iscsi.tcmu-gw.x8664:sn.cb3d2a3a. Created TPG 1. Global pref auto_add_default_portal=true Created default portal listening on all IPs (0.0.0.0), port 3260.
针对您要连接到目标的 iSCSI 发起程序创建一个 ACL 项。在下面的示例中,使用了发起程序 IQN“iqn.1998-01.com.vmware:esxi-872c4888”:
/iscsi> cd iqn.2003-01.org.linux-iscsi.tcmu-gw.x8664:sn.cb3d2a3a/tpg1/acls/ /iscsi/iqn.20...a3a/tpg1/acls> create iqn.1998-01.com.vmware:esxi-872c4888
最后,将前面创建的 RBD 后备存储配置链接到 iSCSI 目标:
/iscsi/iqn.20...a3a/tpg1/acls> cd ../luns /iscsi/iqn.20...a3a/tpg1/luns> create /backstores/user:rbd/tcmu-lu Created LUN 0. Created LUN 0->0 mapping in node ACL iqn.1998-01.com.vmware:esxi-872c4888
退出外壳以保存现有配置:
/iscsi/iqn.20...a3a/tpg1/luns> exit Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup. Configuration saved to /etc/target/saveconfig.json
使用前面配置的 IQN 和主机名,从 iSCSI 发起程序(客户端)节点连接到新供应的 iSCSI 目标。