Elasticsearch索引rollover按日期滚动

首发在个人博客
https://www.xujd.top/

http://www.54288.top/

查看所有的索引
GET _cat/indices

查看所有的别名
GET 127.0.0.1:9200/_alias

查看的模板
GET 127.0.0.1:9200/_template/模板名
使用通配符
GET /_template/temp*

一、重建索引

从前面的学习中,我们知道es的字段建立后就不能被修改,假设原本是一个string类型的数据,被识别成date类型,之后再传一个string类型,由于无法转换格式就报错。。这个时候我们的做法就只能加一个字段去处理,,久而久之字段太多了。。就不行了

所以我们只能重建索引。。。reindex

注意点

1、重建索引不会尝试设置目标索引,它不会复制源索引的设置,你应该在运行_reindex操作之前设置目标索引,包括设置映射、碎片数、副本等

2、一般不会冲突,除非将多个index 重建到同一个index,这样id才有可能冲突,,默认是覆盖。可以自己设置

3、重建索引,是指重建索引那个时候的一个快照,比如重建索引过程需要1分钟。。在重建索引的过程中,插入旧索引的数据是不会同步过去的。所以是否可以在重建索引的时候将旧的索引设置成只读状态?

POST _reindex
{
  "source": {
    "index": "my_index_name"
  },
  "dest": {
    "index": "my_index_name_new"
  }
}

_source 重建特定的字段
有时候我们有写字段不用了同步到新的索引
只有满足_source的字段才会被同步到新的索引

POST _reindex
{
  "source": {
    "index": "my_index_name",
    "_source": ["field_name_1", "field_name_2"]
  },
  "dest": {
    "index": "my_index_name_new"
  }
}

以下会在copy后将新索引中的flag字段名称修改为tag:

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test2"
  },
  "script": {
    "source": "ctx._source.tag = ctx._source.remove(\"flag\")"
  }
}

对满足query条件的数据进行同步

POST _reindex
{
  "source": {
    "index": "my_index_name",
    "type": "my_type_name",
    "query": {  // query的条件
      "term": {
        "user": "user_value"
      }
    }
  },
  "dest": {
    "index": "my_index_name_new"
  }
} 

reindex太慢优化

reindex底层是使用scroll滚动去同步的,,这个是快照

1、修改批量条数
默认情况下,_reindex使用1000条进行批量操作,但是我们在之前学过一个好的bulk是5M-15M,而不是看文档数量
1)每个1kb的1000个文档是1mb。
2)每个100kb的1000个文档是100 MB。

POST _reindex
{
   "source": {
     "index": "source",
     "size": 5000
   },
   "dest": {
     "index": "dest",
     "routing": "=cat"
  }
}

2、借助scroll的sliced

POST _reindex?slices=5&refresh
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}

slices大小设置注意事项:
1)slices大小的设置可以手动指定,或者设置slices设置为auto,auto的含义是:针对单索引,slices大小=分片数;针对多索引,slices=分片的最小值。

2)当slices的数量等于索引中的分片数量时,查询性能最高效。slices大小大于分片数,非但不会提升效率,反而会增加开销。

3)如果这个slices数字很大(例如500),建议选择一个较低的数字,因为过大的slices 会影响性能。

3、将ES副本数设置为0
如果要进行大量批量导入,请考虑通过设置index.number_of_replicas来禁用副本:0,等同步完成在启用副本。

复制文档时,将整个文档发送到副本节点,并逐字重复索引过程。 这意味着每个副本都将执行分析,索引和潜在合并过程。

相反,如果您使用零副本进行索引,然后在提取完成时启用副本,则恢复过程本质上是逐字节的网络传输。 这比复制索引过程更有效。

PUT /my_logs/_settings
{
    "number_of_replicas": 1
}

4、增加refresh间隔

如果你的搜索结果不需要接近实时的准确性,考虑先不要急于索引刷新refresh。可以将每个索引的refresh_interval到30s。

如果正在进行大量数据导入,可以通过在导入期间将此值设置为-1来禁用刷新。完成后不要忘记重新启用它!

设置方法:

PUT /my_logs/_settings
{ "refresh_interval": -1 }

