网络存储ISCSI实战

news2024/11/19 7:28:19

一、网络存储

目前应用最为广泛的两种数据存储设备:NAS与SAN

1、NAS

NAS的全称是Network-attached storage,即网络附加存储,并不需要单独的网络用于存储IO,更适用于中小型的存储解决方案

NAS设备通常是一个完整的服务器架构,包含了CPU、内存、网卡、磁盘,其上安装通用操作系统或者精简的专用操作系统,并通过扩展接口连接了大量存储阵列。NAS的访问形式是通过TCP/IP网络进行远程访问,NAS自身的操作系统上运行着相应的网络服务程序,比如Windows文件共享服务、Linux Samba文件共享服务、Linux/Unix的NFS文件系统等。需要访问NAS的设备,通过TCP/IP网络,在远程使用客户端软件来访问。Windows文件共享是操作系统自身已经包含,Linux则需要安装Samba客户端或者NFS客户端来访问NAS设备。

NAS主要用途是大容量存储,并带有一定的冗余功能,侧重点在于容量和相对较低的实施成本,对于吞吐量、并发数、冗余性能等通常要求不高。此外,由于NAS的访问形式是文件共享式的访问,操作系统只能将NAS设备挂载成一个网络共享设备,而一些操作系统原生特性是无法在网络共享文件系统上实现的,例如磁盘配额、格式化磁盘、组件磁盘阵列等都不能在远程上实现,这也给NAS的应用造成了一定的局限性。

在远程Windows服务器上,NAS被作为网络驱动器被映射后,通过磁盘管理器功能是无法获知NAS的任何信息的。对NAS系统的底层操作如磁盘配额、组建阵列、格式化等都需要在NAS服务器本地来实施,不能在远程访问的客户端上进行。

2、SAN

SAN的全称是Storage Area Network,需要单独一个网络用于网络存储,更适用于大型的存储解决方案。

对比于NAS,SAN存储更像是一个外置磁盘阵列,SAN设备本身通常只包含阵列、控制器、接口卡,不包含CPU、内存、通用操作系统。SAN通过标准外置SCSI接口或者光纤SCSI接口连接到服务器上。因此,使用SAN的时候,相应的服务器必须带有外置SCSI、光纤接口等扩展卡。连接到SAN以后,在操作系统上,可以将SAN提供的磁盘阵列直接读取为本地磁盘驱动器,操作系统不关心这些硬盘是安装在服务器内部的,还是装载SAN设备内的。

SAN的侧重点在于高性能、高可靠性,SAN通常容量不是很大,但是提供了光纤、SCSI接口用于同时连接到多个服务器上,SAN所提供的阵列带有RAID5以上的高级冗余功能,确保当部分磁盘故障时,系统性能下降的幅度尽可能的小。SAN的缺点是实施成本比较高,如果采用外置SCSI接口,则需要速度匹配的高性能SCSI接口卡。如果采用光纤接口,还需要光纤交换机等设备。

在客户端上使用SAN设备,无论其接口形式是何种,就像使用本地磁盘一样,从磁盘管理器中可以完全看到服务器挂载的SAN设备。

3、分布式存储概念(RHCA-Ceph)

分布式存储是为了解决传统存储解决方案价格昂贵,难以横向扩容的问题。

我这里面说的扩容,并不是逻辑卷的扩容,而是存储pool resource的扩容。随着应用数据不断的增加,你所需的存储容量变得非常庞大,受硬件内部空间限制,无法实现scale out扩容(纵向扩容),所谓纵向扩容就是不断在的存储节点上加硬盘。我们希望能实现scale in扩容(横向扩容),所谓横向扩容,表示的意思是增加存储节点来增加存储容量。(存储集群)

存储集群的解决方案,厂商的商用方案价格过于昂贵,一般单位玩儿不起。开源的分布式存储解决方案最大的好处就是便宜。

分布式存储解决方案早期比较知名的就是glusterfs,现在就是ceph。

百度云网盘其实是应用层的一种存储方式(SaaS)。

二、ISCSI网络存储的简介

1、ISCSI 简介

SCSI(small computer system interface)小型计算机系统接口,SCSI以目前的定义来说就是一个硬盘的接口标准,你硬盘通过SCSI口插上,就可以使用SCSI的协议来对磁盘进行读写。

iSCSI(Internet SCSI),iSCSI可以让SCSI接口忽略地域限制,通过网络就能操控磁盘的读写。也就是说以前你在一个电脑上使用一块磁盘,需要将磁盘插到电脑上的磁盘接口,但是有了iSCSI之后你只要对某块磁盘的网络可达,你就可以使用这块磁盘。"

从前面的介绍我们可以看出,NAS和SAN分别有着不同的侧重点。SAN虽然有着很好的性能,但是受限于外置SCSI、光纤通道等连接设备,部署成本较高,且外置SCSI铜缆受到线缆长度的限制,不能远距离部署使用。

为了改善SAN的这一缺点,iSCSI协议和规范在2003年被正式确定下来。

iSCSI用于将SCSI数据块映射为以太网数据包。从根本上说,它是一种基于IP Storage理论的新型存储技术,该技术将存储行业广泛应用的SCSI接口技术与IP网络技术相结合,可以在IP网络上构建SAN。

简单地说,iSCSI就是基于以太网接口的外置SCSI存储设备。

对于中小企业的存储网络来说,iSCSI是个非常好的选择。首先,从技术实现上来讲,iSCSI是基于IP协议的技术标准,它允许网络在TCP/IP协议上传输SCSI命令,实现SCSI和TCP/IP协议的连接,这样用户就可以通过TCP/IP网络来构建SAN,只需要不多的投资,就可以方便、快捷地对信息和数据进行交互式传输和管理。但是,在iSCSI出现之前,构建SAN的唯一技术是利用光纤通道,这要花费很大的建设成本,一般中小企业无法承担。其次,iSCSI技术解决了传输效率、存储容量、兼容性、开放性、安全性等方面的诸多问题,在使用性能上绝对不输给商业的存储系统或光纤存储网络。

