集群架构 - iSCSI块存储服务

1. iSCSI技术介绍

1.1 硬盘接口类型

为了进一步提升硬盘存储设备的读写速度和性能,人们一直在努力改进物理硬盘设备的接口协议。当前的硬盘接口类型主要有IDE、SCSI和SATA这3种。

接口类型 说明 特点
IDE 集成驱动电子设备 成熟稳定、价格便宜的并行传输接口
SATA 串行ATA接口 传输速度更快、数据校验更完整的串行传输接口
SCSI 小型计算机系统接口 系统资源占用率低、转速高、传输速度快等优点

1.2 SCSI接口特点

SCSI (Small Computer System Interface) 是一种用于计算机和硬盘、光驱等设备之间系统级接口的通用标准,具有以下优点:

  1. 系统资源占用率低: CPU占用率低
  2. 转速高: 支持高转速硬盘
  3. 传输速度快: 数据传输速度快
  4. 扩展性强: 支持多设备连接

1.3 iSCSI技术概述

iSCSI (Internet Small Computer System Interface) 技术在工作形式上分为服务端target与客户端initiator。

iSCSI架构:

  • iSCSI服务端 (Target): 用于存放硬盘存储资源的服务器
  • iSCSI客户端 (Initiator): 用户使用的软件,用于访问远程服务端的存储资源

1.4 iSCSI工作原理

iSCSI协议将SCSI命令封装在TCP/IP数据包中,通过IP网络传输,实现远程存储访问。

工作流程:

  1. 客户端发起连接请求
  2. 服务端验证客户端身份
  3. 建立iSCSI会话
  4. 客户端可以像使用本地磁盘一样使用远程存储

1.5 iSCSI优势

优势 说明
成本低 使用现有IP网络,无需专用存储网络
易管理 基于IP网络,管理简单
扩展性强 可以轻松扩展存储容量
兼容性好 支持多种操作系统

2. 配置iSCSI服务端

2.1 安装iSCSI服务

1
2
# 安装iSCSI服务端程序
[root@iscsi-server ~]# yum install targetd targetcli -y

软件包说明:

  • targetd: iSCSI服务端守护进程
  • targetcli: iSCSI服务端配置管理工具

2.2 启动iSCSI服务

1
2
3
4
5
6
7
8
# 启动ISCSI服务端程序targetd
[root@iscsi-server ~]# systemctl start targetd

# 加入开机自启
[root@iscsi-server ~]# systemctl enable targetd

# 检查服务状态
[root@iscsi-server ~]# systemctl status targetd

2.3 配置iSCSI服务共享资源

targetcli是用于管理iSCSI服务端存储资源的配置命令,将iSCSI共享资源的配置内容抽象成”目录”的形式,我们只需将各类配置信息填入到相应的”目录”中即可。

进入targetcli配置界面

1
2
3
4
5
6
7
8
# 进入targetcli配置界面
[root@linux-node1 ~]# targetcli

targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/>

创建块存储对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 进入backstores/block目录
/> cd backstores/block

# 创建块存储对象(使用/dev/sdb设备)
/backstores/block> create disk0 /dev/sdb
Created block storage object disk0 using /dev/sdb.

# 返回根目录
/backstores/block> cd /

# 查看配置
/> ls
o- / ..................................................................... [...]
o- backstores .......................................................... [...]
| o- block .............................................. [Storage Objects: 1]
| | o- disk0 ..................... [/dev/sdb (20.0GiB) write-thru deactivated]
| | o- alua ............................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ................... [ALUA state: Active/optimized]
| o- fileio ............................................. [Storage Objects: 0]
| o- pscsi .............................................. [Storage Objects: 0]
| o- ramdisk ............................................ [Storage Objects: 0]
o- iscsi ........................................................ [Targets: 0]
o- loopback ..................................................... [Targets: 0]

说明:

  • disk0: 存储对象名称(可自定义)
  • /dev/sdb: 要共享的块设备

2.4 创建iSCSI target名称及配置共享资源

iSCSI target名称是由系统自动生成,用于描述共享资源的唯一字符串。

客户端在扫描iSCSI服务端时即可看见该字符串,因此我们无需记忆该字符串。

系统在生成这个target名称后,还会在/iscsi参数目录中创建一个与其字符串同名的新”目录”用来存放共享资源。

创建iSCSI target

1
2
3
4
5
6
7
8
9
# 进入iscsi目录
/> cd iscsi

# 创建iSCSI target(系统自动生成名称)
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

