CREATE DICTIONARY ... LAYOUT IPTrie

CREATE DICTIONARY ... LAYOUT IPTrie

ip_trie 딕셔너리는 네트워크 접두사로 IP 주소를 조회하도록 설계되었어요. IP 범위를 CIDR 표기로 저장하고, 주어진 IP가 어떤 접두사(예: 서브넷 또는 ASN 범위)에 속하는지 빠르게 결정할 수 있게 해주며, 지리적 위치 탐색이나 네트워크 분류 같은 IP 기반 검색에 이상적입니다.

출처: 문서

본문

ip_trie 딕셔너리는 네트워크 접두사로 IP 주소를 조회하도록 설계되었어요. IP 범위를 CIDR 표기로 저장하고, 주어진 IP가 어떤 접두사(예: 서브넷 또는 ASN 범위)에 속하는지 빠르게 결정할 수 있게 해줘요. IP 기반 검색(지리적 위치 탐색이나 네트워크 분류 등)에 이상적입니다.

Example

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 레이아웃은 복합 키를 요구합니다.

  • DDL
  • Configuration file
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);
<structure>
    <key>
        <attribute>
            <name>prefix</name>
            <type>String</type>
        </attribute>
    </key>
    <attribute>
            <name>asn</name>
            <type>UInt32</type>
            <null_value />
    </attribute>
    <attribute>
            <name>cca2</name>
            <type>String</type>
            <null_value>??</null_value>
    </attribute>
    ...
</structure>
<layout>
    <ip_trie>
        <!-- Key attribute `prefix` can be retrieved via dictGetString. -->
        <!-- This option increases memory usage. -->
        <access_to_key_from_attributes>true</access_to_key_from_attributes>
    </ip_trie>
</layout>

키는 허용된 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에 맞아야 해요.

더 알아보기 (Learn more)