如何提高网站的权重,网站如何做漂浮窗,wordpress 删除钩子,长沙网站制作哪一、自动创建新索引的方法
MySQL的分库分表大家是非常熟悉的#xff0c;在Elasticserach中有存在类似的场景需求。为了不让单个索引太过于庞大#xff0c;从而引发性能变差等问题#xff0c;我们常常有根据索引大小、时间等创建新索引的需求#xff0c;解决方案一般有两个…一、自动创建新索引的方法
MySQL的分库分表大家是非常熟悉的在Elasticserach中有存在类似的场景需求。为了不让单个索引太过于庞大从而引发性能变差等问题我们常常有根据索引大小、时间等创建新索引的需求解决方案一般有两个
1、开发一个定时任务调用Elasticsearch索引API创建新索引应用程序兼容新索引的命名规则
2、使用Elasticsearch rollover功能。
第二种Elasticsearch自带的功能更加简单方便无需定时任务。我们今天的主角就是Elasticsearch rollover功能。 二、使用rollover自动创建新索引
2.1、rollover API介绍
Elasticsearch rollover是Elasticsearch中一项用于管理索引的功能它可以自动创建新的索引并将旧的索引移动到另一个位置从而使历史数据不受影响同时可以为新的索引设置不同的设置。它还可以根据特定的时间间隔比如每天来滚动索引这可以有效地降低索引大小提高搜索性能。
rollover的原理是先创建一个带别名的索引然后设定一定的规则例如满足一定的时间范围的条件当满足该设定规则的时候Elasticsearch会自动建立新的索引别名也自动切换指向新的索引这样相当于在物理层面自动建立了索引的分区功能当查询数据落在特定时间内时会到一个相对小的索引中查询相对所有数据都存储在一个大索引的情况可以有效提升查询效率。
rollover API会为data stream或者索引别名创建一个新的索引。在Elasticsearch 7.9之前一般使用索引别名的方式来管理时间序列数据在Elasticsearch之后data stream取代了这个功能它维护更加简单并自动与数据层集成。
rollover API的效果依据待滚动的索引别名的情况不同而有不同的表现
如果一个索引别名对应了多个索引其中一个一定是写索引rollover创建出新索引的时候会设置is_write_index为true,并且上一个被滚动的索引的is_write_index设置为false。如果待滚动的索引别名对应的只有一个索引那么在创建新的索引的同时会删除原索引。
使用rollover API的时候如果指定新的索引的名称并且原索引以“-”结束并且以数字结尾那么新索引将会沿用名称并且将数字增加例如原索引是my-index-000001那么新索引会是my-index-000002。
如果对时间序列数据使用索引别名则可以在索引名称中使用日期来跟踪滚动日期。例如可以创建一个别名来指向名为my-index-{now/d}-000001的索引如果在2099年5月6日创建索引则索引的名称为my-index-2099.05.06-000001。如果在2099年5月7日滚动别名则新索引的名称为my-index-2099.05.07-000002。
rollover API的格式如下
POST /rollover-target/_rollover/POST /rollover-target/_rollover/target-indexrollover API也支持Query Parameters和Request Body其中Query parameters支持wait_for_active_shards、master_timeout、timeout和dry_run,特别说一下dry_run如果将dry_run设置为true那么这次请求不会真的执行但是会检查当前索引是否满足conditions指定的条件这对于提前进行测试非常有用。
Request Body支持aliases、mappings和settings这三个参数只支持索引不支持data stream和conditions。
特别展开讲一下conditions。这是一个可选参数如果指定了conditions则需要在满足conditions指定的一个或者多个条件的情况下才会执行滚动如果没有指定则无条件滚动如果需要自动滚动可以使用ILM Rollover。
conditions支持的属性有
max_age 从索引建立开始算起的时间周期支持Time Units如7d、4h、30m、60s、1000ms、10000micros、500000nanos。max_docs 索引主分片的数量达到设定的值max_size 所有主分片的大小之和达到了设定值可以通过_cat indices API进行查询其中pri.store.size的值就是目标值。max_primary_shard_size 所有主分片中存在主分片的大小达到了设定值可以通过_cat shards API查看分片的大小store值代表每个分片的大小prirep代表了分片是primary分片还是replica分片。max_primary_shard_docs 所有主分片中存在主分片的文档大小达到了设定值可以通过_cat shards API查询其中的docs字段代表了分片上文档数量的大小。
2.2、rollover一个索引
首先创建一个索引并且设置为write index。
# PUT my-index-{now/d}-000001
curl -X PUT localhost:9200/%3Cmy-index-%7Bnow%2Fd%7D-000001%3E?pretty -H Content-Type: application/json -d
{aliases: {my-alias: {is_write_index: true}}
}执行rollover API 如下所示代表间隔7天、文档数量最多达到100000、主分片大小达到50gb、主分片最大文档数量达到20000这些条件中哪个先匹配则都会自动切换到新索引。
curl -X POST localhost:9200/my-alias/_rollover?pretty -H Content-Type: application/json -d
{conditions: {max_age: 7d,max_docs: 100000,max_primary_shard_size: 50gb,max_primary_shard_docs: 20000}
}如果别名的索引名称使用日期数学表达式并且按定期间隔滚动索引则可以使用日期数学表达式来缩小搜索范围。例如下面的搜索目标是最近三天内创建的索引。
# GET /my-index-{now/d}-*,my-index-{now/d-1d}-*,my-index-{now/d-2d}-*/_search
curl -X GET localhost:9200/%3Cmy-index-%7Bnow%2Fd%7D-*%3E%2C%3Cmy-index-%7Bnow%2Fd-1d%7D-*%3E%2C%3Cmy-index-%7Bnow%2Fd-2d%7D-*%3E/_search?pretty2.3、rollover data stream
rollover不仅可以针对index也可以针对data stream。data stream是 Elastic Stack 7.9 的一个新的功能。Data stream 使你可以跨多个索引存储只追加数据的时间序列数据同时为请求提供唯一的一个命名资源搜索请求提交给data stream以后data stream会自动将请求路由到其后备的索引中。 rollover data stream与index类似如下
curl -X POST localhost:9200/my-data-stream/_rollover?pretty -H Content-Type: application/json -d
{conditions: {max_age: 7d,max_docs: 100000,max_primary_shard_size: 50gb,max_primary_shard_docs: 20000}
}响应信息如下当max_docs数量达到了100000,自动会创建一个new_index命令为.ds-my-data-stream-2099.05.07-000002。
{acknowledged: true,shards_acknowledged: true,old_index: .ds-my-data-stream-2099.05.06-000001,new_index: .ds-my-data-stream-2099.05.07-000002,rolled_over: true,dry_run: false,conditions: {[max_age: 7d]: false,[max_docs: 100000]: true,[max_primary_shard_size: 50gb]: false,[max_primary_shard_docs: 2000]: false}
}rollover是一个非常实用的功能特别是对于随着时间推移索引数据量会快速增长的场景。不过也需要注意conditions要设置合理否则容易产生太多的小索引Elasticsearch集群对于索引的维护成本也是比较高的太多的小索引会严重影响集群的性能。
你所在团队是否有遇到过需要自动分索引的场景又是如何处理的呢欢迎和我分享交流。