들어가기 전이 글은 RAFT 알고리즘 논문을 공부하며 개인적으로 정리한 글입니다. 틀린 부분이 있을 수 있으니 이해에 참고만 하시고, 피드백 주실만한 부분은 언제든 댓글로 부탁드립니다. 알고리즘 논문 erlang으로 구현한 학습용 코드 1. RAFT IntroductionConsensus 알고리즘은 여러 노드로 구성된 클러스터에서 일부 노드가 장애를 겪고 있더라도, 클러스터가 일관된 상태로 잘 동작할 수 있도록 지원한다. 이런 이유 때문에 Consensus 알고리즘은 신뢰할 수 있는 대규모 소프트웨어 시스템을 구축하는데 핵심적인 역할을 한다. RAFT 알고리즘 이전에는 Paxos 알고리즘이 Consensus 알고리즘에서 중요한 역할을 해왔다. Paxos 알고리즘의 큰 문제점은 이해하기 어렵다는 것이다. ..
들어가기 전이 글은 다음 포스팅을 참고하여 공부하며 작성한 글입니다. erlang으로 구현된 학습용 코드는 이곳에서 확인할 수 있습니다.1. 시작이전 게시글에서 간단하고 직관적인 멤버쉽 프로토콜인 SWIM을 공부했다. 그러나 초기 SWIM 프로토콜은 Full Membership을 유지하기 때문에 규모가 큰 클러스터로의 확장은 상대적으로 제한된다. 이번 글에서는 HyParView(Hybrid Partial View) 프로토콜을 다룬다. HyParView 프로토콜은 규모가 큰 클러스터에서도 경량화 된 방식으로 잘 동작하는 멤버쉽 프로토콜이다. 2. 직관적으로 바라보기HyParView에 대한 직관을 가질 수 있도록 일상 생활을 예로 들어보자. 우리는 노드를 사람, 클러스터를 사람의 무리라고 치환할 수 있다. ..
들어가기 전이 글은 다음 블로그 글을 보고 공부하며 작성한 글입니다. 이 글에서 다룰 plum tree는 Gossip Protocol이지만, 특정 클러스터 내에서 함께 동작하기 때문에 최종적으로는 Distributed Membership Protocol에 Integrated 되는 형태로 작성될 것입니다. 이 블로그에서 작성한 Distributed Membership Protocol은 다음 글들을 참고해주세요.SWIM Membership protocolHyParView Membership ProtocolHyParView Protocol + Plum Tree 프로토콜이 Integrate된 학습용 코드는 이곳을 참고해주세요. 코드는 erlang으로 작성되어있습니다. 1. 들어가면서 이전 글에서 HyParVi..
들어가기 전이 글은 이 블로그 글을 참고로 학습한 글입니다.원글은 SWIM 프로토콜을 F#으로 구현한 코드를 제공합니다.이 글에서는 erlang으로 SWIM 프로토콜을 구현하였으며, 원글에서는 구현되지 않았던 suspect - alive 반박, SWIM 프로토콜 메세지 사이의 동시성 문제를 해결하기 위해 Incarnation을 고려한 코드를 추가했습니다. 제가 구현한 코드는 이곳에 있습니다. 1. 클러스터란 무엇인가?사용자 관점에서 클러스터는 '단일 머신'처럼 보이도록 만들어준다. 여러 서버가 상호 연결된 클러스터는 새로운 서버가 추가되거나 제거되기도 하는데, 클러스터는 이런 개념들을 '단일 머신'으로 추상화해준다. 이 덕분에 클라이언트는 클러스터에서 발생할 수 있는 여러 복잡한 시나리오들을 고려하지 ..
들어가기 전 이 글은 프로그래밍 러스트 책을 공부하고 정리한 글입니다. 요약Trait은 인터페이스 의미를 가짐. Type은 Struct, i32 같은 것들을 의미함.디스패치 방법정적 디스패치 : impl Trait, 제네릭은 정적 디스패치임. Call Site를 확인하고 필요한 타입에 대한 함수 코드를 모두 생성한다.동적 디스패치 : Trait Object를 사용하는 경우. V Table은 컴파일 시점에 한번만 생성되고, Trait Object는 런타임 시점에 타입에 맞는 V Table의 주소와 함께 Fat Pointer로 생성된다. 그리고 VTable을 참조해서 메서드를 호출한다.dyn 키워드는 dynamic의 줄임말임.dyn Type은 허용되지 않음. dyn은 동적 타입이 오는데, 구현체는 실제로 여..
들어가기 전이 글은 프로그래밍 러스트 2판을 공부하며 작성한 글입니다. 9. 스트럭트 (Struct)Struct 자바, 파이썬에서 제공하는 클래스와 거의 유사한 개념이다.Struct는 크게 다음 세 종류가 존재한다.필드형 Struct : 주로 많이 사용함.튜플형 Struct : 타입 검사를 좀 더 Strict 하게 하기 위해 NewType을 생성할 때 주로 사용.유닛형 Struct : 주로 Trait과 함께 사용할 때 유용하다고 한다. 필드형 Struct필드는 일부만 public, private으로 만들 수 있음.private 필드 : 같은 모듈 내에서는 참조 가능.public 필드 : 외부 모듈에서도 참조 가능.Struct가 private 필드로만 구성되어있으면, 외부 모듈에서는 직접 Struct를 ..
들어가기 전이 글은 Oreily에서 나온 프로그래밍 러스트를 공부하며 작성한 글입니다. 레퍼런스란?스마트 포인터 : 소유권을 가지는 포인터다. 스마트 포인터가 해제되는 시점에 포인터가 가리키는 값도 해제된다.레퍼런스 : 소유권을 가지지 않는 포인터다. 소유권은 Borrow 된다. 레퍼런스 특징레퍼런스는 자신이 가리키는 대상보다 오래 살아있으면 안됨. 레퍼런스가 안전하게 살아있을 수 있는 범위를 라이프타임이라고 함. 모든 레퍼런스는 라이프타임을 가짐.Shared Reference (Multi Reader를 위한 것)Shared Reference는 동시에 여러 개 존재할 수 있음.Shared Reference가 있는 동안은 값을 수정할 수 없음. 소유자라도 수정할 수 없음. Shared Reference가 ..
들어가기 전이 글은 프로그래밍 러스트(Oreilly)를 공부하며 작성한 글입니다. 소유권 (Ownership)러스트에서 소유권은 컴파일 시점에 검증된다. 소유권은 아래 메모리 안정성을 위해 러스트 컴파일러가 제공한다.Dangling Pointer가 없도록 한다.원하는 시점에 메모리가 해제되도록 한다.모든 값은 하나의 소유자를 가진다. (Rc, Arc는 복수 소유자가 존재 가능)소유자는 자신의 구성 요소들에 대한 소유권도 가진다. 이것은 소유권 트리 형태로 구성된다. 구조체는 자신의 필드들을 소유한다.벡터는 자신의 요소들을 소유한다. 소유자가 자신이 선언된 블록을 벗어날 때 무효화된다. 이 때, 소유하고 있던 값들도 모두 힙에서 제거된다. 소유권을 이동해서 트리를 만들고 바꿀 수 있다. Copy Trai..
들어가기 전많은 TCP Connection이 생성되면, 파일 디스크립터가 많이 생성되어 서버에 영향을 준다라는 생각을 했다. 그런데 TCP Connection이 1개 생겼을 때 얼마만큼의 리소스를 사용하기 때문에 서버에 영향을 미치는지는 잘 알지 못했다. 이 부분을 잘 이해해보려고 글을 작성한다. 파일 디스크립터란? 파일 디스크립터는 OS가 프로세스 내에서 파일 / 다른 입출력 자원을 가리키는 역할을 하는 정수값이다. DB로 생각하면 PK 값으로 생각할 수 있고, 파일 디스크립터 번호로 조회하면 이 파일과 연결된 파일 엔트리를 확인할 수 있게 되어있다. 파일 디스크립터는 0보다 큰 정수로 표현되며, 파일디스크립터 0~2는 stdin, stdout, stderr로 예약되어있다. 즉, 사용자가 특정 파일을..
들어가기 전이전 글에서 파일 디스크립터에 대해 알게 되어 공부하던 중 한 가지 의문점이 생겼다. TCP 커넥션은 어느 레벨에서 처리가 되는걸까?서버쪽 소켓은 하나만 열리는데, 수백 대의 클라이언트가 요청을 보내면 서버는 하나의 소켓만으로 모든 읽기 / 쓰기 작업을 처리하는 것일까?소켓은 어느 레벨에서 관리되는 것일까?위 질문에 대해서 알고 싶어서 전반적인 내용을 공부하고, 코드로 작성하고 디버깅하면서 실제로 그런지를 확인해보려고 한다. 클라이언트 - 서버 TCP 연결클라이언트가 데이터를 전송하기 위해 send(), write()를 호출하면 데이터는 클라이언트의 소켓에서 네트워크를 통해 서버로 전달된다. (IP만으로 찾아감)서버의 네트워크 인터페이스(NIC)는 받은 데이터를 서버 운영체제에게 전달한다. 서..