iSCSI的优势主要表现为:首先,iSCSI沿用TCP/IP协议,而TCP/IP是在网络方面最通用、最成熟的协议,且IP网络的基础建设非常完善,同时,SCSI技术是被磁盘和磁带等设备广泛采用的存储标准,这两点使iSCSI的建设费用和维护成本非常低廉;其次,iSCSI支持一般的以太网交换机而不是特殊的光纤通道交换机,从而减少了异构网络带来的麻烦;还有,iSCSI是通过IP封包传输存储命令,因此可以在整个Internet上传输数据,没有距离的限制。

2、​FC SAN与IP SAN

在iSCSI技术出现后,通过IP技术搭建的存储网络也应运而生,SAN技术也就出现了两种不同的实现方式,即FC SAN与IP SAN。简单来说,以光纤搭建的存储网络就是FC SAN.以iSCSI技术搭建的存储网络叫做IP SAN。

作为SAN的两种实现方式,FC SAN与IP SAN各有优劣,下面从几个方面分别阐述。

在数据传输方式上,FC SAN与IP SAN都采用块协议方式来完成。这是它们的相同点。

在传输速度上,就目前的传输速率而言,FC SAN(2Gbit/s)最快,iSCSI(lGbit/s)次之

在传输距离上,FC SAN理论上可以达到100公里,而事实上,传输超过50公里后,就会出现瓶颈。而通过IP网络的iSCSI技术在理论上没有距离的限制,即iSCSI可以进行没有距离限制的数据传输。

管理及维护成本上,架设FC SAN网络需要投入很多硬件成本,并且需要特定的工具软件进行操作管理,而IP SAN构建成本低廉,由于iSCSI是通过IP网络来传输数据和分配存储资源的,因此只要在现有的网络上进行管理和使用即可,这样就可以省下大笔的管理费用及培训成本。

其实IP SAN也面临着一些不可回避的困扰:首先,基于IP SAN的网络存储还没有得到用户的充分肯定:其次,IP SAN存储需要专门的驱动和设备,幸运的是,一些传统的光纤适配器厂商都发布了iSCSI HBA设备,同时Inter也推出了专用的IP存储适配器,而Microsoft、HP、Novell、SUN、AIX、Linux也具有iSCSI IniTIator软件,并且免费供用户使

用:还有,在安全方面,IP SAN虽然有一套规范的安全机制,但是尚未得到用户的认可。

这些问题和困扰虽然会妨碍iSCSI的发展,但是相信在未来的网络存储世界里,IP SAN绝对金拥有一席之地。

3、ISCSI 组成

一个简单的iSCSI系统大致由以下部分组成:iSCSI IniTIator或者iSCSI HBA iSCSI Target 以太网交换机 一台或者多台服务器。

一个完整的iSCSI系统的拓扑结构如图所示:

ISCSI是服务器端和客户端C/S机构,服务器端叫做iSCSI-target,在实际应用中就是支持iSCSI协议的SAN设备;客户端叫做iSCSI-initiator,在实际应用中就是要访问SAN的服务器。

在服务器端和客户端中间,数据的传输通道借助于TCP/IP协议完成,Storage Router可以是以太网交换机或者路由器;服务器端和客户端都有自己的IP地址,数据传输可通过交换机、路由器进行中继,进而达到在很远的距离上,各种客户端设备依然可以连接到SAN并进行工作。

iSCSI存储设备可以是iSCSI磁盘阵列,也可以是具有存储功能的PC服务器。

在基于外置SCSI铜缆和光纤SCSI通道的SAN上,SAN连接到的服务器是不需要进行任何特殊配置的,操作系统会将连接上来的SCSI设备视为一个物理磁盘设备。而iSCSI是通过以太网接口连接的,标准的操作系统仅仅将SAN视为一个网络节点,可以通过TCP/IP访问,但不能将其作为物理磁盘设备来使用。这就是为什么需要iSCSI-initiator客户端软件的原因。

为了进一步降低部署成本,可以在Windows服务器上和Linux服务器上安装iSCSI-target服务器端软件,让现有的服务器变成支持iSCSI协议的SAN存储设备。

存储资源所在的iSCSI服务器被称为“target”。iSCSI target通常是一个硬盘存储设备。当前大部分的主流操作系统都提供了配合iSCSI target使用的客户端软件initiator,iSCSI initiator(client) initiator就是iSCSI传输的服务端。典型的initiator都有共同的目的,就是作为一个SCSI总线的适配器,代替物理上的SCSI设备(类似硬盘或者磁带)。iSCSI initiator通过IP网络传输SCSI命令。

1. iSCSI Initiator

​iSCSI Initiator是一个安装在计算机上的软件或硬件设备,它负责与iSCSI存储设备进行通信。

iSCSI服务器与iSCSI存储设备之间的连接方式有两种:

第二种是硬件iSCSI HBA (Host Bus Adapter)卡方式,即iSCSI Initiator硬件。这种方式需要先购买iSCSI HBA卡,然后将其安装在iSCSI服务器上,从而实现iSCSI服务器与交换机之间、iSCSI服务器与存储设备之间的高效数据传输。与第一种方式相比,硬件iSCSIHBA卡方式不需要消耗iSCSI服务器的CPU资源,同时硬件设备是专用的,所以基于硬件的iSCSI Initiator可以提供更好的数据传输和存储性能。但是,iSCSI HBA卡的价格比较昂贵,因此用户要在性能和成本之间进行权衡。

iSCSI Initiator软件一般都是免费的,Centos和RHEL对iSCSI Initiator的支持都非常不错,现在的Linux发行版本都默认自带了iSCSI Initiator。

2. iSCSI Target

