目录
(1)DAS(直接附加存储,是直接接到计算机的主板总线上去的存储)
(2)NAS(网络附加存储,是通过网络附加到当前主机文件系统之上的存储)
一.故事背景
在结束了MySQL数据库的内容后,接下来是存储服务的相关内容,首先接触的是NFS文件存储。
二.存储基础
1、单机存储设备
(1)DAS(直接附加存储,是直接接到计算机的主板总线上去的存储)
IDE、SATA、SCSI、SAS、USB 接口的磁盘
所谓接口就是一种存储设备驱动下的磁盘设备,提供块级别的存储
(2)NAS(网络附加存储,是通过网络附加到当前主机文件系统之上的存储)
NFS、CIFS、FTP 、samba
文件系统级别的存储,本身就是一个做好的文件系统,通过nfs接口在用户空间输出后,客户端基于内核模块与远程主机进行网络通信,把它转为好像本地文件系统一样来使用,这种存储服务是没办法对它再一次格式化创建文件系统块的
(3)SAN(存储区域网络)
SCSI协议(只是用来传输数据的存取操作,物理层使用SCSI线缆来传输)、FCSAN(物理层使用光纤来传输)、iSCSI(物理层使用以太网来传输)
也是一种网络存储,但不同之处在于SAN提供给客户端主机使用的接口是块级别的存储
2、单机存储的问题
(1)存储处理能力不足
传统的IDE的IO值是100次/秒,SATA固态磁盘500次/秒,固态硬盘达到2000-4000次/秒。即使磁盘的IO能力再大数十倍,也不够抗住网站访问高峰期数十万、数百万甚至上亿用户的同时访问,这同时还要受到主机网络IO能力的限制。
(2)存储空间能力不足
单块磁盘的容量再大,也无法满足用户的正常访问所需的数据容量限制。
(3)单点故障问题
单机存储数据存在单点故障问题
3、商业存储解决方案
EMC、NetAPP、IBM、DELL、华为、浪潮
4、分布式存储(软件定义的存储 SDS)
Ceph、TFS、FastDFS、MooseFS(MFS)、HDFS、GlusterFS(GFS)
存储机制会把数据分散存储到多个节点上,具有高扩展性、高性能、高可用性等优点。
存储系统 | 核心架构 | 数据模型 | 适用场景 | 性能特点 | 可靠性机制 | 主要优缺点 |
Ceph | 去中心化,基于RADOS对象存储 | 统一存储(块/对象/文件) | 云计算、混合云、大规模非结构化数据 | 高吞吐、低延迟(CRUSH算法优化数据分布) | 多副本/纠删码 + CRUSH故障域隔离 | 优点:强一致性、线性扩展、无单点故障 缺点:部署复杂,硬件要求高 |
TFS (Taobao File System) | 中心化(NameServer管理元数据) | 文件存储(小文件优化) | 电商图片、海量小文件(<1MB) | 高随机IO性能,软RAID并发处理 | 多副本 + 主备热切换 | 优点:小文件性能优异、平滑扩容 缺点:不支持POSIX,文档少,大文件性能差 |
FastDFS | 无中心(Tracker调度 + Storage存储) | 文件/块存储 | 轻量级文件服务(图片/视频网站) | 中等吞吐,低并发延迟 | 数据分块 + 多副本同步 | 优点:部署简单、无单点故障 缺点:不支持断点续传,跨集群同步弱 |
MooseFS (MFS) | 中心化(Master管理元数据) | 文件存储 | 海量小文件读写、Web应用 | 小文件高效,大文件一般 | 多副本 + 回收站机制 | 优点:支持FUSE挂载、易监控 缺点:Master单点瓶颈,扩容需中断 |
HDFS | 中心化(NameNode + DataNode) | 文件系统(大文件分块) | 大数据分析、离线批处理 | 高吞吐量,顺序读写优 | 多副本(默认3副本) | 优点:容错性强、生态完善 缺点:小文件低效,不支持随机写 |
GlusterFS (GFS) | 去中心化(无元数据服务器) | 文件/块存储 | 大文件高并发(视频归档、科研数据) | 大文件吞吐高,小文件较差 | 纠删码/副本 + 数据自愈 | 优点:扩展灵活,无单点故障 缺点:目录遍历效率低,CPU占用高 |
5、分布式存储的类型
(1)块存储
(例如硬盘,一般是一个存储被一个服务器挂载使用,适用于容器或虚拟机存储卷分配、日志存储、文件存储)
就是一个裸设备,用于提供没有被组织过的存储空间,底层以分块的方式来存储数据
(2)文件存储
(例如NFS,解决块存储无法共享问题,可以一个存储被多个服务器同时挂载,适用于目录结构的存储、日志存储)
是一种数据的组织存放接口,一般是建立在块级别的存储结构之上,以文件形式来存储数据,而文件的元数据和实际数据是分开存储的
(3)对象存储
(例如OSS,一个存储可以被多服务同时访问,具备块存储的高速读写能力,也具备文件存储共享的特性,适用图片存储、视频存储)
基于API接口提供的文件存储,每一个文件都是一个对象,且文件大小各不相同的,文件的元数据和实际数据是存放在一起的
三.NFS概述
NFS是Network File System的缩写,默认监听2049端口号。它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;NFS一般用来存储共享视频,图片等静态数据。
NFS分为服务端和客户端(C/S架构)。服务端提供共享目录或文件,客户端对服务端共享的目录或文件挂载后,就可以读取到服务端提供的文件或目录,在客户端看来就像访问本地一样。
RPC,远程过程调用协议。可以通过网络从远程主机程序上请求服务,而不需要了解底层网络技术。最重要的功能是远程连接、端口注册。使用UDP的111端口监听客户请求。
NFS挂载原理
一个NFS服务器设置好共享目录,有权访问的NFS客户端就可以把该目录挂载到本地。
NFS通过网络端口实现服务器端和客户端的数据传输。因为NFS有许多功能,不同的功能需要使用不同的端口,因此端口是随机的。那么如何让客户端知道此时服务器端使用的是哪个端口呢?通过RPC(remote procedure call)服务来实现。RPC即远程过程调用。
NFS工作原理
NFS服务端和客户端之间通过随机选择端口来传输数据,NFS服务端利用RPC协议与客户端进行沟通决定使用的随机端口,然后利用这个端口来传输数据,使用的随机端口通常小于1024。RPC协议用来统一管理NFS的随机端口,其使用的端口默认为111。
RPC与NFS通讯过程
-
首先服务器端启动RPC服务,并开启111端口
-
服务器端启动NFS服务,并向RPC注册端口信息
-
客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
-
服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
-
客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
四.NFS服务安装与启停
NFS服务安装
NFS服务启停
五.NFS服务配置文件
# 这是一个NFS服务器的配置文件
# This is a general configuration for the NFS daemons and tools
#[general]
# pipefs-directory=/var/lib/nfs/rpc_pipefs # 设置RPC管道文件系统的目录
[nfsrahead]
# nfs=15000 #NFSv3协议预读数据量(单位:字节)。
# nfs4=16000 #NFSv4协议预读数据量。
#[exportfs]
# debug=0 # 设置导出时的调试级别为0
#[gssd]
# verbosity=0 # 设置GSSAPI的日志级别为0
# rpc-verbosity=0 # 设置RPC日志级别为0
# use-memcache=0 # 是否使用内存缓存,这里设置为0,不使用
# use-machine-creds=1 # 是否使用机器凭证,这里设置为1,使用
# avoid-dns=1 # 是否避免DNS查找,这里设置为1,避免
# limit-to-legacy-enctypes=0 # 是否限制使用旧的对等体类型,这里设置为0,不限制
# context-timeout=0 # 设置上下文超时时间为0,即无超时时间
# rpc-timeout=5 # 设置RPC超时时间为5秒
# keytab-file=/etc/krb5.keytab # 指定Kerberos的keytab文件路径
# cred-cache-directory= # 凭证缓存目录为空,可能这个配置项被注释掉了或者不存在
# preferred-realm= # 首选领域为空,可能是默认的领域值
#[lockd]
# port=0 # 锁管理器监听的端口为0,可能未配置或默认值
# udp-port=0 # UDP端口为0,可能未配置或默认值
#[mountd]
# debug=0 # 挂载时的调试级别为0
# manage-gids=n # 是否管理组ID,这里设置为n,不管理
# descriptors=0 # 描述符数量为0,可能未配置或默认值
#[nfsdcltrack]
# debug=0 # NFS数据流跟踪的调试级别为0
# storagedir=/var/lib/nfs/nfsdcltrack # 数据存储目录为空,可能这个配置项被注释掉了或者不存在
#[nfsd]
# debug=0 # NFS服务的调试级别为0
# threads=8 # 并发线程数为8,可以提供更高的性能
# host= # 主机的IP地址或域名,这里为空,可能是默认值或未配置
#[statd]
# debug=0 # 设置statd服务的调试级别为0,即不进行调试
# port=0 # 设置statd服务的监听端口为0,可能表示默认值或未配置
# outgoing-port=0 # 设置statd服务发送数据的端口为0,可能表示默认值或未配置
# name= # 设置statd服务的名称为空,可能表示默认值或未配置
# state-directory-path=/var/lib/nfs/statd # 设置statd服务的状态目录路径为/var/lib/nfs/statd
# ha-callout= # 设置高可用调用为空,可能表示未配置
# no-notify=0 # 设置是否禁用通知为0,即不禁用通知
#[sm-notify]
# debug=0 # 设置sm-notify服务的调试级别为0,即不进行调试
# force=0 # 设置是否强制发送通知为0,即不强制发送
# retry-time=900 # 设置发送通知请求的延迟时间为900秒
# outgoing-port= # 设置发送数据的端口为空,可能表示默认值或未配置
# outgoing-addr= # 设置发送数据的地址为空,可能表示默认值或未配置
# lift-grace=y # 设置是否解除宽限期为y,即解除宽限期
六.NFS文件共享配置文件
##默认是空的
配置参数说明
参数 | 作用 |
---|---|
ro | 只读 |
rw | 读写 |
root_squash | 当以root身份访问时,映射为NFS服务端的匿名用户 |
no_root_squash | 当以root身份访问时,映射为NFS服务端的root用户 |
all_squash | 无论使用什么账户访问,均映射为NFS服务端的匿名用户 |
sync | 同时将数据写入内存和硬盘中,保证不丢失数据 |
async | 先将数据写入内存,然后写入硬盘中,可能会造成数据丢失 |
五、命令解析
命令字 | 选项 | 作用 |
---|---|---|
exportfs | -d | 开启调试模式。有效的调试类型包括:all, auth, call, general 和 parse。在/etc/nfs.conf的[exportfs]部分中设置debug=也可以开启调试模式。 |
-a | 导出或取消导出所有目录。 | |
-o | 指定一个与exports(5)文件中的导出选项列表相同的选项列表。 | |
-i | 忽略/etc/exports文件和/etc/exports.d目录下的文件,仅使用命令行中给出的默认选项和选项。 | |
-r | 重导出所有目录,将/var/lib/nfs/etab与/etc/exports和/etc/exports.d下的文件同步。该选项会删除来自/var/lib/nfs/etab中已从/etc/exports或/etc/exports.d下的文件的删除条目,并删除内核导出表中已不再有效的条目。 | |
-u | 取消导出一个或多个目录。 | |
-f | 如果/proc/fs/nfsd或/proc/fs/nfs被挂载,则将内核的导出表中的所有内容清除。活跃客户端的新的内核导出表条目是由rpc.mountd在它们下次发出NFS挂载请求时添加的。 | |
-v | 显示详细信息。在导出或取消导出时,显示正在进行的事情。在显示当前导出列表时,还会显示导出选项列表。 | |
-s | 显示适合/etc/exports的当前导出列表 | |
showmount | showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ] | |
-a | 列出客户端主机名或IP地址以及以主机目录格式表示的挂载目录。 | |
-d | 仅列出由客户端挂载的目录。 | |
-e | 显示NFS服务器的导出列表。(常用) | |
-h | 提供简短的帮助摘要。 | |
-v | 报告程序的当前版本号。 |
在/etc/exports中写入内容,并重启加载(或者使用exportfs命令)
七.客户端访问
使用客户端访问服务端,查看nfs服务器192.168.115.128的共享目录
八.客户端挂载
手动挂载
此时若想挂载新的磁盘,一定要先把之前的卸载掉
返回服务端更改文件内容
重启
此时返回客户端挂载即可成功
在客户端安装nginx服务,将服务端挂载到nginx,并启动服务
在服务器的/date目录下创建index.html,并添加内容,此时登录客户端ip可以获得
打开第二台客户端,重复操作也可以获得该内容
九.实战项目——LNMP平台构架
1、LNMP概述
LNMP架构,是指在Linux平台下,由运行Nginx的web服务器,运行PHP的动态页面解析程序和运行MySQL的数据库组成的网站架构,也是当前常用的系统架构之一。
L:Linux N:Nginx M:MySQL P:PHP|Perl|Python
-
Linux:代表一类Unix计算机操作系统的统称,是目前最流行的免费操作系统,如Debian、CentOS、Ubuntu、Fedora、Gentoo等。
-
Nginx:一个高性能的HTTP和反向代理服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx以其内存占用少和并发能力强而著称。
-
MySQL:一种开放源代码的关系型数据库管理系统,使用最常用的数据库管理语言SQL进行数据库管理。MySQL因其速度、可靠性和适应性而受到广泛关注。
-
PHP:一种在服务器端执行的嵌入HTML文档的脚本语言,因其开源、免费、快捷等特点,成为最流行的编程语言之一。
在LNMP架构中,Nginx本身只负责静态页面的处理,当需要处理动态页面时,则需要Nginx将相关.php页面转交给php-fpm来进行处理,php-fpm会将PHP页面解析成html文件,然后交给Nginx进行处理。 与LAMP架构相比,LNMP的主要区别在于对PHP的处理上,LAMP对于PHP动态资源的处理是通过Apache的libphp5.so模块进行的,该模块内嵌如Apache中,而Nginx对PHP动态资源的处理则是通过php-fpm进行的,php-fpm是一个独立的模块,因此,在搭建LNMP架构时,Nginx和php-fpm都需要进行开启。
Nginx解析PHP文件流程如下所示:
LNMP架构运行原理如下图:
2、 LNMP实现细节
1.用户首先通过 http 协议发起请求,请求会先抵达Nginx; 2.Nginx 根据用户的请求进行 Location 规则匹配; 3.Location 如果匹配到请求是静态,则由 Nginx 读取本地直接返回; 4.Location如果匹配到请求是动态,则由Nginx将请求转发给fastcgi协议; 5.fastgi收到后会将请求交给php-fpm管理进程; 6.php-fpm管理进程接收到后会调用具体的worker工作进程, worker进程会调用php解析器解析代码,php解析后直接返回 7.如果有查询数据库操作,则由php连接数据库(用户 密码 IP)发起查询的操作 8.用户->http->nginx->fastcgi->php-fpm->php->tcp->mysql 9.最终数据由mysql->tcp->php->php-fpm->fastcgi->nginx->http->user
3.LNMP部署实战
1.环境准备
客户端安装nginx,mysql,php,php-mysqlnd(欧拉版本),php-fpm
2.配置nginx实现php解析
在服务端上改写新加的index文件为
客户端上启动php-fpm服务,并重启nginx
此时登录一号客户端则
二号客户端也可以登录
3.部署MySQL
安装MySQL
服务器配置文件
登录查看
解压一个压缩包,登录里面的upload
此时环境大多都不可写
将服务端的文件权限改为apache(下载php-fpm)
然后刷新网页
在服务端和客户端mysql都创建用户
然后再去填写网页内容
然后等待安装
访问站点,退出管理员身份,注册一个号
切换管理员身份,进入管理中心,可以看到各个管理内容
十.内容扩展—ISCSI存储服务
1.概述
iSCSI协议(Internet Small Computer System Interface,iSCSI)是一种新的存储技术,它是将SCSI接口与以太网(Ethernet)技术结合起来工作的,简单的说iSCSI协议是将用户的请求转换成SCSI规则编码,然后再将这些数据封装在IP包中以便在以太网中进行传输的协议。
iSCSI技术是基于IP的存储区域网,又称IP-SAN,它是一种基于因特网及SCSI-3协议的存储技术,由IETF提出,并于2003年2月11日成为正式的标准。
iSCSI协议的功能
-
供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行 SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。
-
基于TCP/IP协议的,用来建立和管理IP存储设备、主机和客户机之间的相互连接,并创建SAN。
-
使得SAN利用SCSI协议应用在高速数据传输网络成为可能。这种传输是以块级别的方式在各个存储设备上进行的。
iSCSI的结构
由于SCSI协议是一个C/S架构,因此iSCSI协议也是一个C/S结构,其中client是initiator,server端为target。iSCSI协议的主要功能是利用TCP/IP网络,在主机系统(可称为initiator)和目标存储设备(称为target)之间进行大量的数据封装和可靠传输过程。此外,iSCSI协议还将SCSI协议封装在IP网络上,并且运行在TCP上。
iSCSI协议的工作原理
当iSCSI主机发起数据读写操作后,操作系统会生成一个SCSI指令集,然后该SCSI指令集在iSCSI initiator端被封装成iSCSI消息包,并通过TCP/IP网络传输到存储区域,当存储区域的iSCSI target收到iSCSI消息包时会将其解开,读取其中的SCSI指令,然后再将其SCSI指令传送给SCSI设备执行其指令。当SCSI指令被执行后,返回的数据经过SCSI设备传送给iSCSI target时被封装为iSCSI的响应PDU,然后再通过TCP/IP网络传输给iSCSI initiator端,iSCSI initiator解开其iSCSI PDU包,读取其中的SCSI响应内容,并将其提交给操作系统进行处理,然后操作系统在将其处理后的内容返回给应用程序。
iSCSI的优点
iSCSI最大的优点就是节约成本,利用iSCSI协议构建一个存储网络,除了需要存储设备,交换机、线缆还有以太网接口以外,基本就不需要其他的设备了,只需要在现有的网络上安装iSCSI就可以实现构建一个比较大的存储网络了。
iSCSI基本概念
iSCSI客户端 (iSCSI Initiator)
iSCSI客户端为iSCSI initiator,这是I/O操作的发起者。在RedHat Linux系统中可以通过软件来模拟,需要安装iSCSI设备驱动。如iscsi-initiator-utils.rpm iSCSI initiator具有的特性:
-
既然是I/O操作的发起者,需要通过发现过程请求远端块设备。
-
它可以与target进行持久连接
-
Linux中可以通过软件方式来实现
iSCSI服务器端 (iSCSI Target)
iSCSI服务器端为iSCSI target,这是I/O操作的执行者。在RedHat Enterprise Linux中可以使用scsi-target-utils软件包来模拟实现。 iSCSI target端具有的特性:
-
需要导出一个或多个块设备供启动者(initiator)使用
-
可以通过硬件和软件的方式来实现
iSCSI target设备名称
iSCSI target名称必须是全球唯一的,其格式为:
iqn.<yyyy-mm>.<tld.domain.some.host>[:<identifier>]
# iqn:iSCSI target名称必须是以iqn开头的
# yyyy-mm:表示的是时间
# tld.domain.some.host:这个表示的是一个反过来写的域名
# identifier:这个可以是任意字符串
# 如:iqn.2015-03.com.xsl.www:storge.disk1
逻辑单元号LUN
LUN ID由iSCSI目标设备(Target)分配。iSCSI 启动端(Initiator)设备当前支持在每个目标设备(Target)中导出最多256个LUN。即最大支持16个target。对于LUN,比较通俗的理解就是磁盘分区、LVM卷组、RAID等等。
Target 即“储存设备”(Storage Device),也就是存放数据的硬盘(以磁盘阵列居多)。在使用iSCSI时,会在 iSCSI 储存设备上去建立 LUN(Logical Unit Number)来提供给具备 iSCSI Initiator 功能的主机来存取数据的。LUN 好比是个“逻辑单位磁碟”,物理上通常是由数个实体磁碟( RAID 或 LVM 技术的技术实现)所组成。
iSCSI的发现机制
iSCSI发起端为了和iSCSI目标端建立iSCSI会话,initiator需要知道target的 IP地址,TCP端口号和名字 三个信息。iSCSI发现的目的是为了让iSCSI发起端获取一条到iSCSI目标端的通路。iSCSI有三种发现机制:
静态配置
在iSCSI发起端已经知道iSCSI目标端的IP地址TCP端口号和名字信息时,iSCSI发起端不需要执行发现。iSCSI发起端直接通过IP地址和TCP端口来建立TCP连接,使用iSCSI目标端的名字来建立iSCSI会话。这种发现机制比较适合比较小的iSCSI体系结构
SendTarget发现
在iSCSI发起端知道iSCSI目标端的IP地址和TCP端口的情况下,iSCSI使用IP地址和TCP端口号建立TCP连接后建立发现对话。iSCSI发起端发送SendTarget命令查询网络中的存在的iSCSI信息。这种方法主要用于网关设备,iSCSI发起端被静态配置连接到指定的iSCSI设备。iSCSI发起端和iSCSI网关设备建立对话并发送SendTarget请求给iSCSI网关设备。iSCSI网关设备返回一系列和它相连的ISCSI目标端的信息。iSCSI发起端选择一个目标端来建立对话。
零配置发现
这种机制用于iSCSI发送设备完全不知道iSCSI目标端的信息的情况下。iSCSI发起端利用现有的IP网络协议SLP(Service Location Protocol for Discovery,服务定位协议)。iSCSI目标端使用SLP来注册,iSCSI发起端可以通过查询SLP代理来获得注册的iSCSI目标端的信息。当iSCSI目标端加入到网络中的时候,拓扑结构也随之改变。虽然这种方法增加了实现的复杂性,但它不需要重新配置发起端即可找到新的目标端。
十一.总结
本次内容主要讲解了NFS的相关内容及其部署,在之后环境对的情况下是很有用的,承上启下使用了之前的mysql,nginx等服务,也为之后的Redis铺路。