Elasticsearch 可搜索快照技术原理及最佳实践
导语 : Elasticsearch于7.10版本推出可搜索快照功能,但是7.10版本的可搜索快照技术还不够成熟,随着7.14版本的发布,可搜索快照技术才真正能够大规模用于生产实践中。本文将基于ES 7.14.2版本,继续从原理和实践两个角度向大家介绍可搜索快照技术。
一、可搜索快照技术原理
(一)DataTier模型
Content tier:主要处理产品目录等内容型索引和查询负载;
Hot tier:主要处理数据的读写,尤其是时序类数据的写入和查询,由于对读写性能要求最高,并且查询的频率也最高,因此我们建议对于Hot tier的节点挂载SSD硬盘;
Warm tier:主要处理时序类场景数据,数据不再被更新,查询频率相对Hot tier节点较低;
Cold tier:主要处理数据的读请求,且查询的数据较老,通常查询频率更低,因此建议Warm/Cold tier的节点挂载HDD;
Frozen tier:查询的频率更低,可能半年才查询那么几次,但是这种数据体量其实是最大的;于Frozen tier中的数据,则是通过可搜索快照的技术挂载在集群中的。原始的数据其实是在快照中,集群中只会保存索引的元数据相关信息,以及每次查询时的缓存数据。
(二)节点属性优化
node.roles: ["data_hot", "data_content", "ingest", "ml", "remote_
cluster_client", "transform"]
专用主节点的node.roles则是:
node.roles: ["master"]
如果集群中有Frozen tier的节点,我们通过是将该节点设置为专用Frozen节点,不和任何角色混用,如设置node.roles如下:
node.roles: ["data_frozen"]
PUT {index_name}/_settings
{
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_warm,data_cold,data_hot"
}
}
}
}
}
(三)工作原理
全量挂载(Fully mounted index)
部分挂载(Partially mounted index)
POST /_snapshot/default_searchable_snapshot_repository/my_cos_snapshot/_mount?wait_for_completion=true&storage=shared_cache
{
"index": "wurong-test-2021.11.26-000001",
"renamed_index": "wurong-test-2021.11.26-000001_from_cos",
"index_settings": {
"index.number_of_replicas": 0
},
"ignore_index_settings": [ "index.refresh_interval" ]
}
POST /sale*/_async_search?size=0
{
"sort": [
{ "date": { "order": "asc" } }
],
"aggs": {
"sale_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "1d"
}
}
}
}
二、可搜索快照操作实践
(一)集群环境准备
POST /_license/start_trial?acknowledge=true
调用API后如图4所示,说明当前集群已经是企业版集群了。
(二)创建快照仓库
PUT _snapshot/default_searchable_snapshot_repository
{
"type": "cos",
"settings": {
"app_id": "1254139681",
"access_key_id": "xxxx",
"access_key_secret": "xxxx",
"bucket": "wurong-es-snapshpt",
"region": “ap-guangzhou",
"compress": true,
"chunk_size": "500mb",
"base_path": "/searchable-snapshot"
}
}
(三)配置索引生命周期管理
配置ILM的Policy
首先我们在Kibana上配置索引生命周期管理的Policy,路径为:Management-Stack Management-Data-Index Lifecycle Polices。主要是设置ILM的策略名称,每个Phase的触发Condition。
PUT _ilm/policy/searchable_snapshot_test_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "100mb",
"max_primary_shard_size": "10mb",
"max_age": "20m",
"max_docs": 1000000
},
"set_priority": {
"priority": 100
}
}
},
"cold": {
"min_age": "1h",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "default_searchable_snapshot_repository",
"force_merge_index": true
},
"set_priority": {
"priority": 0
},
"allocate": {
"number_of_replicas": 0
}
}
},
"frozen": {
"min_age": "2h",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "default_searchable_snapshot_repository",
"force_merge_index": true
}
}
}
}
}
}
配置索引模版
PUT _template/searchable_snapshot_test_template
{
"order": 100,
"index_patterns": [
"wurong-test*"
],
"settings": {
"index": {
"lifecycle": {
"name": "searchable_snapshot_test_policy",
"rollover_alias": "wurong-test"
},
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_hot,data_warm,data_cold"
}
}
},
"refresh_interval": "30s",
"number_of_shards": "5",
"translog": {
"sync_interval": "5s",
"durability": "async"
},
"max_result_window": "65536",
"unassigned": {
"node_left": {
"delayed_timeout": "5m"
}
},
"number_of_replicas": "1"
}
}
}
创建初始索引
PUT %3Cwurong-test-%7Bnow%2Fd%7D-000001%3E
{
"aliases": {
"wurong-test":{
"is_write_index": true
}
}
}
效果展示
作者:吴容——腾讯云Elasticsearch高级开发工程师
关于21CTO.com
21CTO.com是开发者的学习与服务平台。
我们为开发者提供高质量的资讯、学习以及工具等产品;
帮助企业快速对接开发者,包括人才招聘,数字化转型咨询,软件研发等服务。
网站地址:www.21cto.com
投稿邮箱:info@21cto.com
联系微信:13426109659
扫描二维码关注21CTO微信号