一个可以用于存储数据的iSCSI磁盘阵列或者具有iSCSI功能的设备都可以被称为“iSCSI Target”,因为大多数操作系统都可以利用一些软件将系统转变为一个“iSCSI Target”。本章重点讲述如何构建一个PC构架的iSCSI存储系统。所谓PC构架就是选择一个普通的、性能优良的、可支持多块磁盘的PC(一般为PC服务器),再选择一款相对成熟稳定的iSCSI Target软件,将iSCSI Target软件安装在PC服务器上,使普通的PC服务器转变成一台iSCSI存储设备,并通过PC服务器的以太网卡对外提供iSCSI数据传输服务。

目前大多数iSCSI Target软件都是收费的,例如DataCorc Software的SANmelody,FalconStor Software的iSCSI Server for Windows等,这些都是Windows平台支持的。不过,也有一些Linux平台的开源iSCSI Target软件,例如iSCSI Enterprise Target,后面的内容会重点介绍这个软件。

利用iSCSI Target软件,可以将服务器的存储空间分配给客户机使用,客户机可以像使用本地硬盘一样使用iSCSI磁盘,包括对其进行分区、格式化及读写等。而且每个客户端都可以向iSCSI磁盘写数据,互不干扰,并且不会破坏存储到服务器中的数据。同时,iSCSITarget软件对用户权限控制非常灵活,支持配置文件。

我们知道,iSCSI是使用TCP/IP协议进行通信的,因此,将iSCSI两端连接起来,仅仅需要一个以太网络就可以了。由此可知,iSCSI的存储性能和这个以太网络有直接关系,所以最好在iSCSI网络中使用千兆以太网交换机,劣质的网络设备会严重影响存储系统的性能,也就是说,要为每个服务器配备高质量的千兆以太网交换机,并提供两个连接。对于iSCSI Target,应该为每个独立阵列中的两个独立端口配备交换机,最后将交换机连接起来,采用这种配置方式,即使两个交换机中的一个出现了故障,整个iSCSI存储系统仍然能够正常工作,这保证了存储系统的不间断运行。

4、iSCSI的工作原理

要理解iSCSI的工作原理,就必须知道iSCSI的层次结构。

根据OSI模型,iSCSI的协议自顶向下一共可以分为三层,如图所示。

下面对每个分层进行简单介绍:

SCSI层:根据客户端发出的请求建立SCSI CDB(命令描述块),并传给iSCSI层。同时接收来自iSCSI层的CDB,并向应用返回数据。

iSCSI层:对SCSI CDB进行封装,以便能够在基于TCP/IP协议的网络上进行传输,完成SCSI到TCP/IP的协议映射。这一层是iSCSI协议的核心层。本章也主要针对这一层的配置和管理进行介绍。

TCP/IP层:对IP报文进行路由和转发,并且提供端到端的透明可靠的传输。

iSCSI协议定义了在TCP/IP网络发送、接收数据块存储数据的规则和方式。先发送端将SCSI命令和数据封装到TCP/IP包中,然后通过IP网络转发,接收端收到TCP/IP包之后,将其还原为SCSI命令和数据并执行,执行完成后,将返回的SCSI命令和数据再封装到TCP/IP包中,之后再传回发送端。这样就完成了数据传输的整个过程。

iSCSI的整个数据传输过程在用户看来是完全透明的,用户使用远端的存储设备就像使用本地的硬盘设备一样。不过,这只是理论状态,实际上iSCSI的数据传输速率并不能完全达到本地硬盘的数据传输速率,但差别并不明显。而且这种网络存储模式还有一个优点是安全性高,这对于数据集中存储的iSCSI来说显然非常重要。

三、ISCSI安装与配置

1、安装iSCSI target软件

安装iscsitarget软件是在Target主机上进行的,这里我们选择的target软件是iscsitarget,大家可以从 iSCSI Enterprise Target下载相应的版本,这里下载的是iscsitarget-1.4.20.1.tar.gz,接着开始进行编译安装:

iscsi]#tar -xzvf iscsitarget-1.4.20.1.tar.gz
iscsi]#cd iscsitarget-1.4.20.1
iscsitarget-1.4.20.1]#make
iscsitarget-1.4.20.1]#make install

 Iscsitarget安装完毕后,会创建/etc/iet/目录,此目录下有Iscsitarget的相关配置文件,接着就可以启动Iscsitarget服务了,启动或关闭Iscsitarget服务的命令如下:

iscsi]# service iscsi-target       
Usage: /etc/init.d/iscsi-target {start|stop|restart|condrestart|status}

如果要让iscsi-target服务开机自动运行,需执行如下操作:

iscsi]#chkconfig --level 35 iscsi-target on

到此为止,iscsitarget安装完成。

2、配置一个简单的iSCSI target

iSCSI Enterprise Target的主配置文件为/etc/iet/ietd.conf,此文件中的选项默认全部被注释掉了,有需要用到这些选项时,再将注释去掉即可。

打开ietd.conf文件,首先找到类似如下行:

#Target iqn.2001-04.com.example:storage.disk2.sys1.xyz

此选项表示该iSCSI Target的命名,先将前面的“#”号去掉, Target的命名在同一子网内应该是唯一的,标准命名方式为:

iqn.yyyy-mm.<reversed domain name>[:identifier]

其中:

  • iqn:表示“iSCSI Qualified Name”,简称iqn。
  • yyyy-mm:表示年份-月份。这里是2001-04。
  • reversed domain name:表示倒过来的域名,这里是com.example。
  • identifier:表示识别代码,这里是storage.disk2.sys1.xyz。

接下来,就是要设定 LUN(Logical Unit Number),找到类似如下行:

#Lun 0 Path=/dev/sdb,Type=fileio,ScsiId=xyz,ScsiSN=xyz

将 前面的“#”号去掉,“Lun 0 Path=/dev/sdb”表示块设备号为0,映射的磁盘为/dev/sdb,“Type”值fileio是默认的,可以用于磁盘、file和LVM, 这里设定的是“fileio”,主要用来对一个磁盘进行存储共享。读者可以根据自己情况将Path改为需要共享的存储分区的设备标识。这里假定共享的设备 标识为/dev/sdb。

至此,一个简单的iSCSI Target已经配置完毕了,最后启动iscsi-target服务:

​iscsi]# service iscsi-target start

