Sangwon
07/07/2026, 12:40 AMRocky
07/07/2026, 12:40 AMINSERT 수행 후 데이터가 즉시 조회되지 않는 현상은 주로 트랜잭션 가시성(Visibility) 및 *FE 간의 메타데이터 동기화 방식*과 관련이 있습니다.
요청하신 내용에 대해 단계별로 설명해 드립니다.
1. 데이터가 몇 초 뒤에 나오는 이유
StarRocks의 데이터 적재는 크게 `Write(쓰기) -> Commit(커밋) -> Publish(발행)`의 단계를 거칩니다. 데이터가 즉시 보이지 않는 이유는 주로 다음 두 가지 때문입니다.
* 트랜잭션 가시성 (Publish 단계):
StarRocks는 트랜잭션이 *커밋*된 이후에, 해당 데이터를 읽을 수 있는 상태로 만드는 Publish 과정을 거칩니다.
• Primary Key 테이블: StarRocks 3.2 버전부터 enable_sync_publish 설정이 추가되었습니다. 이 값이 `false`(기본값인 경우도 있음)라면, 트랜잭션 성공 응답을 보낸 후 백그라운드에서 데이터를 유효화(Apply)하므로 짧은 시간 동안 데이터가 안 보일 수 있습니다.
• Shared Data (공유 저장소) 모드: StarRocks 3.x에서 CN(Compute Node)을 사용하는 공유 저장소 구조라면, 성능 최적화를 위해 여러 트랜잭션을 묶어서 처리하는 lake_enable_batch_publish_version 기능이 동작할 수 있습니다. 이 경우 설정된 배치 조건이 충족될 때까지 데이터 노출이 수 초간 지연될 수 있습니다.
* FE Leader와 Follower 간의 동기화 지연:
INSERT 명령은 항상 *Leader FE*에서 처리됩니다. 반면, 조회(SELECT) 시 로드밸런서 등을 통해 *Follower FE*로 연결될 수 있습니다.
• StarRocks의 메타데이터 동기화(BDBJE)는 비동기 혹은 복제 방식으로 이루어지므로, Leader에서 커밋된 정보가 Follower FE의 메모리(캐시)까지 반영되는 데 아주 짧은(수 ms ~ 수 초) 시간 차이가 발생할 수 있습니다.
──────────
2. 완료 시점 및 FE 캐시 반영 메커니즘
모든 FE에 캐시가 반영되어야 커밋되는지, 혹은 하나라도 반영되면 되는지에 대한 답변입니다.
* 커밋 결정 (Quorum 방식):
StarRocks FE는 Quorum(과반수) 합의 방식을 사용합니다. 3대의 FE가 있다면, *Leader를 포함하여 최소 2대의 FE*에 메타데이터 로그(Edit Log)가 기록되면 트랜잭션은 성공적으로 커밋된 것으로 간주합니다.
• 3대 중 3대 모두에 반영될 때까지 기다리지 않습니다. 2대에 기록되는 즉시 사용자에게 'OK'를 반환합니다.
* 실제 완료(조회 가능) 시점:
사용자 입장에서 데이터가 실제로 조회 가능해지는 시점은 *Leader FE가 해당 트랜잭션을 VISIBLE 상태로 변경한 직후*입니다.
• 만약 조회 쿼리가 Leader FE로 전달된다면 커밋 즉시(혹은 Publish 직후) 데이터를 볼 수 있습니다.
• 만약 조회 쿼리가 아직 로그를 전달받지 못한 Follower FE로 전달된다면, 해당 FE가 Leader로부터 최신 Edit Log를 동기화하여 자신의 메타데이터 캐시를 갱신할 때까지 데이터가 보이지 않습니다.
3. 해결 및 확인 방법
현상을 개선하거나 확인하려면 다음 설정을 점검해 보세요.
1. 동기화 발행 설정 (Primary Key 테이블인 경우):
sql
-- FE 설정 확인
ADMIN SHOW FRONTEND CONFIG LIKE 'enable_sync_publish';
-- true로 설정하면 Publish까지 완료된 후 응답을 줍니다. (지연 발생 가능)
2. 세션 변수 조정:
데이터 가시성 대기 시간을 제어하는 tx_visible_wait_timeout (기본 10초) 변수를 통해, 트랜잭션이 Visible 상태가 될 때까지 쿼리가 기다리도록 제어할 수 있습니다.
3. 조회 FE 확인:
테스트 시 INSERT를 수행한 바로 그 FE(Leader일 가능성이 높음)에서 조회를 수행해도 동일한 지연이 발생하는지 확인해 보세요. 특정 FE에서만 지연된다면 메타데이터 동기화 속도 문제입니다.
요약하자면: 모든 FE에 반영된 후 완료되는 것이 아니라, *과반수(2대)에 기록되면 완료*됩니다. 다만, 조회하는 FE가 최신 정보를 동기화하는 시점에 따라 수 초의 차이가 발생할 수 있습니다.
References
• administration/management/FE_configuration.md
• loading/Flink-connector-starrocks.md
• sql-reference/System_variable.mdSangwon
07/07/2026, 12:46 AMRocky
07/07/2026, 12:46 AMINSERT 직후에 조회하면 데이터가 아직 'Publish' 되지 않아 보이지 않을 수 있습니다.
2. 관련 주요 설정 (FE Config)
배치 동작의 세밀한 제어는 다음 파라미터들로 결정됩니다.
설정 항목 | 기본값 | 설명
lake_enable_batch_publish_version | true | 배치 발행 기능 사용 여부 (v3.2.0+)
lake_batch_publish_min_version_num | 1 | 배치를 만들기 위한 최소 트랜잭션 버전 수
lake_batch_publish_max_version_num | 10 | 한 배치에 포함될 최대 트랜잭션 버전 수
lake_publish_version_max_threads | 512 | 공유 저장소용 Publish 작업을 수행할 최대 스레드 수
3. 해결 방안 (즉시 조회가 중요한 경우)
만약 시스템의 전체 처리량보다 *데이터의 즉시 가시성(Latency)*이 더 중요하다면 다음과 같이 설정할 수 있습니다.
* 배치 기능 끄기: (권장하지 않음, 성능 저하 가능성)
sql
ADMIN SET FRONTEND CONFIG ("lake_enable_batch_publish_version" = "false");
* 기다리도록 설정 (세션 레벨):
쿼리 실행 시 데이터가 보일 때까지 대기하도록 세션 변수를 조정합니다.
sql
SET wait_txn_visible_timeout = 10; -- 최대 10초 대기
4. 관련 문서 및 참조
이 기능은 StarRocks 3.2 버전부터 도입되었으며, 공식 문서의 FE 설정 페이지에서 상세 내용을 확인할 수 있습니다.
* 공식 문서: StarRocks FE Configuration - Shared-data
* 관련 블로그: StarRocks 공식 기술 블로그의 "Shared-data Batch Ingestion Optimization" 섹션에서 성능 벤치마크와 이 설정의 차이를 설명하고 있습니다.
요약하자면: 현재 겪고 계신 현상은 고성능 적재를 위한 *의도된 최적화 결과*입니다. 성능과 가시성 사이의 트레이드오프를 고려하여 위 설정을 조정해 보시길 권장합니다.
References
• administration/management/FE_configuration.md
• knowledge/usage/load/shared_data_batch_ingestion.md
• sql-reference/System_variable.mdSangwon
07/07/2026, 12:58 AMRocky
07/07/2026, 12:58 AMlake_batch_publish_min_version_num 값은 *1*입니다.
* 즉, 대기 중인 트랜잭션이 하나만 있더라도 시스템은 이를 즉시(혹은 다음 주기에) Publish 프로세스로 넘깁니다.
* 10개가 쌓일 때까지 무한정 기다리는 구조가 아닙니다.
2. 왜 그런데 수 초가 걸릴까요?
1개여도 발행이 가능한데 왜 지연이 발생하는지는 다음 요인들 때문일 가능성이 큽니다.
* Publish Daemon의 주기성: StarRocks 내부에서는 `PublishVersionDaemon`이라는 백그라운드 프로세스가 주기적으로 돌면서 커밋된 트랜잭션들을 확인하고 유효화합니다. 이 주기와 시스템 부하에 따라 아주 짧은 찰나의 지연이 발생할 수 있습니다.
* 공유 저장소(S3 등)의 통신 오버헤드: Shared-data 모드에서는 데이터 메타데이터를 저장소에 기록하고 확정하는 과정이 필요합니다. 로컬 디스크를 쓰는 방식보다 네트워크/스토리지 응답 속도에 영향을 더 받습니다.
* 복수의 CN 노드 처리: 10개의 CN 노드에 분산되어 적재된 데이터 조각들을 모두 확인하고 "이제 이 버전은 안전하다"라고 선언하는 과정에서 노드 간 통신 시간이 소요됩니다.
* FE 동기화 (가장 유력): 앞서 말씀드린 대로, 3대의 FE 중 Leader가 "완료"라고 판단했더라도, 사용자가 접속한 Follower FE가 그 소식을 전달받는 데 약간의 시차가 발생할 수 있습니다.
3. "실제 완료 시점"에 대한 명확한 답변
질문하신 "언제 실제 완료되는가"에 대한 정확한 기준은 다음과 같습니다.
1. 커밋 시점: Leader FE를 포함하여 *과반수(Quorum)의 FE*가 해당 트랜잭션 로그를 기록했을 때. (이때 사용자에게는 INSERT 성공 응답이 나갑니다.)
2. 조회 가능 시점 (Visible): `PublishVersionDaemon`이 해당 트랜잭션을 처리하여 상태를 `VISIBLE`로 변경하고, 사용자가 쿼리를 보낸 FE가 이 상태 정보를 알고 있을 때.
요약
* 10개가 안 쌓여도 발행됩니다. (최소 1개부터 가능)
* 지연이 발생하는 이유는 *백그라운드 처리 주기*와 메타데이터 동기화 시간 때문입니다.
* 즉시 조회가 반드시 필요하다면:
* INSERT를 수행한 바로 그 FE(Leader)에서 조회를 시도해 보세요.
* 또는 세션 설정에서 SET wait_txn_visible_timeout = 5; 처럼 설정하여, 데이터가 보일 때까지 쿼리가 잠시 기다리게 할 수 있습니다.
References
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
References
• administration/management/FE_configuration.mdSangwon
07/07/2026, 12:59 AMSangwon
07/07/2026, 12:59 AMRocky
07/07/2026, 1:00 AMpublish_version_interval_ms: 기본값은 *10ms(0.01초)*입니다.
* 즉, 이론적으로는 거의 실시간(연속적)으로 커밋된 트랜잭션이 있는지 확인하고 발행 작업을 시도합니다.
* 스레드가 512개(lake_publish_version_max_threads)라는 것은 이 작업을 동시에 병렬로 처리할 수 있는 능력이 매우 크다는 것을 의미합니다.
2. 그런데 왜 "수 초"가 걸릴까요?
수행 주기가 10ms임에도 불구하고 사용자가 느끼기에 수 초가 걸리는 이유는 *'데몬이 도는 주기'*가 아니라 '개별 작업의 완료 시간 및 동기화 시간' 때문입니다.
1. 공유 저장소(S3/객체 스토리지) 응답 속도:
Shared Data 모드에서는 데이터의 메타데이터를 S3와 같은 원격 저장소에 기록하고 확정해야 합니다. 로컬 디스크 작업보다 네트워크 IO 오버헤드가 크기 때문에, 10ms마다 데몬이 작업을 시작하더라도 실제 완료까지는 수백 ms에서 1~2초가 소요될 수 있습니다.
2. CN 노드와의 통신:
FE가 10개의 CN 노드에 "이 데이터를 이제 읽을 수 있게 준비하라"고 명령을 보내고 응답을 받는 과정(RPC)이 필요합니다. 노드 수가 많을수록 모든 노드의 상태를 확인하는 데 시간이 소요됩니다.
3. FE 간 메타데이터 동기화 (BDBJE):
이것이 가장 흔한 원인입니다. Leader FE에서 Publish가 완료되어도, 다른 2대의 Follower FE가 이 사실을 인계받는 데는 내부적인 복제 주기가 있습니다. 로드밸런서를 통해 Follower FE로 쿼리를 보냈다면, Leader로부터 최신 정보를 복제받을 때까지(수 초 이내) 데이터가 안 보일 수 있습니다.
4. Batch Publish의 대기 시간:
`lake_enable_batch_publish_version`이 켜져 있으면, 처리 효율을 위해 아주 잠깐 동안(보통 1초 미만) 트랜잭션들을 모으는 과정에서 미세한 지연이 추가될 수 있습니다.
3. 실제 완료 시점 상세
* Leader FE 기준: `PublishVersionDaemon`이 작업을 마친 직후 즉시 조회가 가능합니다.
* Follower FE 기준: Leader에서 생성된 *Edit Log*가 Follower FE로 복제되고, Follower가 이를 자신의 메모리에 반영(Replay)한 시점부터 조회가 가능합니다.
권장 확인 사항
만약 1~2초 수준이 아니라 그 이상의 지연이 발생한다면 다음 설정을 확인해 보세요:
* ADMIN SHOW FRONTEND CONFIG LIKE 'publish_version_interval_ms';: 이 값이 혹시 너무 크게 설정되어 있는지 확인 (기본 10).
* wait_txn_visible_timeout: SELECT 쿼리 전에 `SET wait_txn_visible_timeout = 5;`를 설정해 보세요. 이렇게 하면 쿼리가 "데이터가 나올 때까지 최대 5초간 대기"하므로 지연 현상을 사용자 레벨에서 해결할 수 있습니다.
결론적으로, 시스템은 0.01초마다 계속 일하고 있지만, 저장소 통신과 FE 간의 소식 전달 과정에서 발생하는 물리적인 시간이 수 초의 지연으로 나타나는 것입니다.
References
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
References
• administration/management/FE_configuration.md
• knowledge/usage/load/shared_data_batch_ingestion.md