본문으로 바로가기
본문으로 바로가기

ip_trie 딕셔너리 레이아웃

ip_trie 딕셔너리는 네트워크 프리픽스를 기준으로 IP 주소를 조회하도록 설계된 구조입니다. CIDR 표기법으로 IP 범위를 저장하며, 주어진 IP가 어떤 프리픽스(예: 서브넷 또는 ASN 범위)에 속하는지 빠르게 판별할 수 있어 지리적 위치 조회나 네트워크 분류와 같은 IP 기반 검색에 매우 적합합니다.

예시

다음과 같이 IP 프리픽스와 매핑 정보를 저장하는 ClickHouse 테이블이 있다고 가정합니다.

CREATE TABLE my_ip_addresses (
    prefix String,
    asn UInt32,
    cca2 String
)
ENGINE = MergeTree
PRIMARY KEY prefix;
INSERT INTO my_ip_addresses VALUES
    ('202.79.32.0/20', 17501, 'NP'),
    ('2620:0:870::/48', 3856, 'US'),
    ('2a02:6b8:1::/48', 13238, 'RU'),
    ('2001:db8::/32', 65536, 'ZZ')
;

이 테이블에 대해 ip_trie 딕셔너리를 정의합니다. ip_trie 레이아웃에는 복합 키가 필요합니다.

CREATE DICTIONARY my_ip_trie_dictionary (
    prefix String,
    asn UInt32,
    cca2 String DEFAULT '??'
)
PRIMARY KEY prefix
SOURCE(CLICKHOUSE(TABLE 'my_ip_addresses'))
LAYOUT(IP_TRIE)
LIFETIME(3600);

키에는 허용되는 IP 프리픽스를 포함하는 String 타입 속성 하나만 있어야 합니다. 다른 타입은 아직 지원되지 않습니다.

구문은 다음과 같습니다:

dictGetT('dict_name', 'attr_name', ip)

이 함수는 IPv4의 경우 UInt32, IPv6의 경우 FixedString(16)을 인수로 받습니다. 예를 들면 다음과 같습니다.

SELECT dictGet('my_ip_trie_dictionary', 'cca2', toIPv4('202.79.32.10')) AS result;

┌─result─┐
│ NP     │
└────────┘


SELECT dictGet('my_ip_trie_dictionary', 'asn', IPv6StringToNum('2001:db8::1')) AS result;

┌─result─┐
│  65536 │
└────────┘


SELECT dictGet('my_ip_trie_dictionary', ('asn', 'cca2'), IPv6StringToNum('2001:db8::1')) AS result;

┌─result───────┐
│ (65536,'ZZ') │
└──────────────┘

다른 타입은 아직 지원되지 않습니다. 이 함수는 이 IP 주소에 해당하는 프리픽스의 속성을 반환합니다. 프리픽스가 서로 겹치는 경우, 가장 구체적인 프리픽스를 반환합니다.

데이터는 RAM에 모두 상주할 수 있어야 합니다.