HDFS 업그레이드 도메인
HDFS 업그레이드 도메인 (Upgrade Domain)
데이터노드 롤링 업그레이드를 효율적으로 수행하기 위한 업그레이드 도메인(upgrade domain) 개념을 설명하는 문서예요. 새 블록 배치 정책으로 데이터노드를 업그레이드 도메인 단위로 묶어, 가용성에 영향을 주지 않으면서 많은 머신을 동시에 업그레이드할 수 있게 해 줍니다.
출처: 문서
본문
소개 (Introduction)
현재 기본 HDFS 블록 배치 정책은 블록의 3개 복제본이 최소 2개 랙에 배치되도록 보장합니다. 구체적으로 쓰기 파이프라인 동안 복제본 하나는 한 랙에, 나머지 두 복제본은 다른 랙에 배치돼요. 이는 랙 다양성과 쓰기 파이프라인 효율 사이의 좋은 타협입니다. 다만 이후의 로드 밸런싱이나 머신 멤버십 변경으로 블록의 3개 복제본이 3개의 서로 다른 랙에 분산될 수 있습니다. 따라서 서로 다른 랙의 어떤 3개 데이터노드라도 블록의 3개 복제본을 저장할 수 있어요.
그런데 기본 배치 정책은 데이터노드 롤링 업그레이드를 어떻게 수행해야 하는지에 영향을 줍니다. HDFS 롤링 업그레이드 문서는 무중단으로 데이터노드를 롤링 업그레이드하는 방법을 설명해요. 서로 다른 랙의 어떤 3개 데이터노드라도 블록의 모든 복제본을 저장할 수 있으므로, 데이터 가용성과 읽기/쓰기 연산에 미치는 영향을 최소화하려면 데이터노드를 한 번에 하나씩 순차 재시작하는 것이 중요합니다. 한 번에 한 랙씩 업그레이드하는 것도 한 옵션이지만, 업그레이드 중 다른 랙의 머신이 고장 나면 데이터를 사용할 수 없게 될 가능성이 높아져요.
이런 순차 데이터노드 롤링 업그레이드 전략의 부작용은 클러스터가 클수록 업그레이드 시간이 길어진다는 것입니다.
아키텍처 (Architecture)
롤링 업그레이드에 대한 블록 배치 정책의 한계를 해결하기 위해, 새 블록 배치 정책을 통해 HDFS에 업그레이드 도메인 개념이 추가됐어요. 아이디어는 기존 랙 기반 그룹화에 더해 업그레이드 도메인이라는 새 차원으로 데이터노드를 그룹화하는 것입니다. 예를 들어 어떤 랙의 첫 번째 위치 데이터노드들을 업그레이드 도메인 ud_01에, 두 번째 위치 노드들을 ud_02에 할당할 수 있습니다.
네임노드는 기본 블록 배치 정책 외에 사용자 정의 블록 배치를 지원하는 BlockPlacementPolicy 인터페이스를 제공해요. 이 인터페이스에 기반한 새 업그레이드 도메인 블록 배치 정책이 HDFS에 있습니다. 이 정책은 어떤 블록의 복제본이라도 서로 다른 업그레이드 도메인의 머신들에 분산되도록 보장합니다. 기본적으로 어떤 블록의 3개 복제본은 3개의 서로 다른 업그레이드 도메인에 배치됩니다. 즉 특정 업그레이드 도메인에 속한 모든 데이터노드는 어떤 블록의 복제본도 하나 이상 저장하지 않아요.
업그레이드 도메인 블록 배치 정책을 적용하면 한 업그레이드 도메인에 속한 모든 데이터노드를 동시에 업그레이드해도 데이터 가용성에 영향을 주지 않습니다. 한 업그레이드 도메인을 끝내고 다음 업그레이드 도메인으로 옮겨 모든 업그레이드 도메인이 업그레이드될 때까지 반복해요. 이 절차는 어떤 블록의 두 복제본도 동시에 업그레이드되지 않도록 보장합니다. 즉 대규모 클러스터에서 많은 머신을 동시에 업그레이드할 수 있습니다. 클러스터가 계속 확장되면 새 머신이 기존 업그레이드 도메인에 추가되며 업그레이드 병렬성을 해치지 않아요.
기본 블록 배치 정책을 쓰는 기존 클러스터에서 새 업그레이드 도메인 정책으로 전환하면, 새로 만든 블록은 새 정책을 따릅니다. 옛 정책으로 할당된 옛 블록은 새 정책으로 마이그레이션해야 해요. 사용할 수 있는 마이그레이션 도구가 있습니다. 자세한 내용은 HDFS-8789를 참고하세요.
설정 (Settings)
클러스터에서 업그레이드 도메인을 활성화하려면 다음 단계를 따르세요.
- 데이터노드를 개별 업그레이드 도메인 그룹에 할당합니다.
- 업그레이드 도메인 블록 배치 정책을 활성화합니다.
- 기존 블록 배치 정책으로 할당된 블록을 새 업그레이드 도메인 정책으로 마이그레이션합니다.
업그레이드 도메인 id 할당
데이터노드가 어떻게 업그레이드 도메인 id에 매핑되는지는 관리자가 정의하며 클러스터 레이아웃에 따라 다릅니다. 흔한 방법은 머신의 랙 위치를 업그레이드 도메인 id로 사용하는 것입니다.
호스트명에서 업그레이드 도메인 id로의 매핑을 구성하려면 hdfs-default.xml에 설명된 대로 다음 속성을 설정하여 json 기반 호스트 설정 파일을 사용해야 해요.
| 설정 | 값 |
|---|---|
dfs.namenode.hosts.provider.classname |
org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager |
dfs.hosts |
json hosts 파일의 경로 |
json hosts 파일은 모든 호스트의 속성을 정의합니다. 다음 예시에는 2개 랙에 4개 데이터노드가 있고, 랙 위치 01의 머신은 업그레이드 도메인 01, 랙 위치 02의 머신은 업그레이드 도메인 02에 속합니다.
[
{
"hostName": "dcArackA01",
"upgradeDomain": "01"
},
{
"hostName": "dcArackA02",
"upgradeDomain": "02"
},
{
"hostName": "dcArackB01",
"upgradeDomain": "01"
},
{
"hostName": "dcArackB02",
"upgradeDomain": "02"
}
]
업그레이드 도메인 블록 배치 정책 활성화
각 데이터노드에 업그레이드 도메인 id가 할당된 다음, hdfs-default.xml에 설명된 대로 다음 구성으로 업그레이드 도메인 블록 배치 정책을 활성화합니다.
| 설정 | 값 |
|---|---|
dfs.block.replicator.classname |
org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithUpgradeDomain |
네임노드를 재시작하면 새 정책이 모든 새 블록 할당에 사용됩니다.
마이그레이션 (Migration)
기존 클러스터의 블록 배치 정책을 바꾸면, 정책 변경 전에 할당된 블록이 새 블록 배치 정책을 따르도록 해야 해요.
HDFS-8789는 클라이언트 측 마이그레이션 도구의 초안 패치를 제공합니다. 도구가 커밋되면 도구 사용법을 설명할 수 있을 거예요.
업그레이드 도메인 기반 롤링 재시작 (Rolling restart)
클러스터 관리 중 새 구성, 새 hadoop 릴리스나 JVM 버전을 반영하도록 데이터노드를 재시작해야 할 수 있습니다. 업그레이드 도메인이 활성화되고 클러스터의 모든 블록이 새 정책을 따르면, 데이터노드를 배치 단위로 한 번에 한 업그레이드 도메인씩 재시작할 수 있어요. 수동이든 자동화든 단계는 다음과 같습니다.
- dfsadmin 또는 JMX의 데이터노드 정보를 기반으로 데이터노드를 업그레이드 도메인별로 그룹화합니다.
- 각 업그레이드 도메인에 대해
- (선택) 그 업그레이드 도메인의 모든 노드를 유지보수 상태로 둡니다(HdfsDataNodeAdminGuide.html 참고).
- 그 모든 노드를 재시작합니다.
- 재시작 후 모든 데이터노드가 정상인지 확인합니다. 비정상 노드는 decommission해야 합니다.
- (선택) 그 모든 노드를 유지보수 상태에서 빼냅니다.
메트릭 (Metrics)
업그레이드 도메인은 네임노드의 JMX에 포함됩니다. HDFSCommands.html에서 설명하는 것처럼 다음 명령으로도 업그레이드 도메인을 확인할 수 있어요.
클러스터 단위 업그레이드 도메인은 dfsadmin으로 확인합니다.
hdfs dfsadmin -report
특정 경로의 데이터를 저장하는 데이터노드의 업그레이드 도메인은 fsck로 확인합니다.
hdfs fsck <path> -files -blocks -upgradedomains
더 알아보기 (Learn more)
- 원문: 문서