<@U0A71G31CDV> Starrocks FE,CN 조합으로internal catalo...
# questions-and-troubleshooting
s
@Rocky Starrocks FE,CN 조합으로internal catalog pk table사용중인데, 쿼리 칠 때마다 데이터 개수가 달라지는데 이게 원인이 뭐야?
r
StarRocks의 *Primary Key(PK) 테이블*을 FE+CN(Shared-data 모드) 환경에서 사용할 때 쿼리마다 데이터 개수가 다르게 나오는 현상은 크게 세 가지 원인으로 압축될 수 있습니다. 1. 데이터 가시성(Visibility) 설정 문제 (
enable_sync_publish
)
PK 테이블은 데이터 입력 시 Delete+Insert 방식을 사용하며, 데이터 로드 후 "Apply" 단계가 완료되어야 최종 데이터가 확정됩니다. * 원인:
enable_sync_publish
설정이 `false`(비동기)로 되어 있으면, 로드 작업이 '성공'으로 리턴되어도 내부적으로는 아직 PK 인덱스를 업데이트하고 이전 데이터를 삭제 표시(Delete Vector 생성)하는 과정이 진행 중일 수 있습니다. 이 과정에서 쿼리를 치면 시점에 따라 이전 데이터가 포함되거나 제외되어 개수가 달라질 수 있습니다. * 해결책: FE 설정에서
enable_sync_publish = true
(v3.2.0 이상 기본값)로 설정되어 있는지 확인하세요. 이 설정을 켜면 데이터가 실제로 쿼리 가능한 상태(Apply 완료)가 된 후에만 로드 성공을 반환합니다. 2. 동시 로딩(Concurrent Loading) 및 트랜잭션 * 원인: 실시간으로 대량의 데이터가 계속 로드되고 있다면, StarRocks는 MVCC(Multi-Version Concurrency Control)를 사용하므로 매 쿼리 시점마다 최신 버전(Visible Version)이 달라집니다. 특히 다량의
INSERT
혹은 `UPSERT`가 초당 여러 번 발생하는 경우 쿼리할 때마다 개수가 늘어나는 것은 정상적인 동작입니다. * 확인 방법:
SHOW ALTER TABLE MATERIALIZED VIEW
혹은 `SHOW LOAD`를 통해 데이터 로드 주기가 지나치게 빈번하지 않은지, 혹은 로드 완료 시점과 쿼리 시점이 겹치는지 확인해 보세요. 3. 메타데이터 동기화 및 캐시 이슈 (Shared-data 특성) FE와 CN 조합(공유 저장소 모델)에서는 메타데이터는 FE가 관리하고 데이터는 객체 스토리지(S3 등)에 저장됩니다. * 원인: 특정 노드(CN)에서 데이터 캐시(Data Cache) 혹은 메타데이터 캐시가 최신 상태로 갱신되는 과정에서 일시적인 불일치가 발생할 가능성이 있습니다. (특히 v3.1 이전 버전에서 PK 테이블을 Shared-data로 사용할 때 드물게 보고된 바 있습니다.) * 해결책: 현재 사용 중인 StarRocks 버전을 확인해 보세요. v3.1.4 이상 혹은 v3.2 이상의 최신 패치 버전을 사용 중인지 확인하고, 만약
count(_)
결과가 계속 요동친다면
SELECT count(_) FROM table
대신 `SELECT count(pk_column) FROM table`로 쿼리하여 결과가 같은지 비교해 보시기 바랍니다. 추천 조치 사항 1. 동기화 로드 확인:
ADMIN SHOW FRONTEND CONFIG LIKE 'enable_sync_publish';
명령어로 설정값을 확인하고 필요 시 `true`로 변경하세요. 2. 데이터 버전 확인: 쿼리 시
SELECT count(*) FROM table
뒤에
_statistics_
관련 메타데이터나 `SHOW PROC '/dbs/<db_id>/<table_id>/partitions';`를 통해 `VisibleVersion`이 쿼리할 때마다 올라가고 있는지 확인하세요. 3. 버전 업데이트: 만약 데이터 로드가 없는 상황에서도 개수가 변한다면, 이는 Shared-data 모드 초기 버전의 버그일 가능성이 높으므로 최신 마이너 버전을 적용하는 것을 권장합니다. 만약 위 조치 후에도 현상이 지속된다면, 구체적인 StarRocks 버전과 데이터 로드 방식(Stream Load, Flink Connector 등)을 알려주시면 더 정확한 분석이 가능합니다. References • knowledge/admin_and_operation/shared_data_compaction.md
s
@Rocky stream load할때, upsert잖아 update, insert가 각각 몇 건이 수행됐는지 알수있어?
r
결론부터 말씀드리면, StarRocks의 Stream Load 결과(JSON 응답)에서는 Update와 Insert가 각각 몇 건인지 나누어 보여주지 않습니다. 1. 원인: Internal Upsert 메커니즘 StarRocks의 *Primary Key(PK) 테이블*은 내부적으로 모든 쓰기 작업을 Delete+Insert(UPSERT) 방식으로 처리합니다. * 데이터 로드 시, 해당 PK가 이미 존재하는지 PK 인덱스에서 확인합니다. * PK가 있으면: 기존 데이터의 위치를 찾아서 삭제 표시(Delete Vector 업데이트)를 하고, 새 데이터를 씁니다. * PK가 없으면: 그냥 새 데이터를 씁니다. 이 과정이 원자적으로 수행되지만, 로드 결과 인터페이스에서는 둘 다 성공적으로 입력된 행으로 간주하여 *`NumberLoadedRows`*라는 하나의 합계 수치로만 반환합니다. 2. Stream Load 응답 예시
Copy code
json
{
    "Status": "Success",
    "NumberTotalRows": 100,
    "NumberLoadedRows": 100,  // Insert와 Update의 합계
    "NumberFilteredRows": 0,
    "NumberUnselectedRows": 0,
    ...
}
여기서 `NumberLoadedRows`는 테이블에 최종적으로 반영된 모든 행의 개수입니다. 3. 꼭 확인해야 할 경우의 우회 방법 StarRocks 내에서 로딩 시점에 이를 분리할 수 있는 직접적인 옵션은 현재 없으나, 비즈니스 로직상 구분이 꼭 필요하다면 다음과 같은 방법을 고려할 수 있습니다. 1. 임시 테이블(Staging) 활용: 데이터를 먼저 일반 Duplicate Key 테이블(임시)에 로드한 후, `INSERT INTO ... SELECT`와 `LEFT JOIN`을 사용하여 기존 테이블에 있는 키인지 확인하여 직접 카운트하고 최종 테이블에 넣는 방식입니다. (성능 오버헤드 발생 가능) 2. 애플리케이션/기타 도구 레벨: 데이터를 쏘는 쪽(Flink CDC 등)에서 Source DB의 이벤트를 분석하여 카운트하거나, StarRocks에 넣기 전 미리 체크하는 로직을 두어야 합니다. 3. *`*op` 필드 활용 (Delete 구분은 가능):* 만약 `upsert`가 아니라 명시적으로 `delete`를 수행하는 건수가 궁금하다면, 로드 시
*op
컬럼을 사용하여 삭제 작업을 명시적으로 던질 수 있습니다. 하지만 이 경우에도 결과 JSON에서는 'Loaded'로 합산되어 나옵니다. 요약 StarRocks는 실시간 고속 업데이트를 위해 PK 인덱스 기반의 *UPSERT*를 단일 흐름으로 처리하므로, 표준 Stream Load 응답값만으로는 신규 삽입(Insert)과 기존 수정(Update)을 구분할 수 없습니다. References • sql-reference/sql-statements/loading_unloading/STREAM_LOAD.md • loading/Load_to_Primary_Key_tables.md • table_design/table_types/primary_key_table.md References • loading/Load_to_Primary_Key_tables.md • sql-reference/sql-statements/table_bucket_part_index/auto_increment.md • table_design/table_types/primary_key_table.md
r
@Rocky internal catalog에 external catalog mview 를 만들어놧는데 fe 재부팅시 rEPLAY속도가 느린 이유는?
r
Internal Catalog에 External Catalog(Hive, Iceberg, Glue 등) 기반의 *Materialized View(MV)*를 생성한 환경에서 FE 재부팅 시 리플레이(Replay) 속도가 느려지는 원인은 주로 외부 메타데이터와의 동기화 과정 및 방대한 파티션 정보 때문입니다. 주요 원인과 해결 방안은 다음과 같습니다. 1. 외부 카탈로그 메타데이터 조회 블로킹 (가장 유력한 원인) StarRocks FE가 재시작하며 Edit Log를 리플레이할 때, 특정 버전이나 상황에서 *외부 시스템(Hive Metastore, HDFS, S3 등)에 직접 통신을 시도*하는 경우가 있습니다. * 원인: 리플레이 과정 중 외부 테이블의 통계 정보(Statistics)나 파티션 정보를 업데이트하려는 로직이 실행되면서, 외부 카탈로그 응답이 늦어지면 리플레이 스레드(Replayer) 전체가 대기 상태에 빠집니다. * 관련 버그: 최근 StarRocks 커뮤니티에서 `OP_ADD_EXTERNAL_BASIC_STATS_META`와 같은 로그를 리플레이할 때 외부 HMS 호출로 인해 리플레이가 멈추거나 느려지는 현상이 보고된 바 있습니다. 2. 방대한 파티션 메타데이터와 Edit Log 비대화 External Catalog 기반의 MV는 데이터 정합성을 위해 외부 테이블의 파티션 변경 사항을 추적합니다. * 원인: 외부 테이블의 파티션 개수가 수만 개 이상으로 많거나, MV가 참조하는 범위가 넓을 경우 FE가 관리해야 할 메타데이터 양이 급증합니다. 이 정보들이 Edit Log에 누적되면 재부팅 시 로드해야 할 양이 많아져 시간이 오래 걸립니다. * 현상:
meta/image
파일이 생성된 지 오래되었고,
meta/bdb
아래의 로그 파일 개수가 많을수록 리플레이 시간이 선형적으로 증가합니다. 3. 통계 정보(Statistics) 수집 로그 외부 테이블에 대해 `ANALYZE`를 수행했거나 자동 통계 수집이 활성화된 경우, 통계 관련 메타데이터 로그가 생성됩니다. * 원인: FE는 시작 시 최신 통계 정보를 메모리에 올리는데, 외부 테이블의 경우 리플레이 도중 캐시를 갱신하려고 시도하며 이 과정에서 네트워크 IO가 발생하여 지연을 유발합니다. ────────── 해결 및 조치 방안 1. 메타데이터 이미지 강제 생성 (Checkpoint): 정상 작동 중일 때 아래 명령어를 통해 최신 상태를
image
파일로 저장하세요. 이렇게 하면 다음 재부팅 시 리플레이해야 할 로그 양이 최소화됩니다.
Copy code
sql
    ALTER SYSTEM CREATE IMAGE;
