쿠버네티스(k8s)에 대해

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 자동 배포, 스케일링, 운영을 관리하기 위한 오픈소스 플랫폼입니다. Google에서 시작하여 CNCF(Cloud Native Computing Foundation)에서 관리하고 있으며, 복잡한 애플리케이션 환경을 효율적으로 운영할 수 있게 해줍니다.

 

왜 등장했는가?

컨테이너 기술(예: Docker)은 애플리케이션과 그 의존성을 패키징하여 어디서나 일관되게 실행할 수 있게 해줍니다. 하지만 여러 컨테이너를 관리하거나 서비스를 확장하고 장애를 복구하는 작업은 매우 복잡합니다. 이러한 문제를 해결하기 위해 쿠버네티스가 등장했습니다.

주요 목적:

  1. 확장성: 사용자가 증가할 때 자동으로 인스턴스를 늘리거나 줄여 자원을 효율적으로 사용.
  2. 복구 자동화: 장애가 발생한 컨테이너를 자동으로 재시작하거나 교체.
  3. 애플리케이션의 이식성: 클라우드 환경이나 온프레미스 등 다양한 환경에서 일관된 동작 보장.
  4. 운영 간소화: 복잡한 컨테이너화 애플리케이션을 자동으로 관리.

 

쿠버네티스의 주요 기능

  1. 컨테이너 오케스트레이션:
    • 여러 컨테이너를 그룹화하고 조정하여 서비스 운영.
  2. 자동 스케일링:
    • 애플리케이션 부하에 따라 컨테이너를 자동으로 늘리거나 줄임.
  3. 서비스 복구:
    • 문제가 있는 컨테이너를 자동으로 교체하거나 종료.
  4. 로드 밸런싱:
    • 여러 컨테이너로 들어오는 요청을 분산 처리.
  5. 컨피그 및 시크릿 관리:
    • 환경 변수, 설정 파일, 보안 정보(비밀번호 등)를 안전하게 관리.

 

클러스터 구성

쿠버네티스는 클러스터(cluster) 구조로 작동하며, 다음과 같은 컴포넌트로 구성됩니다:

  • Master Node: 클러스터의 제어를 담당.
  • Worker Node: 실제 애플리케이션 컨테이너가 실행되는 노드.

 

쿠버네티스 사용 방법

쿠버네티스 설치

🔗 기본환경 설치 Links:

Install Minikube (Mac, Linux and Windows): https://bit.ly/38bLcJy
Install Kubectl: https://bit.ly/32bSI2Z
맥 환경에서 가이드: https://bit.ly/3oZzuHY

 

설치 작업

Homebrew 최신화

brew update

 

hyperkit(macOS 환경에서 경량화된 하이퍼바이저(Hypervisor)를 제공하기 위해 설계된 툴) 설치

brew install hyperkit

#hyperkit 설치가 안된다면 qemu 설치
brew install qemu

 

minikube 설치

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

 

minikube 시작

minikube start --vm-driver=hyperkit

 

기본 명령어

쿠버네티스 클러스터에서 현재 등록된 노드(Node) 목록을 조회

$kubectl get nodes

NAME       STATUS   ROLES           AGE   VERSION

minikube   Ready    control-plane   13m   v1.31.0

 

Minikube 클러스터의 현재 상태를 확인

$minikube status

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

 

쿠버네티스 버전 확인

$kubectl version

Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"darwin/amd64"}
Kustomize Version: v4.5.4


Deployment 리소스를 생성, Nginx 이미지를 사용하는 Pod 배포

kubectl create deployment nginx-depl --image=nginx

 

쿠버네티스 Pod 목록 조회

$kubectl get pod

 

Deployment를 편집할 수 있는 인터페이스 열기

$kubectl edit deployment nginx-depl

 

현재 클러스터에 있는 ReplicaSet 리소스를 조회

kubectl get replicaset

 

Pod 디버깅

쿠버네티스  Pod 로그 조회

kubectl logs <Pod name>

 

쿠버네티스 Pod 상세 보기

kubectl describe pod

 

결과)

 

 

쿠버네티스 Pod에 접속

kubectl exec -it <Pod name> -- bin/bash

 

쿠버네티스 deployment 삭제

kubectl delete deployment <dep name>

 

 

YAML 파일 작성

YAML 파일 기본 구조

apiVersion: <API 버전>
kind: <리소스 종류>
metadata:
  name: <리소스 이름>
  namespace: <네임스페이스> # (선택 사항)
spec:
  <리소스의 세부 사양>

 

