Open guswns1659 opened 2 days ago
운영체제에서 파일이나 소켓 등을 구분하는 숫자이다. 소켓이 생성될 때 fd가 생성된다. 서버는 클라이언트 포트번호를 통해 각 fd가 어디 클라이언트 포트인지 구분할 수 있다.
예시) send(fd, data, size, flags); // 데이터 전송 recv(fd, buffer, size, flags); // 데이터 수신
보통 TCP/IP에서 사용 가능한 포트 번호 개수이다. 보통 연결 요청이 와서 소켓이 수립되면 fd가 1개가 쌓인다. 한 포트당 몇만개를 소켓 열 수 있지만, 보통 운영체제 전체에서 65536개의 fd만 열 수 있다. 이 값을 조절하면 더 열 수 있음.
멤캐시를 확장하여 클러스터 지원하는 분산 캐시 시스템이다. 주키퍼를 이용하여 클러스터를 관리한다.
데이터 구조 지원
Redis: 문자열뿐 아니라 리스트, 셋, 해시, 정렬된 셋 등 다양한 데이터 구조 지원. Memcached: 단순 문자열(String) 데이터만 저장 가능. 데이터 지속성
Redis: 디스크에 데이터를 저장할 수 있어 재부팅 후에도 데이터 복구 가능. Memcached: 순수 인메모리 기반으로 재부팅 시 데이터 손실. 확장성 및 관리
Redis: 클러스터 모드, 복제, 자동 리밸런싱 등을 지원해 대규모 분산 환경에 적합. Memcached: 수동으로 샤딩해야 하며, 확장성이 제한적. Redis는 다목적 데이터 관리와 확장성에 강하고, Memcached는 단순 캐싱에 최적화되어 있습니다.
여러개의 센티널 프로세스가 존재한다. 마스터를 수시로 핑을 하고 응답이 지연되면, 프로세스간 과반수 합의를 한다. 합의를 하여 마스터 다운을 확정하면 복제 지연이 가장 적인 슬레이브를 마스터로 승격한다. 새 마스터로 복제를 다시 구성한다.
애플리케이션 입장에서는 레디슨이나 레튜스 같은 클라이언트가 중간에서 새로운 마스터 정보를 가져와 요청을 처리한다. 해당 클라이언트들은 연결이 끊어지면 센티널에게 정보를 물어본다.
싱글스레드로 처리되기 때문이다. 하나의 작업이 끝나야 다른 작업이 처리된다.
여러 명령을 하나의 단위로 처리하는 트랜잭션 기능도 지원 한다고 한다.
MULTI: 트랜잭션 시작. 명령 추가: 명령들을 큐에 저장. EXEC: 큐에 저장된 명령을 한 번에 실행.
INCR: 특정 키의 값을 1 증가시키는 명령. Redis는 이 작업을 "읽기 -> 수정 -> 쓰기"로 처리하지만, 싱글 스레드 기반으로 실행하므로 중간에 다른 클라이언트가 값을 읽거나 수정할 수 없습니다.
클러스터는 해시 슬롯을 통해 단일 마스터 노드에만 접근하기 때문에 근본적으로 레드락 알고리즘을 적용할 수 없다. 그래서 클러스터 보다는 sa나 센티널 환경에서 redlock 알고리즘을 적용할 수 있다.
레드락은 5개에서 3개 이상 노드에서 락을 획득해야 한다. 기본이 5개는 필요하다.
각 서비스 별로 마스터 노드가 분리되어 있다. 서비스 단위 샤딩이 이루어짐. 자체적으로 HA를 구성해 마스터 노드 통신 실패 등 이상 징후 발생하면 페일오버 진행함.
List 자료 구조를 이용한다. LPUSH, RPOP, LLEN, LRANGE처럼 데이터 넣고, 빼고 길이 체크하고 특정 사용자 위치 확인할 수 있는 연산 존재한다. LRANGE는 정확하게는 전체 큐를 꺼낸 다음 userId 가 있다면 전체 길이 - userid의 index를 뺀다.
하지만 위치 조회하는 성능이 저하될 수 있으니 조회가 빠른 sortedset을 사용하는 것도 방법. 그래서 데이터 처리는 삽입이 빠른 list로 위치 조회는 sortedset으로 하는 방법
추천하는 방법은 아님. 여러 발행자와 단일 구독자만 구현이 가능하다. 하지만 구독자가 없는 상태에서 발행된 메세지는 유실된다. 최대 단점.
인스턴스를 여러개 두되, 각 인스턴스 별로 티켓을 할당한다. 예를 들어, 3000개라면 1000개씩 할당해 처리. 각 사용자는 해시함수를 적용해 분산 시킨다.
웹소켓을 사용한다. 푸시알림을 사용한다. 오프라인 상태에서도 적용 가능. 콜백을 사용한다. 폴링을 사용한다.
카프카 접속 방법
사내 구성
브로커 추가 시 어떤 동작이 일어나는가? 주의사항
-Auto-Commit: 자동 커밋을 비활성화하고 데이터 처리 완료 후 오프셋을 수동으로 커밋. 이유
오토 커밋은 카프카가 주기적으로 커밋을 자동으로 한다. 이 경우 컨슈머가 장애가 났는데, 해당 메세지가 커밋처리되면 다시 재처리할 수 없게 된다. 수동커밋은 명확하게 커밋 주기를 내가 관리할 수 있다.
오프셋이란
브로커 내 파티션이 관리하는 오프셋과 컨슈머가 관리하는 오프셋이 다르다. 파티션 내 오프셋은 메세지가 저장된 위치를 말한다. 컨슈머는 현재까지 처리한 메세지 위치를 관리한다. 커밋되면 마지막 오프셋이 브로커에 저장된다.
커밋되지 않은 메세지의 오프셋은 컨슈머에만 남아있다. 그래서 자동커밋이 정합성에 불리할 수 있다. 데이터 처리는 했는데 커밋이 안되고 장애가 나면 중복 처리가 될 수 있다.
배치 처리의 장단점
I/O 비용을 줄일 수 있다는 점이 장점
단점은 1개가 실패하면 묶여서 재처리가 필요할 수 있다. 데이터 정합성이나 실시간으로 처리해야 한다면 단건 처리가 나을 수 있다.
공부요소