对象存储 swift
对象存储 是一种用于存储和管理大量数据的系统。类似于一个超大云盘。可以存储各种文件。(照片,视频,文档等等)。与传统的文件存储不同,对下个存储不关心文件的目录结构和层级关系,而是将每个文件视为一个独立的对象(Object).每个对象都有一个唯一的标识符,我们可以通过这个标识符来找到和访问对象。
为了确保数据的可靠性和安全性,对象存储会将每个对象分成对各副本,并将这些副本分散存储在不同的存储服务器上。这样,即使某个服务器出现故障,我们仍然可以通过其他副本来获取文件。当我们想要上传文件时,我们将文件分成小块,并将这些块分发发哦不同的存储服务器上。每个块都有自己的效验码,以便需要时进行数据校验和修复。
当我们需要访问文件时,我们只需要提供文件的唯一标识符,对象存储系统就会根据标识符找到对应的存储服务器,并将文件块重新组装起来,然后,将完整的文件返回给我们。
swfit的特点
- 高可用性:swift采用了多副本,冗余和分布式架构,以确保数据的高可用性和可靠性。当一个存储节点发生故障时,系统可以自动地将数据复制到其他节点上,以确保数据的完整性和可用性。
- 可扩展性:swift可以轻松的扩展到数千台服务器,支持pb级别的数据存储,同时也支持水平和垂直扩展,以应对日益增长的数据需求
- 强安全性:swift提供了多种安全机制,包括认证,授权,访问控制,加密等,以保护用户的数据免受恶意攻击和非法访问
- 高性能:swift采用了分布式存储和负载均衡技术,以确保数据的快速访问和高效传输。同时,swift还支持多种数据访问协议,如RESTful API、Swift API、S3 API等,以满足不同用户的需求。
- 易用性:swift提供了简单,易用的api和web界面
什么是openstack swift
swift和hadoop分布式文件系统(hdfs)都有着相似的目的:实现冗余,快速,联网的存储,它们的技术差异:
- swift中,元数据呈分布式,跨集群复制。而hdfs使用了中央系统来维护文件元数据(namenode,名称节点),这对hdfs来说无异于单一故障点,因而扩展到规模非常大的环境显得更困难
- swift中有多租户架构,而hdfs没有多租户架构这个概念
- swift中文件可以写入多次;在并发操作环境下,以最近一次的操作为准。而hdfs中,文件写入一次,而且每次只能有一个文件写入
- swift使用python hdfs使用java
- swift被设计成了一种比较通用的存储解决方案,能够可靠地存储数量非常多的大小不一的文件;而hdfs被设计成可以存储数量中等的大文件(hdfs针对更庞大的文件做了优化),以支持数据处理。
Proxy Server:负责接收客户端的请求,并将请求分发到后端的存储节点上,同时也负责处理授权、认证和负载均衡等。
Object Server:存储对象数据,如图片、视频、文档等。
Container Server:存储对象容器数据,如文件夹、目录等。
Account Server:存储账户和认证信息,如用户、密码、角色等。
Replicator:负责对象和容器的数据复制和同步,以保证数据的冗余和高可用性。
Auditor:负责对对象和容器的数据进行检查和验证,以确保数据的完整性和可用性。
Updater:负责对对象和容器的元数据进行更新和同步,以支持Swift的高效管理和查询。
工作原理
- 用户发起请求
用户通过RESTful API 发起http请求(例如GET,POST,PUT,DELETE等),以便存储在swift中的对象进行交互。这些请求首先发送搭配代理服务器
- 身份认证和授权
代理服务器接收到请求后,首先对用户进行身份验证,以确保用户具有执行请求操作的权限。swift与openstack的身份验证服务keystone继承,以提供身份验证和授权功能。
- 请求路由
代理服务器根据请求类型(账户,容器或对象操作)将请求路由到适当的服务器。此外,代理服务器还利用ring(一致性哈希环)来确定存储节点的位置
- ring和数据分布
ring使用一致性哈希算法将数据均匀地分布在各个存储节点上,要实现负载均衡和高可用性。当请求到达存储节点时,ring负责确定数据应存储在哪个位置以及如何检索数据。
- 数据持久化
对象服务器将数据写入存储设备。swift将数据分割为多个分片,并在多个存储节点上存储数据的多个副本,以确保数据的可靠性和容错能力。(Swift 会在节点内部创建数据的多个副本(如果你配置了副本数量))
- 复制和一致性
复制器会定期检查数据副本的数量和完整性。如果某个存储节点发生故障或者数据损坏,复制器会自动创建新的副本以保持数据的可用性。同时,审计员会定期检查存储节点上的数据完整性和一致性,并在发现问题时出发复制器
- 响应返回
完成操作后,存储节点将结果返回给代理服务器。代理服务器会将结果以http相应的形式返回给用户。
操作
[root@controller swift]# openstack container create swift-test
+---------------------------------------+------------+------------------------------------+
| account | container | x-trans-id |
+---------------------------------------+------------+------------------------------------+
| AUTH_2fc2d17699ab4d1784a9b0f96e630915 | swift-test | txd6233772ee8248f2913ca-0066ece0e0 |
+---------------------------------------+------------+------------------------------------+
[root@controller swift]# openstack container list
+------------+
| Name |
+------------+
| swift-test |
+------------+
[root@controller swift]# mkdir test
[root@controller swift]# echo 'hello word' > test/lll.txt
[root@controller swift]# openstack object create swift-test test/lll.txt
+--------------+------------+----------------------------------+
| object | container | etag |
+--------------+------------+----------------------------------+
| test/lll.txt | swift-test | 4d2220fcf2abf3a9baac712bb93bd29c |
+--------------+------------+----------------------------------+
[root@controller swift]# openstack object list swift-test
+--------------+
| Name |
+--------------+
| test/lll.txt |
+--------------+
[root@controller swift]# rm -rf test/
[root@controller swift]# openstack object save swift-test test/lll.txt
[root@controller swift]# ls test/
lll.txt
[root@controller swift]# cat test/lll.txt
hello word
[root@controller swift]#
切片式上传
[root@controller ~]# swift upload swift-test -S 4096 cirros-0.5.1-x86_64-disk.img
[root@controller ~]# openstack container list
+---------------------+
| Name |
+---------------------+
| a |
| swift-test |
| swift-test_segments |
+---------------------+
[root@controller ~]# openstack object list swift-test_segments
+-----------------------------------------------------------------------+
| Name |
+-----------------------------------------------------------------------+
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000000 |
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000001 |
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000002 |
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000003 |
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000004 |
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000005 |
| cirros-0.5.1-x86_64-disk.img/1726651615.838030/16338944/4096/00000006 |
省略
# 发现每个都是4096 4mb的分片