본문으로 건너뛰기
최종 수정: 에

FE 설정

이 장에서 배울 내용​

  • FE 구성 요소의 컴퓨팅 리소스(CPU 및 메모리)를 설정하는 방법
  • FE Follower 수와 역할을 설정하는 방법
  • ConfigMap으로 FE 시작 매개변수를 사용자 지정하는 방법
  • 접근 시나리오에 따라 FE 서비스의 접근 모드(ClusterIP/NodePort/LoadBalancer)를 선택하는 방법
  • 메타데이터 손실을 방지하도록 FE의 영구 스토리지를 설정하는 방법

설정 개요​

스토리지-컴퓨팅 분리 모드에서 FE(Frontend)는 주로 쿼리 구문 분석과 계획 수립을 담당합니다. 이 장에서는 다음 순서로 FE 설정을 설명합니다.

설정 항목해결하는 문제
컴퓨팅 리소스 설정FE에 CPU와 메모리를 명시적으로 할당
Follower 노드 수 설정분산 배포 환경에서 메타데이터 관리 노드를 계획
시작 설정 사용자 지정ConfigMap으로 기본 시작 매개변수를 재정의
접근 모드 설정접근 시나리오(클러스터 내부, 클러스터 외부 또는 클라우드 플랫폼)에 따라 FE 서비스를 노출
영구 스토리지 설정FE 재시작 후 메타데이터 손실 방지

컴퓨팅 리소스 설정​

Doris-Operator 저장소에서 제공하는 배포 예제에서는 기본적으로 FE의 리소스 제한이 설정되어 있지 않습니다. 프로덕션 환경에서는 Kubernetes의 요청 및 제한을 통해 FE 컴퓨팅 리소스를 명시적으로 설정하는 것이 좋습니다.

다음 예제는 FE에 8c8Gi의 컴퓨팅 리소스를 할당합니다.

spec:
feSpec:
requests:
cpu: 8
memory: 8Gi
limits:
cpu: 8
memory: 8Gi

이 설정을 배포할 DorisDisaggregatedCluster 리소스에 적용합니다.

Follower 노드 수 설정​

FE 서비스에는 두 가지 역할이 있으며, 각각의 책임은 다음과 같습니다.

역할책임
FollowerSQL 구문 분석을 처리하고 메타데이터를 관리 및 저장
ObserverSQL 구문 분석을 처리하고 Follower의 쿼리 및 쓰기 부하를 분담

Doris는 bdbje 스토리지 시스템을 사용하여 메타데이터를 관리합니다. bdbje의 내부 구현은 Paxos 프로토콜 알고리즘과 유사합니다. 분산 배포 환경에서는 여러 Follower 노드가 함께 메타데이터 관리에 참여하도록 설정해야 합니다.

DorisDisaggregatedCluster 리소스로 Doris 스토리지-컴퓨팅 분리 클러스터를 배포할 때 기본 Follower 수는 1입니다. electionNumber 필드로 Follower 노드 수를 조정할 수 있습니다. 다음 예제는 Follower 수를 3으로 설정합니다.

spec:
feSpec:
electionNumber: 3
팁

스토리지-컴퓨팅 분리 클러스터를 배포한 후에는 electionNumber를 수정할 수 없습니다. 배포 전에 Follower 수를 계획하세요.

시작 설정 사용자 지정​

Doris Operator는 Kubernetes ConfigMap을 통해 FE 시작 설정을 마운트합니다. 설정 절차는 다음과 같습니다.

1단계: FE 시작 ConfigMap 작성​

다음과 같이 FE 시작 설정을 포함하는 ConfigMap을 정의합니다.

apiVersion: v1
kind: ConfigMap
metadata:
name: fe-configmap
namespace: default
labels:
app.kubernetes.io/component: fe
data:
fe.conf: |
CUR_DATE=`date +%Y%m%d-%H%M%S`
# Log dir
LOG_DIR = ${DORIS_HOME}/log
# For jdk 17, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED"
# INFO, WARN, ERROR, FATAL
sys_log_level = INFO
# NORMAL, BRIEF, ASYNC
sys_log_mode = NORMAL
# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
# jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
enable_fqdn_mode=true
deploy_mode = cloud

2단계: 대상 네임스페이스에 ConfigMap 배포​

다음 명령으로 DorisDisaggregatedCluster가 속한 네임스페이스에 ConfigMap을 배포합니다.

kubectl apply -n ${namespace} -f ${feConfigMapName}.yaml

매개변수 설명:

  • ${namespace}: DorisDisaggregatedCluster가 속한 네임스페이스
  • ${feConfigMapName}: 위 설정을 포함하는 파일 이름

3단계: DorisDisaggregatedCluster에서 ConfigMap 참조​

DorisDisaggregatedCluster 리소스를 업데이트하고 다음과 같이 feSpec.configMaps 배열을 통해 ConfigMap을 마운트합니다.

spec:
feSpec:
replicas: 2
configMaps:
- name: fe-configmap
팁