nginx 기본 yaml 파일 참고

더보기
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 8080

 

Yaml 파일 deployment 적용 및 삭제

kubectl apply -f <yaml file>

#삭제
kubectl delete -f <yaml file>

 

 

 

 

키워드 요약 설명

* SSL (Secure Sockets Layer)

인터넷 통신에서 데이터를 암호화하여 안전하게 전송하는 프로토콜. SSL은 TLS로 대체되었으며, 현재는 더 이상 사용되지 않음.

 

* TLS (Transport Layer Security)

SSL의 후속 버전으로 더 안전하고 효율적인 암호화 프로토콜.

 

 

적용 환경

버전 : Amazon Linux release 2023.5.20240722 (Amazon Linux)

 

Python기반의 웹 애플리케이션 프레임워크인 'Reflex'를 AWS에 셀프호스팅을 진행중이다.

Reflex 소스코드를 받아 환경설정을 하고 production모드 실행까지 성공했으나, https 적용을 위해 TLS를 적용해야 하는 단계.

 

Reflex에서 직접 https를 다룰 수 있는 기능은 없으며, reverse proxy구조를 이용하여 Nginx를 거쳐서 인증하도록 해야한다.

 

nginx 설치

sudo yum install nginx

 

Nginx 설치 후 설정 진행

 

Nginx 명령어

sudo systemctl start nginx  // 실행
sudo systemctl status nginx  // 상태 조회
sudo systemctl stop nginx  // 중지

 

Nginx 설정파일 경로 : /etc/nginx/nginx.conf

* /etc/nginx/nginx.conf 파일에 오류가 있다면 아래 메시지 발생

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

 

 

EPEL, Certbot 설치

아마존(AMI3)의 보안정책이 바뀌면서 amazone linux에서는 certbot만 설치 하지 못하고 nginx를 이용해서 설치해야 한다.

 

인증서 구조

Browser <-- HTTPS --> Nginx <-- HTTP --> Reflex App

 

시스템 종속성 설치

sudo dnf install python3 augeas-libs

 

가상환경 설정

sudo python3 -m venv /opt/certbot/

sudo /opt/certbot/bin/pip install --upgrade pip

 

Certbot그리고 Certbot Nginx 플러그인 을 가상환경에 설치

/opt/certbot/bin/pip install certbot certbot-nginx

 

 

certbot을 이용해서 nginx에 SSL 인증서를 적용

/etc/nginx/nginx.conf 수정

server {
    listen 80;
    # 구입한 도메인 이름을 기입한다. ex) www.localstorybe.site
    server_name my.domain.com;

    # 기본 경로에 대해 localhost:3000으로 프록시
    location / {
    proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    location /_next/webpack-hmr {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Forwarded-Proto $scheme;
    }

    # /_event 경로에 대해 localhost:8000으로 프록시
    location /_event {
            proxy_pass http://localhost:8000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

체크리스트

1)웹서버 실행 종료 확인 

2)80번 포트 사용중 확인

3)80번 포트 포트포워딩 해제(필자는 포트포워딩 중이었음)

  • iptables -t nat -L --line-numbers -v -n
  • sudo iptables -t nat -D PREROUTING <규칙 번호>
sudo certbot certonly --standalone

 

 

 

추가 정보

인증서 경로 : /etc/letsencrypt/live/cookeng.site

 

 

인증서 자동 갱신

TLS 인증서는 90일동안만 유효하기 때문에 이후 재발급을 진행해야 한다.

crontab을 통해 인증서 재발급을 자동화 하자.

 

crontab 설치

sudo yum install cronie -y

 

cronie 서비스 활성화

sudo systemctl start crond
sudo systemctl enable crond

 

crontab 편집

crontab -e

 

인증서 갱신 스케줄 추가

 

service nginx stop

sudo certbot renew

 

 

인증서 재발급

 

 

sudo certbot --nginx -d example.com

 

참고 자료

1) https://certbot.eff.org/instructions?ws=other&os=pip

 

 

git 충돌 발생 시 일반적인 절차는 아래와 같음

1. git status

Unmerged paths:
(both modified): <filename>

 

2. 충돌 해결

충돌이 발생한 파일을 열어보면 아래와 같은 형식으로 보임

<<<<<<< HEAD

<Your changes>
=======

<Incoming changes>
>>>>>>>

branch-name

 

  • HEAD는 현재 브랜치 즉, 로컬의 변경 사항
  • branch-name은 머지하려는 다른 브랜치에서 온 변경 사항임
  • <Your changes>와 <Incoming changes> 부분을 확인하고, 어떤 내용이 최종적으로 남아야 할지 결정한 후 수동으로 수정

