Phoenix 索引生命周期

简介: 本文主要介绍云HBASE上Phoenix索引状态的生命周期,帮助大家解惑“为什么我的phoenix索引不能正常使用了?” 索引状态 索引总共有以下几个状态,其状态信息存储在SYSTEM.CATALOG表中。

本文主要介绍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;

Screen_Shot_2017_11_09_at_20_54_05

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 表示索引表能被正常用于查询中。

8062_screen_shot_2016_09_28_at_35743_pm
注:disable状态的索引必须重建,不能设置为USABLE状态。

  • INDEX_DISABLE_TIMESTAMP
    表示索引disable时的时间戳。当索引是active或者手动置为disable时值为0,当索引写失败引起disable时值为非0。

自动重建索引过程

  1. MetaDataRegionObserver类负责运行重建索引线程,SYSTEM.CATALOG表是disable索引表更新的关键,因为它记录着索引表的所有状态。
  2. INACTIVE和DISABLE索引将会被选择重建(所有Online索引表region)。
  3. 所有表的所有索引表重建过程将串行执行(运行在cp上)。
  4. 索引表的建立是从disabled timestamp开始的。(此处会生成disable 时间到现在时间, 并带有需要更新索引信息的scan, RS在执行scan时触发cp重建索引)
  5. 对应的执行sql "UPSERT /+ NO_INDEX / INTO index_table_name(indexedCols) select dataCols from data_table” 完成索引同步。

索引重建生命周期

8063_screen_shot_2016_09_28_at_35855_pm

控制自动重建索引的属性

  • "phoenix.index.failure.handling.rebuild"(default true)
  • "phoenix.index.failure.handling.rebuild.interval" (default 10 seconds)

更新索引表失败处理实践

  1. 写索引表失败会试图禁用索引,向SYSTEM.CATALOG表写入索引状态。
  2. 在集群状态异常情况下,比如存在rit。此时CATALOG表的写操作可能失败,也就是状态不能得到更新,索引数据也同步失败,导致不断的执行起重建索引任务。
  3. 为了确保索引已经能得到更新,杀死RS,来触发WAL的replay,这样就能使得索引表的更新在WAL replay过程中得到重试。 同时需要手工介入,通过alter命令设置索引状态使之可用。

以上是社区版本通过RS failover来解决问题,但这种方法也存在一些问题:

  1. 雪崩效应,整个集群的RS全部自杀:因为自杀的RS上也host了很多region,这些region可能是其他RS的索引表。某一RS自杀后,会导致其他RS的索引表更新失败,从而触发其他RS自杀,而其他RS自杀又会因为同样的原因导致更多的RS自杀,恶性循环。在很短的时间内,集群中所有RS都自杀了。
  2. 禁用的index表需要人工介入才能启用,在集群多了以后,会成为管理负担
  3. 禁用index表之后,本来通过命中索引表来完成的查询,就需要对主表做全表扫描来完成了。小scan会立即变成大scan,这可能会快速耗尽RS的资源,并导致client端大量超时。

云HBASE针对以上问题,提出了以下解决方法,并已经实现。

  1. 在sync WAL之前出现的问题,由client负责重试: 因为没有WAL没有写下去,就不会导致主表和索引表的数据不一致。
  2. 在sync WAL之后出现的问题,由RS负责重试:因为WAL已经写下去了,此时,部分索引表的更新也可能已经完成,客户端如果不重试且RS不重启,主表和索引表会保持长时间的不一致。

索引表一致性

参见下一篇二级索引文章

参考

  1. https://community.hortonworks.com/articles/58818/phoenix-index-lifecycle.html
  2. https://phoenix.apache.org/secondary_indexing.html
