전체 글 37

이진탐색트리 (Binary Search Tree, BST)

개요 트리의 구조 트리: Node와 Branch를 이용해서 사이클을 이루지 안호록 구성한 데이터 구조 트리 중 이진 트리(Binary Tree) 형태의 구조로 탐색(검색) 알고리즘 구현을 위해 자주 사용 용어 Node: 트리에 데이터를 저장하는 기본 요소 (데이터, 연결된 다른 node에 대한 branch 정보 포함) Root node: 트리의 최상위 노드 Level: Root node를 레벨 0으로 봤을 때 하위 node들의 깊이를 나타냄 Parent node: 어떤 노드의 하위 레벨에 연결된 노드 (위쪽 노드) Child node: 어떤 노드의 상위 레벨에 연결된 노드 (아래쪽 노드) Leaf node: Child node가 없는 노드 Depth: 트리에서 node가 가질 수 있는 최대 level 이..

Producer의 send() method 수행 과정 (feat. flush())

개요 및 결론 send()는 즉시 broker에게 메세지를 전송하지 않는다. send()를 통해 메세지를 내부 버퍼에 쌓아두고 flush()를 통해 broker로 전달한다. 물론 send()와 flush() 사이에도 몇 가지 과정을 거친다. 프로듀서가 메세지를 보내는 과정 Serializer 메세지 객체를 바이트 배열(byte array)로 직렬화한다. Partitioner Kafka Producer가 send() 메소드를 호출하면 Record는 Partitioner에게 전달된다. Partitioner는 지정한 토픽에서 어느 파티션으로 전송할 지 정하는 역할을 한다. Kafka Producer 객체를 생성할 때 Partitioner를 지정할 수 있으며, 설정하지 않으면 DefaultPartitioner로..

MySQL 다중 컬럼 인덱스 사용 방법에 대해

테스트를 진행하게 된 계기 MySQL을 사용하며 다중 컬럼 인덱스를 사용했다. 다중 컬럼 인덱스란 여러 개의 컬럼을 묶어 하나의 인덱스로 활용하는 방식이다. 해당 테이블에서 날짜, 시차, 장소번호의 조합에서 중복이 없어야 했기 때문에 아래의 쿼리로 다중 컬럼 유니크 인덱스를 만들었다. alter table add unique index (date, time_diff, location_num); 아무 생각없이 사용하던 중, MySQL의 Index를 공부하다 explain이라는 명령어를 알게됐다. MySQL 서버가 쿼리를 어떤 방식으로 수행할 것인가, 실행 계획을 알고 싶을 때 사용하는 명령어다. 내가 쓰는 테이블에도 explain을 통해 다양한 query의 실행계획을 알아보는 도중에, 인덱스를 타겠지라고 ..

Database 2022.03.03

Proxy Server

Proxy Server (프록시 서버)란? 서버와 클라이언트 사이에 위치하여 두 호스트를 중계해주는 역할을 주로 한다. 중계 역할 이외에도 캐싱 기능, 보안 기능을 제공하며 프록시가 어디에 위치하느냐에 따라 Forward Proxy, Reverse Proxy 두 종류로 나눌 수 있다. Forward Proxy vs. Reverse Proxy Forward Proxy 클라이언트측과 인터넷 사이에 위치한 프록시를 Forward Proxy라고 한다. 캐싱 기능 프록시에서 제공하는 기능의 첫 번째는 캐싱이다. 이 경우 클라이언트가 데이터를 요청하고 응답받는 순서는 클라이언트 → 프록시 → 인터넷 → 서버 → 인터넷 → 프록시 → 클라이언트 순으로 된다. 이 때 프록시 서버는 서버에서 클라이언트 측으로 전송한 데..

spark-submit

spark submit summary 스파크 어플리케이션을 클러스터 매니저에 제출하기 위해 spark-submit이라는 툴을 이용한다. submit을 할 때 다양한 파라미터로 추가 정보를 제공할 수 있다. spark-submit parameter 파라미터 설명 --master 클러스터 매니저를 설정함. 아래 표에서 자세히 설명 --deploy-mode 드라이버 프로세스를 client에서 실행할지, cluster에서 실행할 지 결정함 (Default: client) --class 스파크 어플리케이션의 메인클래스 (Java, Scala 앱의 경우) --name 제출하는 스파크 어플리케이션의 이름 --jars 드라이버와 익스큐터의 CLASSPATH에 포함될 로컬 JAR 파일들 (콤마로 구분한 리스트로 지정) ..

카프카 내부 메커니즘 - 4. 요청 처리