3. 충돌 해결 후 파일 마크

충돌을 해결한 후, 파일을 git add 명령어로 스테이징

  • git add <filename>

 

4. 커밋을 통해 머지 완료

  • git commit

 

wget을 사용하여 Python을 설치하려면 Python 소스 코드를 다운로드하여 빌드하는 방법이 있습니다. 이 과정은 Python의 특정 버전을 설치할 때 유용합니다. 아래는 wget을 사용하여 Python 3.9.6을 예시로 설치하는 절차입니다.

 

1. 필수 패키지 설치

Python을 소스에서 빌드하려면 여러 필수 패키지를 설치해야 합니다.

 

sudo yum groupinstall "Development Tools" -y
sudo yum install openssl-devel bzip2-devel libffi-devel -y

 

2. Python 소스 코드 다운로드

wget을 사용하여 Python 소스 코드를 다운로드합니다.

 

wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz

 

3. 압축 해제

다운로드한 tar 파일을 압축 해제합니다.

tar xvf Python-3.11.9.tgz

 

 

4. 디렉토리 이동

압축 해제된 디렉토리로 이동합니다.

 

cd Python-3.11*/

 

5. 구성 및 빌드

Python을 구성하고 빌드합니다.

 

./configure --enable-optimizations
make

 

6. 설치

빌드가 완료되면 Python을 설치합니다.

 

sudo make install

 

7. Python 버전 확인

설치된 Python 버전을 확인합니다.

 

python --version

 

 

 

현상

웹 개발을 하면서 CORS (Cross-Origin Resource Sharing) 정책 오류는 매우 자주 마주치는데 이번에 발생한 문제는 서버로부터 응답이 차단되었다는 것을 의미한다. 전체 오류 메시지는 아래와 같다.

Access to fetch at 'http://127.0.0.1:3000/api/admin/custom/gen-script?type=1' 
from origin 'http://localhost:3000' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
If an opaque response serves your needs, set the request's mode to 'no-cors' 
to fetch the resource with CORS disabled.

 

원인

http://localhost:3000 으로 부터 요청이 Block되었다는 오류메시지이다.

fetch를 수행한 주소는 http://127.0.0.1:3000/api/~ 로 되어있지만 응답을 받은 주소는 http://localhost:3000/~로 두 주소가 상이하기에 Block이 된 것으로 보인다.

웹 프론트에서 현재 fetch의 주소는 환경변수에서 읽어오는 것이며, <.env.development>파일의 변수값을 보면 아래와 같이 되어있었다.

REACT_APP_WEB_BASE_URL=http://127.0.0.1:3000
REACT_APP_WEB_BASE_PROXY_URL=http://127.0.0.1:80

 

해결방법

변수에 설정된 주소를 아래와 같이 변경했다.

REACT_APP_WEB_BASE_URL=http://localhost:3000
REACT_APP_WEB_BASE_PROXY_URL=http://localhost:80

 

'좌뇌 > Web' 카테고리의 다른 글

(Reflex) AWS-EC2 certbot 사용하여 무료로 'https' 적용하기  (0) 2024.09.09

배경

영어 문제 생성에 특화된 AI 모델을 생성한다.

 

아래와 같이 Prompt를 입력했을 때 Completion 되도록 하는 모델을 학습시키는 것이 목표다.

Prompt Completion
주어진 지문을 활용하여 '글의 목적'유형문제를 작성한다. 난이도는 '고3'학년 '수능/모의고사4점'난이도이다. 지문 : {{To whom it may concern, My name is Michael Brown. I have been a bird-watcher since  childhood. I have always enjoyed watching birds in my yard  and identifying them by sight and sound. Yesterday, I happened  to read an article about your club. I was surprised and excited to find out about a community of passionate bird-watchers who  travel annually to go birding. I would love to join your club,  but your website appears to be under construction. I could not  find any information except for this contact email address. I  would like to know how to sign up for the club. I look forward  to your reply. Sincerely, Michael Brown} } =>
다음 글의 목적으로 가장 적절한 것은?\n{To whom it may concern, My name is Michael Brown. I have been a bird-watcher since  childhood. I have always enjoyed watching birds in my yard  and identifying them by sight and sound. Yesterday, I happened  to read an article about your club. I was surprised and excited to find out about a community of passionate bird-watchers who  travel annually to go birding. I would love to join your club,  but your website appears to be under construction. I could not  find any information except for this contact email address. I  would like to know how to sign up for the club. I look forward  to your reply. Sincerely, Michael Brown} \n① 조류 관찰 클럽에 가입하는 방법을 문의하려고 ② 조류 관찰 시 주의해야 할 사항을 전달하려고 ③ 조류 관찰 협회의 새로운 규정을 확인하려고 ④ 조류 관찰과 관련된 웹 사이트를 소개하려고 ⑤ 조류 관찰 시 필요한 장비를 알아보려고\n\n정답 : 1번

 