Kubernetes 배포 환경에서 시작 설정을 사용자 지정할 때는 다음 두 가지 사항에 유의하세요.

  1. meta_service_endpoint 또는 cluster_id 설정을 추가하지 마세요. Doris-Operator가 이 값을 자동으로 주입합니다.
  2. enable_fqdn_mode=true를 반드시 설정해야 합니다.

접근 설정​

Doris-Operator는 Kubernetes Service를 사용하여 VIP 및 로드 밸런싱 기능을 제공합니다. 접근 시나리오에 따라 다음 세 가지 노출 모드 중 하나를 선택할 수 있습니다.

접근 모드적용 시나리오설명
ClusterIPKubernetes 클러스터 내부에서만 접근기본 모드로, 추가 설정이 필요하지 않음
NodePortKubernetes 클러스터 외부에서 접근(주로 직접 구축한 클러스터에서 사용)호스트 포트를 통해 서비스를 노출
LoadBalancer클라우드 플랫폼 환경에서 클라우드 로드 밸런서를 통해 접근클라우드 서비스 제공업체가 로드 밸런서를 제공

다음 절에서는 각 모드의 설정 방법을 설명합니다.

ClusterIP 모드​

Kubernetes는 기본적으로 ClusterIP 모드를 사용합니다. 이 모드는 Kubernetes 클러스터 내부 주소를 제공하며, 해당 주소는 클러스터 내부에서만 접근할 수 있습니다.

1단계: ClusterIP 설정​

ClusterIP는 기본 접근 모드이므로 사용하기 위해 추가로 변경할 필요가 없습니다.

2단계: Service 접근 주소 확인​

클러스터를 배포한 후 다음 명령으로 FE가 노출하는 Service를 확인합니다.

kubectl -n doris get svc

결과 예시는 다음과 같습니다.

NAME                              TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                               AGE
doriscluster-sample-fe-internal ClusterIP None <none> 9030/TCP 14m
doriscluster-sample-fe ClusterIP 10.1.118.16 <none> 8030/TCP,9020/TCP,9030/TCP,9010/TCP 14m

결과에는 두 종류의 Service가 포함됩니다.

  • internal 접미사가 있는 Service: Doris 내부 통신(예: 하트비트 및 데이터 교환)에만 사용되며 외부에 노출되지 않습니다.
  • internal 접미사가 없는 Service: FE 서비스에 대한 외부 접근에 사용됩니다.

3단계: 컨테이너 내부에서 Doris에 접근​

다음 명령을 실행하여 현재 Kubernetes 클러스터에 MySQL 클라이언트가 포함된 Pod를 생성합니다.

kubectl run mysql-client --image=mysql:5.7 -it --rm --restart=Never --namespace=doris -- /bin/bash

컨테이너 내부에서 internal 접미사가 없는 Service 이름으로 Doris 클러스터에 연결합니다.

mysql -uroot -P9030 -hdoriscluster-sample-fe

NodePort 모드​

Kubernetes 클러스터 외부에서 Doris에 접근하려면 NodePort 모드를 사용합니다. NodePort 모드는 두 가지 포트 할당 방식을 지원합니다.

할당 방식설명
동적 호스트 포트 할당포트 매핑을 명시적으로 설정하지 않으면 Kubernetes가 사용하지 않는 호스트 포트를 자동으로 할당(기본 범위 30000-32767)
정적 호스트 포트 할당포트 매핑을 명시적으로 지정. 호스트 포트가 사용 중이 아니고 충돌이 없으면 해당 포트로 고정됨

정적 할당을 사용하려면 포트 매핑을 계획해야 합니다. Doris는 기본적으로 외부 통신을 위해 다음 포트를 제공합니다.

표 1: FE 서비스 포트 설명

포트 이름기본 포트포트 설명
쿼리 포트9030MySQL 프로토콜을 통해 Doris 클러스터에 접근하는 데 사용
HTTP 포트8030FE 정보를 확인하는 데 사용하는 FE의 HTTP Server 포트

1단계: FE NodePort 설정​

필요에 따라 다음 설정 중 하나를 선택합니다.

  • 동적 포트 할당:

    spec:
    feSpec:
    service:
    type: NodePort
  • 정적 포트 할당:

    spec:
    feSpec:
    service:
    type: NodePort
    portMaps:
    - nodePort: 31001
    targetPort: 8030
    - nodePort: 31002
    targetPort: 9030

2단계: Service 확인​

클러스터를 배포한 후 다음 명령으로 Service를 확인합니다.

kubectl get service

결과는 다음과 같습니다.

NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                       AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 169d
doriscluster-sample-fe-internal ClusterIP None <none> 9030/TCP 2d
doriscluster-sample-fe NodePort 10.152.183.58 <none> 8030:31041/TCP,9020:30783/TCP,9030:31545/TCP,9010:31610/TCP 2d

3단계: NodePort를 통해 Doris에 접근​

