네임노드HA를 공부하고 이해가 잘 안가서 각각 가설을 세우고 테스트를 진행해보았다.
내가 궁금했던 점은 이렇게 5가지였다. 아직 테스트 전인 것도 있어서 차차 해보고 업뎃할 예정이다.
- datanode에서 data가 언제 업데이트/동기화 되는 지
- 665M에서 4G로 언제?
- 주키퍼의 역할
- 주키퍼가 namenode ha에서 하는 역할이란: 어디가 액티브인지 어디가 스탠바이인지 알려준다
- 주키퍼
- 주키퍼가 안돌아가도 hdfs에 접근 가능?
- 주키퍼가 전부
- namenode 상태 바뀌면 복구는 어떻게 함?
- 꼭 얀이 돌아가야 쓰기 읽기 가능?
- 얀은 프로그램이 돌아가지 않는 한, 크게 쓸모 없음
- 블록으로 쪼개지고 입력하는건 그냥 HDFS의 능력
- HDFS랑 얀은 독립적인 컴포넌트
- 맵리듀스는 그냥 하둡이란 환경에서 쓰기 좋은 애플리케이션
- 파일질라로 그냥 리눅스 서버 한개에 파일 올리는 시간 VS 로컬에서 hdfs로 파일 올리는 시간
주키퍼
환경 : nn1-active / nn2-standby (그냥 이전 스냅샷1로 돌림(n2는 스냅샷2))
가설1 : 주키퍼는 nn가 시작될 때 다른 datanode들에게 hdfs 데이터를 동기화해준다
환경1: 주키퍼를 켜지 않고 하둡을 실행해서, 실행전과 후의 data 디렉토리의 용량을 확인해본다.
1-1: 하둡 켜기 전
data 디렉토리의 사용 용량(참고로 얀은 모두 0이었음 순수 dfs파일 크기임)
nn1
518M data
nn2
648M data
n3
236M data/
n4
353M data/
1-2: 모든 서버를 켜고 하둡 실행 -> node04를 제외하고 data 크기 커짐 +2M
결론1: 주키퍼가 안켜져 있어도 hdfs가 업데이트 됨
가설2 : 주키퍼가 3대 이상 켜져 있어야만 hdfs에 접근 할 수 있다.
환경1 : 주키퍼를 2개만 켜고 n4로 3556065504 B 크기 파일 hdfs에 put -> 업뎃됨
nn1
2.8G data
nn2
2.8G data/
n3
2.6G data/
n4
3.7G data/
환경2 : 주키퍼 1개(jvm은 돌아가지만 not running 상태로 뜸-> 사실상 주키퍼가 다 안돌아간다고 봐야함)를 킨 상태에서 이전에 입력한 거 삭제한다 -> 업뎃됨
nn1
521M data
nn2
650M data/
n3
238M data/
n4
353M data/
환경3 : 주키퍼 아예 running x 되지 않는 상태에서 n4로 3556065504 B 크기 파일 hdfs에 put -> 업뎃됨
nn1
2.5G data
nn2
3.5G data/
n3
2.2G data/
n4
3.7G data
결론2
- 주키퍼 작동 유무는 잘 작동하고 있는(active namenode가 있고 datanode가 장애가 없는) hdfs에는 영향을 끼치지 않는다.
- 주키퍼는 2대 이상은 작동되어야 running된다.
- 네임노드가 가동될 때 data가 업데이트 되므로 동기화는 namenode 몫이다.
가설3 : 주키퍼는 꼭 3대여야 active 네임노드와 standby 네임노드를 구분해서 active nn가 장애가 났을 경우 교체해준다- active nn - nn1 / standby nn - nn2
상황1: 주키퍼 3대일 때 active 네임노드와 stanby nn 바꾸기 -> nn1의 namenode를 kill 해줌
- nn2가 active로 바뀌고 nn1은 접속 불가
- 다시 nn1에 namenode키니까 standby로 바뀌었음
- nn2(active)의 네임노드를 kill했는데 아직 nn1이가 standby임 -> 이론상으로는 다시 nn1이 active 되어야 하지 않을까?
- nn1 과 nn2를 다시 시작해도 계속 standby
- 전부 다시시작함 -> nn2가 active됨(주키퍼가 마지막으로 기억한게 얘인가?) -> 강제로 failover날려줌 (hdfs haadmin -failover nn2 nn1)
- HDFS 파일 접근이 안됨
- 알아본 결과, 하둡은 처음 네임노드가 시작되면 standby임 그리고 그 다음에 결정난다고 함. 근데 나는 설치 방법이 그렇지 않았는걸?
상황2: 주키퍼가 2대일 때 active nn 와 standby nn 바꾸기
- nn2가 active됨
- 다시 nn2를 중단하고 nn1을 실행 nn1는 스탠바이
- nn2의 네임노드를 시작해줬더니 nn1이 액티브, nn2가 스탠바이로 바뀜 자동 failover
- 다시 하둡을 켜도 결과는 같음
상황3: 주키퍼가 1대일 때 active nn 와 standby nn 바꾸기
- 주키퍼 한대만 돌아감
- 근데 에러 떨어짐
- 하둡을 켰는데 두 네임노드의 상태가 둘다 standby -> 실패함
상황4: 주키퍼가 안돌아갈때 active nn 와 standby nn 바꾸기
- 주키퍼 다 지움
- 노드 두개가 아예 스탠바이 진행이 안됨
- 주키퍼 두개를 켜고 다시 시작하니 됨
1,2 -> nn1 active nn2 standby
2,3 -> nn1 standby nn2 active
결론: 주키퍼는 1대만으로는 안돌아가고 각각 주키퍼마다 갖고 있는 정보가 있는데 그 정보가 다름
주키퍼 시작->네임노드 시작 -> zkfc 시작 -> 데이터노드 시작 -> 얀 시작 될때,
zkfc가 보내주는 정보로 네임노드의 정보를 업뎃 그래서 주키퍼는 메모리영역에서 돌아감
실제로 주키퍼에서 액티브네임노드에 락(ActiveStandbyElectorLock)을 걸어주는데 액티브 네임노드를 꺼버리니까 사라짐
댓글
댓글 쓰기