Sangwon
06/24/2026, 5:53 AMRocky
06/24/2026, 5:53 AMINSERT INTO ... SELECT FROM FILES() 또는 Broker Load 방식을 사용하면 `stream_load`와 유사하게 Upsert(Update + Insert) 로직을 구현할 수 있습니다.
다만, 이는 단순히 로딩 방식의 차이가 아니라 *대상 테이블의 엔진 타입(Primary Key 또는 Unique Key)*에 따라 결정됩니다.
1. Upsert 로직을 위한 테이블 설정
StarRocks에서 Upsert(기존 키가 있으면 업데이트, 없으면 삽입)를 수행하려면 대상 테이블이 다음 중 하나여야 합니다.
* Primary Key 테이블 (권장): 실시간 업데이트 성능이 가장 뛰어나며, INSERT 시 기본적으로 Upsert로 작동합니다.
* Unique Key 테이블: 대량의 배치 업데이트에 적합하며, 동일한 키가 들어오면 기존 데이터를 대체(Replace)합니다.
2. MinIO 데이터를 이용한 Upsert 방법
방법 A: INSERT INTO ... SELECT FROM FILES() (v3.1 이상 권장)
가장 간편한 방법으로, SQL만으로 MinIO의 데이터를 직접 조회해서 넣을 수 있습니다.
sql
INSERT INTO your_table
SELECT * FROM FILES(
"path" = "<s3://your-bucket/data/*.parquet>",
"format" = "parquet",
"aws.s3.endpoint" = "<http://minio-endpoint:9000>",
"aws.s3.access_key" = "your_access_key",
"aws.s3.secret_key" = "your_secret_key",
"aws.s3.enable_path_style_access" = "true"
);
* Upsert 작동 방식: `your_table`이 Primary Key 테이블이라면, 위 쿼리 실행 시 동일한 PK를 가진 행은 자동으로 업데이트되고, 새로운 PK는 삽입됩니다.
* 부분 업데이트 (Partial Update): v3.3.1 이상의 Primary Key 테이블에서는 INSERT INTO your_table (col1, col3) SELECT ... 처럼 컬럼을 명시하면 특정 컬럼만 업데이트하는 기능도 지원합니다.
방법 B: Broker Load (대용량/비동기)
매우 큰 대용량 파일을 비동기적으로 로딩할 때 적합합니다.
sql
LOAD LABEL my_database.label_1
(
DATA INFILE("<s3a://your-bucket/data.csv>")
INTO TABLE your_table
COLUMNS TERMINATED BY ","
(id, name, score)
SET (__op = 'upsert') -- 명시적으로 Upsert임을 지정 가능 (Primary Key 테이블)
)
WITH BROKER
(
"aws.s3.endpoint" = "<http://minio-endpoint:9000>",
"aws.s3.access_key" = "your_access_key",
"aws.s3.secret_key" = "your_secret_key"
);
3. 더 나은 대안: Pipe (연속 로딩)
만약 MinIO에 데이터가 쌓일 때마다 자동으로 로딩되기를 원하신다면 Pipe 기능을 추천합니다. MinIO의 새로운 파일을 감지하여 자동으로 INSERT 작업을 수행해줍니다.
요약
* 가능 여부: 가능합니다.
* 핵심 조건: 데이터를 넣을 테이블이 Primary Key 엔진이어야 합니다.
* 추천 방식: 간편한 관리를 원하시면 `INSERT + FILES()`를, 대용량 처리가 필요하면 *Broker Load*를 사용하세요.
더 구체적인 데이터 포맷(CSV, Parquet 등)이나 테이블 스키마를 알려주시면 맞춤형 쿼리 작성을 도와드릴 수 있습니다.
References
• sql-reference/sql-functions/table-functions/files.md
• loading/InsertInto.md
• sql-reference/sql-statements/loading_unloading/INSERT.md
• loading/Load_to_Primary_Key_tables.mdSangwon
06/24/2026, 6:00 AMRocky
06/24/2026, 6:00 AMExpect: 100-continue 헤더를 필수적으로 요구하는데, 중간에 있는 Ingress(Nginx 등)가 이 헤더를 처리하는 과정에서 문제가 생기기 때문입니다.
1. StarRocks 버전 및 HTTP/1.0 문제 (버그 확인)
StarRocks 특정 버전(v3.1~v3.3 초기 버전)에서 Ingress나 프록시가 요청을 *HTTP/1.0*으로 전달할 경우, StarRocks FE가 100-continue 헤더를 제대로 인식하지 못하는 버그가 있었습니다.
* 해결책: StarRocks 버전을 v3.3.6 이상 또는 최신 패치 버전으로 업데이트하는 것을 권장합니다. (관련 이슈: #52998)
2. Nginx Ingress 설정 (Annotations)
Nginx Ingress가 요청을 버퍼링하거나 프로토콜 버전을 낮추면 헤더가 누락될 수 있습니다. Ingress 설정에 다음 Annotation들을 추가해 보세요.
yaml
metadata:
annotations:
# 1. HTTP/1.1 사용 강제 (100-continue는 1.1 필수)
<http://nginx.ingress.kubernetes.io/proxy-http-version|nginx.ingress.kubernetes.io/proxy-http-version>: "1.1"
# 2. 요청 버퍼링 비활성화 (대용량 업로드 시 Ingress 메모리 이슈 방지)
<http://nginx.ingress.kubernetes.io/proxy-buffering|nginx.ingress.kubernetes.io/proxy-buffering>: "off"
# 3. 바디 사이즈 제한 해제
<http://nginx.ingress.kubernetes.io/proxy-body-size|nginx.ingress.kubernetes.io/proxy-body-size>: "0"
# 4. 타임아웃 연장 (대용량 로딩 시)
<http://nginx.ingress.kubernetes.io/proxy-read-timeout|nginx.ingress.kubernetes.io/proxy-read-timeout>: "600"
<http://nginx.ingress.kubernetes.io/proxy-send-timeout|nginx.ingress.kubernetes.io/proxy-send-timeout>: "600"
3. FE Proxy 사용 (권장 방식)
StarRocks를 Helm으로 설치하셨다면, starrocksFeProxy 설정을 활성화하는 것이 가장 안정적입니다. `stream_load`는 FE에 요청을 보낸 뒤 실제 데이터 전송은 BE로 *HTTP 307 Redirect*가 일어나는데, Ingress 환경에서는 이 리다이렉션 주소(BE IP)를 클라이언트가 찾지 못하는 경우가 많습니다.
`values.yaml`에서 다음과 같이 설정하면 전용 프록시(Nginx 기반)가 생성되어 이 문제를 해결해 줍니다.
yaml
starrocks:
starrocksFeProxySpec:
enabled: true
service:
type: LoadBalancer # 또는 NodePort
이후 호출 주소를 `http//<FE PROXY IP>8080/api/...`로 변경하여 테스트해 보세요.
4. 클라이언트(curl) 확인
클라이언트에서 헤더를 명시적으로 보내고 있는지 다시 확인해 주세요.
bash
curl --location-trusted -u root:password \
-H "Expect: 100-continue" \ # 이 헤더가 필수입니다
-H "label:my_label" \
-T data.csv \
-XPUT http://<ingress-host>/api/db/table/_stream_load
요약하자면:
1. 먼저 *버전 업데이트*를 검토하시고,
2. Ingress의 proxy-http-version: "1.1" 및 proxy-buffering: "off" 설정을 적용해 보시기 바랍니다.
3. 여전히 문제가 있다면 FE Proxy 기능을 활성화를 가장 추천드립니다.
References
• quick_start/helm.md
• sql-reference/sql-statements/loading_unloading/STREAM_LOAD.md
• GitHub Issue #52998: stream load failed under HTTP/1.0
References
• quick_start/helm.md
• sql-reference/sql-statements/loading_unloading/STREAM_LOAD.md
• faq/loading/Stream_load_faq.md
• loading/StreamLoad.mdSangwon
06/24/2026, 6:33 AMRocky
06/24/2026, 6:33 AMsql
-- LZ4 사용 (또는 명시하지 않으면 기본 적용)
CREATE TABLE my_table ( ... )
DISTRIBUTED BY HASH(id)
PROPERTIES (
"compression" = "LZ4"
);
-- ZSTD 사용 (v3.3.2+ 부터 레벨 지정 가능)
CREATE TABLE my_table_zstd ( ... )
DISTRIBUTED BY HASH(id)
PROPERTIES (
"compression" = "zstd(3)"
);
결론적으로: 쿼리 성능이 최우선이라면 LZ4, 비용 효율성과 스토리지 절약이 중요하다면 *ZSTD*를 선택하십시오.
References
• table_design/data_compression.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/BE_configuration.md
• knowledge/usage/best-practice.md
References
• table_design/data_compression.md
• administration/management/BE_configuration.md
• knowledge/usage/best-practice.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• loading/loading_introduction/feature-support-loading-and-unloading.mdSangwon
06/24/2026, 6:44 AMRocky
06/24/2026, 6:45 AMALTER SYSTEM CREATE IMAGE; 명령을 통해 최신 메타데이터 이미지를 생성하고 백업해 두는 것이 안전합니다.
3. 시스템 변수 확인: 특정 상황에서 enable_rewrite_simple_agg_to_meta_scan 변수가 메타데이터 스캔 시 문제를 일으킬 수 있으므로, 이슈 발생 시 해당 설정을 `false`로 바꾸어 테스트해 볼 수 있습니다.
만약 이미 FE가 뜨지 않는 상황이라면, `fe.conf`에 metadata_ignore_unknown_operation_type = true 옵션을 추가하여 강제로 메타데이터를 로드한 뒤 이미지를 새로 생성하는 복구 절차가 필요할 수 있습니다. (StarRocks 공식 가이드 참고) 할 수 있습니다.
References
• release_notes/release-3.5.md
• release_notes/release-4.0.md
• administration/management/metadata_management.md
• faq/metadata/Metadata_faq.md
References
• release_notes/release-3.5.mdSangwon
06/24/2026, 6:47 AMRocky
06/24/2026, 6:47 AMSET GLOBAL enable_rewrite_simple_agg_to_meta_scan = false; 설정을 통해 안정성을 우선 확보할 수 있습니다.
요약하자면:
v4.1.2는 질문하신 v3.5/4.0.4 시절의 고질적인 메타데이터 버그들이 수정된 안정적인 릴리스입니다. 안심하고 업데이트를 검토하셔도 좋으나, 만약의 상황에 대비해 업데이트 전 `ALTER SYSTEM CREATE IMAGE;`를 통해 *메타데이터 스냅샷(Image)을 반드시 생성*하고 진행하시길 권장합니다.
References
• release_notes/release-3.5.md (v3.5.13 fix list)
• release_notes/release-4.0.md (v4.0.11 fix list)
• release_notes/release-4.1.md (v4.1 upgrade/4.1.1 behavior changes)
• administration/management/metadata_management.md
References
• release_notes/release-3.4.md
• release_notes/release-3.5.md