iSCSI名称格式:

1
iqn.年-月.反向域名:唯一标识符

将存储对象添加到LUN

1
2
3
4
5
6
# 进入LUNs目录
/iscsi> cd iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73/tpg1/luns

# 创建LUN,关联之前创建的存储对象
/iscsi/iqn.20...a73/tpg1/luns> create /backstores/block/disk0
Created LUN 0.

LUN说明:

  • LUN (Logical Unit Number): 逻辑单元号
  • 每个LUN对应一个存储对象

2.5 设置访问控制列表(ACL)

iSCSI协议是通过客户端名称进行验证,用户在访问存储共享资源时不需要输入密码,只要iSCSI客户端的名称与服务端中设置的访问控制列表中某一名称条目一致即可。

acls参数目录用于存放能够访问iSCSI服务端共享存储资源的客户端名称。

1
2
3
4
5
6
7
# 进入acls目录
/iscsi/iqn.20...a9756a73/tpg1> cd acls

# 创建ACL条目(客户端名称)
/iscsi/iqn.20...a73/tpg1/acls> create iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73:client
Created Node ACL for iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73:client
Created mapped LUN 0.

ACL说明:

  • ACL (Access Control List): 访问控制列表
  • 只有ACL中的客户端名称才能访问存储资源
  • 客户端名称格式与服务端target名称类似

2.6 设置iSCSI服务端的监听IP地址和端口号

1
2
3
4
5
6
7
8
9
10
# 返回tpg1目录
/iscsi/iqn.20...d80/tpg1/acls> cd ..

# 进入portals目录
/iscsi/iqn.20...c356ad80/tpg1> cd portals

# 创建监听地址(默认端口3260)
/iscsi/iqn.20.../tpg1/portals> create 192.168.56.11
Using default IP port 3260
Created network portal 192.168.56.11:3260.

说明:

  • 默认端口: 3260
  • 可以指定多个IP地址和端口
  • 0.0.0.0表示监听所有网卡

2.7 配置后检查配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 返回根目录
/iscsi/iqn.20.../tpg1/portals> cd /

# 查看完整配置
/> ls
o- / ..................................................................... [...]
o- backstores .......................................................... [...]
| o- block .............................................. [Storage Objects: 1]
| | o- disk0 ....................... [/dev/sdb (20.0GiB) write-thru activated]
| | o- alua ............................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ................... [ALUA state: Active/optimized]
| o- fileio ............................................. [Storage Objects: 0]
| o- pscsi .............................................. [Storage Objects: 0]
| o- ramdisk ............................................ [Storage Objects: 0]
o- iscsi ........................................................ [Targets: 1]
| o- iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73 . [TPGs: 1]
| o- tpg1 ........................................... [no-gen-acls, no-auth]
| o- acls ...................................................... [ACLs: 1]
| | o- iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73:client [Mapped LUNs: 1]
| | o- mapped_lun0 ............................. [lun0 block/disk0 (rw)]
| o- luns ...................................................... [LUNs: 1]
| | o- lun0 .................. [block/disk0 (/dev/sdb) (default_tg_pt_gp)]
| o- portals ................................................ [Portals: 1]
| o- 0.0.0.0:3260 ................................................. [OK]

# 保存配置
/> saveconfig
Configuration saved to /etc/target/saveconfig.json

# 退出targetcli(注意:不要使用ctrl+c结束该进程)
/> exit

重要提示: 不要使用Ctrl+C结束targetcli进程,应使用exit命令退出,否则配置可能丢失。

2.8 重启服务并配置防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重启targetd服务
[root@liyanzhao ~]# systemctl restart targetd

# 配置firewalld防火墙
[root@liyanzhao ~]# firewall-cmd --permanent --add-port=3260/tcp
success

# 重新加载防火墙
[root@linux-node1 ~]# firewall-cmd --reload
success

# 验证防火墙规则
[root@linux-node1 ~]# firewall-cmd --list-ports
3260/tcp

iSCSI端口说明:

  • TCP 3260: iSCSI服务默认端口

3. 配置Linux客户端

3.1 安装iSCSI客户端服务程序

1
2
# 安装iSCSI客户端程序initiator
yum install iscsi-initiator-utils

软件包说明:

  • iscsi-initiator-utils: iSCSI客户端工具集
  • 包含iscsiadm、iscsid等工具

3.2 配置客户端initiator名称

编辑iSCSI客户端中的initiator名称文件,将服务端的访问控制列表名称填写进来。

