什么是对象存储
对象存储以独立的对象的形式管理数据,而不是传统的文件层次结构或块存储的形式。每个对象包括数据、元数据和唯一标识符。元数据是描述数据的信息,比如创建日期、类型和其他相关信息。
主要用于非结构化数据,例如多媒体内容、备份数据、分析数据等,以及任何需要大规模、易于访问和经济有效的数据存储的应用。Amazon S3、Google Cloud Storage 和 OpenStack Swift 是一些常见的公有云对象存储服务。在私有云或本地环境中,Ceph 和 MinIO 是两个常见的对象存储系统。
与文件存储不同,对象存储不使用目录树结构。它把所有的数据都看作是对象,每个对象都由一个唯一的 ID 标识。对象包括数据本身,以及描述数据的元数据,还有一个全局唯一的 ID。
对象存储的优势在于其扩展性和可访问性。对象存储是为大规模数据设计的,它能够很好地处理大量非结构化数据。对象可以跨多个服务器或地理区域分散存储,提供了高度的冗余和可用性。对象存储通常通过 RESTful API 访问,这使得它可以通过网络从任何地方访问,而且开发者可以轻松地集成到应用程序中。
总结起来,文件存储更适合于需要文件级别操作和低延迟访问的传统应用,而对象存储则适合于大规模、非结构化数据的存储和云环境。
对象存储的桶概念
在对象存储系统中,"桶"(Bucket)是一种容器,用于组织和管理存储的对象。每个桶都有一个唯一的名称,用于区分存储在同一对象存储系统中的其他桶。你可以将桶看作是一个逻辑上的存储区域,可以在其中存储、列举和删除对象。
对象存储系统的用户可以创建一个或多个桶,并将对象上传到这些桶中。每个对象都有一个与其所在桶相关联的唯一键,可以用这个键在桶中定位对象。
这里需要注意的是,桶并不等同于传统文件系统的文件夹。在文件系统中,文件夹可以嵌套,形成一个层级结构,但在对象存储中,桶并不能嵌套。每个桶都是平等且独立的,它们只是一种组织对象的方式。
另外,每个桶可以有其自己的配置,如访问权限和生命周期管理规则。例如,你可以为一个桶设置公共读取权限,而另一个桶则设置为私有。或者,你可以为一个桶设置一个规则,自动删除超过一定期限的对象。这为管理和控制存储的数据提供了灵活性。
例如,Amazon S3、Google Cloud Storage 和 Ceph RGW 都使用了桶的概念。你可以通过这些服务的 API 或工具创建桶,上传对象到桶,从桶下载对象,列举桶中的对象,以及管理桶的配置。
什么是RGW
RGW是RADOS Gateway的简称,是一套基于LIBRADOS接口封装而实现的FastCGI服务,对外提供基于 HTTP 的RESTful风格的对象存储数据访问和管理接口,使得 Ceph 存储集群可以像对象存储系统一样使用。
RGW 支持两种主要的对象存储 API:Amazon S3 兼容的 API 和 OpenStack Swift 兼容的 API。这使得可以使用许多已经存在的 S3 或 Swift 工具和库来访问 Ceph 存储。RGW 的主要功能包括:
-
提供 S3 或 Swift 兼容的 API,使得你可以在 Ceph 上存储和检索数据,而不需要知道底层的 RADOS 协议。 -
支持多种访问控制机制,包括 S3 风格的 ACL(Access Control Lists)和 Swift 风格的访问控制。 -
提供数据冗余和复制,确保数据的可靠性和持久性。 -
支持大规模的数据存储,你可以存储几乎无限数量的对象。 -
支持多租户环境,可以在同一 Ceph 集群中为不同的用户或组织提供隔离的存储空间。
因此,如果需要在 Ceph 存储集群中使用对象存储,或者你需要与 S3 或 Swift 兼容的存储,那么 RGW 就会是一个很好的选择。
安装ceph RADOS Gateway
在线方式安装
sudo apt install ceph-radosgw
离线安装
在联网环境下安装 apt-rdepends:
sudo apt-get update
sudo apt-get install apt-rdepends
apt-rdepends 是一个工具,可以列出一个包及其所有递归依赖的包。使用 apt-rdepends 列出 radosgw 及其所有依赖的包:
apt-rdepends radosgw | grep -v "^ " > packages.txt
这会生成一个名为 packages.txt 的文件,包含 radosgw 及其所有依赖的包的名称。使用 apt-get download 下载这些包
mkdir packages
cd packages
xargs -a ../packages.txt apt-get download
这会在 packages 目录下下载 radosgw 及其所有依赖的包。
-
将下载的包拷贝到离线的环境中:
tar -zcvf ceph_radosgw.tar.gz packages
离线环境解压安装
tar -zxvf ceph_radosgw.tar.gz packages
cd packages
dpkg -i *.deb
配置ceph rados gateway
编辑 /etc/ceph/ceph.conf 文件以添加 client.rgw 部分,下面可以添加多个rgw主机,这样,每个 RGW 实例都有自己的配置,并且都可以被独立地启动和停止。这种方式可以提高系统的可用性和容错能力,因为即使一个 RGW 实例出现问题,其他的实例仍然可以继续提供服务。
[client.rgw.node1]
host = node1
rgw_frontends = "civetweb port=80"
[client.rgw.node2]
host = node2
rgw_frontends = "civetweb port=80"
创建keyring
创建 keyring 文件:使用 ceph-authtool 命令来创建 keyring 文件,然后使用 chown 命令来更改文件的所有者为 ceph 用户。
sudo mkdir -p /var/lib/ceph/radosgw/ceph-rgw.`hostname`/
sudo ceph-authtool /var/lib/ceph/radosgw/ceph-rgw.`hostname`/keyring --create-keyring --gen-key -n client.rgw.`hostname`
sudo chown ceph:ceph /var/lib/ceph/radosgw/ceph-rgw.`hostname`/keyring
添加 keyring 到 Ceph 集群:你需要将新创建的 keyring 添加到你的 Ceph 集群中。
sudo ceph auth add client.rgw.`hostname` osd 'allow rwx' mon 'allow rwx' -i /var/lib/ceph/radosgw/ceph-rgw.`hostname`/keyring
重启ceph rados gateway
sudo systemctl start ceph-radosgw@rgw.`hostname`
创建rgw 数据池
创建数据池以供 RGW 使用。在命令行中运行 ceph 命令以创建所需的池。
ceph osd pool create .rgw.root 64
ceph osd pool create default.rgw.control 64
ceph osd pool create default.rgw.data.root 64
ceph osd pool create default.rgw.gc 64
ceph osd pool create default.rgw.log 64
ceph osd pool create default.rgw.users.uid 64
ceph osd pool create default.rgw.users.email 64
ceph osd pool create default.rgw.users.swift 64
ceph osd pool create default.rgw.buckets.index 64
ceph osd pool create default.rgw.buckets.data 64
解释下上面创建的数据池的作用
-
.rgw.root:存储 RGW 的配置信息和元数据,例如区域和区域组的定义。 -
default.rgw.control:用于 RGW 控制数据。 -
default.rgw.data.root:默认情况下,新创建的 RGW bucket 的元数据会存储在这个池中。 -
default.rgw.gc:用于存储将被垃圾收集器清理的对象列表。 -
default.rgw.log:用于记录 RGW 的访问日志。 -
default.rgw.users.uid、default.rgw.users.email、default.rgw.users.swift:存储不同类型的用户信息。 -
default.rgw.buckets.index:存储每个 bucket 的索引信息,用于快速查找和访问 bucket 中的对象。 -
default.rgw.buckets.data:默认情况下,新创建的 RGW bucket 的对象数据会存储在这个池中。
在执行上面操作中可能会报如下错误
pg_num 64 size 3 would mean 771 total pgs, which exceeds max 750 (mon_max_pg_per_osd 250 * num_in_osds 3
新创建的 placement groups(PG)数量超过了 Ceph 集群的限制。Ceph 集群设置了每个 OSD 可以支持的最大 PG 数量,这是通过参数 mon_max_pg_per_osd 来控制的。
mon_max_pg_per_osd 的值被设置为了 250,而此时的集群中有 3 个 OSDs,因此,集群总共可以支持 250 * 3 = 750 个 PGs。现在尝试创建的 PG 数量为 64 * 3 = 192 个(因为 size 参数设置为 3,每个 PG 都会有两个副本),加上集群中已经存在的 PG 数量,总数超过了 750。可以采取以下几种策略来解决这个问题:
-
增加 mon_max_pg_per_osd 的值:这将增加每个 OSD 支持的 PG 数量,从而增加集群总体可以支持的 PG 数量。但是过多的 PGs 可能会消耗更多的内存和 CPU 资源,可能导致性能下降。
ceph config set global mon_max_pg_per_osd 300
查看当前osd可以支持的最大pg数
ceph config get mon mon_max_pg_per_osd
-
添加更多的 OSDs:通过增加 OSD 的数量,增加集群总体可以支持的 PG 数量。 -
减小 pg_num 的值:降低 pg_num 的值可以减少新创建的 PG 数量,从而使得总 PG 数量不超过限制。但是,pg_num 的值应该根据你的数据分布和性能需求来设置,过小的 pg_num 可能会导致数据分布不均,性能下降。
使用radosgw-admin 命令行工具来创建用户
radosgw-admin user create --uid="wanger" --display-name="wanger"
创建完成后需要保存好access_key和secret_key,后面配置 S3 客户端和其他工具会用到在 Ceph RADOS Gateway (RGW) 中,可以使用 S3 兼容的客户端工具(例如 AWS CLI、s3cmd、boto3 等)或者 librgw API 来上传数据。下面以awscli为例进行实验
-
安装 AWS CLI
apt-get install awscli
-
配置 AWS CLI:运行 aws configure 命令来配置 S3 客户端。需要提供访问密钥、安全密钥、默认区域名称(可以设置为 us-east-1),以及默认输出格式(可以设置为 json)。
aws configure
将访问密钥和安全密钥设置为你在 RGW 中创建的用户的密钥。
-
创建bucket:使用aws s3api create-bucket命令来创建新的bucket。例如:
aws s3api create-bucket --bucket mybucket --endpoint-url http://node1
-
上传数据:使用 aws s3 cp 命令来上传文件到 bucket。例如:
aws s3 cp myfile.txt s3://mybucket/myfile.txt --endpoint-url http://node1
-
列出 bucket 中的文件:使用 aws s3 ls 命令来列出 bucket 中的所有文件。例如:
aws s3api head-object --bucket mybucket --key myfile.txt --endpoint-url http://node1
-
删除文件:使用 aws s3 rm 命令来删除 bucket 中的文件。例如:
aws s3 rm s3://mybucket/myfile.txt --endpoint--url http://node1
公众号:运维开发故事
github:https://github.com/orgs/sunsharing-note/dashboard
博客:https://www.devopstory.cn
爱生活,爱运维
我是wanger,《运维开发故事》公众号团队中的一员,一线运维农民工,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!
扫码二维码
关注我,不定期维护优质内容
温馨提示
如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!
你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。
........................