首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性搜索read_only_allow_delete自动设置

弹性搜索read_only_allow_delete自动设置
EN

Stack Overflow用户
提问于 2018-01-08 18:07:59
回答 3查看 47.4K关注 0票数 42

我对Elasticsearch有意见。我尝试了以下几点:

代码语言:javascript
复制
 $ curl -XPUT -H "Content-Type: application/json" \
     http://localhost:9200/_all/_settings \
       -d '{"index.blocks.read_only_allow_delete": false}'

我的设置:

代码语言:javascript
复制
"settings": {
  "index": {
    "number_of_shards": "5",
    "blocks": {
      "read_only_allow_delete": "true"
    },
    "provided_name": "new-index",
    "creation_date": "1515433832692",
    "analysis": {
      "filter": {
        "ngram_filter": {
          "type": "ngram",
          "min_gram": "2",
          "max_gram": "4"
        }
      },
      "analyzer": {
        "ngram_analyzer": {
          "filter": [
            "ngram_filter"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    },
    "number_of_replicas": "1",
    "uuid": "OSG7CNAWR9-G3QC75K4oQQ",
    "version": {
      "created": "6010199"
    }
  }
}

当我检查设置时,它看起来很好,但是只有几秒钟(3-5),并且它仍然被设置为true。我不能添加新元素和查询任何内容,只有_searchdelete

有人知道怎么解决这个问题吗?

注意:我正在使用Elasticsearch版本: 6.1.1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-18 07:51:02

当硬盘空间较低时,Elasticsearch会自动设置"read_only_allow_delete": "true"

查找正在填充存储空间的文件,并删除/移动它们。一旦您有了足够的存储空间,请通过Kibana的Dev工具运行以下命令:

代码语言:javascript
复制
PUT your_index_name/_settings
{
 "index": {
   "blocks": {
     "read_only_allow_delete": "false"
    }
  }
}

(通过终端):

代码语言:javascript
复制
$ curl -XPUT -H "Content-Type: application/json" \
   http://localhost:9200/_all/_settings \
     -d '{"index.blocks.read_only_allow_delete": false}'

正如你在问题中提到的。

票数 91
EN

Stack Overflow用户

发布于 2019-05-15 07:26:58

为了给已被接受的答案添加一些价值(因为我会在谷歌上搜索这个并在将来回来),在我的例子中,设置了read_only_allow_delete标志,因为磁盘水印的默认设置是基于百分比的--这在我的大磁盘上就没有那么有意义了。因此,我将这些设置更改为基于“保持大小”的正如文件所解释的

因此,在将read_only_allow_delete设置为false之前,首先根据磁盘空间设置水印值:

(使用Kibana UI):

代码语言:javascript
复制
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "20gb",
    "cluster.routing.allocation.disk.watermark.high": "15gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb"
  }
}

PUT your_index_name/_settings
{
 "index": {
   "blocks": {
     "read_only_allow_delete": "false"
    }
  }
}

或(通过终点站):

代码语言:javascript
复制
$ curl -XPUT -H "Content-Type: application/json" \
   http://localhost:9200/_cluster/_settings \
   -d '{"cluster.routing.allocation.disk.watermark.low": "20gb", 
     "cluster.routing.allocation.disk.watermark.high": "15gb", 
     "cluster.routing.allocation.disk.watermark.flood_stage": "10gb"}'

$ curl -XPUT -H "Content-Type: application/json" \
   http://localhost:9200/_all/_settings \
   -d '{"index.blocks.read_only_allow_delete": false}'
票数 17
EN

Stack Overflow用户

发布于 2019-04-11 04:09:16

背景

我们维护一个集群,其中有文件拍、节拍、包拍等等,托运人将数据推送到集群中。不可避免地,有些索引会变得很热,我们想要禁用一段时间的写入,或者清除和重新启用那些已经突破了它们的低水印阈值并自动进入read_only_allow_delete: true的索引。

Bash函数

为了简化我的团队其他成员对集群的管理,我编写了以下Bash函数,以帮助执行这些任务,而不必在curl或Kibana的UI中摸索。

代码语言:javascript
复制
$ cat es_funcs.bash

### es wrapper cmd inventory
declare -A escmd
escmd[l]="./esl"
escmd[p]="./esp"

### es data node naming conventions
nodeBaseName="rdu-es-data-0"
declare -A esnode
esnode[l]="lab-${nodeBaseName}"
esnode[p]="${nodeBaseName}"

usage_chk1 () {
    # usage msg for cmds w/ 1 arg
    local env="$1"

    [[ $env =~ [lp] ]] && return 0 || \
        printf "\nUSAGE: ${FUNCNAME[1]} [l|p]\n\n" && return 1
}

