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:
(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):
ES查询该文件信息:
tagging
通过S3 Brower 添加tagging(或通过python boto3 tagging函数添加):
ES查询该文件信息:
查询
通过postman 结构化查询ES
通过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>"86015ae7a7f787bd4c5b6df1f3a8a0f1"</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清空。