四、Windows上配置ISCSI

微软对iSCSI Initiator的支持相当完备,大家可以免费从微软网站获得iSCSI Initiator软件,网址是http://www.microsoft.com/WindowsServer2003/technologies/storage/iscsi/default.mspx

实例下载的版本是Initiator-2.08-build3825-x86fre.exe,接下来开始说明如何让windows连接iSCSI Target。

 安装完成iSCSI Initiator后,在桌面上会发现启动图标,启动Microsoft iSCSI Initiator后,选择第二个分页标签“Discovery”,然后在“Target Portals”部分点击“Add”按钮,跳出“Add Target Portal”窗口,如图所示:

在此窗口下填写iSCSI Target的ip地址和端口,iSCSI Target地址就是上面设定的Target主机的地址,iSCSI Target的端口默认是3260,除非有特殊设定,填写完成,点击OK按钮。

接下来,选择第三个分页标签“Targets”,如图3所示,可以看到,iSCSI Initiator已经检测到了iSCSI Target的名称,但是此时的iSCSI Target还处于“inactive”状态,点击下方“Log On”按钮,然后弹出“Log On to Target”窗口,接着按下“OK”按钮来**Target,此时iSCSI Target已经从“inactive”状态变为“Connected”状态。

如图所示:

 

 

到此为止,windows系统已经识别了iSCSI Target提供的共享磁盘分区,通过windows的磁盘管理器可以看到新增加的磁盘分区,如图所示: 

现在就可以使用windows的磁盘管理功能对这块共享磁盘进行分区、格式化以及挂载等操作了。 

五、Linux上配置ISCSI

1、安装Linux版本iSCSI Initiator

现在的主流Linux发行版本默认都自带了iSCSI Initiator,即Open-iSCSI,如果系统没有安装,只需通过光盘找到iscsi-initiator-utils- 6.2.0.871-0.16.el5.i386.rpm包,通过rpm方式安装即可,当然也可以通过yum进行自动安装,操作如下:

iscsi]#yum install iscsi*

安装完成后,会生成/etc/iscsi主程序配置目录,其它相关文件的安装位置为:

/etc/iscsi/iscsid.conf
/etc/rc.d/init.d/iscsi
/etc/rc.d/init.d/iscsid
/sbin/iscsi-iname
/sbin/iscsiadm
/sbin/iscsid
/sbin/iscsistart
/var/lib/iscsi
/var/lib/iscsi/ifaces
/var/lib/iscsi/isns
/var/lib/iscsi/nodes
/var/lib/iscsi/send_targets
/var/lib/iscsi/slp
/var/lib/iscsi/static
/var/lock/iscsi

接下来需要启动Initiator服务,操作如下:

iscsi]# service iscsi start

2、iSCSI Initiator目录功能

 /sbin/iscsiadm命令:在iSCSI Initiator安装完成后,会生成/sbin/iscsiadm命令,此命令是用来管理(更新、删除、插入、查询)iSCSI配置数据库文件的命令行 工具,用户能够用它对iSCSI nodes、sessions、connections和discovery records进行一系列的操作。

 /var/lib/iscsi/send_targets目录:在此目录下,会生成一个或多个以iSCSI存储服务器IP和端口命名的文件夹,文件名为“iSCSI Target IP,端口号”(例如“192.168.12.246,3260”)。

/var/lib/iscsi/nodes目录:在此目录下,会生成一个或多个以iSCSI存储服务器上的Target名命名的文件夹,在该文件夹下有一个文件名为“iSCSI portal IP,端口号” (例如“192.168.12.246,3260”)的配置参数文件,该文件是iSCSI initiator登录iSCSI target时要使用的参数,而这些参数的设置是从/etc/iscsi/iscsi.conf中的参数继承而来的,可以通过iscsiadm命令对某一个参数文件进行更改。

3、在linux上执行iSCSI Target发现

可以使用如下指令向 iSCSI Target 主机查询划分了哪些lun:

iscsiadm -m discovery --type sendtargets --portal IP

或者:

iscsiadm -m discovery -t sendtargets -p IP

例如:

iscsi ]# iscsiadm -m discovery -t sendtargets -p 192.168.12.246:3260                                         
192.168.12.246:3260,1 iqn.2001-04.com.example:storage.disk2.sys1.xyz

可以看出,“iqn.2001-04.com.example:storage.disk2.sys1.xyz”就是iSCSI Target的名称。由于在配置iSCSI Target时,没有做任何限制,因此所有的客户端主机都允许连接iSCSI Target共享出来的磁盘。需要说明的是:当成功执行一次Target发现后,iSCSI Initiator就会将查询纪录写到/var/lib/iscsi/send_targets对应目录下。因此,对于Target发现只需执行一次即可。

接着通过iscsiadm指令与iSCSI Target 主机建立连接,也就是登录iSCSI Target:

iscsiadm -m node -T <target-name> -p <ip-address>:<port> --login

或者:

iscsiadm -m node -T [target-name] -p [ip-address] -l

这里的“-T”后面跟target名称,“ip-address”是target主机的IP地址,“port”是target主机的端口号,默认是3260。

例如:

iscsi ]#iscsiadm -m node -T iqn.2001-04.com.example:storage.disk2.sys1.xyz -p 192.168.12.246 -l
Logging in to [iface: default, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]
Login to [iface: default, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]: successful

如果有多个Target主机时,可以通过如下命令一次登录所有的targets:

iscsi ]#iscsiadm -m node --loginall=all

这 里需要说明的是,通过执行Target发现操作,其实已经与iSCSI Target 主机建立了连接,此时如果再次执行iscsiadm命令与Target主机建立连接的话,会提示“iscsiadm: initiator reported error (15 - already exists)”错误,所以需要先断开与iSCSI Target 主机的连接,执行如下指令,断开Initiator 与iSCSI Target 主机的连接:

iscsiadm -m node -T [target-name] -p [ip-address] -u

例如:

