IP-SAN:实现廉价安全的存储

简介:

在这篇博客中,小编要来讲讲SAN的原理以及实现啦,读者应该还记得小编在前面在讲HA和LB群集的时候解决后端的存储用的技术是什么么,NAS(网络附加存储),当然这种技术的效率是比较低的啦,如果企业对于数据存储的速率要求比较高的话,这种技术果断不能满足需求啦,因此就引出了SAN(存储区域网络)啦,简单的说它提供一种块级别的文件共享,前方服务器直接可以将后方存储介质当做本地磁盘来使用啦,人们采用包括光纤通道技术(这个速度可是相当的快啦,一般IDC都会采用这种技术)、磁盘阵列、磁带柜、光盘柜(en)的各种技术进行实现。

实现SAN的网络类型

读者想想在大多数的物理存储中都是使用SCSI接口进行服务器和磁盘驱动器设备之间的通信。因为它们的总线拓扑结构(系统总线)并不适用于网络环境,所以它们并没有使用底层物理连接介质(比如连接电缆)。相对地,它们采用其它底层通信协议作为镜像层来实现网络连接:

1.光纤通道协议 (FCP, Fibre Channel Protocol), 最常见的通过光纤通道来映射SCSI的一种连接方式(FC-SAN);

这一种的连接方式的效率是最高的,但是同时代价是最高的,主要贵在硬件设备上,如光纤交换机,一般IDC都会使用这种技术

2.iSCSI, 基于TCP/IP的SCSI映射(IP-SAN);

这一种的效率要低很多,但是代价也要低太多啦,今天小编要实现的就是这一种啦

3.HyperSCSI, 基于以太网的SCSI映射;

4.ATA over Ethernet, 基于以太网的ATA映射;

5.使用光纤通道连接的FICON,常见与大型机环境;

6.Fibre Channel over Ethernet (FCoE),基于以太网的FC协议;

7.iSCSI Extensions for RDMA (iSER), 基于InfiniBand (IB)的iSCSI连接;

8.iFCP[1] 或 SANoIP[2] 基于IP网络的光纤通道协议(FCP).

IP-SAN的实现

1. 网络拓扑

clip_image002

2. 具体实现

这里要使用到iSCSI技术,小编简单介绍一下iSCSI,iSCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道。透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SAN模拟成为本地的储存装置。

iSCSI使用 TCP/IP 协议(一般使用TCP端口860和3260)。 本质上,iSCSI 让两个主机通过 IP 网络相互协商然后交换 SCSI 命令。这样一来,iSCSI 就是用广域网仿真了一个常用的高性能本地存储总线,从而创建了一个存储局域网(SAN)。不像某些 SAN 协议,iSCSI 不需要专用的电缆;它可以在已有的交换和 IP 基础架构上运行。

在使用上,前端的服务器充当着initiator(发起者),后端的存储充当着target,由前端服务器找到后端的存储,然后使用

软件需求:

小编这里的OS是linux 5.4 光盘自带有相关的软件包

1.后端存储:

scsi-target-utils-0.0-5.20080917snap.el5.i386.rpm //将后端存储服务器模拟成为target

perl-Config-General-2.40-1.el5.noarch.rpm //target的依赖包

2.前端服务器:

iscsi-initiator-utils-6.2.0.871-0.10.el5.i386.rpm //将前端服务改变成为initiator

后端存储配置:

Step 1. 安装软件包并启动服务

# rpm -ivh perl-Config-General-2.40-1.el5.noarch.rpm 

# rpm -ivh scsi-target-utils-0.0-5.20080917snap.el5.i386.rpm

安装完成之后查询一下软件包都产生了哪些文件

# rpm -ql scsi-target-utils

/etc/rc.d/init.d/tgtd //服务脚本

/etc/sysconfig/tgtd

/etc/tgt/targets.conf //配置文件

/usr/sbin/tgt-admin

/usr/sbin/tgt-setup-lun

/usr/sbin/tgtadm //这个比较的常用啦,就是将存储作为一种target资源,以便前端服务器能找到

/usr/sbin/tgtd

/usr/share/doc/scsi-target-utils-0.0

/usr/share/doc/scsi-target-utils-0.0/README

