本文转载于 http://www.linuxidc.com/Linux/2012-07/64739.htm
iSCSI+OCFS2构建企业廉价共享存储方案
[日期:2012-07-09] | 来源:Linux社区 作者:leejia |
本文主要讲的是IP SAN的网络存储iSCSI(Internet Small Computer System Interface),即小型计算机系统接口的安装配置使用。iSCSI技术有着低廉的构建成本和优秀的存储性能,目前逐渐进入了企业应用领域,非常适合中小型企业应用。
iSCSI是一种用来建立和管理IP存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(SAN)。SAN 使得 SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行。
SCSI 结构基于客户/服务器模式,其通常应用环境是:设备互相靠近,并且这些设备由 SCSI 总线连接。iSCSI 的主要功能是在 TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器target)之间进行大量数据的封装和可靠传输过程。此外,iSCSI提供了在IP网络封装SCSI命令,且运行在TCP/IP协议栈上。
与传统的SCSI技术比较起来,iSCSI技术有如三个特点:
1,把原来只用于本机的SCSI协同透过TCP/IP网络传送,使连接距离可作无限的地域延伸
2,连接的服务器数量无限(原来的SCSI-3的上限是15)
3,由于是服务器架构,因此也可以实现在线扩容以至动态部署
使用iSCSI SAN的目的通常有以下两个:
1,存储整合
公司希望将不同的存储资源从分散在网络上的服务器移动到统一的位置(常常是数据中心),这可以让存储的分配变得更为有效。SAN环境中的服务器无需任何更改硬件或电缆连接就可以得到新分配的磁盘卷。
2,灾难恢复
公司希望把存储资源从一个数据中心镜像到另一个远程的数据中心上,后者在出现长时间停电的情况下可以用作热备份。 特别是,iSCSI SAN 使我们只需要用最小的配置更改就可以在 WAN 上面迁移整个磁盘阵列,实质上就是,把存储变成了“可路由的”,就像普通的网络通信一样。
本文主要来讲解iSCSI存储平台的搭建:
下面是本文的实验拓扑:
实验平台:
RedHat enterprise 5.4 + ocfs2 + iSCSI
准备工作:
如果不使用DNS的话,请保证两个客户端节点的主机名和hosts文件中的内容:
主机172.16.30.5:
主机名:node1.jia.com
hosts文件的内容:
172.16.30.6 node1.jia.com
172.16.30.5 node2.jia.com
主机172.16.30.6:
主机名:node2.jia.com
hosts文件的内容:
172.16.30.6 node1.jia.com
172.16.30.5 node2.jia.com
一,服务器端172.16.30.4上的配置:
二,172.16.30.6客户端节点配置操作:
三,172.16.30.5客户端节点上的配置操作:
四,测试使用:
一,服务器端172.16.30.4上的配置:
1、准备要共享的设备,这里使用本地磁盘上的新分区:
# fdisk -l
建立所需要的新分区
# fdisk /dev/sda
是kernel识别我们的分区:
# partprobe /dev/sda
2、安装iscsi服务端:
配置好我们的yum源,可以指向我们的系统安装光盘:
# yum -y install scsi-target-utils
启动服务:
# service tgtd start
# chkconfig tgtd on
我们的服务工作于3260端口:
# netstat -tnlp | grep 3260
3、使用服务端配置管理工具tgtadm创建我们的iscsi设备:
命令用法:
tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...
添加一个新的 target 且其ID为 [id], 名字为 [name].
--lld [driver] --op new --mode target --tid=[id] --targetname [name]
显示所有或某个特定的target:
--lld [driver] --op show --mode target [--tid=[id]]
向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。[path]是某“块设备”的路径,此块设备也可以是raid或lvm设备。lun0已经被系统预留。
--lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path]
删除ID为[id]的target:
--lld [driver] --op delete --mode target --tid=[id]
删除target [id]中的LUN [lun]:
-lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun]
定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:
--lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address]
解除target [id]的访问控制列表中[address]的访问控制权限:
--lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address]
(1)创建一个target:
# tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2010-08.com.example.ts1:disk1
(2)显示所有创建的target:
# tgtadm --lld iscsi --op show --mode target
(3)显示刚创建的target的详细信息:
# tgtadm --lld iscsi --op show --mode target --tid 1
(4)用我们刚创建的分区/dev/sda3创建为LUN,号码为1:
# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda3
(5)开放给172.16.0.0/16网络中的主机访问:
# tgtadm --lld iscsi --op bind --mode target --tid 1 -I 172.16.0.0/16
二,172.16.30.6客户端节点配置操作:
1,安装客户端软件包:
# yum -y install iscsi-initiator-utils
给Initiator客户端定义一个别名:
# echo "InitiatorAlias=initiator1" >> /etc/iscsi/initiatorname.iscsi
启动iscis服务:
# service iscsi start
# chkconfig iscsi on
2、使用客户端工具iscsiadm连接服务器端的iscsi设备:
命令使用方法:
iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] [ -t type -p ip:port [ -l ] ]
-d, --debug=debug_level 显示debug信息,级别为0-8;
-l, --login 登录
-t, --type=type 这里可以使用的类型为sendtargets, fw, 和 iSNS
-p, --portal=ip[:port] 指定target服务的IP和端口;
-m, --mode op 可用的mode有discovery, node, fw, host iface 和 session
-T, --targetname=targetname 用于指定要访问的target的名字
-u, --logout
先发现服务器端的设备:
# iscsiadm -m discovery -t sendtargets -p 172.16.30.4
登录服务器端设备:
# iscsiadm -m node -T iqn.2010-08.com.example.ts1:disk1 -p 172.16.30.4:3260 -l
查看我们发现的设备:
# ls /var/lib/iscsi/send_targets/
3,对我们发现的iscsi设备分区:
先查看:
# fdisk -l
Disk /dev/sda: 107.3 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 5235 41945715 8e Linux LVM
Disk /dev/sdb: 10.0 GB, 10010165760 bytes
64 heads, 32 sectors/track, 9546 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk /dev/sdb doesn't contain a valid partition table
我们可以向使用本地磁盘一样来使用iscsi设备,故我们先对iscsi设备进行分区:
# fdisk /dev/sdb
让kernel识别分区:
# partprobe /dev/sdb
3,把分区格式化为集群文件系统:
分区创建之后,就可以分区格式化了,由于我们是共享的存储设备,可能会有多个客户端来挂载使用同一target的LUN设备,如果多个客户端同时向设备写入数据,不会实现文件系统的写同步,甚至可能导致文件系统的崩溃。我们可以使用集群文件系统来避免这种情况,这里使用ocfs2集群文件系统:
首先下载软件包:
我的系统kernel是2.6.18.164的版本,故我要下载相对应的软件包,ocfs2的版本一定要和kernel的版本严格相对应,要不然不能使用:
ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm
ocfs2-tools-1.4.4-1.el5.i386.rpm
ocfs2console-1.4.4-1.el5.i386.rpm
安装:
# rpm -ivh \
ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm \
ocfs2-tools-1.4.4-1.el5.i386.rpm \
ocfs2console-1.4.4-1.el5.i386.rpm
编辑主配置文件:
# mkdir /etc/ocfs2
# vim /etc/ocfs2/cluster.conf
添加如下内容,主机名和ip要对应:
node:
ip_port = 7777
ip_address = 172.16.30.6
number = 0
name = node1.jia.com
cluster = ocfs2
node:
ip_port = 7777
ip_address = 172.16.30.5
number = 1
name = node2.jia.com
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
由于两个节点上配置文件要相同,故将此配置文件同步至另一节点172.16.30.5:
# scp -r /etc/ocfs2 root@172.16.30.5:/etc/
启动ocfs2文件系统:
# /etc/init.d/o2cb enable
# /etc/init.d/o2cb stop
# /etc/init.d/o2cb start
# /etc/init.d/ocfs2 stop
# /etc/init.d/ocfs2 start
查看ocfs2集群的运行状态
# /etc/init.d/o2cb status
Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold = 31
Network idle timeout: 30000
Network keepalive delay: 2000
Network reconnect delay: 2000
Checking O2CB heartbeat: Not active
在格式化和挂载文件系统之前,应验证O2CB在两个节点上均为online状态;上述信息最后一行显示O2CB心跳未激活是因为文件系统还没有挂载,其挂载之后就会变成active状态。
创建ocfs2文件系统,其中-N选项用于指明最多允许多少个节点同时使用此文件系统:
# mkfs -t ocfs2 -N 2 /dev/sdb1
挂载分区:
# mount /dev/sdb1 /mnt
我们的客户端172.16.30.6现在就可以使用这个iscsi设备了
三,172.16.30.5客户端节点上的配置操作:
1,安装客户端软件包:
# yum -y install iscsi-initiator-utils
给Initiator客户端定义一个别名:
# echo "InitiatorAlias=initiator1" >> /etc/iscsi/initiatorname.iscsi
启动iscis服务:
# service iscsi start
# chkconfig iscsi on
2、使用客户端工具iscsiadm连接服务器端的iscsi设备:
先发现服务器端的设备:
# iscsiadm -m discovery -t sendtargets -p 172.16.30.4
登录服务器端设备:
# iscsiadm -m node -T iqn.2010-08.com.example.ts1:disk1 -p 172.16.30.4:3260 -l
查看iscis设备:
# fdisk -l
Disk /dev/sda: 107.3 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 5235 41945715 8e Linux LVM
/dev/sda3 5236 5965 5863725 8e Linux LVM
Disk /dev/sdb: 10.0 GB, 10010165760 bytes
64 heads, 32 sectors/track, 9546 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 955 977904 83 Linux
3,安装cofs2相关软件包:
# rpm -ivh \
ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm \
ocfs2-tools-1.4.4-1.el5.i386.rpm \
ocfs2console-1.4.4-1.el5.i386.rpm
4,启动ocfs2文件系统:
# /etc/init.d/o2cb enable
# /etc/init.d/o2cb stop
# /etc/init.d/o2cb start
# /etc/init.d/ocfs2 stop
# /etc/init.d/ocfs2 start
挂载分区:
# mount /dev/sdb1 /mnt
四,测试使用:
我们在172.16.30.5上建立一个文件:
# cd /mnt
# touch test.txt
然后,我们在172.16.30.6上查看
# ls /mnt/
lost+found test.txt
ok!现在我们的两个客户端就共享使用了iscsi设备,并且可以同时往挂载的分区中写入数据了!