cluster_block_exception @ 胡巴 | 星期二,四月 3 日,2018 年 | 2 分钟阅读 | 更新于 星期三,九月 29 日,2021 年

事件:早上在看自己的文章列表时发现昨晚写的一篇新的博客没有列出来,但是文章的排序仍然正确。 原因分析: 因为自己的读取策略是先读取ES,排序由ES进行!~若ES执行结果出错,则从数据库读取列表,排序默认。

cluster_block_exception

事件:早上在看自己的文章列表时发现昨晚写的一篇新的博客没有列出来,但是文章的排序仍然正确。

原因分析

因为自己的读取策略是先读取ES,排序由ES进行!~若ES执行结果出错,则从数据库读取列表,排序默认。

而当前的状况是列表排序是按照ES 的排序进行的,但是新文章没有列出来。

结论

ES更新索引失败!

验证

进入自己的ES项目,查看索引更新日志。果然,报错了,索引更新失败。

报错信息:

    [2018-04-03 01:19:07] product.ERROR: {"error":{"root_cause":[{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}],"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"},"status":403} {"exception":"[object] (Elasticsearch\\Common\\Exceptions\\Forbidden403Exception(code: 403): {\"error\":{\"root_cause\":[{\"type\":\"cluster_block_exception\",\"reason\":\"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];\"}],\"type\":\"cluster_block_exception\",\"reason\":\"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];\"},\"status\":403} at /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:600)
    [stacktrace]
    #0 /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(273): Elasticsearch\\Connections\\Connection->process4xxError(Array, Array, Array)
    #1 /var/www/html/search/vendor/react/promise/src/FulfilledPromise.php(25): Elasticsearch\\Connections\\Connection->Elasticsearch\\Connections\\{closure}(Array)
    #2 /var/www/html/search/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php(55): React\\Promise\\FulfilledPromise->then(Object(Closure), NULL, NULL)
    #3 /var/www/html/search/vendor/guzzlehttp/ringphp/src/Core.php(341): GuzzleHttp\\Ring\\Future\\CompletedFutureValue->then(Object(Closure), NULL, NULL)
    #4 /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(294): GuzzleHttp\\Ring\\Core::proxy(Object(GuzzleHttp\\Ring\\Future\\CompletedFutureArray), Object(Closure))
    #5 /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(171): Elasticsearch\\Connections\\Connection->Elasticsearch\\Connections\\{closure}(Array, Object(Elasticsearch\\Connections\\Connection), Object(Elasticsearch\\Transport), Array)
    #6 /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(106): Elasticsearch\\Connections\\Connection->performRequest('POST', '/_aliases', Array, '{\"actions\":[{\"r...', Array, Object(Elasticsearch\\Transport))
    #7 /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Namespaces/AbstractNamespace.php(72): Elasticsearch\\Transport->performRequest('POST', '/_aliases', Array, Array, Array)
    #8 /var/www/html/search/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Namespaces/IndicesNamespace.php(897): Elasticsearch\\Namespaces\\AbstractNamespace->performRequest(Object(Elasticsearch\\Endpoints\\Indices\\Aliases\\Update))
    #9 /var/www/html/search/app/Models/Blog/Blog.php(83): Elasticsearch\\Namespaces\\IndicesNamespace->updateAliases(Array)
    #10 /var/www/html/search/app/Console/Commands/BulkCommand.php(41): App\\Models\\Blog\\Blog->bulkIndex()
    #11 [internal function]: App\\Console\\Commands\\BulkCommand->handle()
    #12 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array)
    #13 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
    #14 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))
    #15 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Container/Container.php(549): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)
    #16 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Console/Command.php(183): Illuminate\\Container\\Container->call(Array)
    #17 /var/www/html/search/vendor/symfony/console/Command/Command.php(252): Illuminate\\Console\\Command->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
    #18 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Console/Command.php(170): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
    #19 /var/www/html/search/vendor/symfony/console/Application.php(936): Illuminate\\Console\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #20 /var/www/html/search/vendor/symfony/console/Application.php(240): Symfony\\Component\\Console\\Application->doRunCommand(Object(App\\Console\\Commands\\BulkCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #21 /var/www/html/search/vendor/symfony/console/Application.php(148): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #22 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Console/Application.php(88): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #23 /var/www/html/search/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(121): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #24 /var/www/html/search/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
    #25 {main}
    "}

主要原因是这个:

    {"error":{"root_cause":[{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}],"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"},"status":403}

通过在网络中查询,得出大概原因是ES新节点的数据目录data存储空间不足,导致从master主节点接收同步数据的时候失败,此时ES集群为了保护数据,会自动把索引分片index置为只读read-only。看到这里我想到确实是昨天自己服务器磁盘被写满了,应该是那时索引没有了存储空间导致的。

我们看下现在的索引设置:

    curl -XGET localhost:9200/_settings?pretty

    {
      "blog_v1_product" : {
        "settings" : {
          "index" : {
            "number_of_shards" : "2",
            "blocks" : {
              "read_only_allow_delete" : "true"
            },
            "provided_name" : "blog_v1_product",
            "creation_date" : "1522544402424",
            "analysis" : {
              "analyzer" : {
                "ik_smart" : {
                  "tokenizer" : "ik_smart"
                },
                "ik_max_word" : {
                  "tokenizer" : "ik_max_word"
                }
              }
            },
            "number_of_replicas" : "2",
            "uuid" : "0uatJENnQ8OujQH2okT4sQ",
            "version" : {
              "created" : "6020299"
            }
          }
        }
      },
      "blog_v0_product" : {
        "settings" : {
          "index" : {
            "number_of_shards" : "2",
            "provided_name" : "blog_v0_product",
            "creation_date" : "1522718347311",
            "analysis" : {
              "analyzer" : {
                "ik_smart" : {
                  "tokenizer" : "ik_smart"
                },
                "ik_max_word" : {
                  "tokenizer" : "ik_max_word"
                }
              }
            },
            "number_of_replicas" : "2",
            "uuid" : "o-QpU1KHTm-ntK_HZqBPaA",
            "version" : {
              "created" : "6020299"
            }
          }
        }
      }
    }

可以看到里面有个索引 blog_v1_product 有一个

    "blocks" : {
      "read_only_allow_delete" : "true"
    },

正是这个read_only_allow_delete导致的!!!

解决方法

  1. 要给data数据足够的存储空间,可以更改data数据的存储路径,如果改这个,要记得从起ES。如果释放完你磁盘的空间,数据的存储空间还是够的就不用改存储路径了。
  2. 然后要做的就是把索引的设置read_only_allow_delete 变成false。
     curl -XPUT localhost:9200/blog_v1_product/_settings?pretty -H "content-type:application/json" -d '{ "index": {    "blocks": {"read_only_allow_delete":"false"} } }'

        {
           "acknowledged" : true
        }

经过上面的处理后,索引就能再次正常更新了。

Copyright © 2017 - 2025 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】

avatar

BoBo`s Blog每天进步一点点,能多一点是一点

基本信息
  • 姓名:bobo
  • 花名:胡巴
  • 性别:男
  • 血型:O型
  • 星座:白羊座

联系方式

  • 所在地:上海
  • QQ:279250819
  • 微信号:wanghuiwoshinideyou
  • 电子邮件:279250819@qq.com

博客地址

公众号

alt 无限递归

工作经历
  • 2022.5 - 至今

    • 公司:乐府互娱
    • 职位:高级SDK工程师
  • 2019.6 - 2022.4

    • 公司:萌推(上海突进网络科技有限公司)
    • 职位:中级PHP工程师 & 初级golang工程师
    • 荣誉:
      • 绩效A连续得主
      • 月度之星
      • 优秀个人奖
    • 所作所为:
      • 利用ES优化OMS、MMS管理系统商品列表查询
      • 利用消息队列、Redis、乐观锁优化商品审核流程
      • 利用Redis对商家端接口进行有效限流
      • 优化商品相关表索引,提升SQL查询速度
      • 商品中台构建,统一商品相关操作
      • 大表优化(数据分离、分表、大字段拆分)
      • 掌握所有商品核心流程
  • 2018.5 - 2019.5

    • 公司:DaDa英语(上海卓赞教育信息科技有限公司)
    • 职位:中级PHP开发工程师
    • 荣誉:无
    • 所作所为:
      • 利用ES优化教师CMS系统统计数据接口至500ms内
      • 工单系统开发及持续优化
      • 教师CMS系统的功能开发及持续优化
  • 2018.3 - 2018.5

    • 公司:波奇(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:同下
    • 所做作为:如下
  • 2016.7 - 2018.3

    • 公司:光橙(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:
      • 年度最佳进步奖
    • 所作所为:
      • 利用Redis提升商详接口最佳响应速度至50ms内
      • 利用Redis提升双11活动页可承受QPS至500以上
      • 利用Redis对接口进行简单限流
      • 与小伙伴合作提升搜索质量(ES初识)
      • 其他C端接口的开发及优化
      • B端商城老页面的维护及优化
SKILLS

编程语言

  • PHP
  • Golang
  • Shell
  • JAVA
  • JS
  • HTML\CSS

数据库

  • MySQL
  • Redis
  • Clickhouse

消息中间件

  • RabbitMq
  • Kafka

文档撰写

  • Swagger
  • Markdown

技术框架

  • Laravel
  • gin

搜索引擎

  • ElasticSearch

抓包工具

  • Charles