应用场景
分布式存储的应用场景相对于其存储接口,现在流行分为三种:
对象存储: 也就是通常意义的键值存储,其接口就是简单的 GET、PUT、DEL 和其他扩展,如七牛、又拍、Swift、S3
块存储: 这种接口通常以 QEMU Driver 或者 Kernel Module 的方式存在,这种接口需要实现 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青云的云硬盘和阿里云的盘古系统,还有 Ceph 的 RBD(RBD 是 Ceph 面向块存储的接口)
文件存储: 通常意义是支持 POSIX 接口,它跟传统的文件系统如 Ext4 是一个类型的,但区别在于分布式存储提供了并行化的能力,如 Ceph 的 CephFS(CephFS 是 Ceph 面向文件存储的接口),但是有时候又会把 GFS,HDFS 这种非 POSIX 接口的类文件存储接口归入此类。
按照这三种接口和其应用场景,很容易了解这三种类型的 IO 特点,括号里代表了它在非分布式情况下的对应:
对象存储(键值数据库):接口简单,一个对象我们可以看成一个文件,只能全写全读,通常以大文件为主,要求足够的 IO 带宽。
块存储(硬盘):它的 IO 特点与传统的硬盘是一致的,一个硬盘应该是能面向通用需求的,即能应付大文件读写,也能处理好小文件读写。但是硬盘的特点是容量大,热点明显。因此块存储主要可以应付热点问题。另外,块存储要求的延迟是最低的。
文件存储(文件系统):支持文件存储的接口的系统设计跟传统本地文件系统如 Ext4 这种的特点和难点是一致的,它比块存储具有更丰富的接口,需要考虑目录、文件属性等支持,实现一个支持并行化的文件存储应该是最困难的。但像 HDFS、GFS 这种自己定义标准的系统,可以通过根据实现来定义接口,会容易一点。
因此,这三种接口分别以非分布式情况下的键值数据库、硬盘和文件系统的 IO 特点来对应即可。至于冷热、快慢、大小文件而言更接近于业务。但是因为存储系统是通用化实现,通常来说,需要尽量满足各种需求,而接口定义已经一定意义上就砍去了一些需求,如对象存储会以冷存储、大文件为主。
如何选择
首先对象存储和文件存储的区别是不大的,存储的都是一样的东西,只是抛弃了统一的命名空间和目录树的结构,使得扩展起来桎梏少一些。
独立的互联网存储服务一般都是做对象存储的,因为块存储是给计算机用的,对象存储是给浏览器等 HTTP 客户端用的。独立服务所提供的存储系统,访问都来自互联网,自然是做对象存储;与之相对应,大部分类 AWS 的主机服务商都会提供一个块存储服务搭配主机服务。
同一个服务商同时提供两个服务是有好处的,除了提供的服务比较全这个优点以外,对象存储还可以支撑块存储的快照、主机的系统镜像存储等应用,可以相互结合的。
权衡的因素有很多——可靠性要求、可用性要求、时延要求、一致性要求、使用模式相关要求(包括请求大小、QPS/IOPS、吞吐)等。
比如:
另外 SSD 随着成本降低,在块存储里逐渐成为主流了,以便提供更好的 IOPS,AWS 这个月开始,创建的 EBS 卷缺省就是 SSD 的了。
对于评价一个实现,首先是看适合不适合这个用途,然后看这个方案有没有显著的缺点,是否有严重的影响,然后成本之类的也是一个因素,做软件的人总觉的用便宜硬件实现高大上的服务才值得吹牛,呵呵。
下文链接:https://www.zhihu.com/question/21536660/answer/33279921
块存储#
典型设备:磁盘阵列,硬盘
块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)
接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。
此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。
优点:
缺点:
文件存储#
典型设备:FTP、NFS服务器
为了克服上述文件无法共享的问题,所以有了文件存储。
文件存储也有软硬一体化的设备,但是其实普通拿一台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。
主机A可以直接对文件存储进行文件的上传下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。
优点:
缺点:
对象存储#
典型设备:内置大容量硬盘的分布式服务器
首先,一个文件包含了了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。
以往像FAT32这种文件系统,是直接将一份文件的数据与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如4M的文件,假设文件系统要求一个块4K,那么就将文件打散成为1000个小块),再写进硬盘里面,过程中没有区分数据/metadata的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。
这种情况下读写速率很慢,因为就算你有100个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械手臂在实际工作。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。
最后为什么对象存储兼具块存储与文件存储的好处,还要使用块存储或文件存储呢?
ubuntu20.4下 ceph安装
1、系统更新
sudo apt update && sudo apt -y upgrade
sudo systemctl reboot
2、时间同步
apt -y install chrony
systemctl start chrony
systemctl enable chrony
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3.配置主机名
hostname ceph1
hostname ceph2
hostname ceph3
4、添加hosts
vim /etc/hosts
192.168.1.10 ceph1
192.168.1.11 ceph2
192.168.1.12 ceph3
5、免密
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub
vi ~/.ssh/authorized_keys
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph1
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph3
6、安装Cephadm(所有节点)
配置 Ceph APT源
echo deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
添加 APT 源 Key
wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
更新源并且安装 ceph-deploy
sudo apt-get update
sudo apt-get install ceph-deploy -y
apt-get install cephadm
7、安装 Ceph
7.1 步骤1: 创建配置文件目录#
7.2 引导集群(创建第一个 mon 节点)
ephadm bootstrap \
--mon-ip 192.168.1.10 \
--initial-dashboard-user admin \
--initial-dashboard-password adb123456
# cephadm bootstrap \
# --mon-ip 第一个节点IP \
# --initial-dashboard-user 用户名 \
# --initial-dashboard-password 密码
3、 安装Ceph 工具
cephadm add-repo --release octopus
cephadm install ceph-common
7.4 、部署 mon 节点
ceph orch apply mon --unmanaged
ceph orch host add {node1}
ceph orch host add {node2}
ceph orch host add {node3}
# 示例
ceph orch host add ceph1
ceph orch host add ceph2
ceph orch host add ceph3
ceph orch host label add {node1} mon
ceph orch host label add {node2} mon
ceph orch host label add {node3} mon
ceph orch host label add ceph1 mon
ceph orch host label add ceph2 mon
ceph orch host label add ceph3 mon
# 查看标记结果 正常如下:
ceph orch host ls
HOST ADDR LABELS STATUS
controller1 controller1 mon
controller2 controller2 mon
controller3 controller3 mon
ceph orch apply mon label:mon
ceph orch apply mon "{node1},{node2},{node3}"
# 示例--注意:controller 之间不能有空格
ceph orch apply mon "ceph1,ceph2,ceph3"
7.5、 部署 osd 节点
步骤一: 增加节点到集群
ceph orch host add {node2}
ceph orch host add {node3}
# 示例
ceph orch host add ceph2
ceph orch host add ceph3
步骤二:标记 osd 节点
ceph orch host add {node1} osd
ceph orch host add {node2} osd
# 示例
ceph orch host add ceph2 osd
ceph orch host add ceph3 osd
步骤三:查看标记结果
ceph orch host ls
# 正常结果如下:
HOST ADDR LABELS STATUS
controller1 controller1 mon
controller2 controller2 osd mon
controller3 controller3 osd mon
7.6、 查看存储节点上所有设备
ceph orch device ls
注意事项:
7.7 、部署 OSD
ceph orch daemon add osd {node1}:/dev/sdb
ceph orch daemon add osd {node2}:/dev/sdb
ceph orch daemon add osd {node3}:/dev/sdb
ceph orch daemon add osd {node1}:/dev/sdc
ceph orch daemon add osd {node2}:/dev/sdc
ceph orch daemon add osd {node3}:/dev/sdc
ceph orch daemon add osd {node1}:/dev/sdd
ceph orch daemon add osd {node2}:/dev/sdd
ceph orch daemon add osd {node3}:/dev/sdd
8、Ceph 相关操作
查看 ceph 状态ceph -s
# 正常如下:
cluster:
id: f2024656-3082-11ec-a2b1-1d2be083b36b
health: HEALTH_OK ###### HEALTH_OK 是正常状态
services:
mon: 3 daemons, quorum controller1,controller3,controller2 (age 3h)
mgr: controller1.fkiash(active, since 3h), standbys: controller2.znlcmv
osd: 9 osds: 9 up (since 49m), 9 in (since 49m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 9.1 GiB used, 891 GiB / 900 GiB avail
pgs: 1 active+clean
9、查看
ceph poolceph osd lspools