<@U0A71G31CDV> A, B starrocks 두개 가 있고, 각각 CN모드로 mi...
# questions-and-troubleshooting
s
@Rocky A, B starrocks 두개 가 있고, 각각 CN모드로 minio를 연결해두었어, catalog는 internal catalog를 사용하고있고 A starrocks에서 B starrocks의 Internal catalog를 바라보는게 가능할까?
r
네, 가능합니다. StarRocks 클러스터 A에서 클러스터 B의 Internal Catalog(내부 테이블)를 조회하는 방법은 크게 두 가지가 있습니다. 가장 권장되는 방법은 *StarRocks External Catalog*(
type
=
starrocks
)를 사용하는 것이며, 대체 방법으로 *JDBC Catalog*를 사용할 수도 있습니다. 1. StarRocks External Catalog 사용 (권장) 이 방식은 StarRocks 간의 전용 커넥터를 사용하여 성능이 가장 좋으며, 클러스터 A의 CN이 클러스터 B의 BE/CN과 직접 통신하여 데이터를 가져올 수 있습니다. 설정 방법 (클러스터 A에서 실행):
Copy code
sql
CREATE EXTERNAL CATALOG cluster_b_catalog
PROPERTIES (
    "type" = "starrocks",
    "starrocks.host" = "<클러스터_B_FE_Leader_IP>",
    "starrocks.port" = "9030",      -- 클러스터 B의 MySQL 포트
    "starrocks.user" = "<사용자_ID>",
    "starrocks.password" = "<비밀번호>"
);
데이터 조회:
Copy code
sql
SELECT * FROM cluster_b_catalog.db_name.table_name;
* 참고: 이 기능을 사용하려면 두 클러스터 간에 FE의 MySQL 포트(9030)뿐만 아니라 FE의 RPC 포트(9020) 및 *BE/CN의 bRPC 포트(8060)*가 서로 통신 가능해야 합니다. 2. JDBC Catalog 사용 (대체 방법) StarRocks는 MySQL 프로토콜과 호환되므로 JDBC Catalog를 통해 연결할 수도 있습니다. 전용 커넥터보다 성능은 다소 떨어질 수 있으나 설정이 범용적입니다. 설정 방법 (클러스터 A에서 실행):
Copy code
sql
CREATE EXTERNAL CATALOG cluster_b_jdbc
PROPERTIES (
    "type" = "jdbc",
    "user" = "<사용자_ID>",
    "password" = "<비밀번호>",
    "jdbc_uri" = "jdbc:mysql://<클러스터_B_FE_Leader_IP>:9030",
    "driver_url" = "<https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar>",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);
요약 및 주의사항 * MinIO 연결: 두 클러스터 모두 MinIO를 사용 중이라 하더라도, Catalog를 통한 조회는 클러스터 A가 직접 클러스터 B의 MinIO 경로를 보는 것이 아니라 *클러스터 B의 FE/CN을 통해 데이터를 요청*하는 방식입니다. 따라서 클러스터 B는 정상적으로 가동 중이어야 합니다. * 권한: 클러스터 B에서 사용하는 계정은 해당 테이블에 대한
SELECT
권한이 있어야 합니다. * External Table (ENGINE=olap): 과거에 사용하던
CREATE EXTERNAL TABLE
방식은 주로 쓰기(INSERT INTO) 전용이며 조회가 불가능하거나 제한적이므로, 위와 같은 *Catalog 방식*을 사용하는 것이 최신규 버전(v2.4 이상)의 표준입니다. References • data_source/catalog/query_external_data.md • data_source/catalog/catalog_overview.md • data_source/catalog/default_catalog.md • data_source/External_table.md
s
external table로는 안되는거야?
@Rocky external table로는 안되는거야?
r
결론부터 말씀드리면, *`CREATE EXTERNAL TABLE (ENGINE=olap)` 방식은 조회가 불가능*하며, 조회(SELECT)가 목적이라면 반드시 External Catalog 기능을 사용하셔야 합니다. 그 이유는 다음과 같습니다: 1. External Table (
ENGINE=olap
)은 "쓰기" 전용입니다.
StarRocks에서 `ENGINE=olap`으로 생성하는 External Table은 다른 StarRocks 클러스터로 데이터를 밀어넣기(INSERT INTO) 위한 용도로 설계되었습니다. * 지원하는 명령어:
INSERT INTO
,
SHOW CREATE TABLE
* 지원하지 않는 명령어:
SELECT
(조회 불가) * 따라서 클러스터 A에서 B의 데이터를 읽어오고 싶다면 이 방식으로는 해결할 수 없습니다. 2. 조회를 위해서는 "External Catalog"가 정석입니다. 앞서 설명해 드린 *StarRocks External Catalog*(
"type" = "starrocks"
)가 바로 이 문제를 해결하기 위해 도입된 기능입니다. * 장점: 클러스터 B의 모든 DB와 테이블을 한 번에 가져올 수 있으며,
SELECT
조회가 가능합니다. * 동작 방식: 클러스터 A의 CN이 클러스터 B의 FE로부터 메타데이터를 받아오고, 실제 데이터 스캔은 클러스터 B의 CN/BE와 통신하여 수행합니다. 3. 만약 External Table 구문을 꼭 쓰고 싶다면? (비권장) 성능이나 관리 측면에서 권장하지 않지만, 과거에 사용하던
ENGINE=mysql
방식을 사용할 수는 있습니다. StarRocks는 MySQL 프로토콜과 호환되므로, 클러스터 B를 마치 MySQL 서버인 것처럼 등록하는 방식입니다.
Copy code
sql
-- 이 방식은 조회가 가능하지만, 성능이 떨어지고 보안/기능 제약이 많아 
-- 현재는 JDBC Catalog나 StarRocks Catalog로 대체되었습니다.
CREATE EXTERNAL TABLE remote_t (
    k1 INT,
    ...
) ENGINE=mysql
PROPERTIES (
    "host" = "<Cluster_B_FE_IP>",
    "port" = "9030",
    "user" = "...",
    "password" = "...",
    "database" = "...",
    "table" = "..."
);
요약 * 목적이 데이터 조회(SELECT)라면:
CREATE EXTERNAL CATALOG
(Type:
starrocks
)를 사용하세요. * 목적이 데이터 전송(A -> B로 INSERT)이라면:
CREATE EXTERNAL TABLE
(ENGINE:
olap
)을 사용하세요. * MinIO 환경 영향: 두 클러스터 모두 MinIO를 쓰고 있더라도, 내부 테이블(Internal Catalog)은 각 클러스터의 FE가 메타데이터를 독점 관리하므로, 클러스터 간 데이터 공유는 반드시 위와 같은 Catalog/Table 커넥터를 통해야 합니다. References • data_source/External_table.md • data_source/catalog/starrocks_catalog.md • data_source/catalog/catalog_overview.md References • knowledge/admin_and_operation/shared_data_garbage_cleanup.md • deployment/shared_data/gcs.md • deployment/shared_data/s3.md • administration/management/FE_configuration.md • deployment/shared_data/azure.md • deployment/shared_data/minio.md