第一次接触iSCSI是在2013年负责企业存储架构改造时。当时客户需要将原有的DAS直连存储升级为网络存储方案,但预算有限无法部署光纤通道。iSCSI以其以太网承载SCSI协议的独特设计,完美解决了这个痛点。经过这些年的实践,我发现iSCSI的魅力远不止于成本优势。
iSCSI(Internet Small Computer System Interface)本质上是通过TCP/IP网络传输SCSI命令的协议栈。它将存储指令封装在IP包中进行传输,使得客户端(initiator)能够像访问本地SCSI设备一样访问远程存储目标(target)。这种设计带来了三个革命性改变:
在企业级应用中,iSCSI通常用于以下场景:
关键提示:虽然iSCSI可以通过常规千兆网络运行,但建议至少使用10Gbps网络以获得理想性能。对于高IOPS要求的数据库应用,建议配置独立的存储网络VLAN。
以Linux平台为例,使用targetcli工具搭建iSCSI target服务是目前最主流的方案。以下是CentOS 8上的详细配置过程:
bash复制# 安装必要组件
yum install -y targetcli iscsi-initiator-utils
# 启动服务
systemctl enable --now target
# 进入配置界面
targetcli
在交互式界面中按以下顺序创建存储资源:
一个典型配置示例如下:
bash复制/> backstores/fileio create disk1 /iscsi_disks/disk1.img 50G
/> iscsi/ create iqn.2023-08.storage:server
/> iscsi/iqn.2023-08.storage:server/tpg1/luns create /backstores/fileio/disk1
/> iscsi/iqn.2023-08.storage:server/tpg1/acls create iqn.2023-08.client:initiator
Windows客户端配置相对简单:
Linux客户端配置示例:
bash复制# 安装客户端工具
yum install -y iscsi-initiator-utils
# 配置initiator名称
echo "InitiatorName=iqn.2023-08.client:initiator" > /etc/iscsi/initiatorname.iscsi
# 发现target
iscsiadm -m discovery -t st -p 192.168.1.100
# 建立连接
iscsiadm -m node -T iqn.2023-08.storage:server -p 192.168.1.100 -l
经验之谈:生产环境中建议配置CHAP认证。在targetcli中使用
set auth命令启用双向认证,可以有效防止未授权访问。
对于高可用性要求的场景,配置多路径访问是必须的。以下是Linux下的配置示例:
bash复制yum install -y device-mapper-multipath
/etc/multipath.conf:ini复制devices {
device {
vendor "LIO-ORG"
product "TCMU device"
path_grouping_policy multibus
path_checker tur
features "0"
hardware_handler "0"
failback immediate
}
}
bash复制systemctl enable --now multipathd
在/etc/iscsi/iscsid.conf中调整以下关键参数:
ini复制# 增大队列深度提升吞吐量
node.session.queue_depth = 32
# 启用头部和数据摘要(需硬件支持)
node.conn[0].iscsi.HeaderDigest = CRC32C
node.conn[0].iscsi.DataDigest = CRC32C
# 调整超时设置
node.conn[0].timeo.noop_out_interval = 10
node.conn[0].timeo.noop_out_timeout = 15
对于网络层面的优化,建议:
症状:客户端无法发现target或连接超时
排查步骤:
症状:传输速率远低于网络带宽
优化建议:
症状:已连接的磁盘意外断开
应急处理:
经过多个金融行业项目的验证,我总结出以下黄金准则:
对于超融合架构,建议考虑以下增强方案:
在实际操作中,我发现很多性能问题其实源于不当的队列深度设置。一个简单的计算公式可以帮助确定最佳值:
code复制推荐队列深度 = (延迟ms × 吞吐量MB/s) / I/O大小KB
例如对于0.5ms延迟、500MB/s吞吐量的系统,处理4KB I/O时:
(0.5 × 500)/4 ≈ 62,因此设置队列深度为64比较合适。