1
2
3
4
5
# 编辑initiator名称文件
[root@liyanzhao ~]# vim /etc/iscsi/initiatorname.iscsi

# 修改为服务端ACL中配置的客户端名称
InitiatorName=iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73:client

说明:

  • 客户端名称必须与服务端ACL中配置的名称完全一致
  • 格式: InitiatorName=客户端名称

3.3 重启客户端iscsid服务

1
2
3
4
5
6
7
8
# 重启客户端iscsid服务程序
[root@liyanzhao ~]# systemctl restart iscsid

# 加入开机自启动
[root@liyanzhao ~]# systemctl enable iscsid

# 检查服务状态
[root@liyanzhao ~]# systemctl status iscsid

3.4 发现iSCSI服务端共享存储资源

iSCSI客户端访问并使用共享存储资源的步骤很简单:发现、登录、挂载、使用。

iscsiadm是用于管理、查询、插入、更新或删除iSCSI数据库配置文件的命令行工具。

1
2
3
4
5
6
# 扫描远程ISCSI服务端共享存储资源
# -m discovery 扫描并发现可用的存储资源
# -t st 执行扫描操作的类型
# -p 指定iSCSI服务端的IP地址
[root@liyanzhao ~]# iscsiadm -m discovery -t st -p 192.168.56.11
192.168.56.11:3260,1 iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73

命令参数说明:

  • -m discovery: 发现模式
  • -t st: 发送目标发现类型
  • -p IP地址: 指定iSCSI服务端IP地址

3.5 登录iSCSI服务端

iscsiadm命令发现远程服务器上可用的存储资源后,然后使用iscsiadm登录ISCSI服务端。

1
2
3
4
5
6
7
8
9
10
# 登录iSCSI服务端
# -m node参数为将客户端所在主机作为一台节点服务器
# -T 参数为要使用的存储资源(直接复制前面命令中扫描发现的结果,以免录入错误)
# -p 192.168.56.11参数依然为对方iSCSI服务端的IP地址
# --login或-l参数进行登录验证
[root@liyanzhao ~]# iscsiadm -m node \
-T iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73 \
-p 192.168.56.11 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73, portal: 192.168.56.11,3260]
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73, portal: 192.168.56.11,3260]: successful

命令参数说明:

  • -m node: 节点模式
  • -T target名称: 指定要连接的target
  • -p IP地址: 指定服务端IP地址
  • --login-l: 执行登录操作

3.6 格式化并挂载iSCSI存储

iSCSI客户端成功登录之后,会在客户端主机上多出一块名为/dev/sd[x]的设备文件,进行格式化挂载即可。

查看当前磁盘