위 예시는 실제 수능 영어의 문제다. 그리고 이런 모의고사, 수능기출 데이터로 OpenAI의 GPT-3 모델에 Fine Tuning 시키기는 방법을 초기에 시도했다.

 

그러나 Fine Tuning을 시도하면서 몇가지 문제를 발견했다.

 

문제점

문제1. OpenAI의 Chat Completion에 대한 Fine Tuning 미지원

23년 05월 기준 GPT-3 에서 Fine Tuning을 지원하는 모델을 다음과 같다.

  • davinci
  • curie
  • babbage 
  • ada

그러나 위 모델들로 학습을 시키더라도 Chat Completion 이 아닌, Text Completion만 사용이 가능했다.

Text Completion 과 Chat Completion은 비슷보이지만 Text Completion 은 문장의 빈 칸이나 글뒤에 자연스러운 문장을 완성시키는 작업에 적합하며, Chat Completion은 prompt를 이해하고 이에 따른 명령을 수행하는 작업에 적합하다.

 

내가 생성하고자하는 모델은 영어문제를 생성하기 위한 다양한 조건을 이해하고 이에 따른 지문과 문제를 만들어야하기 때문에 Chat Completion을 사용하는 것이 더 적합했다. 따라서 OpenAI에서 제공하는 Fine Tuning을 활용하여 프로젝트를 완료하기에는 현재시점에서 한계가 있다고 판단했다.

 

문제2. 학습 데이터셋 부족

만약 근시일 내에 OpenAI에서 Chat Completion의 Fine Tuning을 지원하다고 하더라도  수능, 모의고사로는 데이터셋이 부족했으며 여러 유형별로 충분한 데이터 셋이 필요했다. (최소 1만개의 학습데이터가 있어야 할 것으로 추정)

 

구글에 검색하여 PDF기출문제를 찾을 수 있지만 엄청난 수작업을 필요로 할 것이기에...Chat GPT를 사용하여 영어문제를 대량 생성해보기로 한다.

Chat GPT에게 테스트해 본 결과, 아무리 조건을 디테일하게 작성해도 한 번에 영어문제를 만들어달라고 Prompt를 작성하는 것은 정확성이 떨어졌다.

 

여러 테스트 결과 지문을 제시하고 제시된 지문으로 문제를 만드는 방법이 보다 정확성이 높았다.

따라서 영어 지문을 1차적으로 수집하고 2차로 수집한 지문을 통해 문제를 생성해내도록 전략을 수립했다.

 

아래는 고등학교 영어문제 유형 중 '글의 목적'찾기 유형의 문제에 대해 지문을 생성하고 정답에 대한 선택지를 생성하는 프롬프트이다.

 

1. 영어 지문생성 프롬프트

:편지 양식의 지문을 랜덤으로 생성하고 편지 작성자의 목적을 같이 출력한다.

> Please write an English letter that meets the following criteria:
1. The names of the letter writer and the recipient should be arbitrarily designated. For example, the writer can be John and the recipient can be Emily.
2. The purpose of the letter writer can be various, such as 'Schedule Information', 'Store Advertising', 'Change Information', 'Program Reservation' etc.
3. The letter should be written as a complete letter that does not require further modification.
4. The total size of the letter should be between 550 and 700 characters.
5. After the last line break of the letter, include a sentence of 60-100 characters about the writer's purpose of writing the letter, indicated by the '->' symbol. ex) John is writing to Emily to provide her with information about ......
6. Exclude salutations and addresses and only write the body of the letter.

 

2. 선택지 생성 프롬프트

:프롬프트와 함께 정답(편지 작성 목적)을 제시하면 오답 선택지를 생성해낸다.

>Please create answer choices for an English exam question that satisfies the given requirements based on the provided sentence.
1. I will give you a correct answer to an English exam question.
2. Please select a specific word from the correct answer sentence and combine it with random words to create a new sentence.
3. The created sentence should not have the same meaning or a similar intent as the correct answer.
4. Please generate five additional sentences that satisfy the above conditions.
5. Explanation is omitted. Please provide the generated sentence only.
* correct answer : To encourage participation in the Science Education Policy Council

 

