ceph怎么搭建文件存储_Ceph RGW搭建ES同步模块

本文介绍了如何使用Ceph RGW搭建Elasticsearch同步模块,以增强对象存储的检索能力。详细步骤包括:部署环境设置、ceph集群搭建、RGW与Elasticsearch的配置、自定义元数据和tagging的使用,以及通过postman和RGW进行查询操作。文章指出,RGW的ES查询功能可能存在不完善的情况,建议直接使用Elasticsearch进行复杂查询。
摘要由CSDN通过智能技术生成

RGW搭建ES同步模块

前言

目前对象存储提供的检索服务十分有限,仅有prefix查询,对于海量小文件来说,丰富的检索能力对于应用来说是十分友好的,特别是在大数据时代,优势越益明显。通过ceph 自带的es同步模块,将对象属性通过X-Amz-Meta-xxx 或 tagging 打上对应标签,在对其进行模糊查询,准确查询,自定义标签查询,以满足上层应用的需求

部署

环境详情:

ceph 版本:12.2.12

elasticsearch 版本:6.8.1

node65 172.16.20.65 mon,osd,rgw

node66 172.16.20.66 osd,rgw,elastciseatch

搭建ceph集群

此步骤跳过,具体可见《ceph-deploy搭建ceph集群》

搭建master zone,slave zone

(1)创建默认的realm

radosgw-admin realm create --rgw-realm=default --default

(2)将默认的zonegroup关联至realm

radosgw-admin zonegroup modify  --rgw-zonegroup=default  --rgw-realm="default"  --master --default

(3)将master zone 关联至 zonegroup

radosgw-admin zone modify  --rgw-zone=default --rgw-zonegroup=default --rgw-realm=default 
--master --default --endpoints=http://172.16.20.65:7480

更新配置

radosgw-admin period update --commit

(4)创建同步用户 以及 配置网关

# 创建同步用户
radosgw-admin user create --uid=sync --display-name="sync" --access-key=sync  --secret=sync  --system

# 配置网关
[client.rgw.node65]
host = node65
rgw_frontends = civetweb port=7480
rgw_content_length_compat = true

[client.rgw.node66]
host = node66
rgw_frontends = civetweb port=7480
rgw_content_length_compat = true
rgw_zone = es-zone

ps:

此处可先配置好2个网关的配置

启动网关:

systemctl start ceph-radosgw@rgw.node65

(4)配置slave zone (es zone)

RGW支持配置ES参数有:

endpoint

指定要访问的Elasticsearch服务器端点

num_shards (整数)

数据同步初始化时将为Elasticsearch配置的分片数。请注意,初始化后无法更改。此处的任何更改都需要重建Elasticsearch索引并重
新初始化数据同步过程。

num_replicas (整数)

数据同步初始化时将为Elasticsearch配置的副本数。

explicit_custom_meta (正确|错误)

指定是否将对所有用户自定义元数据编制索引,或者用户是否需要配置(在存储桶级别)应为哪些自定义元数据条目编制索引。默认为假

index_buckets_list (以逗号分隔的字符串列表)

如果为空,则将对所有存储桶建立索引。否则,将仅索引此处指定的存储桶。可以提供存储桶前缀(例如foo *)或存储桶后缀(例如* bar)。

approved_owners_list (以逗号分隔的字符串列表)

如果为空,将为所有所有者的存储桶建立索引(受其他限制),否则,将仅对指定所有者拥有的存储桶建立索引。也可以提供后缀和前缀。

override_index_path (串)

如果不为空,则此字符串将用作elasticsearch索引路径。否则,索引路径将在同步初始化时确定并生成。

#配置es zone:

radosgw-admin zone  create --rgw-zone es-zone --rgw-zonegroup default --rgw-realm=default   
--endpoints=http://172.16.20.66:7480  --access-key=sync  --secret=sync  --tier-type=elasticsearch 
--tier-config=endpoint=http://172.16.20.66:9200

radosgw-admin period update --commit

(5)配置Elasticsearch

具体可见《Elasticsearch部署使用文档》

(6)启动66节点上的rgw

systemctl start ceph-radosgw@rgw.node66

(7)创建网关用户,使用S3 Browser上传文件

radosgw-admin user create --uid=piglet --display-name="piglet" --access-key=123456  --secret=123456

查看es index:

7cd03031a6b36d98ced0e87d52e4695f.png

(8)查看存储池 及 同步状态

# es7-zone为es7测试,可忽略
[root@node65 es]# ceph df 
GLOBAL:
    SIZE       AVAIL      RAW USED     %RAW USED 
    400GiB     396GiB      4.15GiB          1.04 
POOLS:
    NAME                           ID     USED        %USED     MAX AVAIL     OBJECTS 
    .rgw.root                      1      19.5KiB         0        188GiB          32 
    default.rgw.control            2           0B         0        188GiB           8 
    default.rgw.meta               3      1.58KiB         0        188GiB          13 
    default.rgw.log                4          63B         0        188GiB         216 
    default.rgw.buckets.index      5           0B         0        188GiB           2 
    default.rgw.buckets.data       6      26.6MiB      0.01        188GiB          15 
    default.rgw.buckets.non-ec     8           0B         0        188GiB           0 
    es-zone.rgw.control            9           0B         0        188GiB           8 
    es-zone.rgw.meta               10     1.58KiB         0        188GiB          11 
    es-zone.rgw.log                11     8.04KiB         0        188GiB         745 
    es-zone.rgw.buckets.index      12          0B         0        188GiB           2 
    es7-zone.rgw.control           13          0B         0        188GiB           8 
    es7-zone.rgw.meta              14     1.55KiB         0        188GiB          11 
    es7-zone.rgw.log               15     8.04KiB         0        188GiB         690 
    es7-zone.rgw.buckets.index     16          0B         0        188GiB           2 


