OpenStack运维篇:Swift组件概述及命令详解
Swift是由Rackspace开发并贡献给OpenStack的分布式对象存储服务,采用一致性哈希算法实现数据均衡分布,支持PB级存储容量。其架构分为访问层(处理REST API请求)和存储层(管理Account/Container/Object数据),通过多副本机制确保高可用性。运维操作包括使用swift stat查看服务状态和openstack container create创建容器等命令。
一、Swift概述
1. Swift概述
Swift 最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一,为其Nova子项目提供虚机镜像存储服务。Swift构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。Swift在OpenStack系统中不依赖于任何服务,可以独立部署为其他系统提供分布式对象存储服务。而在OpenStack的应用中,其Proxy Server往往由Keystone节点兼任,由Keystone来完成服务访问的安全认证。
Swift是业务提供时,使用普通的服务器来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。通过统一REST API进行友好访问,不仅易于扩展,且无中心数据库,避免单点故障或单点性能瓶颈。Swift主要通过Account、Container和Object三个表单结构来完成存储对象的存储、查询、获取和上传等功能,通过数据存储的多副本机制实现数据的高可用。
2. Swift的架构和组件
Swift的架构是一种完全对称、面向资源的分布式系统架构,所有组件都可扩展,避免因单点失效而影响整个系统运转。通信方式采用非阻塞式 I/O 模式,提高了系统吞吐和响应能力,如下图所示。系统架构整体上采用分层的理念设计,共分为两层:访问层和存储层。Controller的Ring以上部分属于访问层,接收外部REST API的访问,实现负载均衡和访问安全验证,并定位对象数据的存储的位置。后端的Server部分属于存储层,用来分别存储不同的对象数据:Account、Container和Object。
3. Swift中的数据结构原理
Swift中最重要的算法就是一致性哈希(Consistent Hashing),它是Swift实现海量数据存储,并能实现数据均衡度和可扩展性兼容的保证,可以不过分的认为一致性哈希算法是所有分布式存储的灵魂,不仅Swift中有它的影子,在开源分布式存储Ceph以及华为分布式存储FusionStorage中同样有它的影子。在面对海量级别的对象,需要存放在成千上万台服务器和硬盘设备上,首先要解决寻址问题,即如何将对象均匀地分布到这些设备地址上。这也是Swift中的一致性哈希首先要解决的问题,算法的基本思路是:通过计算可将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;虚拟空间大小通常采用2的n次幂,便于进行高效的移位操作;然后通过独特的数据结构 Ring(环)再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。
二、Swift运维
2.1 查看服务状态
[root@controller ~]# swift stat
Account: AUTH_1fc6d5693088417db5d90001b8639cea
Containers: 2
Objects: 3
Bytes: 13287936
Containers in policy "policy-0": 2
Objects in policy "policy-0": 3
Bytes in policy "policy-0": 13287936
X-Account-Project-Domain-Id: 698d058275304ede912627430540fa13
X-Openstack-Request-Id: tx694a96783f7746fb88f5f-00632faea6
X-Timestamp: 1664023652.56722
X-Trans-Id: tx694a96783f7746fb88f5f-00632faea6
Content-Type: application/json; charset=utf-8
Accept-Ranges: bytes
2.2 创建容器
通过“openstack container create”命令创建容器,命令格式如下所示:
openstack container create
# 使用命令创建容器,名称为"swift_test"
$ openstack container create swift_test
+---------------------------------------+------------+------------------------------------+
| account | container | x-trans-id |
+---------------------------------------+------------+------------------------------------+
| AUTH_1fc6d5693088417db5d90001b8639cea | swift_test | txab5bc2ddaa6143c48fb64-00632fafb0 |
+---------------------------------------+------------+------------------------------------+
2.3 查看容器
$ openstack container list
+------------+
| Name |
+------------+
| swift_test |
+------------+
2.4 创建对象
创建完容器后,可以创建对象,通过使用命令“openstack object create”在容器中创建对象。命令格式如下
所示: openstack object create <容器名> <文件对象>
$ openstack object create swift_test anaconda-ks.cfg
+-----------------+------------+----------------------------------+
| object | container | etag |
+-----------------+------------+----------------------------------+
| anaconda-ks.cfg | swift_test | 17d1d7c3ecd7773569b07e1e6289bd17 |
+-----------------+------------+----------------------------------+
2.5 查看对象
$ openstack object list swift_test 语法格式:openstack object list <容器名>
+-----------------+
| Name |
+-----------------+
| anaconda-ks.cfg |
+-----------------+
# 可以使用openstack object show <容器名> <对象> 查看容器中对象的详细信息
$ openstack object show swift_test anaconda-ks.cfg
+----------------+---------------------------------------+
| Field | Value |
+----------------+---------------------------------------+
| account | AUTH_1fc6d5693088417db5d90001b8639cea |
| container | swift_test |
| content-length | 1780 |
| content-type | application/octet-stream |
| etag | 17d1d7c3ecd7773569b07e1e6289bd17 |
| last-modified | Sun, 25 Sep 2022 01:37:04 GMT |
| object | anaconda-ks.cfg |
+----------------+---------------------------------------+
2.6 下载对象
存储在容器中的对象,可以在需要使用时,通过“openstack object save”命令进行下载至本地,命令格式如下所示: openstack object save <容器名> <对象>
使用命令将“swift-test”容器中“anaconda-ks.cfg”对象下载至本地/opt/目录下。操作命令如下所示:
$ openstack object save swift_test anaconda-ks.cfg
[root@controller opt]# ls
anaconda-ks.cfg centos iaas
[root@controller opt]#
2.7 删除对象
使用“openstack object delete”命令删除容器内的对象,命令格式如下所示
openstack object delete <容器名> <对象>
[root@controller opt]# openstack object list swift_test
+-----------------+
| Name |
+-----------------+
| anaconda-ks.cfg |
+-----------------+
[root@controller opt]# openstack object delete swift_test anaconda-ks.cfg
[root@controller opt]# openstack object list swift_test
[root@controller opt]#
2.8 删除容器
使用“openstack object delete”命令删除容器内的对象,命令格式如下所示:
openstack container delete <容器名>
1)使用命令删除“swift_test”容器
root@controller ~]# openstack container delete swift_test
Conflict (HTTP 409) (Request-ID: tx8e5c5c9364be4e18a0188-00632fb3bb)
# 使用删除容器命令将“swift-test”容器删除,因为容器内存有对象,所以无法直接删除
# 需要添加“--recursive”参数将容器内部对象一起删除,才可以删除“swift-test”容器,查看容器列表信息
[root@controller ~]# openstack container delete --recursive swift_test
[root@controller ~]# openstack container list
2.9 分片存储案例
1)创建容器
[root@controller ~]# swift post swift_test
[root@controller ~]# swift stat swift_test
Account: AUTH_1fc6d5693088417db5d90001b8639cea
Container: swift_test
Objects: 0
Bytes: 0
Read ACL:
Write ACL:
Sync To:
Sync Key:
Accept-Ranges: bytes
X-Storage-Policy: Policy-0
Last-Modified: Sun, 25 Sep 2022 01:52:55 GMT
X-Timestamp: 1664023652.57997
X-Trans-Id: tx2b6c159a18ea496db09c8-00632fb487
Content-Type: application/json; charset=utf-8
X-Openstack-Request-Id: tx2b6c159a18ea496db09c8-00632fb487
2)上传镜像并分片存储
将提供的cirros-0.3.4-x86_64-disk.img镜像上传至controller节点的/root目录下,并使用命令上传至test容器中,进行分片存储,每个片段的大小为10M
[root@controller ~]# ls
admin-openrc.sh anaconda-ks.cfg cirros-0.3.4-x86_64-disk.img logininfo.txt
# 上传镜像至容器并进行分片 -S 分片存储 默认单位是B 10M=10485760B
$ swift upload swift_test -S 10000000 cirros-0.3.4-x86_64-disk.img
cirros-0.3.4-x86_64-disk.img segment 1
cirros-0.3.4-x86_64-disk.img segment 0
cirros-0.3.4-x86_64-disk.img
# 查看cirros镜像的存储路径
[root@controller ~]# swift stat swift_test cirros-0.3.4-x86_64-disk.img
Account: AUTH_1fc6d5693088417db5d90001b8639cea
Container: swift_test
Object: cirros-0.3.4-x86_64-disk.img
Content Type: application/octet-stream
Content Length: 13287936
Last Modified: Sun, 25 Sep 2022 01:55:03 GMT
ETag: "cca17a689bfcd70118fabc833af0d033"
Manifest: swift_test_segments/cirros-0.3.4-x86_64-disk.img/1664068344.301414/13287936/10000000/
Meta Mtime: 1664068344.301414
Accept-Ranges: bytes
X-Timestamp: 1664070902.49337
X-Trans-Id: txef7947259ac74714b1939-00632fb559
X-Openstack-Request-Id: txef7947259ac74714b1939-00632fb559
# 查看存储路径中的数据片
[root@controller ~]# swift list
swift_test
swift_test_segments
[root@controller ~]# swift list swift_test_segments
cirros-0.3.4-x86_64-disk.img/1664068344.301414/13287936/10000000/00000000
cirros-0.3.4-x86_64-disk.img/1664068344.301414/13287936/10000000/00000001
# 可以看到,cirros镜像在上传至swfit对象存储中被分片存储了,单个存储片的大小为10M,因为该镜像大小为16M左右,所有分成了两个存储片。
更多推荐
所有评论(0)