현재는 Fine Tuning을 위해 OpenAI이외에 다른 모델을 찾아보는 중이며, 위 방법으로 학습데이터를 수집하고 있다.(1만개 목표)

 

여러 아파치 하둡 작업(Map Reduce, Hive, Spark, Sqoop, Pig 등)을 실행하고 관리하는 워크플로우 스케줄러 시스템

Oozie 용어

Action : Oozie에서 실행할 수 있는 작업단위(MapReduce 작업, Spark 작업, Shell script 작업)

Workflow : 기본적 의미는 이전 작업의 출력이 다음 작업의 입력으로 이어지는 것을 말함. Oozie에서 Workflow는 Action들의 제어와 의존 관계를 DAG 형식으로 표한 한다.

Coordinator : Data Sets과 Workflow를 실행하는 스케줄을 정의 한 것.

Bundle : Coordinator의 집합.

 

핵심 기능

Scheduling

  • 특정 시간에 액션 수행
  • 주기적인 간격 이후에 액션 수행
  • 이벤트가 발생하면 액션 수행

Coordinating

  • 이전 액션이 성공적으로 끝나면 다음 액션 시작

Managing

  • 액션이 성공하거나 실패했을 때 이메일 발송
  • 액션 수행시간이나 액션의 단계를 저장

 

워크플로우 노드 유형

시작/종료 제어플로우 노드

Action 노드 : 실제로 처리되는 Task를 정의.

Fork/Join 노드 : 워크플로우에서 Task를 병렬로 실행시킨다.

제어 플로우 노드 : 이전 액션 결과를 기반으로 다음 실행을 위한 판단을 내린다.

 

 

Oozie 실행 과정

1. 클라이언트는 우지 서버에 연결하여 job properties을 제출

  • job properties는 key-value 형태로 작업에 필요한 파라미터를 정의
  • workflow.xml(Action들과 그들을 연결하는 로직은 Workflow를 정의) 파일의 NameNode와 Yarn ResourceManager(혹은 JobTracker)에 대한 URI를 포함하고 있음.

2. 우지 서버가 HDFS로 부터 workflow 파일을 읽는다.

3. 우지 서버에서 workflow를 파싱해서 액션을 수행한다.

 

 

사용 예시

Oozie의 스크립트는 xml로 작성하고 이를 수행하는 방식이다. 아래는 xml 예시파일이다.

<!-- This is a comment -->
<workflow-app xmlns = "uri:oozie:workflow:0.4" name = "simple-Workflow">
   <start to = "Create_External_Table" />

   <!—Step 1 -->
   
   <action name = "Create_External_Table">
      <hive xmlns = "uri:oozie:hive-action:0.4">
         <job-tracker>xyz.com:8088</job-tracker>
         <name-node>hdfs://rootname</name-node>
         <script>hdfs_path_of_script/external.hive</script>
      </hive>
		
      <ok to = "Create_orc_Table" />
      <error to = "kill_job" />
   </action>

   <!—Step 2 -->
   
   <action name = "Create_orc_Table">
      <hive xmlns = "uri:oozie:hive-action:0.4">
         <job-tracker>xyz.com:8088</job-tracker>
         <name-node>hdfs://rootname</name-node>
         <script>hdfs_path_of_script/orc.hive</script>
      </hive>
		
      <ok to = "Insert_into_Table" />
      <error to = "kill_job" />
   </action>

   <!—Step 3 -->
      
   <action name = "Insert_into_Table">
      <hive xmlns = "uri:oozie:hive-action:0.4">
         <job-tracker>xyz.com:8088</job-tracker>
         <name-node>hdfs://rootname</name-node>
         <script>hdfs_path_of_script/Copydata.hive</script>
         <param>database_name</param>
      </hive>
		
      <ok to = "end" />
      <error to = "kill_job" />
   </action>
   
   <kill name = "kill_job">
      <message>Job failed</message>
   </kill>
	
   <end name = "end" />

</workflow-app>

 

이런 Oozie의 스크립트는 DAG 형식으로 표현했을 때 아래와 같다.

 

 

 

출처 : https://seamless.tistory.com/31 [Apache Oozie 알아보기]

출처 : https://www.tutorialspoint.com/apache_oozie/apache_oozie_workflow.htm [Apache Oozie - Workflow]

'좌뇌 > 빅데이터(BigData)' 카테고리의 다른 글