/usr/share/doc/scsi-target-utils-0.0/README.iscsi

/usr/share/doc/scsi-target-utils-0.0/README.iser

/usr/share/doc/scsi-target-utils-0.0/README.lu_configuration

/usr/share/doc/scsi-target-utils-0.0/README.mmc

/usr/share/man/man8/tgt-admin.8.gz

/usr/share/man/man8/tgt-setup-lun.8.gz

/usr/share/man/man8/tgtadm.8.gz

启动服务

# service tgtd start

Step 2. 创建target资源

tgtadm 语法

--lld [driver] --op new --mode target --tid=[id] --targetname [name] //添加资源

--lld [driver] --op delete --mode target --tid=[id] //删除资源

--lld [driver] --op show --mode target //查看资源

--lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path] //绑定磁盘

--lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address] //指定哪些IP端的服务器能够访问到target资源

# tgtadm --lld iscsi --op new --mode target --tid=1 --targetname iqn.2013-06.com.back:disk

小编这里有/dev/sdb1可以作为target的磁盘

# tgtadm --lld iscsi --op new --mode=logicalunit --tid=1 --lun=1 --backing-store /dev/sdb1

# tgtadm --lld iscsi --op show --mode target //查看资源情况

Target 1: iqn.2013-06.com.back:disk

System information:

Driver: iscsi

State: ready //状态已经准备好了

I_T nexus information:

LUN information:

LUN: 0

Type: controller

SCSI ID: deadbeaf1:0

SCSI SN: beaf10

Size: 0 MB

Online: Yes

Removable media: No

Backing store: No backing store

LUN: 1 //这里就是小编添加进的磁盘信息啦

Type: disk

SCSI ID: deadbeaf1:1

SCSI SN: beaf11

Size: 10734 MB

Online: Yes

Removable media: No

Backing store: /dev/sdb1

Account information:

ACL information:

Step 3. 创建是算完成啦,还要考虑安全性啦,这里基于IP地址进行限制

# tgtadm --lld iscsi --op bind --mode=target --tid=1 --initiator-address=192.168.30.0/24 //只允许30网段的访问

再查看一下信息后方会多出下面的信息啦

clip_image004

当然上述的配置可以直接写在配置文档中,以便以后使用

在/etc/tgt/targets.conf中添加下面内容就是了

<target iqn.2013-06.com.back:disk>

List of files to export as LUNs

backing-store /dev/sdb1

# Authentication :

# if no "incominguser" is specified, it is not used

#incominguser backup secretpass12

# Access control :

# defaults to ALL if no "initiator-address" is specified

initiator-address 192.168.30.0/24

</target>

Step 4. 基于CHAP的登陆认证(双向认证)

依然修改/etc/tgt/targets.conf,找到# Authentication :添加下面的两行

incominguser web1totarget 123456 //web1登陆的用户名和密码

incominguser web2totarget 123456 //web2登陆的用户名和密码

outgoinguser targettoweb 654321 //target向web服务器进行认证

再次查询一下target资源状态

clip_image006

 

前端服务器配置

拿web1为例

Step 1. 安装软件包并启动服务

# yum install iscsi-initiator-utils

启动服务

# service iscsi start

Step 2. 初始化发起端名称以及CHAP认证配置

# vim /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.2013-06.com.web1

chap认证配置(双向)

# vim /etc/iscsi/iscsid.conf

node.session.auth.authmethod = CHAP

node.session.auth.username = web1totarget

node.session.auth.password = 123456

node.session.auth.username_in = targettoweb

node.session.auth.password_in = 654321

Step 3. 发起连接

# iscsiadm --mode discovery --type sendtargets --portal 192.168.30.3

Step 4. 登陆

# iscsiadm --mode node --targetname iqn.2013-06.com.back:disk --portal 192.168.30.3 --login

Logging in to [iface: default, target: iqn.2013-06.com.back:disk, portal: 192.168.30.3,3260]

Login to [iface: default, target: iqn.2013-06.com.back:disk, portal: 192.168.30.3,3260]: successful

此时如果在后端存储查看信息的话会看到

# tgtadm --lld iscsi --op show --mode=target

Target 1: iqn.2013-06.com.back:disk

System information:

Driver: iscsi

State: ready

I_T nexus information:

