-
[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
반응형'Database > Clickhouse' 카테고리의 다른 글
[ClickHouse] ReplicatedMergeTree 테이블 Backup 적용하기 (0) 2024.02.29 [ClickHouse] primary.idx 파일 알아보기 (0) 2024.02.28 [Clickhouse] ReplicatedMergeTree 알아보기 (0) 2024.02.18 [Clickhouse] Docker 로 Clickhouse 구현하기 (2) 2024.02.17 [ClickHouse] Multi Sharding 구현하기 ( Docker, Shards ) (0) 2024.02.17