MySQL 연결을 예로 들어 설명합니다. Doris 쿼리 포트가 호스트 포트 31545에 매핑되어 있다고 가정합니다. 절차는 다음과 같습니다.

  1. Kubernetes 클러스터에 속한 임의 노드의 IP 주소를 확인합니다.

    kubectl get nodes -owide

    결과 예시:

    NAME   STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE          KERNEL-VERSION          CONTAINER-RUNTIME
    r60 Ready control-plane 14d v1.28.2 192.168.88.60 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
    r61 Ready <none> 14d v1.28.2 192.168.88.61 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
    r62 Ready <none> 14d v1.28.2 192.168.88.62 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
    r63 Ready <none> 14d v1.28.2 192.168.88.63 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
  2. 임의 노드의 IP(예: 192.168.88.62)와 매핑된 포트를 사용하여 Doris 클러스터에 연결합니다.

    mysql -h 192.168.88.62 -P 31545 -uroot

LoadBalancer 모드​

LoadBalancer 모드는 클라우드 플랫폼의 Kubernetes 환경에 적합하며, 클라우드 서비스 제공업체가 로드 밸런서를 제공합니다.

1단계: LoadBalancer 모드 설정​

LoadBalancer를 feSpec.service의 유형으로 설정합니다.

spec:
feSpec:
service:
type: LoadBalancer
annotations:
service.beta.kubernetes.io/load-balancer-type: "external"

2단계: Service 확인​

클러스터를 배포한 후 다음 명령으로 Service를 확인합니다.

kubectl get service

결과 예시:

NAME                              TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)                                                       AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 169d
doriscluster-sample-fe-internal ClusterIP None <none> 9030/TCP 2d
doriscluster-sample-fe LoadBalancer 10.152.183.58 ac4828493dgrftb884g67wg4tb68gyut-1137856348.us-east-1.elb.amazonaws.com 8030:31041/TCP,9020:30783/TCP,9030:31545/TCP,9010:31610/TCP 2d

3단계: LoadBalancer를 통해 접근​

MySQL 연결을 예로 들어 설명합니다. 쿼리 포트가 9030에서 수신 대기한다고 가정합니다. 다음 명령으로 Doris 클러스터에 연결합니다.

mysql -h ac4828493dgrftb884g67wg4tb68gyut-1137856348.us-east-1.elb.amazonaws.com -P 9030 -uroot

영구 스토리지​

기본 배포에서 FE 서비스는 메타데이터 저장 방식으로 Kubernetes의 EmptyDir를 사용합니다. EmptyDir는 비영구 스토리지 방식이므로 서비스가 재시작되면 메타데이터가 손실됩니다.

재시작 후에도 FE 메타데이터가 손실되지 않도록 FE에 영구 스토리지를 설정합니다. Doris Operator는 다음 세 가지 옵션을 제공합니다. 필요에 따라 하나를 선택하세요.

옵션적용 시나리오
스토리지 템플릿을 사용한 자동 생성로그와 메타데이터에 동일한 스토리지 설정을 사용하여 설정을 간소화
사용자 지정 마운트 지점 설정디렉터리마다 서로 다른 스토리지 사양이 필요한 경우
로그를 영구 저장하지 않음로그를 표준 출력에만 기록하며 영구 저장할 필요가 없는 경우

스토리지 템플릿을 사용한 자동 생성​

다음과 같이 스토리지 템플릿을 통해 로그와 메타데이터의 영구 저장을 동일하게 설정합니다.

spec:
feSpec:
persistentVolumes:
- persistentVolumeClaimSpec:
# storageClassName: ${storageclass_name}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 200Gi

이 설정으로 클러스터를 배포하면 다음과 같이 적용됩니다.

  • Doris Operator가 로그 디렉터리(기본값 /opt/apache-doris/fe/log)와 메타데이터 디렉터리(기본값 /opt/apache-doris/fe/doris-meta)에 영구 스토리지를 자동으로 마운트합니다.
  • 사용자 지정 시작 설정에서 로그 또는 메타데이터 디렉터리를 명시적으로 지정하면 Doris Operator가 이를 자동으로 파싱하고 그에 맞게 스토리지를 마운트합니다.
  • 영구 스토리지는 StorageClass 모드를 사용합니다. storageClassName으로 원하는 StorageClass를 지정할 수 있습니다.

사용자 지정 마운트 지점 설정​

Doris Operator는 디렉터리별 스토리지 설정을 지원합니다. 예를 들어, 사용자 지정 스토리지 설정으로 로그 디렉터리에 300Gi 디스크를 마운트하고, 스토리지 템플릿으로 메타데이터 디렉터리에 200Gi 디스크를 마운트할 수 있습니다.

spec:
feSpec:
persistentVolumes:
- mountPaths:
- /opt/apache-doris/fe/log
persistentVolumeClaimSpec:
# storageClassName: ${storageclass_name}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 300Gi
- persistentVolumeClaimSpec:
# storageClassName: ${storageclass_name}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 200Gi
팁

mountPaths 배열이 비어 있으면 해당 스토리지 설정은 템플릿 설정으로 처리됩니다(즉, 별도로 설정되지 않은 모든 디렉터리에 적용됩니다).

로그를 영구 저장하지 않음​

로그를 영구 저장하지 않고 표준 출력에만 기록하려면 다음 설정을 사용합니다.

spec:
feSpec:
logNotStore: true