iscsi ]#iscsiadm -m node -T iqn.2001-04.com.example:storage.disk2.sys1.xyz -p 192.168.12.246  -u
Logging out of session [sid: 2, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]
Logout of [sid: 2, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]: successful

当iSCSI Initiator与iSCSI Target连接成功后,还可以通过如下命令查看iSCSI session信息:

iscsi ]#iscsiadm -m session –i

例如:

iscsi ]#iscsiadm -m session –i
iSCSI Transport Class version 2.0-871
version 2.0-871
Target: iqn.2001-04.com.example:storage.disk2.sys1.xyz
        Current Portal: 192.168.12.246:3260,1
        Persistent Portal: 192.168.12.246:3260,1
                **********
                Interface:
                **********
                Iface Name: default
                Iface Transport: tcp
                Iface Initiatorname: iqn.1994-05.com.RedHat :fd37f211e3a
                Iface IPaddress: 192.168.12.26
                Iface HWaddress: <empty>
                Iface Netdev: <empty>
                SID: 1
                iSCSI Connection State: LOGGED IN
                iSCSI Session State: LOGGED_IN
                Internal iscsid Session State: NO CHANGE
                ************************
                Negotiated iSCSI params:
                ************************
                HeaderDigest: None
                DataDigest: None
                MaxRecvDataSegmentLength: 262144
                MaxXmitDataSegmentLength: 8192
                FirstBurstLength: 65536
                MaxBurstLength: 262144
                ImmediateData: Yes
                InitialR2T: Yes
                MaxOutstandingR2T: 1
                ************************
                Attached SCSI devices:
                ************************
                Host Number: 32 State: running
                scsi32 Channel 00 Id 0 Lun: 0
                        Attached scsi disk sdb          State: running

4、管理共享磁盘

首先通过fdisk命令查看共享过来的磁盘标识,也可以通过dmesg命令查看系统是否认到了共享的iSCSI磁盘,操作如下:

iscsi ]#fdisk -l
Disk /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 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       38913   312464250   8e  Linux LVM

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         609     4891761   83  Linux
/dev/sdb2             610        1305     5590620   83  Linux

从fdisk输出可知,iscsi共享磁盘标识为/dev/sdb,大小10.7G,下面就可以通过fdisk命令对这个磁盘进行重新分区、格式化、创建文件系统等操作了。

六、iSCSI网络存储实战

1、网络存储-基于块的网络存储技术iSCSI

iSCSI架构:

  • iSCSI Target(iSCSI Server端);
  • iSCSI Initiator(iSCSI客户端);
  • IQN(互联网完全名称标识),无论是iSCSI Target端还是iSCSI Initiator端都需要有IQN,且IQN必须局域网唯一;
  • Backstore(后端存储),后端存储在Target端的,所谓后端存储就是Target端共享给iSCSI客户端所必须的存储设备;
  • Lun(Logical Unit Number逻辑单元号),Lun是将BackStore逻辑的编成号码来被iSCSI客户端所识别的;
  • ACL(访问控制列表),ACL是Target端用于控制那些iSCSI客户端可以访问Lun的组件;
  • Portal(访问接口),Portal是Target端曝露自己哪些地址哪些端口可以被iSCSI客户端所访问的;

2、iSCSI 实战

拓扑结构:

1. 需求

iscsi-server和centos-stream1的linux操作系统版本为CentOS-Stream;

ubuntu20的操作系统版本为ubuntu20.04;

Windows10的操作系统版本为Windows10企业版;

esxi的操作系统版本为esxi6.7;

iscsi-server除了操作系统所在的硬盘还有一块500G的磁盘vdb:

  1. 将iscsi-server的vdb划成4个逻辑卷,4个逻辑卷的名称分别为ubuntu,stream,windows,esxi,每个大小100G;
  2. 在iscsi-server上安装targetcli软件搭建iscsi服务器;
  3. 在iscsi-server上创建4个IQN,分别使用ubuntu,stream,windows,esxi这4个逻辑卷作为backstore共享给ubuntu20.04,centos-stream,widows10,esxi6.7; 

2. iscsi-server上基础配置和软件安装