ZooKeeper  (0) 2022.05.19
DB vs DW (데이터베이스와 데이터웨어하우스 차이)  (0) 2022.05.15

코디네이션 서비스

각 시스템의 중요한 상태정보나 설정정보들을 유지하고 동기화를 위한 lock처리 등을 관리하는 서비스를 의미한다.

 

ZooKeeper 란?

ZooKeeper는 Hadoop의 분산 시스템에서 분산 애플리케이션에 대한 코디네이션 서비스를 제공하는 역할을 한다. 애플리케이션들의 설정 정보 관리, 이름을 지정, 분산 동기화를 제공하며, 그룹화 서비스를 제공하는 중앙 집중식 서비스이다.

ZooKeeper는 이러한 다양한 서비스의 본질을 중앙 집중식 조정 서비스에 대한 매우 간단한 인터페이스로 통합하는 것을 목표로 한다.

 

 

모델

ZooKeeper는 분산 애플리케이션에 대한 동기화, 설정 정보, Lock(잠금처리) 등에 대한 조율을 위해 각 애플리케이션들에 대한 서버를 두고 이를 관리하는 구조로 되어있다. 그런데 단순한 서버 클라이언트 구조가 아닌 안전성, 분산 애플리케이션 환경 등을 고려하여 설계되었다.

 

znode

주키퍼에게 필요한 글로벌 락, 동기화, 리더 채택, 설정 관리 등의 기능을 구현할 수 있도록 하는 파일시스템이 있다. 이 파일 시스템에서의 각각 파일을 znode라고 부른다.


znode는 unix-like 시스템에서 쓰이는 file system처럼 node 간에 hierarchy namespace를 가지고 '/'로 구분하여 사용한다. 그러나 ZooKeeper에서 일반적인 file system과 다른 부분은 file과 directory의 구분이 없이 znode라는 것 하나만을 제공한다

 

 

znode의 종류

  • Persistent mode: Persistent mode로 생성된 znode는 명시적으로 삭제될 때까지 지워지지 않는, 우리가 일반적으로 생각하는 file과 같다.

 

  • Ephemeral mode: Ephemeral mode로 생성된 znode는 ZooKeeper서버와 znode를 생성하도록 요청한 클라이언트 사이의 connection이 종료되면 자동으로 지워진다. ephemeral node의 이런 특성을 이용하여 lock이나 leader election을 구현하기도 하고 클라이언트와 연결 여부를 확인하기도 용이하다.

 

  • Sequence mode : znode는 Persistent일 수도 Ephemeral일 수도 있다. Sequence mode로 znode가 만들어 질 때 주키퍼 데이터 모델 상에서 이 znode는 10자리 연속된 숫자를 가지고 있는 이름을 가지고 만들어 진다. Sequence mode의 znode가 만들어 질 때, 주키퍼 데이터 모델 상에서 이 znode는 10자리 연속된 숫자를 가지고 있는 이름을 가지고 만들어 진다. 예로들어 /app 이라는 연속형 znode를 만들면 app0000000001, app0000000002, ... 로 자동적으로 만들어지는 형식이다. 이 연속형 znode는 lock을 구현하거나 글로벌 큐(global queue)를 구현할 때 사용된다.


znode는 사용성에 따라 모드를 반드시 지정해서 create를 호출해야 한다

 

 

ZooKeeper 아키텍쳐

 

주키퍼의 서버는 한대가 아닌 여러대를 동시에 운용한다. 그리고 서버들의 묶음을 앙상블(Ensemble)이라고 칭한다.

이 서버들은 모두 동일한 데이터를 가지고 있는데, 갱신이 일어날 때도 같이 동기화 되도록 프로그래밍 되어있다.

이렇게 동일한 데이터를 가진 서버를 여러대 두고 운용하는 이유는 장애에 대한 대비 때문이다. 만약 한 대의 서버로 운용하는데 서버에 장애가 발생하면 모든 분산 애플리케이션은 중단된다. 그러나 2대 이상의 동일한 서버를 두고 운용하면 장애에 대한 안정성은 높아 진다. Ensemble은 과반수 이상의 서버에 장애가 생기면 서비스 불가 상태가 된다. 즉 서버가 N대일 때, ⌈N/2⌉대 이상 장애가 발생하면 서비스 불가 상태가 된다. 


각 서버가 동일한 데이터를 가지도록 동기화 시키는 방법에 대해 자세히 설명하면 다음과 같다. 다이어그램에 나와있듯이 클라이언트(분산 애플리케이션)들은 주키퍼 서버들로 이루어진 앙상블(Ensemble)에 접근하여 znode의 데이터를 읽거나 데이터를 업데이트 한다. 

