Sangwon
08/05/2026, 4:23 AMRocky
08/05/2026, 4:24 AMENGINE=olap)을 사용하여 다른 StarRocks 클러스터를 연결하는 방식입니다.
* 주요 용도: 데이터 쓰기(Insert Into) 전용입니다.
* 한 클러스터에서 다른 클러스터로 데이터를 동기화하거나, 읽기-쓰기 분리(Read-Write Separation) 환경을 구축할 때 사용합니다.
* 통신 프로토콜: StarRocks 내부의 RPC(Remote Procedure Call) 및 bRPC 프로토콜을 사용합니다.
* 목적지 클러스터 FE의 `rpc_port`(기본 9020)와 BE의 `brpc_port`(기본 8060)를 통해 직접 통신하므로 매우 빠르고 효율적입니다.
* 제한 사항:
* 읽기(Select)가 불가능합니다. 오직 `INSERT INTO`와 `SHOW CREATE TABLE`만 지원합니다.
* 컬럼 구조가 목적지 테이블과 완전히 일치해야 합니다.
2. JDBC 방식 (Catalog 또는 External Table)
StarRocks가 MySQL 호환 프로토콜을 제공하기 때문에, 다른 클러스터를 마치 MySQL 데이터베이스처럼 연결하는 방식입니다. 최신 버전(v3.0+)에서는 JDBC Catalog 사용을 권장합니다.
* 주요 용도: 데이터 읽기(Query) 및 *데이터 로드*입니다.
* 다른 클러스터의 데이터를 조회하거나, 조회한 데이터를 현재 클러스터로 가져올 때 사용합니다.
* 통신 프로토콜: 표준 MySQL/JDBC 프로토콜을 사용합니다.
* 목적지 클러스터 FE의 `query_port`(기본 9030)를 통해 연결됩니다.
* 특징:
* 일반적인 SQL 쿼리(SELECT)가 가능합니다.
* 필터 조건(Predicate Pushdown)이 지원되어 필요한 데이터만 걸러서 가져올 수 있습니다.
* StarRocks뿐만 아니라 MySQL, PostgreSQL, Oracle 등 다양한 DB 연결과 방식이 동일하여 범용적입니다.
──────────
요약 비교표
구분 | StarRocks External Table (Native) | JDBC 방식 (Catalog/Table)
핵심 목적 | 데이터 전송/쓰기 (Target으로 Push) | 데이터 조회/읽기 (Source에서 Pull)
지원 작업 | INSERT INTO (쓰기 전용) | SELECT, INSERT INTO (읽기/쓰기 모두 가능하나 주로 읽기)
연결 포트 | FE RPC(9020), BE bRPC(8060) | FE Query Port(9030, MySQL Port)
성능 | 매우 높음 (내부 바이너리 프로토콜) | 보통 (JDBC 드라이버 오버헤드 존재)
권장 버전 | 모든 버전 (쓰기 시) | v3.0 이상에서는 JDBC Catalog 권장
결론적으로 어떤 것을 선택해야 하나요?
* A 클러스터의 데이터를 B 클러스터로 주기적으로 밀어 넣고 싶다면: *StarRocks External Table*을 생성하여 `INSERT INTO external_table SELECT ...`를 사용하세요.
* A 클러스터에 있는 데이터를 실시간으로 조회(Join 등)하고 싶다면: *JDBC Catalog*를 생성하여 SELECT * FROM remote_catalog.db.table 방식을 사용하세요.
References
• data_source/External_table.md
• data_source/catalog/query_external_data.md
• unloading/Spark_connector.mdSangwon
08/05/2026, 4:25 AMRocky
08/05/2026, 4:25 AMTYPE=starrocks (Native External Table 방식)
StarRocks 전용 프로토콜을 사용하여 다른 클러스터에 데이터를 *전송*하기 위한 연결 방식입니다.
* 주요 목적: 데이터 쓰기 전용 (Push)
* `INSERT INTO external_table SELECT ...`를 사용하여 현재 클러스터의 데이터를 원격 클러스터로 보낼 때 사용합니다.
* 통신 방식: StarRocks 고유의 RPC(9020) 및 bRPC(8060) 프로토콜을 사용합니다.
* StarRocks 간의 최적화된 바이너리 통신을 하기 때문에 대용량 데이터 전송 성능이 매우 뛰어납니다.
* 주요 특징 및 제한:
* 읽기(SELECT) 불가: 이 테이블에 대고 쿼리를 날려 데이터를 조회할 수 없습니다.
* 동일 스키마 필수: 원격지의 대상 테이블과 현재 클러스터의 외부 테이블 스키마가 완벽히 일치해야 합니다.
* 실시간성: 약 10초 주기로 메타데이터를 동기화합니다.
2. TYPE=jdbc (JDBC Catalog/Table 방식)
표준 JDBC 드라이버를 사용하여 다른 클러스터의 데이터를 *조회*하기 위한 연결 방식입니다.
* 주요 목적: 데이터 읽기/조회 중심 (Pull)
* 다른 클러스터의 테이블을 조회하거나, JOIN 쿼리에 활용하거나, 데이터를 현재 클러스터로 끌어올 때 사용합니다.
* 통신 방식: *MySQL 프로토콜(9030)*을 사용합니다.
* StarRocks FE의 MySQL Query Port를 통해 연결되므로, 일반적인 DB 연결과 동일한 방식으로 작동합니다.
* 주요 특징 및 장점:
* 읽기/쓰기 모두 가능: `SELECT`와 `INSERT`가 모두 가능합니다. (다만 읽기 성능 최적화에 더 특화되어 있습니다.)
* 쿼리 최적화: 필터 조건(Predicate Pushdown)이 원격지로 전달되어, 필요한 데이터만 골라 가져오는 효율적인 쿼리가 가능합니다.
* 범용성: StarRocks뿐만 아니라 MySQL, Oracle, PostgreSQL 등 다른 DB 연결 방식과 동일하여 관리가 편합니다.
──────────
요약 비교
구분 | TYPE=starrocks (Native) | TYPE=jdbc (JDBC)
연결 방향 | 쓰기(Push) 중심 | 읽기(Pull) 및 쓰기
연결 포트 | 9020(RPC), 8060(bRPC) | 9030(MySQL Port)
속도/성능 | 매우 빠름 (전용 프로토콜) | 보통 (JDBC 드라이버 오버헤드)
데이터 조회 | 불가능 | 가능
설정 복잡도 | 상대적으로 낮음 (엔진 내장) | 드라이버(.jar) 설치 및 리소스 등록 필요
어떤 것을 써야 할까요?
* *"배치 작업으로 다른 클러스터에 데이터를 빠르게 백업/전송하고 싶다"*면 *`TYPE=starrocks`*를 사용하세요.
* *"다른 클러스터에 있는 데이터를 실시간으로 조회하거나 Join해서 분석하고 싶다"*면 *`TYPE=jdbc` (JDBC Catalog)*를 사용하세요.
최근 StarRocks 버전(v3.0+)에서는 외부 데이터를 조회할 때 `EXTERNAL TABLE`보다는 Catalog(JDBC Catalog) 기능을 사용하는 것을 공식적으로 권장하고 있습니다.
References
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• data_source/External_table.mdSangwon
08/05/2026, 4:26 AMRocky
08/05/2026, 4:26 AMTYPE=starrocks)은 구조적으로 읽기를 지원하지 않기 때문입니다.
질문하신 부하 분산과 작동 원리에 대해 상세히 설명해 드립니다.
1. 부하 분산: 어디가 더 힘들까?
A 클러스터에서 B 클러스터의 테이블을 JDBC로 조회할 때, 부하는 다음과 같이 나뉩니다.
* B 클러스터 (데이터 소스): "실질적인 연산 수행"
* Scan 부하: 데이터를 디스크에서 읽어오는 작업을 B의 BE(Backend)들이 수행합니다.
* Filter 부하 (Predicate Pushdown): WHERE 절에 있는 조건들(예: id > 100, date = '2023-10-01')은 B 클러스터로 전달되어, B가 데이터를 다 읽기 전에 미리 필터링합니다. 즉, B가 연산을 해서 결과만 추려냅니다.
* Resource 사용: B 클러스터의 CPU와 I/O 자원을 사용하여 쿼리를 처리합니다.
* A 클러스터 (조회 시작점): "네트워크 수신 및 최종 처리"
* 네트워크 부하: B가 필터링해서 보내주는 데이터를 네트워크를 통해 전달받습니다.
* Final Processing: 만약 A 클러스터에서 B의 데이터와 A의 로컬 데이터를 `JOIN`하거나, 최종적인 ORDER BY, GROUP BY 등을 수행한다면 해당 연산은 A에서 일어납니다.
* Coordinator 역할: 쿼리를 던지고 결과를 취합하는 제어 역할을 수행합니다.
2. 핵심 기술: Predicate Pushdown (조건 하향 전달)
JDBC 방식에서 가장 중요한 점은 *"A가 B의 데이터를 통째로 다 가져와서 필터링하는 것이 아니다"*라는 점입니다.
* StarRocks는 JDBC 조회 시 필터 조건(Comparison, IN, IS NULL, BETWEEN 등)을 원격지(B 클러스터)로 보냅니다.
* 따라서 *네트워크 전송량은 전체 데이터가 아니라, B에서 필터링이 완료된 결과값*만큼만 발생합니다.
* 결과적으로 *연산 부하의 상당 부분은 데이터를 직접 들고 있는 B 클러스터*가 담당하게 됩니다.
3. 추가 팁: JDBC Catalog 권장
현재 StarRocks에서는 CREATE EXTERNAL TABLE ... TYPE=jdbc 방식보다 JDBC Catalog 사용을 강력히 권장합니다.
* 편의성: 테이블 하나하나 생성할 필요 없이, B 클러스터 전체 DB와 테이블을 한 번에 연결해서 볼 수 있습니다.
* 최적화: 최신 버전의 쿼리 최적화 기능이 Catalog 기반에서 더 잘 작동합니다.
요약하자면:
B 클러스터는 데이터를 읽고 필터링하는 '일꾼' 역할을 하고, A 클러스터는 결과를 받아서 사용자에게 보여주는 '관리자' 역할을 하게 됩니다. 따라서 B 클러스터의 사양이 낮거나 이미 부하가 많다면, A에서의 조회가 B의 성능에 영향을 줄 수 있습니다.
References
• data_source/External_table.md
• data_source/catalog/jdbc_catalog.md
• data_source/catalog/elasticsearch_catalog.md (Predicate Pushdown behavior is similar))
References
• data_source/External_table.mdSangwon
08/05/2026, 6:14 AMRocky
08/05/2026, 6:14 AMtype 프로퍼티 값으로 `starrocks`를 사용하는 것은 불가능합니다.
StarRocks 공식 문서상 *External Catalog*에서 지원하는 type 목록에는 `starrocks`가 포함되어 있지 않습니다. 혼동이 생기는 이유는 *External Table(외부 테이블)*과 *External Catalog(외부 카탈로그)*의 설정 방식이 다르기 때문입니다.
정확한 차이와 문서를 바탕으로 한 설명은 다음과 같습니다.
1. External Catalog (조회/읽기 목적)
다른 StarRocks 클러스터의 모든 DB와 테이블을 한 번에 연결해서 *조회(SELECT)*하려면 *JDBC Catalog*를 사용해야 합니다. 이때 `type`은 반드시 *`jdbc`*여야 합니다.
* 문법:
sql
CREATE EXTERNAL CATALOG remote_sr
PROPERTIES (
"type" = "jdbc", -- starrocks가 아님
"user" = "root",
"password" = "password123",
"jdbc_uri" = "jdbc:mysql://<상대_FE_IP>:9030",
"driver_url" = "file:///path/to/mysql-connector-java.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver"
);
* 참조 문서: StarRocks 공식 문서 - JDBC catalog
2. External Table (쓰기/Push 목적)
반면, `starrocks`라는 키워드를 사용하는 경우는 *External Table*을 생성할 때입니다. 이 방식은 카탈로그 방식이 아니라 테이블 하나하나를 개별적으로 생성할 때 사용하며, 주로 *데이터 전송(INSERT INTO)*을 위해 쓰입니다.
* 문법:
sql
CREATE EXTERNAL TABLE external_t
(
k1 DATE,
k2 INT
)
ENGINE=olap -- 여기서 엔진을 지정하고 PROPERTIES에서 정보를 입력
PROPERTIES
(
"host" = "<상대_FE_IP>",
"port" = "9020",
"user" = "root",
"password" = "password123",
"database" = "db_test",
"table" = "t"
);
* 참조 문서: StarRocks 공식 문서 - StarRocks external table
──────────
요약 및 확인
사용자께서 *"읽기 위주의 작업"*을 위해 두 클러스터를 연결하신다면 다음과 같이 이해하시면 됩니다.
1. Catalog 방식: `CREATE EXTERNAL CATALOG`를 쓰고, `type`은 *`jdbc`*로 설정합니다. (상대 StarRocks를 MySQL처럼 인식하여 읽어옴)
2. Table 방식: `CREATE EXTERNAL TABLE`을 쓰고, `ENGINE=olap`을 사용합니다. 하지만 이 방식은 공식적으로 *읽기(SELECT)를 지원하지 않고 쓰기(INSERT INTO) 전용*입니다.
따라서 조회용 연결을 만드실 때는 *`type` = `jdbc`*가 확실*가 맞으며*, 공식 문서의 Catalog 목록 어디에도 type = `starrocks`인 카탈로그는 존재하지 않습니다.
References
• data_source/External_table.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.mdSangwon
08/05/2026, 6:17 AMRocky
08/05/2026, 6:17 AMINSERT INTO 쿼리를 실행합니다.
* 특징: StarRocks 고유의 RPC 프로토콜(9020 포트)을 사용하여 데이터를 대량으로 밀어넣습니다.
* 방법:
1. *A 클러스터*에서 아래와 같이 테이블을 생성합니다. (B 클러스터의 실제 테이블 스키마와 동일해야 함)
sql
CREATE EXTERNAL TABLE to_cluster_b (
id INT,
name STRING
) ENGINE=olap
PROPERTIES (
"host" = "<B_클러스터_FE_IP>",
"port" = "9020",
"user" = "root",
"password" = "password",
"database" = "target_db",
"table" = "target_table"
);
2. 데이터 전송 실행:
sql
INSERT INTO to_cluster_b SELECT * FROM local_table;
2. JDBC Catalog 방식 (편의성 중심)
이미 조회를 위해 JDBC Catalog를 설정해 두었다면, 이를 그대로 쓰기 작업에 활용할 수 있습니다.
* 특징: 별도의 외부 테이블을 일일이 만들 필요 없이 catalog.db.table 경로로 바로 접근 가능합니다. MySQL 프로토콜을 사용하므로 성능은 위 1번 방식보다 약간 낮을 수 있지만, 관리가 매우 편합니다.
* 방법:
sql
-- 이미 생성된 JDBC Catalog가 있다면
INSERT INTO jdbc_catalog_b.target_db.target_table
SELECT * FROM local_table;
──────────
요약: 어떤 것을 선택할까요?
비교 항목 | ***Native External Table (1번)*** | ***JDBC Catalog (2번)***
속도 | 매우 빠름 (대용량 적합) | 보통 (소/중규모 적합)
설정 | 테이블마다 각각 생성 필요 | 카탈로그 하나로 전체 DB 접근
프로토콜 | StarRocks 전용 RPC (9020) | MySQL/JDBC (9030)
추천 상황 | 정기적인 대규모 배치 데이터 전송 | 간편한 데이터 이동이나 소량 전송
*일반적인 운영 환경*에서는 성능 최적화를 위해 1번(External Table) 방식을 주로 사용하며, 개발 환경이나 간편한 데이터 이관이 필요할 때는 2번(JDBC Catalog) 방식을 섞어서 사용합니다.
참고: 대규모 마이그레이션의 경우
만약 테라바이트(TB) 단위의 아주 큰 데이터를 한 번에 옮겨야 한다면, 위 방식보다는 Backup/Restore 기능을 사용하여 S3나 HDFS 같은 공유 스토리지를 통해 통째로 옮기는 것이 훨씬 빠르고 안정적입니다.
References
• data_source/External_table.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/Backup_and_restore.md
References
• loading/StreamLoad.md
• quick_start/shared-data.md
• quick_start/routine-load.md