Phoenix 索引生命周期
本文主要介绍Phoenix索引状态的生命周期,帮助大家解惑“为什么我的phoenix索引不能正常使用了?”
索引状态
索引总共有以下几个状态,其状态信息存储在SYSTEM.CATALOG表中。可以通过以下SQL来查看所有索引表信息:
select TABLE_NAME,DATA_TABLE_NAME,INDEX_TYPE,INDEX_STATE,INDEX_DISABLE_TIMESTAMP
from system.catalog where INDEX_TYPE is not null;

SQL中字段:
- TABLE_NAME表示索引表名
- DATA_TABLE_NAME表示原数据表名
- INDEX_TYPE表示索引类型
GLOBAL(1)
LOCAL(2)
- INDEX_STATE表示索引状态
BUILDING("b")
USABLE("e")
UNUSABLE("d")
ACTIVE("a")
INACTIVE("i")
DISABLE("x"))
REBUILD("r") - DISABLE 表示索引将处于不可用的维护状态,同时将不能用于查询中。
- REBUILD 表示索引将完成重建,同时一旦重建完成此索引将能被在此用于查询中。
- BUILDING 表示将从索引不可用的时间戳处重建索引直到重建完成。
- INACTIVE/UNUSABLE 表示索引将不能用于查询中,但索引仍然在不可用的维护状态。
- ACTIVE/USABLE 表示索引表能被正常用于查询中。

注:disable状态的索引必须重建,不能设置为USABLE状态。
- INDEX_DISABLE_TIMESTAMP
表示索引disable时的时间戳。当索引是active或者手动置为disable时值为0,当索引写失败引起disable时值为非0。
自动重建索引过程
- MetaDataRegionObserver类负责运行重建索引线程,SYSTEM.CATALOG表是disable索引表更新的关键,因为它记录着索引表的所有状态。
- INACTIVE和DISABLE索引将会被选择重建(所有Online索引表region)。
- 所有表的所有索引表重建过程将串行执行(运行在cp上)。
- 索引表的建立是从disabled timestamp开始的。(此处会生成disable 时间到现在时间, 并带有需要更新索引信息的scan, RS在执行scan时触发cp重建索引)
- 对应的执行sql "UPSERT /+ NO_INDEX / INTO index_table_name(indexedCols) select dataCols from data_table” 完成索引同步。
索引重建生命周期

控制自动重建索引的属性
- "phoenix.index.failure.handling.rebuild"(default true)
- "phoenix.index.failure.handling.rebuild.interval" (default 10 seconds)
更新索引表失败处理实践
- 写索引表失败会试图禁用索引,向SYSTEM.CATALOG表写入索引状态。
- 在集群状态异常情况下,比如存在rit。此时CATALOG表的写操作可能失败,也就是状态不能得到更新,索引数据也同步失败,导致不断的执行起重建索引任务。
- 为了确保索引已经能得到更新,杀死RS,来触发WAL的replay,这样就能使得索引表的更新在WAL replay过程中得到重试。 同时需要手工介入,通过alter命令设置索引状态使之可用。
以上是社区版本通过RS failover来解决问题,但这种方法也存在一些问题:
- 雪崩效应,整个集群的RS全部自杀:因为自杀的RS上也host了很多region,这些region可能是其他RS的索引表。某一RS自杀后,会导致其他RS的索引表更新失败,从而触发其他RS自杀,而其他RS自杀又会因为同样的原因导致更多的RS自杀,恶性循环。在很短的时间内,集群中所有RS都自杀了。
- 禁用的index表需要人工介入才能启用,在集群多了以后,会成为管理负担
- 禁用index表之后,本来通过命中索引表来完成的查询,就需要对主表做全表扫描来完成了。小scan会立即变成大scan,这可能会快速耗尽RS的资源,并导致client端大量超时。
云HBASE针对以上问题,提出了以下解决方法,并已经实现。
- 在sync WAL之前出现的问题,由client负责重试: 因为没有WAL没有写下去,就不会导致主表和索引表的数据不一致。
- 在sync WAL之后出现的问题,由RS负责重试:因为WAL已经写下去了,此时,部分索引表的更新也可能已经完成,客户端如果不重试且RS不重启,主表和索引表会保持长时间的不一致。
索引表一致性
参见下一篇二级索引文章
参考
- https://community.hortonworks.com/articles/58818/phoenix-index-lifecycle.html
- https://phoenix.apache.org/secondary_indexing.html
转自:https://yq.aliyun.com/articles/236804
交流
如果大家对HBase有兴趣,致力于使用HBase解决实际的问题,欢迎加入Hbase技术社区群交流:
微信HBase技术社区群,假如微信群加不了,可以加秘书微信: SH_425 ,然后邀请您。