브로커가 하는 일의 대부분은 클라이언트와 파티션 리플리카 및 컨트롤러부터 파티션 리더에게 전송되는 요청을 처리하는 것이다. 이러한 요청과 응답에는 TCP로 전송되는 이진 프로토콜을 가지고 있다. 모든 요청에는 다음 내용을 포함하는 헤더가 존재하며 요청 타입에 따라 서로 다른 구조의 데이터를 전송한다. 요청 타입 ID: 어떤 요청인지를 나타낸다. 예를 들어, 메시지를 쓰는 요청은 produce라고 하며 id는 0, 메시지를 읽는 요청은 fetch라고 하며 id는 1 등등... 요청 버전: 프로토콜 API의 버전을 나타낸다. 요청 버전 덕분에 서로 다른 프로토콜을 사용하는 브로커가 요청을 보내도, 카프카는 버전에 맞추어 요청을 처리할 수 있다. cID (correlation ID): 각 요청의 고유 식별 번..

카프카 내부 메커니즘 - 2.컨트롤러

컨트롤러 컨트롤러 역시 카프카 브로커 중 하나이며 일반 브로커의 기능에 더하여 파티션 리더를 선출하는 책임을 갖는다. 컨트롤러 선출 과정 카프카 클러스터가 실행되면 모든 브로커들은 최상위 노드에 /controller 임시 노드를 생성하려고 한다. 이 때 가장 먼저 실행된 브로커가 임시 노드를 생성하고 컨트롤러가 되며 나머지 브로커들은 ‘노드가 이미 존재한다’는 예외를 받고 이미 /controller 임시 노드가 있다는 것과 클러스터에 컨트롤러가 있다는 것을 알게 된다. 이후에 모든 브로커들은 /controller 노드에 주키퍼의 watch를 생성하여 controller 노드에 변화가 생기면 바로 알 수 있도록 한다. 컨트롤러 재선출 컨트롤러 브로커가 중단되거나 연결이 끊기면 임시 노드였던 /control..

카프카 내부 메커니즘 - 1.클러스터 멤버십

실제 업무에서 카프카를 사용하는 작성하는 어플리케이션을 위해서 내부 구조를 알 필요는 없지만 어떻게 동작하는지 알아두면 문제가 발생했을 때 신속히 원인을 파악하고 대처하는(트러블슈팅) 기반이 될 수 있다. 이 글에서는 책 을 바탕으로 카프카 복제(Replication)가 동작하는 방식, 카프카가 프로듀서와 컨슈머의 요청을 처리하는 방법, 카프카가 스토리지(파일 형식, 인덱스 등)를 처리하는 방법을 알아본다. 클러스터 멤버십 주키퍼의 트리구조 데이터 저장 카프카에서 사용하는 주키퍼의 중요사항을 알아볼 필요가 있다. 주피커는 내부적으로 디렉터리처럼 계층적인 트리구조로 데이터를 저장한다. 데이터를 저장하는 노드를 znode라고 하며 각 znode의 이름 앞에는 /(슬래시)를 붙여 디렉터리처럼 경로(path)를..

System Bus

System Bus 컴퓨터를 구성하는 요소(CPU, I/O장치, Memory)들을 연결해주는 통로다. 여러 하드웨어들을 물리적으로 연결해 전기적 신호로 데이터를 주고받을 수 있게 해준다. 종류는 크게 세 가지로 데이터 버스, 주소 버스, 제어 버스가 있다. 데이터 버스 CPU와 다른 장치 사이에서 데이터가 오가는 통로. Memory와 I/O장치의 명령어를 CPU로 보내거나 CPU가 연산한 결과를 Memory, I/O장치로 보낼 때 사용하는 양방향버스다. 주소 버스 주소 버스는 물리적 주소를 특정하기 위해 사용하는 버스다. CPU나 입출력장치(DMA-enabled device)가 메모리(혹은 기억장치)에서 데이터를 읽거나 쓸 때 주소 버스에 데이터 버스에 실어보내는 값의 메모리 주소를 전달한다. CPU가 ..

PIO(Programmed I/O)와 DMA(Direct Memory Access)

입출력 제어방식 컴퓨터와 입출력장치 사이에서 데이터가 오가는 방식을 입출력 제어방식이라고 하는데, DMA와 PIO는 이 입출력 제어방식들 중 하나이며 총 네 가지 방식이 있다. 대형 컴퓨터에서 사용하는 Channel에 의한 I/O를 제외한 세 가지 방식에 대해 알아본다. 제어방식 CPU 관여 여부 프로그램에 의한 I/O(PIO, Program I/O) O Intrrupt에 의한 I/O O DMA(Direct Memory Access)에 의한 I/O X Channel에 의한 I/O X Programmed I/O vs Interrupt I/O(Interrupt Initiated I/O) 이 두가지 입출력 방식은 CPU가 입출력(데이터의 이동)을 담당한다는 점에서는 같지만, 입출력이 준비되었음을 인식하는 과정..