[root@node65 es]# radosgw-admin sync status --rgw-zone es-zone
          realm 17000d76-be15-49c7-87f1-b5ac88829d05 (default)
      zonegroup cc783421-e210-4a0b-9d07-59e64c20b328 (default)
           zone 5c6c038f-ff02-405f-a822-ac23ae1595d5 (es-zone)
  metadata sync syncing
                full sync: 0/64 shards
                incremental sync: 64/64 shards
                metadata is caught up with master
      data sync source: 3f934da4-2c5c-45c1-ad16-a4c288b9bc0d (default)
                        syncing
                        full sync: 0/128 shards
                        incremental sync: 128/128 shards
                        data is caught up with source

配置自定义元数据、tagging

自定义元数据

可通过

POST /bucket?mdsearch 添加ES的自定义对应索引

DELETE /bucket?mdsearch 删除ES的自定义对应索引

GET /bucket?mdsearch 获取ES的自定义对应索引

脚本如下:

[root@node65 es]# cat curl.sh 
#!/usr/bin/sh

bucket=mytest
url="172.16.20.65:7480"
resource="/${bucket}"
contentType="application/x-compressed-tar"
dateValue=`date -R -u`
#CanonicalizedHeaders="content-type:${contentType}nhost:${bucket}.${url}nx-amz-date:${dateValue}nx-amz-meta-search:x-amz-meta-keyword;stringn"
CanonicalizedHeaders="x-amz-meta-search:x-amz-meta-myname;string, x-amz-meta-keyword;string"
stringToSign="POSTnn${contentType}n${dateValue}n${CanonicalizedHeaders}n${resource}"
s3Key="123456"
s3Secret="123456"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X POST 
  -H "Host: ${bucket}.${url}" 
  -H "Date: ${dateValue}" 
  -H "Content-Type: ${contentType}" 
  -H "X-Amz-Meta-Search: x-amz-meta-myname;string, x-amz-meta-keyword;string" 
  -H "Authorization: AWS ${s3Key}:${signature}" "http://${url}/${bucket}?mdsearch"

此处通过X-Amz-Meta-Search自定义了2个元数据:

(1)x-amz-meta-myname

(2)x-amz-meta-keyword

通过S3 Brower 添加自定义请求头(需V4):

ebe357cf19a9bc1919d6902f2eddba6c.png

ES查询该文件信息:

c066a9c2770f6c5f34b35e5aa9a2067f.png

tagging

通过S3 Brower 添加tagging(或通过python boto3 tagging函数添加):

2d128dd32f893054510eafe762c0e705.png

ES查询该文件信息:

8efb974d82bdad9c60911a9843c9b8be.png

查询

通过postman 结构化查询ES

1a2155112c8c1dbdfb86fb2b708d5a4f.png

通过RGW查询

GET /{bucket}?query={query-expr}

输出将是XML中的键列表,该列表类似于S3列表存储桶响应

脚本:

[root@node65 es]# vi es-get.sh 
#!/usr/bin/sh

bucket=mytest
url="172.16.20.66:7480"
resource="/${bucket}"
contentType="application/x-compressed-tar"
dateValue=`date -R -u`
stringToSign="GETnn${contentType}n${dateValue}n${resource}"
s3Key="123456"
s3Secret="123456"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -i -v -X GET 
  -H "Host: ${bucket}.${url}" 
  -H "Date: ${dateValue}" 
  -H "Content-Type: ${contentType}" 
  -H "Authorization: AWS ${s3Key}:${signature}" "http://${url}/${bucket}?query=name==bg"

返回结果:

[root@node65 es]# sh es-get.sh 
* About to connect() to 172.16.20.66 port 7480 (#0)
*   Trying 172.16.20.66...
* Connected to 172.16.20.66 (172.16.20.66) port 7480 (#0)
> GET /mytest?query=name==bg HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host: mytest.172.16.20.66:7480
> Date: Thu, 17 Dec 2020 01:50:19 +0000
> Content-Type: application/x-compressed-tar
> Authorization: AWS 123456:MQzLNEjmXWrzJVeI5Nv598lsGe4=
> 
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< x-amz-request-id: tx000000000000000000338-005fdab95b-c5b8e-es-zone
x-amz-request-id: tx000000000000000000338-005fdab95b-c5b8e-es-zone
< Content-Type: application/xml
Content-Type: application/xml
< Content-Length: 626
Content-Length: 626
< Date: Thu, 17 Dec 2020 01:50:19 GMT
Date: Thu, 17 Dec 2020 01:50:19 GMT

< 
* Connection #0 to host 172.16.20.66 left intact
<SearchMetadataResponse><Marker></Marker><IsTruncated>false</IsTruncated><Contents><Bucket>mytest
</Bucket><Key>bg-123.jpg</Key><Instance>null</Instance><VersionedEpoch>0
</VersionedEpoch><LastModified>2020-12-16T08:44:24.726Z</LastModified><Size>174658</Size>
<ETag>&quot;86015ae7a7f787bd4c5b6df1f3a8a0f1&quot;</ETag><ContentType>image/jpeg</ContentType>
<StorageClass></StorageClass><Owner><ID>piglet</ID><DisplayName>piglet</DisplayName></Owner><CustomMetadata><Entry><Name>keyword</Name><Value>book book2</Value></Entry><Entry>
<Name>myname</Name><Value>test</Value></Entry></CustomMetadata></Contents></SearchMetadataResponse>

ps:

当文件名带-或.特殊字符时,可能查询出不来例如:name==bg-123 或 name==.jpg

RGW的ES应该做的不够完善,故最好使用直接访问ES的查询功能,权限限制这些通过前端应用限制

S3 Brower 添加自定义请求头时,会将原先存在的tagging清空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值