钉钉HBase技术社区群

Phoenix 索引生命周期的更多相关文章
- Elastic 使用索引生命周期管理实现热温冷架构
Elastic: 使用索引生命周期管理实现热温冷架构 索引生命周期管理 (ILM) 是在 Elasticsearch 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能.ILM 是 Elast ...
- ELK 索引生命周期管理
kibana 索引配置 管理索引 点击设置 --- Elasticsearch 的 Index management 可以查看 elk 生成的所有索引 (设置,Elasticsearch ,管理) 配 ...
- ElasticSearch——索引生命周期管理
从ES6.6开始,Elasticsearch提供索引生命周期管理功能,索引生命周期管理可以通过API或者kibana界面配置,详情参考[index-lifecycle-management] 本文仅通 ...
- 这么简单的ES索引生命周期管理,不了解一下吗~
对于日志或指标(metric)类时序性强的ES索引,因为数据量大,并且写入和查询大多都是近期时间内的数据.我们可以采用hot-warm-cold架构将索引数据切分成hot/warm/cold的索引.h ...
- Elasticsearch7.X ILM索引生命周期管理(冷热分离)
Elasticsearch7.X ILM索引生命周期管理(冷热分离) 一.“索引生命周期管理”概述 Elasticsearch索引生命周期管理指:Elasticsearch从设置.创建.打开.关闭.删 ...
- Elasticsearch索引生命周期管理方案
一.前言 在 Elasticsearch 的日常中,有很多如存储 系统日志.行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索引 的数量也会持续增长,然而这些场景基本上只有 ...
- ELK日志保留7天-索引生命周期策略
一.简介 ELK日志我们一般都是按天存储,例如索引名为"kafkalog-2022-04-05",因为日志量所占的存储是非常大的,我们不能一直保存,而是要定期清理旧的,这里就以保留 ...
- Elasticsearch 索引生命周期管理 ILM 实战指南
文章转载自:https://mp.weixin.qq.com/s/7VQd5sKt_PH56PFnCrUOHQ 1.什么是索引生命周期 在基于日志.指标.实时时间序列的大型系统中,集群的索引也具备类似 ...
- ES 7.13版本设置索引模板和索引生命周期管理
第一步:索引管理中查看都有哪些索引文件,然后添加索引模式(后面的日期用*表示) 第二步:索引生命周期管理 自带的有一个log,就使用这个,不用再新建了,根据需求修改里面的配置就行了 第三步:添加索引模 ...
随机推荐
- es6总结(四)--对象
- 解决npm 的 shasum check failed for错误
使用npm安装一些包失败,类似如下报错情况: C:\Program Files\nodejs>npm update npm npm ERR! Windows_NT 10.0.14393 np ...
- AC日记——爱情之路 codevs 2070
2070 爱情之路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description yh非常想念他的女朋友小y,于是他 ...
- [原创][FPGA]Quartus实用小技巧(长期更新)
0. 简介 在使用Quartus软件时,经常会时不时的发现一些小技巧,本文的目的是总结所查阅或者发现到的小技巧,本文长期更新. 1. Quartus中的模板功能 最近在Quartus II的菜单里找到 ...
- netframework中等待多个子线程执行完毕并计算执行时间
本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualRes ...
- 2017-10-29-afternoon-清北模拟赛
T1 洗澡 贪心:将未匹配的右括号花费1变为左括号,最有多余的左括号有一半变成右括号 #include <cstring> #include <cstdio> ); int n ...
- 关于编写Windows程序中启动兼容性问题
之前用qt4编写Windows程序的时候遇到了一个软件在系统的兼容性问题:用户在win10系统下使用这个程序的时候,如果没有用低于win10版本的兼容模式运行的时候,存在运行某部分功能的时候无法使用的 ...
- Android Glide源码分析
1. 功能介绍 图片加载框架,相对于UniversalImageLoader,Picasso,它还支持video,Gif,SVG格式,支持缩略图请求,旨在打造更好的列表图片滑动体验.Glide有生命周 ...
- 无插件,跨平台,基于WebGL的三维地球来了!!!
用户通过浏览器即可递交数据到同一个地理信息系统中,操作简单,跨平台 ,无插件,可扩展,高效共享 ,完美匹配超大数据量发布! 近年来,随着计算机图形学.虚拟现实.卫星遥感.航空摄影.激光雷达等技术的迅猛 ...
- 微服务指南走北(三):Restful API 设计简述
API的定义取决于选择的IPC通信方式,假设是消息机制(如 AMQP 或者 STOMP).API则由消息频道(channel)和消息类型.假设是使用HTTP机制,则是基于请求/响应(调用http的ur ...