ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ClickHouse Config] listen_host 설정 알아보기
    Database/Clickhouse 2024. 2. 28. 07:23
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 ClickHouse 의 config.xml 의 <listen_host> 설정에 대해서 알아봅니다.

    listen_host 설정은 ClickHouse 서버가 어떤 Network Interface 를 사용할지 결정하는 설정입니다.

    일반적으로 아래와 같이 어떠한 IPv4 와 IPv6 Network Interface 를 사용하도록 제약없이 사용됩니다.

    <listen_host>0.0.0.0</listen_host>
    <listen_host>::</listen_host>

     

     

    이 설정은 서버가 모든 네트워크 인터페이스에 대해 연결을 수신하도록 허용합니다.

    그러나 보안과 성능을 고려한다면 네트워크 인터페이스를 구체적으로 제한하거나 설정을 세밀하게 조정해야 할 수도 있습니다.

     

    특정 네트워크 인터페이스를 설정하는 방법.

    우선 <listen_host> 설정에 대한 실습을 위해서 Docker Container 와 Docker Network 를 활용하도록 하겠습니다.

     

    Localhost Loopback Interface  연결.

    아래의 명령어를 통해서 오직 Localhost Lookback Network Interface 만 요청을 수신할 수 있는 ClickHouse Server 를 실행합니다.

     

    docker network create clickhouse
    
    cat <<'EOF'> /tmp/listen-local.xml
    <clickhouse>
        <listen_host>127.0.0.1</listen_host>
    </clickhouse>
    EOF
    
    docker run -d --platform linux/amd64 \
    --network clickhouse \
    --name clickhouse-local \
    --hostname clickhouse-local \
    --mount type=bind,source=/tmp/listen-local.xml,target=/etc/clickhouse-server/config.d/servers.xml \
    altinity/clickhouse-server:23.8.16.42.altinitystable

     

    ClickHouse Docker Container 실행 이후에 2개의 Network Interface 가 확인됩니다.

    하나는 1번에 해당하는 Localhost Loopback Network Interface 이구요.

    다른 하나는 40번의 Ethernet Network Interface 입니다.

    Ethernet Network Interface 는 --network 설정으로 연결해준 clickhouse Docker Network 에 해당합니다.

     

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    
    40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
           valid_lft forever preferred_lft forever

     

    저희는 config.xml 의 <listen_host> 설정을 통하여 127.0.0.1 Network Interface 를 사용하도록 지정하였기 때문에

    Ethernet Network Interface 를 통한 요청은 차단됩니다.

     

    그래서 아래와 같이 clickhouse Docker Network 를 통한 접근은 차단되게 됩니다.

    bash-3.2$ docker run -it --rm \
    >     --network clickhouse \
    >     altinity/clickhouse-server:23.8.16.42.altinitystable \
    >     clickhouse-client --host clickhouse-local --port 9000
    
    ClickHouse client version 23.8.16.42.altinitystable (altinity build).
    Connecting to clickhouse-local:9000 as user default.
    Code: 210. DB::NetException: Connection refused (clickhouse-local:9000). (NETWORK_ERROR)

     

     

    2개 이상의 Network Interface 연결.

    먼저 2개의 Docker Network 를 생성합니다.

     

    docker network create --subnet=172.18.0.0/16 ch-net-1
    docker network create --subnet=172.20.0.0/16 ch-net-2

     

    그리고 <listen_host> 에 두개의 Network Interface 의 연결하기 위한 설정을 추가합니다.

     

    cat <<'EOF'> /tmp/listen.xml
    <clickhouse>
        <listen_host>127.0.0.1</listen_host>
        <listen_host>172.18.0.2</listen_host>
        <listen_host>172.20.0.2</listen_host>
    </clickhouse>
    EOF
    
    docker run -d --platform linux/amd64 \
    --name clickhouse \
    --hostname clickhouse \
    --mount type=bind,source=/tmp/listen.xml,target=/etc/clickhouse-server/config.d/servers.xml \
    altinity/clickhouse-server:23.8.16.42.altinitystable

     

    실행된 ClickHouse Docker Container 의 Network Interface 상태는 아래와 같습니다.

    현재 생성해 둔 Docker Network 를 연결시키지 않은 상태입니다.

     

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    
    52: eth0@if53: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever

     

     

    아래의 docker network connect 명령어를 통해서 ClickHouse Docker Container 에 새로운 Network Interface 를 추가할 수 있습니다.

     

    docker network connect ch-net-1 clickhouse
    docker network connect ch-net-2 clickhouse
    54: eth1@if55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
           valid_lft forever preferred_lft forever
           
    56: eth2@if57: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:14:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.20.0.2/16 brd 172.20.255.255 scope global eth2
           valid_lft forever preferred_lft forever

     

     

    이제 172.18.0.2 로의 접근이 허용됩니다.

     

    docker run -it --rm \
      --network ch-net-1 \
      altinity/clickhouse-server:23.8.16.42.altinitystable \
      clickhouse-client --host 172.18.0.2 --port 9000

     

    ch-net-2 Docker Network 를 통한 172.20.0.2 로의 접근 또한 허용됩니다.

     

    docker run -it --rm \
      --network ch-net-2 \
      altinity/clickhouse-server:23.8.16.42.altinitystable \
      clickhouse-client --host 172.20.0.2 --port 9000

     

     

    listen_host 에 설정되지 않은 Network Interface 로 접근.

    아래의 명령어를 실행하면 172.18.0.2 와 172.20.02 2개의 IP 가 ClickHouse Docker Container 에 할당됩니다.

    하지만 오직 172.18.0.2 Network Interface 만을 사용하도록 ClickHouse listen_host 설정을 제한하였습니다.

     

    cat <<'EOF'> /tmp/listen.xml
    <clickhouse>
        <listen_host>127.0.0.1</listen_host>
        <listen_host>172.18.0.2</listen_host>
    </clickhouse>
    EOF
    
    docker create --platform linux/amd64 \
    	--name clickhouse \
    	--hostname clickhouse \
    	--mount type=bind,source=/tmp/listen.xml,target=/etc/clickhouse-server/config.d/servers.xml \
    	altinity/clickhouse-server:23.8.16.42.altinitystable
        
    docker network connect ch-net-1 clickhouse
    docker network connect ch-net-2 clickhouse
    
    docker start clickhouse

     

    연결된 Network Interface 의 상태는 아래와 같습니다.

    1개의 Loopback Interface 와 3개의 Ethernet Network Interface 가 존재합니다.

    Ethernet Network Interface 가 3개인 이유는 기본적인 Default Bridge Network 가 도커 컨테이너에 연결되기 때문입니다.

     

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    
    84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    
    86: eth1@if87: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
           valid_lft forever preferred_lft forever
    
    88: eth2@if89: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:14:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.20.0.2/16 brd 172.20.255.255 scope global eth2
           valid_lft forever preferred_lft forever

     

     

    그리고 다시 각 IP 로 clickhouse-client 접근을 시도합니다.

    <listen_host> 로 설정된 172.18.0.2 로의 접근은 허용됩니다.

     

    docker run -it --rm \
      --network ch-net-1 \
      altinity/clickhouse-server:23.8.16.42.altinitystable \
      clickhouse-client --host 172.18.0.2 --port 9000

     

    반면 <listen_host> 설정에 포함되지 않은 172.20.0.2 로의 접근은 차단되게 됩니다.

     

    docker run -it --rm \
      --network ch-net-2 \
      altinity/clickhouse-server:23.8.16.42.altinitystable \
      clickhouse-client --host 172.20.0.2 --port 9000

     

    반응형
Designed by Tistory.