目录
相关文章
|
XML 存储 分布式计算
hbase构建二级索引解决方案
HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索。假设我们相对Hbase里面列族的列列进行一些组合查询,就只能全表扫描了。表如果较大的话,代价是不可接受的,所以要提出二级索引的方案。
1062 0
hbase构建二级索引解决方案
|
8月前
|
存储 SQL 消息中间件
ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析
AggregatingMergeTree是ClickHouse的一种表引擎,它优化了MergeTree的合并逻辑,通过将相同主键(排序键)的行聚合为一行并存储聚合函数状态来减少行数。适用于增量数据聚合和物化视图。建表语法中涉及AggregateFunction和SimpleAggregateFunction类型。插入数据需使用带-State-的聚合函数,查询时使用GROUP BY和-Merge-。处理逻辑包括按排序键聚合、在合并分区时计算、以分区为单位聚合等。常用于物化视图配合普通MergeTree使用。查阅更多资料可访问相关链接。
368 4
|
3月前
|
数据管理 大数据 OLAP
AnalyticDB核心概念详解:表、索引与分区
【10月更文挑战第25天】在大数据时代,高效的数据库管理和分析工具变得尤为重要。阿里云的AnalyticDB(ADB)是一款完全托管的实时数据仓库服务,能够支持PB级数据的实时查询和分析。作为一名数据工程师,我有幸在多个项目中使用过AnalyticDB,并积累了丰富的实践经验。本文将从我个人的角度出发,详细介绍AnalyticDB的核心概念,包括表结构设计、索引类型选择和分区策略,帮助读者更有效地组织和管理数据。
142 3
|
8月前
|
存储 SQL 算法
ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析
CollapsingMergeTree是ClickHouse的一种表引擎,它扩展了`MergeTree`,通过折叠行来优化存储和查询效率。当`Sign`列值为1和-1的成对行存在时,该引擎会异步删除除`Sign`外其他字段相同的行,只保留最新状态。建表语法中,`sign`列必须为`Int8`类型,用来标记状态(1)和撤销(-1)。写入时,应确保状态和撤销行的对应关系以保证正确折叠。查询时,可能需要使用聚合函数如`sum(Sign * x)`配合`GROUP BY`来处理折叠后的数据。使用`FINAL`修饰符可强制折叠,但效率较低。系列文章提供了更多关于ClickHouse及其表引擎的详细解析。
290 1
|
4月前
|
存储 消息中间件 分布式计算
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
61 0
|
8月前
|
传感器 存储 SQL
ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree是ClickHouse用于优化Graphite数据存储和汇总的表引擎,适合需要瘦身和高效查询Graphite数据的开发者。它基于MergeTree,减少存储空间并提升查询效率。创建表时需包括Path、Time、Value和Version列。配置涉及pattern、regexp、function和retention,用于指定聚合函数和数据保留规则。文章还提供了建表语句示例和相关资源链接。
116 1
|
8月前
|
存储 SQL 关系型数据库
ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析
`SummingMergeTree`是`MergeTree`引擎的变种,它合并相同主键的行并计算数值列的总和,从而节省存储空间和加速查询。通常与`MergeTree`配合使用,存储聚合数据以避免数据丢失。创建`SummingMergeTree`表时,可选参数`columns`指定要汇总的数值列。未指定时,默认汇总所有非主键数值列。注意,聚合可能不完整,查询时需用`SUM`和`GROUP BY`。文章还介绍了建表语法、数据处理规则以及对嵌套数据结构和`AggregateFunction`列的处理。查阅更多ClickHouse相关内容可访问相关链接。
293 5
|
8月前
|
存储 SQL 算法
ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
VersionedCollapsingMergeTree是ClickHouse的一种优化引擎,扩展了MergeTree,支持多线程异步插入和高效的数据折叠。它通过Sign和Version列处理对象状态的变化,Sign表示行的状态(正向或撤销),Version追踪状态版本。引擎自动删除旧状态,减少存储占用。在查询时,需注意可能需使用GROUP BY和聚合函数确保数据折叠,因为ClickHouse不保证查询结果已折叠。文章还提供了建表语法、使用示例和相关资源链接。
267 0
|
9月前
|
SQL 消息中间件 关系型数据库
ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
`ReplacingMergeTree`是ClickHouse的一种表引擎,用于数据去重。与`MergeTree`不同,它在合并分区时删除重复行,但不保证无重复。去重基于`ORDER BY`列,在ver列未指定时保留最新行,否则保留ver值最大者。数据处理策略包括延迟合并导致的不确定性及按分区去重。`CREATE TABLE`语法中,`ReplacingMergeTree`需要指定可选的`ver`列。相关系列文章提供了更深入的解析。
424 0
|
SQL 存储 安全
Hive 内部表(管理表)和外部表的区别【重点】
Hive 内部表(管理表)和外部表的区别【重点】
875 1