前言
环境:centos7.9
什么是存储storage
简单来说,存储就是存放数据的介质。我们平时最常见的存储就是U盘、移动硬盘、笔记本使用的机械或固态硬盘等等。在服务器领域,为了数据的安全性,业务数据一般要与系统分开而且重要的业务数据一般是通过某种共享技术(nsf)挂载到远程存储上的,这样即是为了安全,也是为了高可用性。比如:音视频网站,存放音视频的目录一般不能放在根分区下,以防系统挂掉的时候,需要重新系统时,音视频数据还在,同时,由于音视频数据量太大,不可能说把音视频的数据放在本地服务器的磁盘空间上,因为本地服务器的能插硬盘的槽总是有限的,这时我们就引入一个远程存储的概念,即把音视频存放到远程存储上去。
本篇我们就来介绍远程存储技术,那么,存储长啥样呢,在服务器领域,我们一般使用的存储柜。如下图所示:
简单的而言,就是柜子,里面插了好多硬盘,组成了很大的存储空间。
Linux存储五层
存储的分类
存储分类 | 描述 |
---|---|
DAS直连式存储(direct assess/attach storage) | 如:机箱里的disk,或通过接口直连到系统总线上的disk(如U盘,移动硬盘) |
NAS网络附加存储(network attched storage) | 通过交换机,路由器连接起来,共享的是目录,如:nfs、Samba、ftp |
SAN存储区域网络(storage area network) | 通过交换机,路由器连接起来的高速存储网络,共享的是块设备,如:sdb、dbc |
DAS:直接连接系统,不受网速限制,速度快,扩容有上限;
NAS和SAN:通过网络设备连接的远程存储,速度受网络影响,但扩容方便,几乎无上限。
备注:NAS共享的是目录,应用服务器直接mount挂载就可以使用;SAN共享的快设备,应用服务器挂载之后还需要分区、格式化之后才能使用。
存储类型的分类
存储类型的分类 | 描述 |
---|---|
文件存储 | NAS都属于这一种,简单来说就是mount后直接使用 |
快存储 | SAN都属于这一类,简单来说就是类似于/dev/sdb这种,要分区、格式化后才能使用 |
对象存储 | 通俗来讲,就是存储是什么形式,怎么做的都不需要关注,使用的人只需要直接使用程序接口去访问,进行get下载与put上传即可 |
文件存储:类似于一个大目录,多个客户端都可以挂载过来使用,优点是利于数据共享,即多个客户端挂载之后数据是共享的,缺点是速度较慢;
快存储:类似于一个block块设备,客户端可以分区、格式化,挂载并使用,和使用本地一个硬盘一样,优点就是和本地硬盘一样直接使用,速度较快,缺点是数据不共享,即各个客户端自定义自己的块设备分区、格式化,挂载并使用;
对象储存:一个对象我们可以看成一个文件,综合了文件存储和块存储的优点,优点是速度快,数据共享,使用url就能访问,缺点是成本高,不兼容现有的模式。
模拟SAN存储服务器
DAS直连式存储太简单了,我们的U盘就是,这种我们不讲, NAS网络附加存储我们其实也讲过,nfs就能实现,而nfs的配置可以查看之前我写的文章,本篇我们主要讲SAN存储区域网络,即块存储,在此,我们模拟IP-SAN之iscsi实现。
准备工作
先准备两台虚拟机:存储服务器A、应用服务器B;同时存储服务器A新加1块磁盘,如下所示,为了简单,在存储服务器A我已经加了1块1G的硬盘:
[root@storage ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
sda1 8:1 0 300M 0 part /boot
sda2 8:2 0 39.7G 0 part
centos-root 253:0 0 35.7G 0 lvm /
centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk #这块硬盘就是新加了,为了方面模拟
sr0 11:0 1 1024M 0 rom
[root@storage ~]#
存储服务器A-安装软件、共享硬盘
在存储服务器A中安装epel源:
[root@storage ~]# yum install epel-release -y #安装epel源
[root@storage ~]# yum install scsi-target-utils -y #安装scsi-target-utils
[root@storage ~]# rpm -qc scsi-target-utils #查看scsi-target-utils有哪些配置文件
/etc/sysconfig/tgtd
/etc/tgt/conf.d/sample.conf
/etc/tgt/targets.conf
/etc/tgt/tgtd.conf
[root@storage ~]# vim /etc/tgt/targets.conf #编辑配置文件
[root@storage ~]# vim /etc/tgt/targets.conf
# Set iSNS parameters, if needed
## backing-store /dev/LVM/somedevice
#<target iqn.2008-09.com.example:server.target7>
# This is a sample config file for tgt-admin.
#
# The "#" symbol disables the processing of a line.
# Set the driver. If not specified, defaults to "iscsi".
default-driver iscsi
<target storage:data> #这段target就是新加的,storage:data共享名,可以自定义
backing-store /dev/sdb #/dev/sdb就是共享的快设备,既可以是整块硬盘,也可以是一个分区或者dd的一个文件等
allow-in-use yes
</target>
# Set iSNS parameters, if needed
#iSNSServerIP 192.168.111.222
#iSNSServerPort 3205
#iSNSAccessControl On
#iSNS On
# Continue if tgtadm exits with non-zero code (equivalent of
# --ignore-errors command line option)
#ignore-errors yes
[root@storage ~]# systemctl start tgtd #启动tgtd服务
[root@storage ~]# systemctl enable tgtd #设置开机自启
[root@Oracle11g ~]# lsof -i:3260 #tgtd服务的端口是3260
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tgtd 2549 root 6u IPv4 36160 0t0 TCP *:iscsi-target (LISTEN)
tgtd 2549 root 7u IPv6 36161 0t0 TCP *:iscsi-target (LISTEN)
[root@Oracle11g ~]#
应用服务器B-安装软件、挂载
[root@nginx /]# yum install iscsi-initiator-utils -y #安装iscsi-initiator-utils
[root@nginx /]# iscsiadm -m discovery -t sendtargets -p 192.168.118.131 #发现存储端共享的设备,会把相关信息保存
192.168.118.131:3260,1 storage:data #发现存储端共享了一个名为storage:data快设备
[root@nginx /]# lsblk #查看硬盘,这是还没有存储端的硬盘挂载过来
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 9G 0 part
centos-root 253:0 0 8G 0 lvm /
centos-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
[root@nginx /]# iscsiadm -m node -l #登陆,因为上一步discovery了存储设备并保存了相关信息
Logging in to [iface: default, target: storage:data, portal: 192.168.118.131,3260] (multiple)
Login to [iface: default, target: storage:data, portal: 192.168.118.131,3260] successful.
[root@nginx /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 9G 0 part
centos-root 253:0 0 8G 0 lvm /
centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk #登陆之后,存储端的共享硬盘就挂载过来了
sr0 11:0 1 1024M 0 rom
[root@nginx /]#
[root@nginx /]# iscsiadm -m node -u #取消登陆,取消链接
Logging out of session [sid: 1, target: storage:data, portal: 192.168.118.131,3260]
Logout of [sid: 1, target: storage:data, portal: 192.168.118.131,3260] successful.
[root@nginx /]# lsblk #共享硬盘已经取消了,看不到了
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 9G 0 part
centos-root 253:0 0 8G 0 lvm /
centos-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
[root@nginx /]# iscsiadm -m node -l #重新登陆,下面我们就可以自由对共享过来的硬盘进行磁盘分区、格式化等操作了
[root@nginx /]# fdisk /dev/sdb
fdisk: cannot open /dev/sdb: No such file or directory
[root@nginx /]# iscsiadm -m node -l
Logging in to [iface: default, target: storage:data, portal: 192.168.118.131,3260] (multiple)
Login to [iface: default, target: storage:data, portal: 192.168.118.131,3260] successful.
[root@nginx /]# fdisk /dev/sdb #分区,只分一个sdb1进行测试就可以
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x3e423aab.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@nginx /]# mkfs.xfs /dev/sdb1 #格式化分区为xfs文件系统
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=65472 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=261888, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@nginx /]# mkdir /data #创建挂载点
[root@nginx /]# mount /dev/sdb1 /data #把磁盘分区挂载到挂载点
[root@nginx /]# df -h #查看所有磁盘
Filesystem Size Used Avail Use% Mounted on
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.7M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 8.0G 5.5G 2.6G 69% /
/dev/sda1 1014M 239M 776M 24% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb1 1020M 33M 988M 4% /data #sdb1已经正常挂载到了?data目录,可以正常存储文件了
[root@nginx /]#
问?
是否可以两个客户端同时挂载一个存储的块设备?答案:可以,但不会建议这么做,因为我们说过SAN不共享数据。
假设张三和李四都挂载了sdb,张三想对sdb分3个分区,李四想对sdb分5个分区,那这种情况属于什么?肯定冲突了。即使李四不分区了,那张三分区格式化了sdb然后写入了文件,李四也看不到,这是因为我们说过SAN不共享数据。所有,对于块存储,我们建议一个块只给一个客户端使用,不要给多个客户端使用。
总结–SAN存储配置
存储服务器配置如下:
[root@storage ~]# yum install epel-release -y #安装epel源
[root@storage ~]# yum install scsi-target-utils -y #安装scsi-target-utils
[root@storage ~]# vim /etc/tgt/targets.conf #编辑配置文件
[root@storage ~]# vim /etc/tgt/targets.conf
# Set iSNS parameters, if needed
## backing-store /dev/LVM/somedevice
#<target iqn.2008-09.com.example:server.target7>
# This is a sample config file for tgt-admin.
#
# The "#" symbol disables the processing of a line.
# Set the driver. If not specified, defaults to "iscsi".
default-driver iscsi
<target storage:data> #这段target就是新加的,storage:data共享名,可以自定义
backing-store /dev/sdb #/dev/sdb就是共享的快设备,既可以是整块硬盘,也可以是一个分区或者dd的一个文件等
allow-in-use yes
</target>
# Set iSNS parameters, if needed
#iSNSServerIP 192.168.111.222
#iSNSServerPort 3205
#iSNSAccessControl On
#iSNS On
# Continue if tgtadm exits with non-zero code (equivalent of
# --ignore-errors command line option)
#ignore-errors yes
[root@storage ~]# systemctl start tgtd #启动tgtd服务
[root@storage ~]# systemctl enable tgtd #设置开机自启
[root@Oracle11g ~]# lsof -i:3260 #tgtd服务的端口是3260
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tgtd 2549 root 6u IPv4 36160 0t0 TCP *:iscsi-target (LISTEN)
tgtd 2549 root 7u IPv6 36161 0t0 TCP *:iscsi-target (LISTEN)
[root@Oracle11g ~]#
客户端挂载配置如下:
[root@nginx /]# yum install iscsi-initiator-utils -y #安装iscsi-initiator-utils
[root@nginx /]# iscsiadm -m discovery -t sendtargets -p 192.168.118.131 #发现存储端共享的设备,会把相关信息保存
192.168.118.131:3260,1 storage:data #发现存储端共享了一个名为storage:data快设备
[root@nginx /]# iscsiadm -m node -l #登陆,因为上一步discovery了存储设备并保存了相关信息
Logging in to [iface: default, target: storage:data, portal: 192.168.118.131,3260] (multiple)
Login to [iface: default, target: storage:data, portal: 192.168.118.131,3260] successful.
[root@nginx /]# lsblk #查看设备
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 9G 0 part
centos-root 253:0 0 8G 0 lvm /
centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk #登陆之后,存储端的共享硬盘就挂载过来了,可以自由分区格式化然后使用了
sr0 11:0 1 1024M 0 rom
[root@nginx /]# fdisk /dev/sdb #开始分区
fdisk: cannot open /dev/sdb: No such file or directory
[root@nginx /]# iscsiadm -m node -l
Logging in to [iface: default, target: storage:data, portal: 192.168.118.131,3260] (multiple)
Login to [iface: default, target: storage:data, portal: 192.168.118.131,3260] successful.
[root@nginx /]# fdisk /dev/sdb #分区,只分一个sdb1进行测试就可以
[root@nginx /]# mkfs.xfs /dev/sdb1 #格式化分区为xfs文件系统
[root@nginx /]# mkdir /data #创建挂载点
[root@nginx /]# mount /dev/sdb1 /data #把磁盘分区挂载到挂载点
[root@nginx /]# df -h #查看所有磁盘分区
NAS是远程通过网络共享目录;
SAN是远程通过网络共享块设备;