본 글은 데이터 중심 어플리케이션(마틴 클레프만)으로 스터디하며 해당 책의 내용을 요약 정리한 내용입니다.
https://github.com/ddia-study/ddia-study
분산 시스템에는 공유 메모리가 없고 지연 변동이 큰 신뢰할 수 없는 네트워크를 통해 메시지를 보낼 수 있을 뿐이며 부분 장애, 신뢰성 없는 시계, 프로세스 중단에 시달릴 수 있다.
신뢰성 없는 시스템 모델에서 잘 동작하는 소프트웨어를 만드는 게 가능할지라도 그것이 간단하지는 않다.
분산 시스템은 한 노드에만 의존할 수는 없다.
대신 여러 분산 알고리즘은 정족수(quorum), 즉 노드들 사이의 투표에 의존한다.
노드의 과반수 이상을 정족수로 삼는게 가장 흔하다.
시스템이 오직 하나의 뭔가가 필요할 때가 자주 있다.
분산 시스템에서 이를 구현하려면 주의해야 한다.
어떤 노드가 스스로를 선택된 자라고 믿을지라도 노드의 정족수도 반드시 동의한다는 뜻은 아니다!
Hbase Example : 데이터 오염 사례
잠금 서버가 잠금이나 임차권을 승인할 때마다 fencing token도 반환한다고 가정한다.
펜싱 토큰은 잠금이 승인될 때마다 증가하는 숫자다.
클라이언트가 쓰기 요청을 저장소 서비스로 보낼 때마다 자신의 현재 펜싱 토큰을 포함하도록 요구할 수 있다.
이 메커니즘은 자원 자체가 이미 처리된 것보다 오래된 토큰을 사용해서 쓰는 것을 거부함으로써 토큰을 확인하는 활동적인 역할을 맡아야 한다.
서버 측에서 토큰을 확인하는 것은 결점으로 보이지만 거의 틀림없이 좋다.
흥미로운 내용
마틴 클레프만이 fencing token에 대해서 서술한 글에서는 Redis의 Redlock 알고리즘이 어떤 문제가 있는지 설명해놨다.
Redis Redlock : DLM(Distributed Lock Manager)를 구현하는 알고리즘. N개의 마스터에서 Lock 이슈로 인해 일어날 수 있는 문제를 해결하기 위한 알고리즘이다. Quorum 이상의 인스턴스에서 Lock을 획득하면 lock을 얻은 것으로 보는 알고리즘.
The algorithm relies on the assumption that while there is no synchronized clock across the processes, the local time in every process updates at approximately at the same rate, with a small margin of error compared to the auto-release time of the lock.
그 와중에 시계 동기화가 문제 없다는 가정 하에 잘 작동한다고 한다.
Redis Redlock : https://redis.io/docs/reference/patterns/distributed-locks/
저자의 글 : https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html
대충 다 읽어봤는데, 머리가 정말 아프다...
분산 시스템의 문제는 노드가 "거짓말" (임의의 결함이 있거나 오염된 응답을 보냄)을 할지도 모른다는 위험이 있다면 훨씬 더 어려워진다.
예를 들어 어떤 노드가 실제로는 받지 않은 특정 메시지를 받았다고 주장할 수도 있다.
이런 동작을 Byzantine fault라고 하며 이렇게 신뢰할 수 없는 환경에서 합의에 도달하는 문제를 Byzantine Generals Problem라고 한다.
시스템이 Byzantine fault-tolerant하게 만드는 프로토콜은 매우 복잡하고 내결함성을 지닌 임베디드 시스템은 하드웨어 수준의 지원에 의존한다.
약한 형태의 거짓말로부터 보호해주는 메커니즘은 완전한 비잔팀 내결함성을 지니지는 않지만 그럼에도 더욱 나은 신뢰성으로 향하는 간단하고 실용적인 발걸음이다.
- 네트워크 패킷의 오염 검출을 피하는 경우
It turns out that ZooKeeper was not catching unhandled exceptions from its critical threads, meaning that if one died, the ZooKeeper process would continue to run without it. - https://www.pagerduty.com/blog/the-discovery-of-apache-zookeepers-poison-packet/)
- 사용자 입력 sanitization
- NTP 클라이언트 사용 시 여러 서버 쓰기
시스템에서 발생할 것으로 예상되는 결함의 종류를 정형화해야 하는데, 이를 위해 시스템 모델(알고리즘이 가정하는 것을 기술한 추상화)을 정의한다.
현실 시스템을 모델링하는 데는 죽으면 복구하는 결함을 지닌 부분 동기식 모델이 일반적으로 가장 유용하다.
알고리즘은 시스템 모델에서 발생하리라고 가정한 모든 상황에서 그 속성들을 항상 만족시키면 해당 시스템 모델에서 정확하다.
하지만 모든 노드가 죽거나 모든 네트워크 지연이 무한히 길어진다면 어떤 알고리즘도 아무것도 할 수 없다.
유일성, 단조 일련번호는 안전성 속성이지만 가용성은 활동성 속성이다.
분산 알고리즘은 시스템 모델의 모든 상황에서 안전성 속성이 항상 만족되기를 요구하는 게 일반적이다.
Chapter 10. Batch Processing(일괄 처리) (0) | 2022.06.10 |
---|---|
Chapter 9. 일관성과 합의 - Part 2 (0) | 2022.06.10 |
Chapter 8. 분산 시스템의 골칫거리 - Part 1 (0) | 2022.06.10 |
Chapter 6. Partitioning(파티셔닝) (0) | 2022.06.10 |
Chapter 5. Replication(복제) (0) | 2022.06.10 |
댓글 영역