코딩공부/백엔드개발 공부

[Hazelcast] Split-Brain Recovery란

내일의기대 2023. 12. 30. 02:27

본 글에서는 Hazelcast의 Split-Brain Recovery에 대해서 다룹니다. Split-Brain Recovery는 Cluster의 분할이 감지되었을때 Merge를 어떻게 수행할지 설정하는 과정입니다. Hazelcast 공식 문서에 서술된 내용 일부를 번역하여 Split-Brain Recovery가 무엇인지, Merge Policy에는 어떤것들이 있는지, 설정은 어떻게 하면 되는지를 본 글에서 다룹니다.

1. Split-Brain Recovery 개요
Hazelcast는 주기적으로 백그라운드 작업을 통해 Cluster의 Split을 탐지합니다. Split이 탐지되면 우선 Merge를 시작 할 쪽을 결정합니다. 이 결정은 Cluster의 크기로 결정되는데요, Member의 수가 작은 Clueter가 큰 곳으로 합쳐집니다. Split이 감지되면 Merge 프로세스를 시작할 쪽이 결정됩니다. Member 수가 동일한 경우 Hashing 알고리즘이 병합을 시작할 Cluster 즉 Merging Side를 결정합니다. 이 Merging Side를 결정 할때 Member 리스트의 교집합이 없다는 것을 확인합니다.

Merging Side가 선택되면 Merge할 쪽 Cluster의 가장 오래된 Member가 Cluster의 다른 Member들에게 Merge 명령어를 전달하면서 Merge 프로세스를 시작합니다.

분할에서 복구를 하는동안, Hazelcast는 분할된 Cluster간 데이터 출동을 어떻게 해결할지 Merge Policy를 제공합니다. 하나의 Merge Policy는 존재하는 데이터와 Merging 데이터 사이에 충돌을 해결하기위한 Callback Function입니다. HazelCast는 구현 가능한 인터페이스 제공과 더불어 즉시 사용가능한 정책들을 제공합니다. Split-Brain Recovery를 제공하지 않는 데이터 구조는 Merging 과정에서 버려집니다.

Merging Cluster의 각 Member들은 다음과 같이 동작합니다.

  • 모든 네트워크 연결을 끊습니다. (자신의 Clsuter에서 연결해제(Detach))
  • Split-Brain Recovery를 지원하는 로컬 데이터 구조에 대한 Snapshot을 찍습니다.
  • 나머지 데이터 구조는 버립니다.
  • 새로운 Cluster에 Lite Member로써 참가합니다.
  • 새로운 Clsuter에 자신의 로컬 Snapshot을 가지고 Merge 작업을 보냅니다.

2. Merge Policy
Hazelcast는 다음 구현된 Merge Policy들을 제공합니다.

  • DiscardMergePolicy: 작은 Cluster의 Entry들이 버려집니다.
  • ExpirationTimeMergePolicy: 많은 유효기간을 가진 Entry가 이깁니다.
  • HigherHitsMergePolicy: Hit수가 더 많은 Entry가 이깁니다.
  • HyperLogLogMergePolicy: CardinalityEstimator를 위한 특별한 Policy를 사용하는데, 이 Policy는 기본적으로 HyperLogLog 를 사용하고, 두개의 Instance중 최대 등록 횟수를 유지합니다.
  • LatestAccessMergePolicy: 최근에 접근된 Entry가 이깁니다.
  • LatestUpdateMergePolicy: 최근 Update된 Entry가 이깁니다.
  • PassThroughMergePolicy: 더 작은 Cluster가 이깁니다.
  • PutIfAbsentMergePolicy: Cluster에 Entry가 존재하지 않은경우에 더 작은 Cluster의 Entry가 이깁니다.

3. Merge Policy 설정하기
Merge Policy는 MergePolicyConfig 구조체를 통해 설정할 수 있습니다. ICache 구조체의 경우는 유일한 예외인데, MergePolicyConfig 구조체가 아닌 직접 Policy를 지정해 줘야합니다. 아래 예제 코드를 보면 확인하 실 수 있습니다.

MergePolicyConfig mergePolicyConfig = new MergePolicyConfig()
                .setPolicy("DiscardMergePolicy")
                .setBatchSize(100);

MapConfig mapConfig = new MapConfig("default")
        .setMergePolicyConfig(mergePolicyConfig);

ListConfig listConfig = new ListConfig("default")
        .setMergePolicyConfig(mergePolicyConfig);

//CacheConfig는 MerPolicyConfig 사용하지 않음
CacheConfig mapConfig = new CacheConfig()
        .setName("default")
        .setMergePolicy("ExpirationTimeMergePolicy");
        
Config config = new Config()
        .addMapConfig(mapConfig)
        .addListConfig(listConfig);
        
HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(config);

공식 문서에서는 추가적으로 Merging을 지원하는 데이터 구조와 그렇지 않은 구조에서 설명하고, 또한 Custom Merge Policy를 구현하는 방법에 대해서 다루고 있습니다. 더 많은 정보를 알아보고 싶으시면 아래 링크를 보시기 바랍니다.

참고자료

https://docs.hazelcast.com/imdg/4.2/network-partitioning/split-brain-recovery#custom-merge-policies