enable_readonly_idxs () {
    # set read_only_allow_delete flag
    local env="$1"
    usage_chk1 "$env" || return 1
    DISALLOWDEL=$(cat <<-EOM
        {
         "index": {
           "blocks": {
             "read_only_allow_delete": "true"
            }
          }
        }
    EOM
    )
    ${escmd[$env]} PUT '_all/_settings' -d "$DISALLOWDEL"
}

disable_readonly_idxs () {
    # clear read_only_allow_delete flag
    local env="$1"
    usage_chk1 "$env" || return 1
    ALLOWDEL=$(cat <<-EOM
        {
         "index": {
           "blocks": {
             "read_only_allow_delete": "false"
            }
          }
        }
    EOM
    )
    ${escmd[$env]} PUT '_all/_settings' -d "$ALLOWDEL"
}

示例运行

上面的函数可以在shell中获得,如下所示:

代码语言:javascript
复制
$ . es_funcs.bash

注意:如果碰巧有多个集群,则将文件顶部的数组映射为集群的短名称。我们有两个,一个给我们的实验室,一个给我们的生产。所以我把它们表示为lp

然后您可以像这样运行它们,以便在您的read_only_allow_delete集群上启用l属性(true):

代码语言:javascript
复制
$ enable_readonly_idxs l
{"acknowledged":true}

p

代码语言:javascript
复制
$ enable_readonly_idxs p
{"acknowledged":true}

助手脚本概述

还有一个脚本包含curl命令,我使用这些命令与集群进行交互。此脚本在escmd数组中引用,该数组位于es_func.bash文件顶部。数组包含指向单个shell脚本escli.bash的符号链接的名称。这些链接称为eslesp

代码语言:javascript
复制
$ ll
-rw-r--r-- 1 smingolelli staff  9035 Apr 10 23:38 es_funcs.bash
-rwxr-xr-x 1 smingolelli staff  1626 Apr 10 23:02 escli.bash
-rw-r--r-- 1 smingolelli staff   338 Apr  5 00:27 escli.conf
lrwxr-xr-x 1 smingolelli staff    10 Jan 23 08:12 esl -> escli.bash
lrwxr-xr-x 1 smingolelli staff    10 Jan 23 08:12 esp -> escli.bash

escli.bash脚本:

代码语言:javascript
复制
$ cat escli.bash
#!/bin/bash

#------------------------------------------------
# Detect how we were called [l|p]
#------------------------------------------------
[[ $(basename $0) == "esl" ]] && env="lab1" || env="rdu1"

#------------------------------------------------
# source escli.conf variables
#------------------------------------------------
# g* tools via brew install coreutils
[ $(uname) == "Darwin" ] && readlink=greadlink || readlink=readlink
. $(dirname $($readlink -f $0))/escli.conf


usage () {
    cat <<-EOF

    USAGE: $0 [HEAD|GET|PUT|POST] '...ES REST CALL...'

    EXAMPLES:

        $0 GET  '_cat/shards?pretty'
        $0 GET  '_cat/indices?pretty&v&human'
        $0 GET  '_cat'
        $0 GET  ''
        $0 PUT  '_all/_settings'   -d "\$DATA"
        $0 POST '_cluster/reroute' -d "\$DATA"


    EOF
    exit 1
}

[ "$1" == "" ] && usage

#------------------------------------------------
# ...ways to call curl.....
#------------------------------------------------
if [ "${1}" == "HEAD" ]; then
    curl -I -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        "${esBaseUrl}/$2"
elif [ "${1}" == "PUT" ]; then
    curl -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        -X$1 -H "${contType}" "${esBaseUrl}/$2" "$3" "$4"
elif [ "${1}" == "POST" ]; then
    curl -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        -X$1 -H "${contType}" "${esBaseUrl}/$2" "$3" "$4"
else
    curl -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        -X$1 "${esBaseUrl}/$2" "$3" "$4" "$5"
fi

此脚本接受一个属性文件escli.conf。在这个文件中,您指定了从任何地方检索用户名+密码的命令,为此我使用LastPass,因此通过lpass检索它们,并设置用于访问集群REST的基本URL。

代码语言:javascript
复制
$ cat escli.conf
#################################################
### props used by escli.bash
#################################################

usernameCmd='lpass show --username somedom.com'
passwordCmd='lpass show --password somedom.com'

esBaseUrl="https://es-data-01a.${env}.somdom.com:9200"
contType="Content-Type: application/json"

我已经把所有这些放在一个Github (链接在下面)中,其中还包括了除上述2之外的附加功能,我将其作为这个问题的示例展示。

参考文献

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48155774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档