二、索引别名

像上面我们将一个旧的索引 order_index_v1 重建到 order_index_v2的时候

我们java代码查询es的时候使用order_index_v1,这样的话,当我们要切换使用order_index_v2,就需要将所有的order_index_v1改成order_index_v2,麻烦,而且java服务可能需要停机重启才能生效,这样肯定是不行的,所以我们就可以使用别名

我们将order_index_v1 取一个别名叫order_index,,之后对order_index_v1的操作都使用order_index,当我们切换索引的时候将,别名指向order_index_v2就行,,

别名在rollover的时候非常好用,,而且索引对性能没有任何影响

新建别名
order_index别名指向已有的索引order_index_v1

POST /_aliases?pretty
{
  "actions": [
    {
      "add": {
        "index": "order_index_v1",
        "alias": "order_index"
      }
    }
  ]
}

索引切换

将order_index指向order_index_v2

POST /_aliases?pretty
{
  "actions": [
    {
      "remove": {
        "index": "order_index_v1",
        "alias": "order_index"
      }
    },
    {
      "add": {
        "index": "order_index_v2",
        "alias": "order_index"
      }
    }
  ]
}

三、索引模板

{
  "order": 0,                               // 模板优先级
  "template": "sample_info*",               // 模板匹配的名称方式
  "settings": {...},                        // 索引设置
  "mappings": {...},                        // 索引中各字段的映射定义
  "aliases": {...}                          // 索引的别名
}

order:优先级数字越低,越早使用,如果同时匹配到两个模板,数字低的先使用,数字高的会覆盖低的。
template:将这个模板应用于所有以 logstash- 为起始的索引。
settings:定义了索引的属性,包括分片数量、副本数量、写入flush时间间隔。
mappings:字段映射
aliases:别名

"settings": {
    "index": {
      "refresh_interval": "10s",//每10秒刷新
      "number_of_shards" : "5",//主分片数量
      "number_of_replicas" : "2",//副本数量
      "translog": {
        "flush_threshold_size": "1gb",//内容容量到达1gb异步刷新
        "sync_interval": "30s",//间隔30s异步刷新(设置后无法更改)
        "durability": "async"//异步刷新
      }
    }
  }

创建模板
(模板名和索引名一样都不能有大写)

PUT http://127.0.0.1:9200/_template/template_name

{
    "template": "dsideal*",
    "order": 0,
    "settings": {
        "number_of_shards": 5
    },
    "aliases": {
        "dsideal-query": {}      #起个别名
    },
    "mappings": {
        "doc": {
            "properties": {
                "person_name": {
                    "type": "keyword"
                },
                "gender_id": {
                    "type": "long"
                },
                "bureau_id": {
                    "type": "long"
                }
            }
        }
    }
}

blog的例子
先创建一个模板

put 127.0.0.1:9200/_template/blog_template
{
  "template": "blog_*",
  "order": 0,
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "summary": {
          "type": "text"
        },
        "publish_time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis"
        },
        "states": {
          "type": "short"
        },
        "creator": {
          "type": "keyword"
        },
        "click_num": {
          "type": "integer"
        },
        "thumb_url": {
          "type": "text"
        },
        "category_id": {
          "type": "long"
        },
        "join_field": {
          "type": "join",
          "relations": {
            "t_article": "t_article_contents"
          }
        },
        "contents": {
          "type": "text"
        }
      }
    }
  }
}

创建一个索引 blog_v3 会自动使用模板

put 127.0.0.1:9200/blog_v3/

重建索引
注意上面模板的type doc 源数据是 t_article 所以reindex 要指定同步到doc

{
  "source": {
    "index": "blog"
  },
  "dest": {
    "index": "blog_v3",
    "type":"doc"
  }
}

注意
假设 我有5条数据 第二条reindex失败了 但是(其他的数据会成功),不会因为一条数据失败而全部失败,,但是继续重建的时候会被默认覆盖,所以不用删除

遇到一个问题
我的模板设置日期格式
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

但是我源数据的格式 yyyy-MM-dd HH:mm  同步的时候会因为格式不正确报错