I_T nexus: 1

Initiator: iqn.2013-06.com.web2

Connection: 0

IP Address: 192.168.30.2

I_T nexus: 2

Initiator: iqn.2013-06.com.web1

Connection: 0

IP Address: 192.168.30.1

Step 5.前端服务器查看磁盘列表

读者会发现多了一块磁盘啦

clip_image008

6.进行相关的格式化分区挂载(用的ext3文件系统)

切换到挂载目录下进行文件操作

# mount /dev/sdb1 /mnt/back/

# cd /mnt/back/

# touch f1

# ll

总计 16

-rw-r--r-- 1 root root 0 06-07 21:39 f1

drwx------ 2 root root 16384 06-07 21:37 lost+found

但是这种方式是有问题的,ext3文件系统没有锁机制和推送机制,意思就是如果两个web站点同时建立的新文件没法相互看见,为了解决这个问题,那就要使用新的文件系统啦,小编这里就用oracle的文件系统OCFS2来实现啦。

7.OCFS2文件系统的实现

软件需求:

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

这里小编还是在web1的服务器上做配置为例

Step 1:安装软件包:

# rpm -ivh ocfs2* //web2的服务器上也需要安装

Step 2:修改hosts文件和hostname

# vim /etc/hosts

192.168.30.1 reserver1.com

192.168.30.2 reserver2.com

# vim /etc/sysconfig/network

HOSTNAME=reserver1.com //web2的主机名就是reserver2.com啦

两个web服务器的hosts文件是一致的,这里可以用scp将web1的hosts文件传递给web2

# scp /etc/hosts 192.168.30.2:/etc/

Step 3:配置群集节点

# o2cb_ctl -C -n ocfs2 -t cluster –i //创建一个名为ocfs2的群集

# o2cb_ctl -C -n reserver1.com -t node -a number=0 -a ip_address=192.168.30.1 -a ip_port=7777 -a cluster=ocfs2 //在群集中加入节点(web1)

# o2cb_ctl -C -n reserver2.com -t node -a number=1 -a ip_address=192.168.30.2 -a ip_port=7777 -a cluster=ocfs2 //在群集中加入节点(web2)

这样一来就会在/etc/ocfs2/的目录下产生群集配置文件cluster.conf ,同样小编用scp传输过去

# scp /etc/ocfs2/cluster.conf 192.168.30.2:/etc/ocfs2/ //注意web2的/etc/ocfs2目录要事先创建

Step 4:启动群集服务

这里记着两边服务器都要启动

# service o2cb enable //确认配置是否有效

Writing O2CB configuration: OK

Loading filesystem "configfs": OK

Mounting configfs filesystem at /sys/kernel/config: OK

Loading filesystem "ocfs2_dlmfs": OK

Mounting ocfs2_dlmfs filesystem at /dlm: OK

Starting O2CB cluster ocfs2: OK

# service o2cb start //启动服务

Cluster ocfs2 already online

# service o2cb status //查看服务状态(web1的)

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

Step 5:格式化文件系统并挂载

先格式化文件系统,这里的-N参数指明的是最大的链接节点数

# mkfs -t ocfs2 -N 2 /dev/sdb1 //这里只需要在一个服务器上做就是了

挂载

# mount /dev/sdb1 /mnt/back/ //挂载的工作两边服务器都要做

查看一下两边的群集状态

# service o2cb status //web1的状态

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: Active //激活状态

# service o2cb status //web2的状态

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: Active //激活状态

Step 6:检查是否可推送和锁机制

在web1服务器上创建一个文件看看能不能在web2上看到

# cd /mnt/back/

# touch web1

在web2上查询

clip_image010

先在web1上编辑文件web1,同时在web2上也编辑

[root@reserver1 back]# vim web1

[root@reserver2 back]# vim web1

clip_image012

好啦,到此为止小编我要将的东东就完成啦,读者你要是感觉有用的话就自己动手做做吧。。。。。。。




本文转自 chenming421  51CTO博客,原文链接:http://blog.51cto.com/wnqcmq/1219054

相关文章
|
9月前
|
存储 机器学习/深度学习 人工智能
虚拟化技术-什么是SAN存储?
虚拟化技术-什么是SAN存储?
563 0