만일 주키퍼 서버에 쓰기 동작을 할 경우에, 클라이언트는 특정 서버에 접속하여 그 서버의 데이터를 업데이트 한다. 그리고 업데이트 된 서버는 leader의 역할을 맡은 주키퍼 서버에 그 데이터를 알리고 업데이트한다. 이 업데이트를 감지한 leader 서버는 그 정보를 다른 곳에 브로드캐스트(Broadcast) 형식으로 알리게 된다. 그 업데이트 정보를 받은 나머지 Follower 주키퍼 서버들은 그 내용을 갱신하여 전체 서버들의 데이터들이 일관된 상태로 유지된 상태로 있게 된다. 이런 과정을 통해 Ensemble안의 주키퍼 서버들은 조율된 상태이며 항상 동일한 데이터를 가지고 있게 된다. 클라이언트는 어느 주키퍼 서버에서 데이터를 읽어도 똑같은 값을 가져온다.

 

ZooKeeper  특징

Sequential Consistency(순차적 일관성) - 클라이언트의 업데이트가 전송된 순서대로 적용됩니다.
Atomicity(원자성) - 업데이트가 성공하거나 실패합니다. 부분 결과가 없습니다.
Single System Image - 클라이언트는 연결된 서버에 관계없이 동일한 데이터를 볼 수 있다. 
Reliability - 클라이언트 요청에 의해 업데이트가 적용되면 다른 클라이언트가 업데이트를 덮어쓸 때까지 데이터(znode 등)가 계속 유지된다.
Timeliness - 특정 시간(time bound)내에는 클라이언트 정보가 최신 상태로 유지되도록 보장합니다.

 

 

ZooKeeper  활용 사례

아래와 같이 Hadoop의 클러스터 구성에 활용된다. Hadoop클러스터에서 Active Namenode와 Stanby Namenode가 존재할 때, Namenode가 비정상 상태인 경우 Stanby Namednode가 동작해야 한다. 방법은 다음과 같다. Active Namenode가 비정상일 경우 ZooKeeper서버와 connection이 끊길 것이다. 이를 ZooKeeper를 통해 Stanby Namenode가 알게 될 것이고, Stanby Namenode는 Active 상태가 된다.

ZooKeeper는 이외에도 Hbase, Kafka 등의 애플리케이션에서 활용된다.

 

ZooKeeper API 활용하여 애플리케이션 개발

ZooKeeper를 활용하여 개발하는 방법은 아래 블로그에 소개가 나와있으니 참고한다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=alice_k106&logNo=220620934774 

 

60. [Zookeeper] 분산 코디네이터 - Zookeeper 예제 코딩편 (java)

이번 포스트에서는 Zookeeper(이하 주키퍼)를 이용한 코드를 설명한다. 정말로 간단한 예제를 설명한다. ...

blog.naver.com

 

 

 

참고 

출처: https://engkimbs.tistory.com/660

출처: https://kimseunghyun76.tistory.com/397

출처: https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_designGoals 

출처: https://blog.seulgi.kim/2014/05/zookeeper-1-znode-zookeeper-data.html

'좌뇌 > 빅데이터(BigData)' 카테고리의 다른 글

Apache Oozie  (0) 2022.06.02
DB vs DW (데이터베이스와 데이터웨어하우스 차이)  (0) 2022.05.15

Database vs Data Warehouse

  데이터 베이스 데이터웨어 하우스
목적 기록하도록 설계 분석하도록 설계
가공 방법 OLTP (온라인 트랜잭션 처리) OLAP (온라인 분석 처리)
용법 데이터베이스는 비즈니스를위한 기본적인 작업 수행에 도움이됩니다. 데이터웨어 하우스를 사용하면 비즈니스를 분석 할 수 있습니다.
테이블과 조인 데이터베이스의 테이블과 조인은 정규화되면 복잡합니다. 테이블 및 조인은 비정규화되어 있기 때문에 데이터웨어 하우스에서 간단합니다.
정위 응용 프로그램 지향 데이터 수집 주제 중심의 데이터 모음
저장 용량 한도 일반적으로 단일 응용 프로그램으로 제한됩니다. 여러 애플리케이션의 데이터 저장
유효성 실시간으로 데이터를 이용할 수 있습니다. 필요한 경우 원본 시스템에서 데이터를 새로 고칩니다.
용법 ER 모델링 기술은 설계에 사용됩니다. 데이터 모델링 기술은 설계에 사용됩니다.
기술 데이터 캡처 데이터 분석
데이터 형식 데이터베이스에 저장된 데이터는 최신 상태입니다. 현재 및 과거 데이터는 데이터웨어 하우스에 저장됩니다. 최신이 아닐 수도 있습니다.
데이터 저장 Flat Relational Approach 방법은 데이터 저장에 사용됩니다. 데이터 구조에 대해 차원적이고 표준화 된 접근 방식을 사용합니다. 예 : 스타 및 스노우 플레이크 스키마.
쿼리 유형 간단한 트랜잭션 쿼리가 사용됩니다. 복잡한 쿼리는 분석 목적으로 사용됩니다.
데이터 요약 상세 데이터는 데이터베이스에 저장됩니다. 고도로 요약 된 데이터를 저장합니다.