后面我将模板改成
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm||yyyy-MM-dd||epoch_millis"
重新同步  发现还是不行,,,这个是因为你只是改了模板,,但是对已经创建的index不生效了。。

四、rollover api

如果所有数据只存在一个索引下,随着数据积累,索引体积越来越大。为了方便管理ES索引,尽量将数据分散到多个索引里。在ES5.0以后新增了一个rollover API,可以动态的滚动索引。

满足条件的时候会自动触发,滚动创建新的索引。。

{
  "conditions": {
  "max_age":   "30d",
  "max_docs":  1000,
  "max_size":  "50gb",
  }
}

当满足30天
或者 这个index文档数量大于1000
或者数据总量大于50gb
满足一个会自动滚动创建新的index

有两种指定新index名字的方式
1、第一种不指定索引名字
索引名字需要以-数字结尾 例如: index_name-1。每次调用rollover API新的索引名字会自动+1
假设我们现在有一个别名blog_alias指向blog-8

 POST 127.0.0.1:9200/blog_alias(别名)/_rollover
    {
      "conditions": {
        "max_age": "7d",
        "max_docs": 1400,
        "max_size": "5gb"
      }
    }

滚动index的index为blog-000009**(6位)**

2、第二种自己指定索引名字

 POST 127.0.0.1:9200/blog_alias(别名)/_rollover/%3Cblog_alias-%7Bnow%2Fd%7D-1%3E
    {
      "conditions": {
        "max_age": "7d",
        "max_docs": 1400,
        "max_size": "5gb"
      }
    }

格式就是
https://www.urlencoder.io/。实际上它就是字符串“<blog_alias-{now/d}-1>”的url编码形式

ps
创建别名的时候 要是使用**“is_write_index”: true**这样我们每次通过别名进行写操作才能指向最新的index
rollover不会自动触发,我们需要写个定时器去调用,,比如0点0分0秒去触发
max_age如果是中午12点创建的index 是从中午还是算的时间24小时为一天。。如"max_age": “1d”,到隔开中午12点算一天

五、源数据

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 5,
        "max_score": 1,
        "hits": [
            {
                "_index": "blog",
                "_type": "t_article",
                "_id": "31111111111111111",
                "_score": 1,
                "_routing": "29",
                "_source": {
                    "contents": "娃哈哈哈哈哈哈哈哈",
                    "join_field": {
                        "name": "t_article_contents",
                        "parent": 1
                    }
                }
            },
            {
                "_index": "blog",
                "_type": "t_article",
                "_id": "2",
                "_score": 1,
                "_source": {
                    "title": "你大爷",
                    "summary": "你大爷 哇哈哈 66666",
                    "publish_time": "2018-08-29 15:56",
                    "states": 1,
                    "creator": "丁D",
                    "click_num": 222,
                    "thumb_url": "/upload/shan.jpg",
                    "category_id": 1,
                    "join_field": {
                        "name": "t_article"
                    }
                }
            },
            {
                "_index": "blog",
                "_type": "t_article",
                "_id": "3",
                "_score": 1,
                "_routing": "1",
                "_source": {
                    "contents": "娃哈哈哈哈哈哈哈哈",
                    "join_field": {
                        "name": "t_article_contents",
                        "parent": 1
                    }
                }
            },
            {
                "_index": "blog",
                "_type": "t_article",
                "_id": "4",
                "_score": 1,
                "_routing": "1",
                "_source": {
                    "contents": "沿着路灯一个人走回家 和老朋友打电话 你那里天气好吗",
                    "join_field": {
                        "name": "t_article_contents",
                        "parent": 1
                    }
                }
            },
            {
                "_index": "blog",
                "_type": "t_article",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "title": "山有木兮",
                    "summary": "《山有木兮》是橙光游戏《人鱼传说之长生烛》的主题曲,执素兮谱曲,顾聆落填词演唱者伦桑,于2016年8月12日正式发行",
                    "publish_time": "2018-08-29 15:56:00",
                    "category_id": 1,
                    "states": 1,
                    "creator": "丁D",
                    "click_num": 111,
                    "thumb_url": "/upload/shan.jpg",
                    "join_field": {
                        "name": "t_article"
                    }
                }
            }
        ]
    }
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值