1
2
3
4
5
6
7
8
# 查看当前磁盘
[root@liyanzhao ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part /
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk

说明: 新出现的设备可能是sdb、sdc等,根据实际情况确定。

格式化并挂载

1
2
3
4
5
6
7
8
9
10
11
12
# 格式化iSCSI磁盘(使用xfs文件系统)
[root@liyanzhao ~]# mkfs.xfs /dev/sdc

# 创建挂载点
[root@liyanzhao ~]# mkdir /iscsi

# 挂载iSCSI磁盘
[root@liyanzhao ~]# mount /dev/sdc /iscsi/

# 验证挂载
[root@liyanzhao ~]# df -h | grep iscsi
/dev/sdc 20G 33M 20G 1% /iscsi

3.7 开机自动挂载

1
2
3
4
5
6
7
8
9
10
# 查看磁盘UUID
[root@liyanzhao ~]# blkid | grep /dev/sdc
/dev/sdc: UUID="0b5f71ea-90f9-45c5-a7cb-6a22f5460a67" TYPE="xfs"

# 添加到fstab文件
[root@liyanzhao ~]# tail -n1 /etc/fstab
UUID=0b5f71ea-90f9-45c5-a7cb-6a22f5460a67 /iscsi xfs defaults 0 0

# 测试fstab配置
[root@liyanzhao ~]# mount -a

注意: 由于iSCSI是网络存储,建议在fstab中添加_netdev选项,确保网络就绪后再挂载。

1
2
# 更安全的fstab配置
UUID=0b5f71ea-90f9-45c5-a7cb-6a22f5460a67 /iscsi xfs defaults,_netdev 0 0

3.8 卸载iSCSI共享设备资源

1
2
3
4
5
6
7
8
9
10
# 卸载iSCSI设备
# -u参数进行卸载
[root@liyanzhao ~]# umount /iscsi

# 登出iSCSI服务端
[root@liyanzhao ~]# iscsiadm -m node \
-T iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73 \
-p 192.168.56.11 -u
Logging out of session [sid: 1, target: iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73, portal: 192.168.56.11,3260]
Logout of [sid: 1, target: iqn.2003-01.org.linux-iscsi.linux-node1.x8664:sn.9eaea9756a73, portal: 192.168.56.11,3260]: successful

命令参数说明:

  • -u--logout: 登出iSCSI会话

3.9 Linux客户端管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看已发现的target
iscsiadm -m discoverydb -t st -p 192.168.56.11

# 查看已登录的会话
iscsiadm -m session

# 查看节点信息
iscsiadm -m node

# 删除发现的target
iscsiadm -m node -T target名称 -p IP地址 --op delete

# 设置自动登录
iscsiadm -m node -T target名称 -p IP地址 --op update -n node.startup -v automatic

4. 配置Win客户端

使用Windows系统的客户端也可以正常访问iSCSI服务器上的共享存储资源,而且操作原理及步骤与Linux系统的客户端基本相同。

4.1 运行iSCSI发起程序

在Windows 7操作系统中已经默认安装了iSCSI客户端程序,我们只需在控制面板中找到”系统和安全”标签,然后单击”管理工具”。

操作步骤:

  1. 打开”控制面板”
  2. 选择”系统和安全”
  3. 单击”管理工具”

进入到”管理工具”双击”iSCSI发起程序”,在第一次运行iSCSI发起程序时,系统会提示Microsoft iSCSI服务端未运行,单击”是”按钮即可自动启动并运行iSCSI发起程序。

4.2 扫描发现iSCSI服务端

必须先扫描发现iSCSI服务端上可用的存储资源。

操作步骤:

  1. 在iSCSI发起程序的”目标”窗口栏写入iSCSI服务端的IP地址
  2. 单击”快速连接”

在弹出的”快速连接”提示框中可看到共享的硬盘存储资源,单击”完成”按钮即可。

回到”目标”选项卡页面,可以看到共享存储资源的名称已经出现。

4.3 配置客户端名称

由于在iSCSI服务端程序上设置了ACL使得只有客户端名称与ACL策略中的名称保持一致时才能使用远程存储资源,因此需要在”配置”选项卡中单击”更改”按钮,把iSCSI发起程序的名称修改为服务端ACL中配置的客户端名称。

操作步骤:

  1. 切换到”配置”选项卡
  2. 单击”更改”按钮
  3. 修改iSCSI发起程序名称
  4. 确认修改

在确认客户端发起程序的名称修改正确后即可返回到”目标”选项卡页面中,然后单击”连接”按钮进行连接请求,成功连接到远程共享存储资源的页面。

4.4 访问iSCSI远程共享存储资源

右键单击桌面上的”计算机”图标,打开计算机管理程序。

操作步骤:

  1. 右键”计算机” → “管理”
  2. 打开”计算机管理”窗口
  3. 选择”存储” → “磁盘管理”

4.5 对磁盘进行初始化操作

在磁盘管理界面中,可以看到新检测到的iSCSI磁盘设备。

初始化步骤:

  1. 初始化磁盘: 右键新磁盘 → “初始化磁盘”

    • 选择分区表类型(MBR或GPT)
    • 点击”确定”
  2. 创建分区: 右键未分配空间 → “新建简单卷”

    • 启动”新建简单卷向导”
    • 设置分区大小
    • 分配驱动器号(盘符)
    • 选择文件系统(NTFS)和卷标
    • 完成初始化
  3. 等待初始化完成: 系统会自动格式化磁盘并完成初始化

注意事项:

  • 选择合适的分区表类型(MBR支持2TB以下,GPT支持更大容量)
  • 选择合适的文件系统(Windows通常使用NTFS)
  • 初始化过程可能需要一些时间

4.6 Windows客户端管理

查看iSCSI连接状态:

  • 在iSCSI发起程序中查看”目标”选项卡
  • 显示”已连接”状态表示连接成功

断开iSCSI连接:

  • 在”目标”选项卡中,选择已连接的target
  • 单击”断开”按钮

删除target:

  • 在”目标”选项卡中,选择target
  • 单击”删除”按钮

5. iSCSI服务管理

5.1 服务端管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动服务
systemctl start targetd

# 停止服务
systemctl stop targetd

# 重启服务
systemctl restart targetd

# 查看状态
systemctl status targetd

# 开机自启
systemctl enable targetd

5.2 targetcli管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入targetcli
targetcli

# 查看配置
ls

# 保存配置
saveconfig

# 退出
exit

# 删除配置
# 在targetcli中使用delete命令

5.3 客户端管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 发现target
iscsiadm -m discovery -t st -p IP地址

# 登录target
iscsiadm -m node -T target名称 -p IP地址 --login

# 登出target
iscsiadm -m node -T target名称 -p IP地址 -u

# 查看会话
iscsiadm -m session

# 查看节点
iscsiadm -m node

# 设置自动登录
iscsiadm -m node -T target名称 -p IP地址 --op update -n node.startup -v automatic

6. iSCSI故障排查

6.1 常见问题

问题1: 无法发现target

排查步骤:

1
2
3
4
5
6
7
8
9
10
11
12
# 检查服务端服务状态
systemctl status targetd

# 检查端口监听
ss -lntup | grep 3260

# 检查防火墙
firewall-cmd --list-ports

# 测试网络连通性
ping 服务端IP
telnet 服务端IP 3260

问题2: 登录失败

排查步骤:

1
2
3
4
5
6
7
8
9
10
11
# 检查客户端initiator名称
cat /etc/iscsi/initiatorname.iscsi

# 检查服务端ACL配置
targetcli
/> cd /iscsi/iqn.../tpg1/acls
/acls> ls

# 查看日志
journalctl -u targetd -f
tail -f /var/log/messages

问题3: 无法识别磁盘

排查步骤:

1
2
3
4
5
6
7
8
9
10
11
# 检查会话状态
iscsiadm -m session

# 重新扫描SCSI总线
echo "- - -" > /sys/class/scsi_host/host0/scan
# 或
rescan-scsi-bus.sh

# 查看磁盘
lsblk
fdisk -l

6.2 错误代码

错误信息 说明 解决方法
Connection refused 连接被拒绝 检查服务端服务和防火墙
Login failed 登录失败 检查initiator名称和ACL配置
No route to host 无法到达主机 检查网络连通性
Timeout 连接超时 检查网络和防火墙规则

7. iSCSI安全加固

7.1 安全建议

  1. 使用CHAP认证: 启用用户名密码认证
  2. 限制访问IP: 使用防火墙限制访问来源
  3. 使用专用网络: 将iSCSI流量隔离到专用网络
  4. 定期更新: 保持软件最新版本

7.2 启用CHAP认证

1
2
3
4
5
6
7
8
9
# 在targetcli中配置CHAP认证
targetcli
/> cd /iscsi/iqn.../tpg1
/tpg1> set attribute authentication=1
/tpg1> set attribute generate_node_acls=0
/tpg1> cd acls/iqn.../client
/client> set auth userid=用户名
/client> set auth password=密码
/> saveconfig

7.3 防火墙配置

1
2
3
# 限制访问来源
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.56.0/24" port port="3260" protocol="tcp" accept'
firewall-cmd --reload

8. iSCSI性能优化

8.1 网络优化

1
2
3
4
5
6
7
8
9
10
11
# 优化网络参数
cat >> /etc/sysctl.conf <<EOF
# iSCSI优化
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF

sysctl -p

8.2 存储优化

1
2
3
# 使用专用网络
# 配置多路径(MPIO)
# 调整队列深度

8.3 客户端优化

1
2
3
4
5
# 调整iSCSI参数
# 编辑/etc/iscsi/iscsid.conf
node.session.timeo.replacement_timeout = 120
node.conn[0].timeo.noop_out_interval = 5
node.conn[0].timeo.noop_out_timeout = 5

9. iSCSI实战案例

9.1 案例1: 多客户端共享存储

需求: 多个客户端共享同一个iSCSI存储。

配置步骤:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 在服务端创建多个ACL
targetcli
/> cd /iscsi/iqn.../tpg1/acls
/acls> create iqn.2003-01.org.linux-iscsi.client1
/acls> create iqn.2003-01.org.linux-iscsi.client2

# 2. 在各客户端配置对应的initiator名称
# 客户端1: /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.client1

# 客户端2: /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.client2

9.2 案例2: 多路径配置

需求: 配置iSCSI多路径以提高可用性和性能。

配置步骤:

1
2
3
4
5
6
7
8
# 1. 安装多路径软件
yum install device-mapper-multipath -y

# 2. 配置多路径
mpathconf --enable

# 3. 编辑多路径配置
vim /etc/multipath.conf

实战优化