명령어 실행 후
meta/image
디렉토리에 새로운 이미지가 생성되었는지 확인하세요.
2. 외부 시스템 연결성 확인: FE 서버에서 Hive Metastore(HMS)나 데이터 소스(S3/HDFS)로의 네트워크 지연이 없는지 확인하세요. 외부 시스템이 느리면 FE 리플레이도 같이 느려집니다. 3. 불필요한 외부 통계 수집 제한: 외부 테이블의 파티션이 너무 많다면, 자동 통계 수집 범위를 조정하거나 필요한 컬럼에 대해서만 수집하도록 설정하여 메타데이터 부하를 줄여야 합니다. 4. StarRocks 버전 업데이트: 리플레이 도중 외부 시스템 호출로 인해 블로킹되는 문제는 성능 저하뿐 아니라 시스템 안정성에도 영향을 미치므로, 해당 버그가 수정된 최신 패치 버전(v3.1.x, v3.2.x 이후의 최신 릴리스)으로 업데이트하는 것을 권장합니다. 추가 확인 사항: 만약 리플레이 도중 FE 로그(
fe.log
또는
fe.warn.log
)에
MetadataMgr.getTable
혹은
HMS
관련 타임아웃/지연 로그가 찍히고 있다면, 1번 원인(블로킹 문제)일 확률이 매우 높습니다. 이 경우 FE 설정을 통해 외부 메타데이터 캐시 관련 옵션을 튜닝해야 할 수도 있습니다.
r
@Rocky mv_plan_cache_thread_pool_size를 늘리면 fe 부팅시 MV REPLAY시간이 짧아져?
r
결론부터 말씀드리면, `mv_plan_cache_thread_pool_size`를 늘린다고 해서 FE 부팅 시의 MV 리플레이(Replay) 속도가 직접적으로 빨라지지는 않습니다. 이 설정값이 왜 리플레이 속도와 직접적인 관련이 없는지, 그리고 실제로 리플레이가 느린 원인과 해결책은 무엇인지 정리해 드립니다. 1. `mv_plan_cache_thread_pool_size`의 역할 이 파라미터는 FE 부팅 과정이 아니라, *사용자의 쿼리가 들어왔을 때 MV를 이용한 쿼리 재작성(Query Rewrite)에 필요한 플랜 캐시를 관리하는 스레드 풀*의 크기를 의미합니다. (v3.2에 도입) * 주 용도: 쿼리 최적화 단계에서 MV를 사용해 쿼리를 변환할 때, 매번 플랜을 새로 생성하지 않고 캐시된 플랜을 가져오는 과정의 병렬 처리를 돕습니다. * 리플레이와 무관한 이유: FE 부팅 시 수행되는 리플레이는 BDB JE(Berkeley DB)에 저장된 Edit Log를 순차적으로 읽어 메모리에 메타데이터 객체를 복구하는 과정입니다. 이 과정은 기본적으로 *단일 스레드(
replayer
스레드)*로 동작하므로, 쿼리 실행 시 사용하는 스레드 풀 크기를 늘려도 리플레이 자체는 빨라지지 않습니다. 2. 리플레이가 느린 실제 원인 (External Catalog MV 기준) 사용자님이 질문하신 "External Catalog 기반 MV"의 리플레이가 느린 이유는 주로 외부 시스템과의 통신 블로킹 때문입니다. * 외부 메타데이터 조회: FE가 MV 정보를 복구할 때, MV가 참조하는 외부 테이블(Hive, Iceberg 등)의 파티션 정보나 통계 정보를 확인하기 위해 외부 카탈로그(HMS, S3 등)에 접근하는 경우가 있습니다. * 네트워크 I/O 대기: 만약 리플레이 도중에 외부 시스템 응답이 늦어지면, 단일 스레드인 리플레이 스레드가 해당 응답을 받을 때까지 멈춰 있게(Blocking) 됩니다. 이로 인해 수천 개의 MV가 있다면 부팅 시간이 기하급수적으로 늘어납니다. 3. 실제로 리플레이 속도를 줄이는 방법 리플레이 시간을 단축하려면 아래 설정과 조치들을 검토해야 합니다. 1.
enable_materialized_view_concurrent_prepare
(v3.4.4+):
최신 버전에서는 MV 준비 과정을 병렬로 처리하여 성능을 개선하는 옵션이 추가되었습니다. 이 기능이 활성화되어 있는지 확인해 보세요. 2. 최신 이미지 생성 (CheckPoint): 리플레이할 로그 양 자체가 많으면 느려집니다. 부팅 전 혹은 주기적으로 `ALTER SYSTEM CREATE IMAGE;`를 실행하여 현재 메타데이터 상태를 이미지 파일로 굳히면, 다음 부팅 시 리플레이해야 할 로그가 줄어듭니다. 3. 통계 정보 리플레이 최적화: 최신 패치 버전(v3.1.x, v3.2.x 후기 버전)들에는 리플레이 도중 외부 통계 정보를 수집하며 블로킹되는 현상을 개선하는 로직이 포함되어 있습니다. 버전이 낮다면 업데이트를 권장합니다. 4. 외부 카탈로그 캐시 설정:
background_refresh_metadata_interval_millis
등을 통해 외부 메타데이터를 주기적으로 캐싱하여, FE가 기동 시 외부 시스템에 직접 물어보는 횟수를 줄여야 합니다. 요약 * `mv_plan_cache_thread_pool_size`: 쿼리 실행(Rewrite) 시의 성능 옵션이며, 부팅 속도와는 무관함. * 느린 원인: 리플레이 스레드가 외부 카탈로그(HMS 등)의 응답을 기다리며 멈추기 때문. * 해결 방안: `ALTER SYSTEM CREATE IMAGE`로 로그 양 축소, StarRocks 최신 패치 버전으로 업데이트, 혹은 외부 메타데이터 통신 지연 확인. References • administration/management/FE_configuration.md • using_starrocks/async_mv/use_cases/data_lake_query_acceleration_with_materialized_views.md • knowledge/trouble_shooting/fe_deadlock_problems.md References • administration/management/FE_configuration.md • knowledge/trouble_shooting/fe_memory_problems.md • knowledge/trouble_shooting/fe_deadlock_problems.md
r
@Rocky enable_profile true 설정하면변경되는 점과 그 효과, 그리고 성능상의 디메리트가 있나
r
enable_profile
설정은 StarRocks에서 쿼리 실행의 상세 내역(Profile)을 수집할지 여부를 결정하는 옵션입니다. 이 설정을 `true`로 변경했을 때의 변화와 장단점은 다음과 같습니다. 1. 변경되는 점 및 효과 * 상세 실행 로그 수집: 쿼리가 실행되는 동안 각 BE(Backend)에서 발생하는 CPU 사용량, 메모리 점유, 스캔 데이터 양, 네트워크 전송 시간 등 모든 연산(Operator) 단위의 지표를 수집합니다. * 시각화 및 분석 가능: 수집된 데이터는 FE의 웹 UI(
http://<FE_IP>:8030/query
)에서 확인하거나,
get_query_profile(query_id)
함수를 통해 텍스트 형태로 뽑아볼 수 있습니다. * 쿼리 튜닝의 핵심: 어떤 부분에서 병목(Bottleneck)이 발생하는지, 데이터 왜곡(Skew)이 있는지, 인덱스가 제대로 작동하는지를 정확히 파악할 수 있게 됩니다. 2. 성능상의 디메리트 (부작용) 이 설정은 분석에는 매우 유용하지만, 운영 환경(Production)에서 전역(Global)으로 상시 켜두기에는 다음과 같은 부담이 있습니다. * FE의 부하 증가: 쿼리가 끝날 때마다 FE는 각 BE에 분산된 수많은 실행 지표를 하나로 모아서 정리(Merge)하고 메모리에 저장해야 합니다. 쿼리 복잡도가 높을수록 FE의 CPU와 메모리 사용량이 늘어납니다. * 쿼리 응답 속도 지연 (Latency): 실제 연산은 끝났더라도 FE가 프로파일 데이터를 수집하고 처리하는 시간이 추가되므로, 클라이언트가 느끼는 최종 쿼리 응답 시간이 약간 길어질 수 있습니다. * 동시성 저하: 초당 수백~수천 건의 짧은 쿼리가 발생하는 고대역폭(High Concurrency) 환경에서는 프로파일 수집 자체가 시스템 전체의 병목이 될 수 있습니다. 3. 권장 사용법 성능 저하를 최소화하면서 효과를 보려면 다음과 같이 사용하는 것이 좋습니다. 1. 세션 단위 설정 (권장): 전역으로 켜지 말고, 분석이 필요한 특정 쿼리를 실행할 때만 해당 세션에서 활성화합니다.
Copy code
sql
    SET enable_profile = true;
    -- 분석할 쿼리 실행
    SELECT ... ;
    SET enable_profile = false;