[root@localhost ~]# hostnamectl set-hostname iscsi-server
[root@iscsi-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/'
/etc/selinux/config
[root@iscsi-server ~]# setenforce 0
[root@iscsi-server ~]# systemctl disable firewalld --now
[root@iscsi-server ~]# yum -y install targetcli
#启动target服务,代表着启动iscsi-server
[root@iscsi-server ~]# systemctl enable target --now

3. iscsi-server上划逻辑卷

[root@iscsi-server ~]# pvcreate /dev/vdb
    Physical volume "/dev/vdb" successfully created.
[root@iscsi-server ~]# vgcreate iscsi /dev/vdb
    Volume group "iscsi" successfully created
[root@iscsi-server ~]# lvcreate -n ubuntu -L 100G iscsi
    Logical volume "ubuntu" created.
[root@iscsi-server ~]# lvcreate -n stream -L 100G iscsi
    Logical volume "stream" created.
[root@iscsi-server ~]# lvcreate -n windows -L 100G iscsi
    Logical volume "windows" created.
[root@iscsi-server ~]# lvcreate -n esxi -L 100G iscsi
    Logical volume "esxi" created.
[root@iscsi-server ~]# lvs
LV   VG  Attr     LSize     Pool Origin Data%     Meta%     Move Log Cpy%Sync Convert
home cs -wi-a----- 421.09g
root cs -wi-ao---- 70.00g
swap cs -wi-ao---- 7.90g
esxi iscsi -wi-a----- 100.00g
stream iscsi -wi-a----- 100.00g
ubuntu iscsi -wi-a----- 100.00g
windows iscsi -wi-a----- 100.00g

4. target端创建backstore

[root@iscsi-server ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/>

5. 创建IQN

IQN的格式是IQN.YYYY-MM.域名的反写。

我们可以看到IQN创建完毕之后,下面会带上一个默认TPG1,TPG就是改IQN的默认策略。TPG下面有ACL,LUN,portals。

IQN属于名字,名字是自己创建的,这种不支持补全,但是其他的都支持补全。 

6. 针对IQN设置ACL,LUN,Portals

默认当IQN创建之后默认的portal就是监听所有地址的3260端口,你可以不用更改。

iqn.2021-01.com.example:ubuntuserver使用了ubuntu的backstore,只允许iqn.2021-01.com.example:ubuntu使用这个target存储。

iqn.2021-01.com.example:stream使用了stream的backstore,只允许iqn.2021-01.com.example:stream使用这个target存储

其他的两个类似。

saveconfig就是保存配置,保存完之后就可以exit退出了。

/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json

[root@iscsi-server ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 959/sshd
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 959/sshd

3、windows访问iSCSI Server端

没有使用iscsi存储之前,有一块系统盘和一块100G的未使用的磁盘。 

 

必须要保证windows上的iscsi发起程序是开机启动的,才能在重启windows之后,自动挂载iscsi的磁盘。 

4、Linux访问iSCSI server

1. centos-stream访问

需要修改iscsi发起程序的IQN:

[root@stream ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:eaac1e599195

如果没有/etc/iscsi/目录,那么说明你没有安装iscsi发起程序,只需要:

yum -y install iscsiinitiator-utils
[root@stream ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2021-01.com.example:stream

启动iscsi服务和iscsid服务并设置下次开机启动:

[root@stream ~]# systemctl enable iscsi iscsid
[root@stream ~]# systemctl restart iscsi iscsid

你可能会发现iscsi服务没有正常启动,原因是默认没有任何的iscsi-server的节点被记录,有记录了,服务就会正常。

发现target:

[root@stream ~]# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver

iscsiadm是iscsi发起程序的命令行,-m参数表示模式,discovery表示发现模式,-t st表示
sendtarget,表示发现之后要发送自己的IQN。

-p参数表示portal,默认portal的端口是3260,所以-p 10.163.1.110相当于-p 10.163.1.110:3260

[root@stream ~]# ls /var/lib/iscsi/nodes
iqn.2021-01.com.example:esxiserver iqn.2021-01.com.example:ubuntuserver
iqn.2021-01.com.example:streamserver iqn.2021-01.com.example:windowsserver

当发现了target之后,再重启iscsi发起程序,你就会发现iscsi服务正常了。

[root@stream ~]# systemctl restart iscsi

登陆target:

#如果ACL不匹配就会出现"iSCSI login failed due to authorization failure"
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:ubuntuserver,portal: 10.163.1.110,3260]
iscsiadm: Could not login to [iface: default, target: iqn.2021-01.com.example:ubuntuserver, portal: 10.163.1.110,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
[root@stream ~]#
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l

#node表示节点操作模式,-T表示Target,-l表示登陆
[root@stream ~]# ls /dev/sd*
/dev/sda
[root@stream ~]# ls /dev/vd*
/dev/vda /dev/vda1 /dev/vda2 /dev/vdb

[root@stream ~]# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -u
Logging out of session [sid: 2, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260]
Logout of [sid: 2, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260] successful.

#-u参数表示登出

[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -u
Logging out of session [sid: 2, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Logout of [sid: 2, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
[root@stream ~]#
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Login to [iface: default, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
/dev/sda
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -u
Logging out of session [sid: 6, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Logout of [sid: 6, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Login to [iface: default, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
/dev/sda

#重启之后查看磁盘是否还在
[root@stream ~]# ls /dev/sd*
/dev/sda

2. ubuntu访问

root@yyds:~# cat /etc/iscsi/initiatorname.iscsi
## DO NOT EDIT OR REMOVE THIS FILE!
## If you remove this file, the iSCSI daemon will not start.
## If you change the InitiatorName, existing access control lists
## may reject this initiator. The InitiatorName must be unique
## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames.
InitiatorName=iqn.2021-01.com.example:ubuntu

root@yyds:~# systemctl enable iscsi iscsid
root@yyds:~#
systemctl restart iscsi iscsid
root@yyds:~# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver

root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:ubuntuserver,
portal: 10.163.1.110,3260] (multiple)
Login to [iface: default, target: iqn.2021-01.com.example:ubuntuserver, portal:
10.163.1.110,3260] successful.

root@yyds:~# ls /dev/sd*
/dev/sda

root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -u
Logging out of session [sid: 1, target: iqn.2021-01.com.example:ubuntuserver,portal: 10.163.1.110,3260]
Logout of [sid: 1, target: iqn.2021-01.com.example:ubuntuserver, portal:10.163.1.110,3260] successful.

root@yyds:~# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory

root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:ubuntuserver,portal: 10.163.1.110,3260] (multiple)
Login to [iface: default, target: iqn.2021-01.com.example:ubuntuserver, portal:10.163.1.110,3260] successful.

root@yyds:~# systemctl restart iscsi
root@yyds:~# systemctl status iscsi
● open-iscsi.service - Login to default iSCSI targets
Loaded: loaded (/lib/systemd/system/open-iscsi.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2021-01-27 14:40:05 UTC; 2s ago
Docs: man:iscsiadm(8)
      man:iscsid(8)
Process: 31245 ExecStart=/sbin/iscsiadm -m node --loginall=automatic
(code=exited, status=21)
Process: 31258 ExecStart=/lib/open-iscsi/activate-storage.sh (code=exited,status=0/SUCCESS)
Main PID: 31258 (code=exited, status=0/SUCCESS)
Jan 27 14:40:05 yyds systemd[1]: Starting Login to default iSCSI targets
...Jan 27 14:40:05 yyds iscsiadm[31245]: iscsiadm: No records found
Jan 27 14:40:05 yyds systemd[1]: Finished Login to default iSCSI targets.

root@yyds:~# reboot

root@yyds:~# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
root@yyds:~# sed -i 's/node.startup = manual/node.startup = automatic
/'/etc/iscsi/iscsid.conf
root@yyds:~# systemctl restart iscsid

root@yyds:~# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver
root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l

root@yyds:~# reboot

root@yyds:~# ls /dev/
sd*/dev/sda

5、esxi访问iSCSI Server端

在iSCSI target端上增加acl使esxi可以使用target端的存储: 

/> /iscsi/iqn.2021-01.com.example:esxiserver/tpg1/acls/ create iqn.1998-01.com.vmware:6011518d-b255-a641-8345-500000060000-096ec182
Created Node ACL for iqn.1998-01.com.vmware:6011518d-b255-a641-8345-500000060000-096ec182
Created mapped LUN 0.

也可以在esxi的命令行界面修改: 

[root@localhost:~] vi /etc/vmware/vmkiscsid/initiatorname.iscsi

6、Linux使用iscsi存储 

[root@stream ~]# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@stream ~]# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6fb0ddcc

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 20973567 20971520 10G 83 Linux
/dev/sda2 20973568 62916607 41943040 20G 83 Linux

让streamserver也能被ubuntu访问:

/> /iscsi/iqn.2021-01.com.example:streamserver/tpg1/acls/ create iqn.2021-01.com.example:ubuntu
Created Node ACL for iqn.2021-01.com.example:ubuntu
Created mapped LUN 0.
/> saveconfig

ubuntu上挂在streamserver target的存储:

root@yyds:~# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver

root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260] (multiple)
Login to [iface: default, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260] successful.

root@yyds:~# ls /dev/sd*
/dev/sda /dev/sdb /dev/sdb1 /dev/sdb2

也就是说,如果你针对iscsi存储做了分区,那么如果别的节点也挂了这个存储,也能使用这个分区。

[root@stream ~]# mkfs.ext4 /dev/sda1
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 16ac77c3-e728-42d4-8e21-0f534b27ea6c
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

[root@stream ~]# mkfs.ext4 /dev/sda2
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 29d87675-3844-48f2-add9-8ec2b99e0113
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done    
Writing superblocks and filesystem accounting information: done

[root@stream ~]# mkdir /mnt/iscsi-sda{1,2}
#iscsi网络存储在持久性挂载的时候必须加上_netdev参数来标识这是一个网络存储。否则如果系统在引导的时候如果还没有启动iscsi服务,就开始找/dev/sda1这块磁盘,如果找不到,系统就无法正常启动,导致进入紧急救援模式。

[root@stream ~]# cat /etc/fstab
/dev/sda1 /mnt/iscsi-sda1 ext4 defaults,_netdev 0 0
[root@stream ~]# mount -a
[root@stream ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs tmpfs 3.8G 8.5M 3.8G 1% /run
tmpfs tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/mapper/cs-root xfs 70G 2.4G 68G 4% /
/dev/vda1 xfs 1014M 199M 816M 20% /boot
tmpfs tmpfs 777M 0 777M 0% /run/user/0
/dev/sda1 ext4 9.8G 37M 9.3G 1% /mnt/iscsi-sda1

#ubuntu
root@yyds:~# mkdir /mnt/iscsi-storage1
root@yyds:~# mount /dev/sdb1 /mnt/iscsi-storage1
/root@yyds:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 394M 1.1M 393M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 196G 6.4G 180G 4% /
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda2 ext4 976M 104M 806M 12% /boot

root@yyds:~# touch /mnt/iscsi-storage1/ubunt-file
root@stream ~]# ls /mnt/iscsi-sda1/
lost+found

[root@stream ~]# umount /mnt/iscsi-sda1
[root@stream ~]# mount -a
[root@stream ~]# ls /mnt/iscsi-sda1/
[root@stream ~]# ls /mnt/iscsi-sda1/ -l
ls: cannot access '/mnt/iscsi-sda1/ubuntu-file': Bad message
total 16
drwx------. 2 root root 16384 Jan 27 23:08 lost+found
-?????????? ? ? ? ? ? ubuntu-file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天天说手撕红黑树?你真的能撕的下来吗?(详细解释+代码注释)

目录 一、你还记得什么是红黑树吗&#xff1f; 二、AVL树与红黑树的比较 三、模拟实现红黑树 3.1、红黑树的定义 3.2、插入结点 3.2.1、情况一 3.2.2、情况二 3.2.3、情况三 四、红黑树的验证 4.1、检查中序遍历是否有序 3.2、检查是否出现两个连续的红色结点 4.3、检…

数据护航 安全立方—海泰方圆数据安全治理立体式框架

发展数据安全是必然趋势 2022年6月&#xff0c;中央全面深化改革委员会第二十六次会议强调&#xff0c;“数据基础制度建设事关国家发展和安全大局&#xff0c;要维护国家数据安全&#xff0c;保护个人信息和商业秘密&#xff0c;促进数据高效流通使用、赋能实体经济&#xff0…

【JVM】jvm虚拟机中的堆

jvm虚拟机中的堆一、JVM体系结构二、Java堆简介2.1 堆的特点2.2 堆空间细分2.3 堆空间的分代思想2.4 堆的默认大小三、JVM堆内存常用参数四、垃圾回收算法&#xff08;GC&#xff0c;Garbage Collection&#xff09;4.1 标记-清除&#xff08;Mark-Sweep&#xff09;4.2 复制&a…

【代码审计-1】PHP无框架项目SQL注入

代码审计 教学计划&#xff1a;审计项目漏洞Demo->审计思路->完整源码框架->验证并利用漏洞 教学内容&#xff1a;PHP&#xff0c;JAVA网站应用&#xff0c;引入框架类开发源码&#xff0c;相关审计工具及插件使用 必备知识点&#xff1a;环境安装搭建使用&#xff0c…

python是什么鬼?为什么学会他就能月入过万,它真的这么牛吗?

为什么那么多人选择学习python&#xff1f; Python在人工智能、大数据、自动化运维、全栈开发等方面具有独特的优势。随着Python继续占据编程语言主流的趋势&#xff0c;全国各城市的招聘岗位和薪酬将大幅增加。此外&#xff0c;随着人工智能在中国的投资和规划&#xff0c;对…

使用docker compose一键部署多个服务

docker compose 是 docker 官方的开源项目&#xff0c;用来实现对 docker 容器集群的快速编排 下载安装 官网下载地址&#xff1a;点这里 我用的是云服务器&#xff0c;所以就直接用yum安装了&#xff0c;直接执行这两条命令&#xff0c;等安装结束后查看版本&#xff0c;看到…

SpringCloud系列(六)Feign 客户端的配置及使用

❓Feign 是什么? &#x1f64a;Feign 是一个声明式的 http 客户端, 其主要的作用就是帮助我们实现 http 的请求发送, 正如官网所说, Feign使编写Java http客户端更容易; ❓❓为什么要用 Feign? &#x1f64a;&#x1f64a;如在未学习 Feign 之前, 我们利用的是 RestTemplate …

2022年宜春市职业院校技能大赛中职组“网络搭建与应用”赛项任务书

2022年宜春市职业院校技能大赛中职组“网络搭建与应用”赛项任务书 &#xff08;总分1000分&#xff09; 赛题说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分二个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;网络搭建及安全部署项目 第二部分&#xff1a;服务器…

【实时数仓】DWS层访客主题计算(续)、商品主题计算

文章目录一 DWS层-访客主题计算1 写入OLAP数据库&#xff08;1&#xff09;增加ClickhouseUtila JdbcSink.<T>sink( )的四个参数说明b ClickhouseUtil中获取JdbcSink函数的实现c 构造者设计模式d 赋值给问号占位符并创建TransientSink注解e 在GmallConfig中配置ClickHous…

SWRM(2022)

论文题目&#xff08;Title&#xff09;&#xff1a;Sentiment Word Aware Multimodal Refinement for Multimodal Sentiment Analysis with ASR Errors 研究问题&#xff08;Question&#xff09;&#xff1a;具有语音识别错误的多模态情感分析的情感词感知多模态细化 研究动…

位 字节 字符

位 字节 字符 比特位(bit)→【百度百科】 字节(Byte)→【百度百科】 字符 →【百度百科】 位(bit,简写为b)&#xff1a;&#xff1a; 1、计算机 最小的存储单位&#xff1b; 2、比特位上的值只能存 0 或 1&#xff1b; 3、数据传输大多是以 位 为单位。 字节(Byte,简写为B)&…

SQL | 你必须知道的一些 SELECT 查询

数据是许多大小企业的核心部分。例如&#xff0c;Facebook 存储每个用户的个人资料信息&#xff0c;数据库系统内的数据包括他们的朋友和帖子。SQL&#xff08;Structured Query Language 的缩写&#xff09;是一种编程语言&#xff0c;使开发人员和数据库管理员能够使用那些数…

云、数、智“三江并流”,亚马逊云科技将把数字化航船带向何方?

科技云报道原创。 数流和智流融合不仅仅是趋势&#xff0c;而是正在发生的事情。 从国家层面“十四五”规划为数字化转型高度定调&#xff0c;到各行业内外部刚需推进&#xff0c;数字化转型是千行百业必然发展趋势。 如果说过去两年是数字化转型的试验阶段&#xff0c;进行…

打开远程会议模式新篇章,华为云会议让沟通更高效!

当下&#xff0c;“降本增效”似乎已成诸多公司的战略选择&#xff0c;不少企业希望能够借助借数字化的转型&#xff0c;对办公方式以及远程会议模式进行升级。在这一市场需求的推动下&#xff0c;不少云服务厂商都针对办公推出了全新的会议模式&#xff0c;比如我们熟悉的华为…

ArcGIS基础:拓扑工具编辑面要素的公共边

需求&#xff1a;在普通的面要素数据中&#xff0c;存在很多相邻面要素&#xff0c;其一大特点就是存在公共边和公共顶点&#xff0c;如下所示&#xff1a; 如果对其中的一个公共边或者公共顶点进行编辑&#xff0c;必须保证相邻的面要素在数据的编辑前后保持拓扑关系不变。 …

搭建基于 Python+Flask+MySQL 的学生培养计划管理系统(附源码)

大家好&#xff0c;今天给大家分析一款 PythonFlaskMySQL 实现的学生培养计划管理系统&#xff0c;项目包括课程推荐、课程评分、交流论坛和模拟退选课模块。 文章目录项目功能项目目录项目环境使用方法源码项目展示项目功能 学生培养计划可视化&#xff0c;学生能够直观地了解…

转行前端一年大概是什么水平

水平“仅供参考” 你很可能是通过搜索找到这篇文章的。 刚入行那会儿&#xff0c;整个小团队就我一只前端。我没有参考坐标系&#xff0c;不知道自己水平是什么程度&#xff0c;不知道大家是什么水平&#xff0c;更不知道就业市场对一年工作经验的要求是怎样的。那种感觉&…

推荐8个提高工作效率的IntelliJ插件

前言 欢迎关注个人公众号——JAVA旭阳 IntelliJ目前已经成为市面上最受欢迎的Java开发工具&#xff0c;这得益于里面非常丰富的插件机制。本文我将分享在日常开发中我经常使用的5个插件&#xff0c;它们可以帮助您提高工作效率。 1. GenerateAllSetter 作为开发人员&#xff…

美国物理学会Physics网站公布“年度亮点”工作,AlphaFold和潘建伟团队成果等入选

凭借詹姆斯韦伯太空望远镜拍摄的令人惊叹的图像、激光聚变的突破、升级后的大型强子对撞机的启动以及小行星防御系统的首次测试&#xff0c;2022 年提供了大量的宏伟成果。 在生物、量子和凝聚态物理学方面也有重要的小规模努力&#xff0c;以及在多样性、公平性和包容性方面的…

图片颜色处理

目录背景任务需求思考过程背景 背景叙述的是我为什么要做颜色处理以及整个思考过程&#xff0c;有些流水账&#xff0c;可不看。 任务需求 拍照&#xff0c;获取图片中固定一块区域的颜色&#xff0c;判断是不是红色。 思考过程 知道这个任务的时候&#xff0c;首先对图像…