*OLTP

OLTP 란 온라인 트랜잭션 처리를 말하며, 네트워크 상의 온라인 사용자들의 Database 에 대한 일괄 트랜잭션 처리를 의미한다.

흔히 말하는 "트랜잭션(Transaction) 처리" 를 OLTP 라 부며, 트랜잭션이라 부르는 용어의 의미 자체가 OLTP 의 의미를 포함하고 있다.

트랜잭션의 주 특징은 그루핑된 연산의 실패시, Rollback 이 지원된다는 점이다.

 

*OLAP

온라인 분석 처리(Online Analytical Processing, OLAP)는 의사결정 지원 시스템 가운데 대표적인 예로, 사용자가 동일한 데이터를 여러 기준을 이용하는 다양한 방식으로 바라보면서 다차원 데이터 분석을 할 수 있도록 도와준다.

최종 사용자가 다차원 정보에 직접 접근하여 대화식으로 정보를 분석하고 의사결정에 활용하는 과정에서 등장하였다. Database 자체적으로 운용되는 시스템을 의마하는 것은 아니다. 사용자가 온라인상에서 직접 데이터에 접근하고 대화식으로 정보를 분석하므로 사용자가 기업의 전반적인 상황을 이해할 수 있게 하고 의사결정하는 일련의 시스템을 의미한다.

 

출처: https://ko.wikipedia.org/wiki/온라인_분석_처리 [위키백과]
출처: https://jins-dev.tistory.com/entry/간략하게-정리해보는-OLTP-OLAP-의-개념 [Jins' Dev Inside]

출처: https://dbrang.tistory.com/1380 [디비랑[dɪ'bɪraŋ]]

'좌뇌 > 빅데이터(BigData)' 카테고리의 다른 글

Apache Oozie  (0) 2022.06.02
ZooKeeper  (0) 2022.05.19

[문제]

슈퍼 마리오 앞에 10개의 버섯이 일렬로 놓여져 있다. 이 버섯을 먹으면 점수를 받는다.

슈퍼 마리오는 버섯을 처음부터 나온 순서대로 집으려고 한다. 하지만, 모든 버섯을 집을 필요는 없고 중간에 중단할 수 있다.

중간에 버섯을 먹는 것을 중단했다면, 그 이후에 나온 버섯은 모두 먹을 수 없다. 따라서 첫 버섯을 먹지 않았다면, 그 이후 버섯도 모두 먹을 수 없다.

마리오는 받은 점수의 합을 최대한 100에 가깝게 만들려고 한다.

버섯의 점수가 주어졌을 때, 마리오가 받는 점수를 출력하는 프로그램을 작성하시오.

 

[입력]

총 10개의 줄에 각각의 버섯의 점수가 주어진다. 이 값은 100보다 작거나 같은 양의 정수이다. 버섯이 나온 순서대로 점수가 주어진다.

[출력]

첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.

 

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
 
vector<int> sumArr;
 
int main() {
    int sum = 0;
    int resultPos = 0;
    for(int i = 0; i < 10; i++){
        int tmp;
        scanf("%d"&tmp);
        sum += tmp;
        sumArr.push_back(sum);
        int oldVal = abs(sumArr[resultPos] - 100);
        int newVal = abs(sumArr[i] - 100);
        if(oldVal == newVal && sumArr[resultPos] < sumArr[i])
            resultPos = i;
        else
            resultPos = oldVal > newVal ? i : resultPos;
    }
    printf("%d", sumArr[resultPos]);
    return 0;
}
 

'좌뇌 > 알고리즘' 카테고리의 다른 글

프로그래머스 - 전화번호 목록  (0) 2019.02.08

+ Recent posts