2. 느린 쿼리만 자동 수집: 모든 쿼리가 아니라 특정 시간 이상 걸리는 쿼리에 대해서만 프로파일을 남기고 싶다면, 전역 설정 대신 *`query_detail_limit`*이나 관련 모니터링 설정을 통해 관리하는 것이 효율적입니다. 3. 운영 환경 유의사항: 운영 중인 클러스터에서 전역(
SET GLOBAL
)으로 켤 경우, 반드시 FE의 메모리 사용량과 CPU 상태를 모니터링하며 진행해야 합니다. 요약 * 효과: "왜 느린지"를 완벽하게 파악할 수 있는 상세 보고서를 제공함. * 디메리트: FE의 자원(CPU/MEM) 소모가 발생하며, 특히 쿼리 건수가 많을 때 성능 저하가 뚜렷함. * 결론: 상시 활성화보다는 *필요한 시점에 세션 단위로 사용*하는 것이 가장 안전합니다. References • administration/management/FE_configuration.md • administration/Query_planning_statistics.md • administration/Query_profile.md References • administration/Query_profile.md • administration/management/FE_configuration.md • administration/Query_planning_statistics.md
r
@Rocky bdb edit log 쌓인거 수동으로 checkpoint생성하는법
r
BDB Edit Log(메타데이터 변경 이력)이 너무 많이 쌓여 수동으로 Checkpoint(이미지 파일 생성 및 로그 정리)를 수행하는 방법은 다음과 같습니다. 1. 수동 Checkpoint 명령어 실행 StarRocks의 *Leader FE*에 접속하여 아래 SQL 명령어를 실행합니다. 이 명령은 현재 메모리에 있는 메타데이터를 스냅샷 형태의
image
파일로 저장하도록 강제합니다.
Copy code
sql
ALTER SYSTEM CREATE IMAGE;
2. 진행 상황 확인 (FE 로그 모니터링) 위 명령어는 *비동기(Asynchronous)*로 동작합니다. 실제 진행 여부는 Leader FE의
fe.log
파일에서 확인할 수 있습니다. * 시작 로그:
triggering a new checkpoint manually...
또는
begin to generate new image: image.xxxx
* 완료 로그:
finished save image.xxxx
또는
checkpoint finished save image.xxxx
3. 메타데이터 디렉토리 확인 FE의 메타데이터 경로(기본값:
meta
디렉토리)에서 파일이 생성되었는지 확인합니다. * 경로:
meta/image/
* 결과: 명령이 성공하면
image.<버전번호>
파일이 새롭게 생성되어 있어야 합니다. 4. BDB Log (.jdb) 파일의 삭제 원리 `CREATE IMAGE`를 수행한다고 해서
meta/bdb/
아래의
.jdb
파일들이 즉시 삭제되지는 않습니다. 1.
image
파일이 성공적으로 생성되면, 해당 시점 이전의 로그들은 더 이상 부팅 시 리플레이할 필요가 없어집니다. 2. Berkeley DB JE(BDB) 내부의 *Cleaner 스레드*가 백그라운드에서 더 이상 참조되지 않는
.jdb
파일들을 감지하고 일정 시간 후에 점진적으로 삭제합니다. 3. 만약 로그가 계속 삭제되지 않는다면, FE 설정 중 `edit_log_roll_num`(기본 50,000)이 너무 크게 잡혀 있거나 Checkpoint 과정에서 에러가 발생했는지 확인해야 합니다. 주의사항 * 이 작업은 반드시 *Leader FE*에서 트리거되어야 하며, 데이터 양에 따라
image
파일 생성 중 FE의 CPU/IO 사용량이 일시적으로 상승할 수 있습니다. * 만약
show proc '/frontends';
명령에서 특정 FE의
Join
상태가 `false`이거나 메타데이터 버전이 크게 차이 난다면, Checkpoint 이전에 네트워크 상태나 FE 클러스터 상태를 먼저 점검하십시오. References • sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md • administration/management/monitoring/alert.md • administration/management/FE_configuration.md References • sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md • administration/management/monitoring/alert.md • administration/management/FE_configuration.md References • sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md • administration/management/FE_configuration.md • administration/management/monitoring/alert.md • sql-reference/sql-statements/backup_restore/CREATE_REPOSITORY.md
r
@Rocky Starrocks 재기동시 Mview 리로딩할때 시간이 소요되는 이유와 시간이 안걸리는 케이스
r
StarRocks FE가 재기동될 때 Materialized View(MV) 로딩(리로딩)으로 인해 시간이 소요되는 주된 이유는 메타데이터 복구(Replay) 과정에서의 직렬 처리와 외부 시스템과의 통신 지연 때문입니다. 반면, 로딩이 거의 즉시 완료되어 시간이 걸리지 않는 케이스는 메타데이터가 최신 상태로 유지되었거나 로컬 자원만 사용하는 경우입니다. 상세 내용은 다음과 같습니다. ────────── 1. 시간이 오래 걸리는 이유 1. 외부 카탈로그(HMS/S3 등) 통신 블로킹: * 가장 큰 원인입니다. *External Catalog(Hive, Iceberg, Glue 등)*를 기반으로 생성된 MV가 많을 때, FE는 부팅 시 MV의 상태를 확인하기 위해 외부 메타데이터 서비스(HMS 등)에 연결을 시도합니다. * 이 과정에서 네트워크 I/O가 발생하며, 외부 시스템의 응답이 늦어지면 단일 스레드로 동작하는 메타데이터 리플레이 스레드가 해당 응답을 받을 때까지 멈추게(Blocking) 되어 전체 부팅 시간이 길어집니다. 2. BDB JE Edit Log의 양: * StarRocks는 모든 메타데이터 변경 사항을 BDB JE에 Edit Log 형식으로 저장합니다. 마지막 체크포인트(Image 생성) 이후 변경 내역이 수만 건 쌓여 있다면, 부팅 시 이를 순차적으로 하나씩 다시 읽어 MV 객체를 메모리에 생성해야 합니다. 3. 순차적 리플레이 (Sequential Replay): * 기본적으로 메타데이터 복구는 순차적으로 진행됩니다. MV가 수천 개라면 하나하나 상태를 확인하고 플랜 정보를 복구하는 과정이 누적되어 병목이 됩니다. ────────── 2. 시간이 걸리지 않는 케이스 (빠른 케이스) 1. 내부 테이블(OLAP) 기반 MV: * StarRocks 내부에 직접 저장된 OLAP 테이블만을 기반으로 만든 MV는 외부 시스템과 통신할 필요가 없습니다. 모든 데이터가 FE의 로컬 디스크(Meta 디렉토리)에 있으므로 리플레이 속도가 매우 빠릅니다. 2. 최신 이미지 파일(Checkpoint) 존재: *
ALTER SYSTEM CREATE IMAGE;
명령을 통해 최근에 메타데이터 스냅샷을 생성했다면, 읽어야 할 Edit Log 양이 거의 없으므로 부팅 즉시 MV 정보가 로드됩니다. 3. 최신 버전의 병렬 최적화 옵션 사용: *
enable_materialized_view_concurrent_prepare
(v3.4.4+)
: 이 설정이 `true`일 경우, MV 준비 과정을 병렬로 처리하여 이전 버전보다 훨씬 빠르게 로딩을 마칩니다. *
enable_mv_post_image_reload_cache
(v3.5.0+)
: 이미지 로드 후 중복된 MV 상태 체크를 최적화하여 시간을 단축합니다. ────────── 3. 로딩 시간을 단축하기 위한 권장 조치 * 정기적인 이미지 생성: 재기동 전이나 주기적으로 `ALTER SYSTEM CREATE IMAGE;`를 실행하여 로그를 압축하세요. * 버전 업그레이드: MV 로딩 성능 개선은 최신 버전(v3.3, v3.4 이상)에서 집중적으로 이루어졌습니다. 특히 v3.4.4 이상의 병렬 준비(Concurrent Prepare) 기능을 활용하는 것이 좋습니다. * 외부 카탈로그 캐싱: 외부 카탈로그 관련 MV가 많다면
background_refresh_metadata_interval_millis
등을 설정하여 메타데이터를 미리 캐싱해 두면 부팅 시 외부 통신 부담을 줄일 수 있습니다. * 비정상 부팅 시 긴급 조치: 만약 MV 오류로 부팅 자체가 안 될 정도로 느리다면,
ignore_materialized_view_error = true
설정을 FE 설정 파일에 추가하여 예외를 무시하고 부팅하게 할 수 있습니다. References • administration/management/FE_configuration.md • using_starrocks/async_mv/use_cases/data_lake_query_acceleration_with_materialized_views.md • using_starrocks/async_mv/troubleshooting_asynchronous_materialized_views.md • sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md References • administration/management/FE_configuration.md • using_starrocks/async_mv/use_cases/data_lake_query_acceleration_with_materialized_views.md