分布式存储
存储概述
存储介绍
-
存储:就是存放数据的介质
-
-
如果web服务器家目录空间不够,可以通过添加硬盘使用LVM进行扩容,但硬盘数量存在上限;也可以使用远程存储共享进行扩容
存储分层
- 一个新的硬盘在linux系统里使用一般来说就三步:(分区)-格式化-挂载,才能使用
linux上如何挂载ntfs格式的移动硬盘?
linux内核支持ntfs,但centos7系统没有编译该功能,解决方法:
重新编译内核,在内核中加上ntfs支持。但该方法不推荐,因为编译内核会造成内核运行不稳定,没有过硬的实力不要尝试)
参考内核模块 [root@server1 ~]# lsmod Module Size Used by snd_seq_midi 13565 0 snd_seq_midi_event 14597 1 snd_seq_midi ppdev 17671 0 crc32_pclmul 13133 0 ghash_clmulni_intel 13273 0 vmw_balloon 18094 0 aesni_intel 189456 0 btusb 41520 0 lrw 13286 1 aesni_intel gf128mul 15139 1 lrw btrtl 12945 1 btusb btbcm 14040 1 btusb glue_helper 13990 1 aesni_intel btintel 15709 1 btusb ablk_helper 13597 1 aesni_intel cryptd 21190 3 ghash_clmulni_intel,aesni_intel,ablk_helper bluetooth 548787 5 btbcm,btrtl,btusb,btintel snd_ens1371 25076 0 snd_rawmidi 31553 2 snd_ens1371,snd_seq_midi snd_ac97_codec 130479 1 snd_ens1371 ac97_bus 12730 1 snd_ac97_codec snd_seq 62774 2 snd_seq_midi_event,snd_seq_midi joydev 17389 0 pcspkr 12718 0 snd_seq_device 14356 3 snd_seq,snd_rawmidi,snd_seq_midi rfkill 22391 1 bluetooth snd_pcm 101339 2 snd_ac97_codec,snd_ens1371 sg 40719 0 snd_timer 30014 2 snd_pcm,snd_seq snd 83987 7 snd_ac97_codec,snd_timer,snd_pcm,snd_seq,snd_rawmidi,snd_ens1371,snd_seq_device vmw_vmci 67168 0 soundcore 15047 1 snd i2c_piix4 22401 0 parport_pc 28205 0 parport 46395 2 ppdev,parport_pc ip_tables 27126 0 xfs 997727 2 libcrc32c 12644 1 xfs sd_mod 46281 3 crc_t10dif 12912 1 sd_mod crct10dif_generic 12647 0 sr_mod 22416 0 cdrom 42600 1 sr_mod ata_generic 12923 0 pata_acpi 13053 0 vmwgfx 291993 1 crct10dif_pclmul 14307 1 crct10dif_common 12595 3 crct10dif_pclmul,crct10dif_generic,crc_t10dif crc32c_intel 22094 1 drm_kms_helper 186531 1 vmwgfx serio_raw 13434 0 syscopyarea 12529 1 drm_kms_helper mptspi 22673 2 sysfillrect 12701 1 drm_kms_helper sysimgblt 12640 1 drm_kms_helper fb_sys_fops 12703 1 drm_kms_helper e1000 137624 0 ttm 96673 1 vmwgfx drm 456166 4 ttm,drm_kms_helper,vmwgfx scsi_transport_spi 30732 1 mptspi mptscsih 40150 1 mptspi mptbase 106036 2 mptspi,mptscsih ata_piix 35052 0 drm_panel_orientation_quirks 17180 1 drm libata 243094 3 pata_acpi,ata_generic,ata_piix nfit 55639 0 libnvdimm 159524 1 nfit dm_mirror 22326 0 dm_region_hash 20813 1 dm_mirror dm_log 18411 2 dm_region_hash,dm_mirror dm_mod 124501 8 dm_log,dm_mirror
安装软件,为内核加上支持ntfs的模块
安装 # yum install epel-release -y # yum install ntfs-3g 挂载 # mount.ntfs-3g /dev/sdb1 /mnt
- liunx存储分层
- 物理卷:指的是物理设备,如硬盘(/dev/sda),分区(/dev/sda1),dd命令创建的文件,软raid(/dev/md0),逻辑卷(/dev/vg01/lv01)等
- 模块驱动:安装相应的模块,即可实现相应的功能
- 文件系统:格式化成相应的文件系统:如ext4,xfs
- 虚拟文件系统: 又名VFS (Virtual File System),作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口
存储分类
- 三种存储方式:DAS、SAN、NAS
- 三种存储类型:块存储、文件存储、对象存储
按存储方式分:
分类 | 名称 | 描述 |
---|---|---|
DAS | 直连式存储 (direct access/attach storage) |
如:机箱里的disk,或通过接口直连到系统总线上的disk(如U盘,移动硬盘) |
NAS | 网络附加存储 (network attched storage) |
通过交换机,路由器连接起来,共享的是目录如:nfs,samba,ftp |
SAN | 存储区域网络 (storage area network) |
通过交换机,路由器连接起来的高速存储网络,共享的是块设备 |
三者区别与联系
-
DAS: 直接连接系统,不受网速限制,速度快; 扩展容量有上限。
-
NAS与SAN: 通过网络设备连接的远程存储,速度受网络影响; 但扩展方便,几乎无上限。
-
NAS和SAN都是通过网络(通过了网络设备,如路由器,交换机等)的,但NAS共享的是应用层的目录,而SAN共享的是/dev/sdb1或/dev/sdb这种块设备。
按储存类型分:
分类 | 描述 |
---|---|
文件存储 | NAS都属于这一类。 简单来说就是mount后直接使用的 |
块存储 | SAN都属于这一类。 简单来说就是类似/dev/sdb这种,要分区,格式化后才能mount使用 |
对象存储 | 对象存储采用扁平化的形式管理数据,没有目录的层次结构,并且对象的操作主要以put、get、delete为主。 |
三者比较
比较项 | 块存储 | 文件存储 | 对象存储 |
---|---|---|---|
概念 | 用高速网络连接专业主机服务器的一种存储方式 | 使用文件系统,具有目录树 | 将数据和元数据当做一个对象 |
速度 | 低延迟(10ms),热数据 | 不同技术各有不同 | 100ms-1s,冷数据 |
可分布性 | 异地不现实 | 可分布式 | 分布并发能力高 |
文件大小 | 大小都可以 | 适合大文件 | 大小都可以 |
接口 | Driver,kernel module | POSIX | Restful API |
典型技术 | SAN | HDFS、GFS | Swift、Amazon S3 |
适合场景 | 数据中心,虚拟化平台 | 办公网络 | 网络媒体文件存储 |
文件存储: 类似一个大的目录,多个客户端都可以挂载过来使用。
- 优点: 利于数据共享
- 缺点: 速度较慢
块存储: 类似一个block设备,客户端可以格式化,挂载并使用,和用一个硬盘一样。
- 优点: 和本地硬盘一样,直接使用,速度较快
- 缺点: 数据不共享,建议一个块设备仅供一人使用
对象存储: 一个对象我们可以看成一个文件, 综合了文件存储和块存储的优点。
- 优点: 速度快,数据共享
- 缺点: 成本高, 不兼容现有的模式
SAN
分类
- FC-SAN: 早期的SAN, 服务器与交换机的数据传输是通过光纤进行的, 服务器把SCSI指令传输到存储设备上,不能走普通LAN网的IP协议。速度快,成本高
- IP-SAN: 用IP协议封装的SAN, 可以完全走普通网络,因此叫做IP-SAN, 最典型的就是ISCSI。速度较慢(已经有W兆以太网标准), 成本低
IP-SAN之iscsi实现
虚拟机 | IP地址 | 作用 |
---|---|---|
server1 | 192.168.139.10 | 储存服务器(导出) |
server2 | 192.168.139.20 | 业务服务器(导入) |
- 环境准备
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
cat >> /etc/hosts <<EOF
192.168.139.10 server10
192.168.139.20 server20
EOF
ntpdate cn.ntp.org.cn
date
- 导出端配置
安装iscsi-target-utils软件包
[root@server1 ~]# yum install -y epel-release.noarch
[root@server1 ~]# yum install -y scsi-target-utils
模拟需要导出的物理卷
[root@server1 ~]# dd if=/dev/zero of=/tmp/big_file bs=1M count=1000
修改配置文件
[root@server1 ~]# cd /etc/tgt/
[root@server1 tgt]# vim targets.conf
[root@server1 tgt]# cat targets.conf |grep -Ev '^#|^$'
default-driver iscsi
#共享名,也就是存储导入端发现后看到的名称
<target iscsi:data>
#backing-store定义实际要共享出去的设备
backing-store /tmp/big_file
</target>
启动服务
[root@server1 tgt]# systemctl start tgtd
[root@server1 tgt]# systemctl enable tgtd
- 导入端配置
安装iscsi-initiator-utils软件包
[root@server2 ~]# yum install -y epel-release.noarch
[root@server2 ~]# yum install -y iscsi-initiator-utils
寻找资源
[root@server2 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.139.10
192.168.139.10:3260,1 iscsi:data
登录
[root@server2 ~]# iscsiadm -m node -l
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 1000M 0 disk
sr0 11:0 1 973M 0 rom
#发现多出来了一块sdc
断开连接:
[root@server2 ~]# iscsiadm -m node -u
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sr0 11:0 1 973M 0 rom
#删除登录过的信息
[root@server2 ~]# iscsiadm -m node --op delete
- 扩展:添加用户名和密码验证功能
导出端配置验证功能
[root@server1 tgt]# vim targets.conf
[root@server1 tgt]# cat targets.conf |grep -Ev '^#|^$'
default-driver iscsi
#共享名,也就是存储导入端发现后看到的名称
<target iscsi:data>
#backing-store定义实际要共享出去的设备
backing-store /tmp/big_file
incominguser tgt-user tgt-pass
</target>
导入端添加用户及密码
[root@server2 ~]# vim /etc/iscsi/iscsid.conf
57 node.session.auth.authmethod = CHAP
68 node.session.auth.username = tgt-user
69 node.session.auth.password = tgt-pass
78 discovery.sendtargets.auth.authmethod = CHAP
82 discovery.sendtargets.auth.username = tgt-user
83 discovery.sendtargets.auth.password = tgt-pass
验证
[root@server2 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.139.10
192.168.139.10:3260,1 iscsi:data
[root@server2 ~]# iscsiadm -m node -l
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 1000M 0 disk
sr0 11:0 1 973M 0 rom
分布式储存
介绍
-
NAS是远程通过网络共享目录, SAN是远程通过网络共享块设备。
-
分布式存储你可以看作**拥有多台存储服务器连接起来的存储导出端**。把这多台存储服务器的存储合起来做成一个整体再通过网络进行远程共享,共享的方式有目录(文件存储),块设备(块存储),对象网关或者说一个程序接口(对象存储)。
-
常见的分布式存储开源软件有:GlusterFS,Ceph,HDFS,MooseFS,FastDFS等
-
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。
-
分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用定位服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
-
分布式存储系统需要解决的两个问题:
问题一:我应该把数据写到什么地方?对于一个存储系统而言,当用户提交需要写入的数据时,系统必须迅速决策,为数据分配一个存储空间。这个决策的速度影响到数据如延迟,而更为重要的是,其决策的合理性也影响着数据分布的均匀性。
问题二:我之前把数据写到什么地方?对于一个存储系统而言,高效、准确地处理数据寻址空间也是基本功能之一。
特性
可扩展
- 分布式系统可以扩展到几百台到几千台的集群规模,轻松达到PB级别或以上。而且,随着集群规模的增长,系统整体性能表现为线性增长。 分布式存储的水平扩展有以下几个特性:
- 节点扩展后,旧数据会自动迁移到新节点,实现负载均衡,避免单点过热的情况出现
- 水平扩展只需要将新节点和原有集群连接到同一网络,整个过程不会对业务造成影响
- 当节点被添加到集群,集群系统的整体容量和性能也随之线性扩展,此后新节点的资源就会被管理平台接管,被用于分配或者回收
低成本
- 分布式存储系统的自动容错、自动负载均衡机制使其可以构建在普通PC机之上。另外,线性扩展能力也使得增加、减少机器非常方便,可以使用较低的成本实现自动运维
高性能
- 无论是整个集群还是单机服务,都要求分布式系统具备高性能。提升读写性能(LB)或数据高可用(HA)
易用
- 分布式存储系统需要提供易用的对外接口,另外也要求具备完善的监控、运维工具,并能够方便地与其它系统集成。如 Hadoop云计算系统导入数据。
开源软件比较
存储系统 | Ceph | GlusterFS | HDFS | MooseFS | FastDFS |
---|---|---|---|---|---|
开发语言 | C++ | C | Java | C | C |
开源协议 | LGPL | GPL V3 | Apache | GPL V3 | GPL V3 |
数据存储方式 | 对象/文件/块 | 文件/块 | 文件 | 块 | 文件/块 |
集群节点通信协议 | 私有协议(TCP) | TCP/RDAM | TCP | TCP | TCP |
专用元数据存储点 | 占用MDS | 无 | 占用MDS | 占用MFS | 无 |
在线扩容 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余备份 | 支持 | 支持 | 支持 | 支持 | 支持 |
单点故障 | 不存在 | 不存在 | 存在 | 存在 | 不存在 |
跨集群同步 | 不支持 | 支持 | 不支持 | 不支持 | 部分支持 |
适用场景 | 单集群的大中小文件 | 跨集群云存储 | Mapreduce使用的文件存储 | 单集群的大中文件 | 单集群的中小文件 |
FUSE挂载 | 支持 | 支持 | 支持 | 支持 | 不支持 |
访问接口 | POSIX | POSIX | 不支持POSIX | POSIX | 不支持POSIX |
Glusterfs
介绍
- glusterfs是一个免费,开源的分布式文件系统(它属于文件存储类型)
- 官网:https://www.gluster.org/
常见raid级别(扩展)
-
raid0 读写性能佳,坏了其中一块,数据挂掉,可靠性低(stripe条带化),磁盘利用率100%
-
raid1 镜像备份(mirror),同一份数据完整的保存在多个磁盘上,写的性能不佳,可靠性高,读的性能还行,磁盘利用率50%
-
raid10 先做raid 1 再做raid 0 (生产环境中常用)
- raid5 由多块磁盘做raid 5,磁盘利用率为n-1/n, 其中一块放校验数据,允许坏一块盘,数据可以利用校验值来恢复 (生产环境中常用)
- raid6 在raid5的基础上再加一块校验盘,进一步提高数据可靠性
常见卷的模式
卷模式 | 描述 |
---|---|
Replicated | 复制卷,类似raid1 |
Striped | 条带卷,类似raid0 |
Distributed | 分布卷 |
Distribute Replicated | 分布与复制组合 |
Dispersed | 纠删卷,类似raid5,raid6 |
复制卷(Replica volume)
- 将文件同步到多个Brick上,使其具备多个文件副本,属于文件级RAID1,具有容错能力。因为数据分散 到多个Brick中,所以读性能得到了很大提升,但写性能下降
条带卷(Stripe volume)
- 类似于RAID0,文件被分为数据块并以轮询的方式分布到多个Brick Server上,文件存储以数据块为单 位,支持大文件存储,文件越大,读取效率越高
分布式卷(Distribute volume)
- 文件通过HASH算法分布到所有Brick Server上,这种卷是Glusterf的基础;以文件为单位根据HASH算法 散列到不同的Brick,其实只是扩大了磁盘空间,如果有一个磁盘损坏,数据也将丢失,属于文件级的 RAID0,不具备容错能力
分布式复制卷(Distribute Replica volume)
- Brick Server数量是镜像数(数据副本数量)的倍数,具有分布式卷和复制卷的特点
其他:详见官网
集群搭建
虚拟机 | 担当 | IP地址 |
---|---|---|
server1 | storage1 | 192.168.139.10 |
server2 | storage2 | 192.168.139.20 |
server3 | storage3 | 192.168.139.30 |
server4 | storage4 | 192.168.139.40 |
server5 | client | 192.168.139.50 |
- 基于server02克隆server03,server04,server05
- 环境准备(所有节点)
修改主机名
hostnamectl set-hostname server3/4/5
su
配置静态