Difference between r1.14 and the current
@@ -86,7 +86,7 @@
1. DFS에서 태블릿 읽기 실패시 대처
1. 무한 읽기 시도 -> DFS 부하 증가
1. 읽기 실패한 태블릿 삭제요청 -> 정보 손실
client는 b+ 트리를 이용해 row key 탐색을 할 수 있다.
== 마스터 SCAN ★★★★★ ==
1. 무한 읽기 시도 -> DFS 부하 증가
1. 읽기 실패한 태블릿 삭제요청 -> 정보 손실
== B+ 트리 갱신 ★★★★★ ==
== 메타 테이블 갱신 ★★★★★ ==
태블릿의 삽입(혹은 split)이 있을 때마다 마스터(또는 TS 스스로)가 b+ 트리를 갱신한다.client는 b+ 트리를 이용해 row key 탐색을 할 수 있다.
== 마스터 SCAN ★★★★★ ==
@@ -238,6 +238,8 @@
Locker나 태블릿 서버 접근은 클라이언트 API로 한다.
1. 속성
1. root tablet 주소 요청 (Locker)
1. 클라이언트 api 사용
1. 속성
1. root tablet 주소 캐싱
1. meta tablet 블럭 캐싱
1. 기능1. root tablet 주소 요청 (Locker)
1. 클라이언트 api 사용
@@ -252,12 +254,17 @@
1. root table 주소 얻기 (Locker)
1. 데이터 읽기요청 태블릿 서버)
1. 최초 접근시에만 b+ 트리 탐색
1. 최초 접근시에만 b+ 트리 탐색
태블릿 서버/마스터 정보 관리
데이터 저장보다는 빠른 응답과 안정성을 요구함.
1. 속성
1. 태블릿 서버 정보(ip, port)를 받아 파일로 저장
1. 마스터 지정
1. 데이터 읽기요청 태블릿 서버)
1. 최초 접근시에만 b+ 트리 탐색
1. 읽기시 row key 또는 key로 검색가능
1. 데이터 쓰기 요청 (태블릿 서버)1. 최초 접근시에만 b+ 트리 탐색
1. 쓰기시 key:value로만 쓰기 가능
== Locker ==태블릿 서버/마스터 정보 관리
데이터 저장보다는 빠른 응답과 안정성을 요구함.
1. 속성
1. 마스터 서버 주소 파일저장
1. 태블릿 서버 주소 파일저장
1. 루트 태블릿 주소 파일저장
1. 기능1. 태블릿 서버 정보(ip, port)를 받아 파일로 저장
1. 마스터 지정
@@ -266,3 +273,7 @@
1. 루트 태블릿 주소 가짐
1. 마스터 서버에게 받는다
== DFS ==
1. 마스터 서버에게 받는다
== DFS ==
key와 value가 실제 저장되는 분산 파일 시스템
1. 속성
1. 기능
1. 태블릿 서버에게 받은 SSTableID를 DFSFileName으로 변환한다.
Contents
- 1. 기능
- 2. 로드 밸런싱 ★★★★★
- 3. TS 복구 ★★★★★
- 4. 메타 테이블 갱신 ★★★★★
- 5. 마스터 SCAN ★★★★★
- 6. 클라이언트의 요청 ★★★★
- 7. 커밋로그에 쓰기 ★★★
- 8. TS 등록 ★★★
- 9. 마스터 등록 ★★★
- 10. SSTABLE Compaction ★★★
- 11. 태블릿 복구 ★★
- 12. 마스터 복구 ★★
- 13. 태블릿 Split ★★
- 14. 클라이언트 에러코드 ★★
- 15. heartbeat ★
- 16. 만기 ★
- 17. 태블릿 서버
- 18. 마스터 서버
- 19. 클라이언트
- 20. 클라이언트 API
- 21. Locker
- 22. DFS
- 구글의 분산 데이터베이스 Bigtable 분석하고 설계하기
- http://nforge.zeropage.org/projects/bigtablet
- 아 잘못만들었네
- 아 잘못만들었네
1. 기능 ¶
태블릿 할당 ★★★★★
마스터 SCAN ★★★★★
클라이언트의 요청 ★★★★
Tablet Server 등록 ★★★
Master Server 등록 ★★★
클라이언트 에러코드 ★★
SSTABLE Compaction ★★★
마스터 복구 ★★
태블릿 Split ★★
heartbeat ★
만기 ★
로드밸런싱/태블릿 서버 복구
B+ 트리 갱신 ★★★★★마스터 SCAN ★★★★★
클라이언트의 요청 ★★★★
read/write
커밋로그에 쓰기 ★★★Tablet Server 등록 ★★★
Master Server 등록 ★★★
클라이언트 에러코드 ★★
SSTABLE Compaction ★★★
minor compaction
major compaction
태블릿 복구 ★★major compaction
마스터 복구 ★★
태블릿 Split ★★
heartbeat ★
만기 ★
2.1. 기능명세 ¶
- 트리거
- 태블릿 개수, cpu rate, 메모리 사용량의 비율을 계산해서
- ISSUE : 평균+일정 수치를 이용한 계산식 필요
- 평균으로 트리거를 결정하지만 값이 일정 수치보다 작다면 로드 밸런싱은 일어나지 않는다.
- 평균으로 트리거를 결정하지만 값이 일정 수치보다 작다면 로드 밸런싱은 일어나지 않는다.
- 태블릿 개수, cpu rate, 메모리 사용량의 비율을 계산해서
- 마스터 역할
- 가장load가 큰 TS(source)와 가장load가 적은 TS(target)와의 차이가 일정수준 이상일때
- source 에게 target의 ip와 전달할 태블릿의 개수를 전달
- 가장load가 큰 TS(source)와 가장load가 적은 TS(target)와의 차이가 일정수준 이상일때
- TS 역할
- 소스 TS
- 해당 태블릿의 SSTABLE들을 minor compaction
- source는 target에게 정해진 갯수만큼의 태블릿을 리스트로 이름전달 ( 연속된 태블릿을 전달한다)
- 자신의 태블릿 리스트에서 전달한 태블릿들을 삭제
- target에게서 제대로 전달받았는지 확인
- 해당 태블릿의 SSTABLE들을 minor compaction
- 타겟 TS
- 전달받은 태블릿 리스트로 태블릿들을 읽어온다
- 소스 TS에게 성공 메세지 보냄
- 전달받은 태블릿 리스트로 태블릿들을 읽어온다
- 소스 TS
- 마스터에게 성공 메세지 전달(마스터 업데이트)
- 마스터에게 성공 메세지 전달(마스터 업데이트)
- 소스 TS
- 마스터 역할
- b+ 트리(메타태블릿) 갱신
- b+ 트리(메타태블릿) 갱신
- ISSUE
- 클러스터의 로드가 적어서 하나의 TS가 커버할 수 있는 정도도 로드 밸런싱이 필요한가?
- target이 제대로 전달받았는지 어떻게 알지?
- target이 직접 마스터에게 자신의 태블릿 리스트를 전달하고 마스터가 target의 이전 태블릿 리스트와 현재 태블릿 리스트를 비교해 밸런싱이 잘 되었는지 확인.
- target이 직접 마스터에게 자신의 태블릿 리스트를 전달하고 마스터가 target의 이전 태블릿 리스트와 현재 태블릿 리스트를 비교해 밸런싱이 잘 되었는지 확인.
- 더 나은 로드밸런싱 정책필요
- 로드밸런싱시 전송할 태블릿 개수 어떻게?
- 로드밸런싱시 전송할 태블릿 개수 어떻게?
- 클러스터의 로드가 적어서 하나의 TS가 커버할 수 있는 정도도 로드 밸런싱이 필요한가?
3.1. 기능명세 ¶
- 마스터
- 마스터는 주기적으로 TS들에게서 heartbeat를 받는다
- 마스터는 주기적으로 TS들의 태블릿 리스트를 스캔한다.
- 스캔한 태블릿 리스트들과 메타태블릿(루트태블릿이었나?)과 비교해 누락된 태블릿 리스트가 있는지 검사
- 누락된 태블릿 리스트가 있다면 해당 태블릿 리스트를 가지고 있는 TS가 만기된 것임.(<- 만기가 되지 않았다면?)
- 해당 태블릿 리스트를 다른 TS들에게 할당해야함.
- target들을 정한다. (어떤 기준으로? 몇개나?)
- traget들에게 직접 태블릿 리스트를 전달한다.
- 누락된 태블릿 리스트가 있다면 해당 태블릿 리스트를 가지고 있는 TS가 만기된 것임.(<- 만기가 되지 않았다면?)
- 스캔한 태블릿 리스트들과 메타태블릿(루트태블릿이었나?)과 비교해 누락된 태블릿 리스트가 있는지 검사
- 마스터는 주기적으로 TS들에게서 heartbeat를 받는다
- TS
- 읽기 성공시 마스터에게 성공 메세지 전달 (마스터 업데이트)
- 읽기 성공시 마스터에게 성공 메세지 전달 (마스터 업데이트)
- ISSUE
- 태블릿 분산시 어떤 정책을 쓸까?
- 평균?
- 개수?
- 평균?
- 태블릿 분산시 어떤 정책을 쓸까?
3.2. ISSUE ¶
- 메타데이터 태블릿 갱신 (B+ 트리 갱신)
- 갱신 : 마스터가
- 언제 : 마스터 업데이트 후
- 마스터 업데이트 : target이 태블릿 리스트를 전달받고 DFS에서 태블릿 읽기에 성공하면 source에게 성공 메세지 전달.
- source는 target에게 성공 메세지를 받으면 자신의 태블릿 리스트에서 전달한 태블릿들을 삭제한다.
- source는 마스터에게 성공 메세지를 보내 마스터를 업데이트한다.
- 마스터는 메타태블릿을 업데이트한다.
- 갱신 : 마스터가
- 로드 밸런싱 중간에 target이 다운된다면 : 마스터는 로드밸런싱을 위해 다른 target을 선택. 이후 TS 복구를 한다.
- 로드 밸런싱 중간에 source가 다운된다면? : TS 복구
- 소스TS는 전달할 태블릿을 어떻게 정할 것인가 : 태블릿 리스트에서 앞에서부터 연속되는 태블릿 N개
- DFS에서 태블릿 읽기 실패시 대처
- 무한 읽기 시도 -> DFS 부하 증가
- 읽기 실패한 태블릿 삭제요청 -> 정보 손실
- 무한 읽기 시도 -> DFS 부하 증가
4. 메타 테이블 갱신 ★★★★★ ¶
태블릿의 삽입(혹은 split)이 있을 때마다 마스터(또는 TS 스스로)가 b+ 트리를 갱신한다.
client는 b+ 트리를 이용해 row key 탐색을 할 수 있다.
client는 b+ 트리를 이용해 row key 탐색을 할 수 있다.
5. 마스터 SCAN ★★★★★ ¶
마스터의 스캔요청에 대한 응답. TS가 관리중인 모든 태블릿의 리스트를 마스터에게 전달한다.
- 마스터의 스캔요청
- TS가 자신이 관리하고 있는 태블릿의 리스트들을 전달한다.
6.1.1. read ¶
- 클라이언트 역할
- B+트리에서 원하는 row를 가지고 있는 TS를 탐색
- B+트리에서 원하는 row를 가지고 있는 TS를 탐색
- TS역할
- 클라이언트의 ROW의 읽기 요청이 들어온다 (ISSUE 6. 클라이언트는 어떤 형식으로 TS에게 ROW를 요청할 것인가)
- TS는 자신이 가진 태블릿들에서 요청받은 ROW를 검색
- 검색결과들을 merge한다.
- merge결과를 String의 리스트로 클라이언트에게 돌려준다
- 클라이언트의 ROW의 읽기 요청이 들어온다 (ISSUE 6. 클라이언트는 어떤 형식으로 TS에게 ROW를 요청할 것인가)
6.1.2. write ¶
- 클라이언트 역할
- (태블릿은 같은 ROW를 담고 있으므로 클라이언트는 트리탐색을 통해 TS를 할당받는다)
- (태블릿은 같은 ROW를 담고 있으므로 클라이언트는 트리탐색을 통해 TS를 할당받는다)
- TS 역할
- 클라이언트에게 요청받은 row는 먼저 커밋로그에 기록 후 memtable에 쓴다.
- 클라이언트에게 요청받은 row는 먼저 커밋로그에 기록 후 memtable에 쓴다.
7. 커밋로그에 쓰기 ★★★ ¶
쓰기(write) 연산시에만 기록됨
크기 제한(2GB) 필요
원형 자료구조를 사용해 공간의 재활용필요 -> 한바퀴 돌아서 공간이 없어지면 memtable들의 minor compaction이 필요하다.
그러나 compaction시에는 모든 수정작업이 중지되므로 로그는 적절히 커야한다.
크기 제한(2GB) 필요
원형 자료구조를 사용해 공간의 재활용필요 -> 한바퀴 돌아서 공간이 없어지면 memtable들의 minor compaction이 필요하다.
그러나 compaction시에는 모든 수정작업이 중지되므로 로그는 적절히 커야한다.
7.1.2. 말소 ¶
- memtable이 copaction으로 sstable이 되면 해당 sstable의 로그는 삭제되어야 한다.
- 로그의 삭제도 쓰기연산
- 플래그를 이용해 삭제됨을 명시
- 플래그를 이용해 삭제됨을 명시
8.1. 기능명세 ¶
- Locker에 자신의 정보를 등록한다
- 자신의 ip
- port
- 그 외의 시스템 전체가 공유해야 하는 정보는?
- 자신의 ip
- Locker는 해당 ip와 port#로 파일을 생성하며 해당 TS에게만 수정권한을 준다.
9. 마스터 등록 ★★★ ¶
마스터 서버는 클러스터 내에 하나만 존재한다.
시작시 Locker에 등록을 하고 Locker는 이미 등록된 마스터가 있는지 검사 후 허가/거절 메세지 전달.
거절 메세지를 받은 마스터는 exit();
시작시 Locker에 등록을 하고 Locker는 이미 등록된 마스터가 있는지 검사 후 허가/거절 메세지 전달.
거절 메세지를 받은 마스터는 exit();
10.1. Minor Compaction ¶
memtable에 더이상 쓰기 연산을 수행할 수 없을 때 SSTABLE로 변환. 파일형태로 DFS에 쓴다.
- 트리거
- memtable에게 할당된 메모리를 다 사용해서 더 이상 쓰기를 할 수 없을 때
- 커밋로그에게 할당된 용량을 다 사용해서 더 이상 쓰기를 할 수 없을 때
- memtable에게 할당된 메모리를 다 사용해서 더 이상 쓰기를 할 수 없을 때
10.2. Major Compaction ¶
SSTABLE들을 합병하여 최근 기록만을 남긴다.
client의 읽기 요청 응답시에 효율이 좋음
client의 읽기 요청 응답시에 효율이 좋음
- ISSUE
- SSTABLE 합병 시기?
- major compaction을 하면 SSTABLE이 항상 1개가되나?
- SSTABLE 합병 시기?
12.1. 기능명세 ¶
- 마스터가 다운되었음을 감지하는 즉시 ?는 새로운 마스터를 결정한다.
- ISSUE
- 마스터의 다운을 어떻게 감지하지?
- 누가 새로운 마스터를 결정하지?
- 마스터의 다운을 어떻게 감지하지?
- ISSUE
- 새로운 마스터의 시작을 알린다
- ISSUE : 누가 마스터를 알리지?
- 마스터가? TS가?
- 마스터가? TS가?
- ISSUE : 누가 마스터를 알리지?
- 마스터는 Locker에서 TS리스트를 읽어온다.
- 마스터는 Locker에서 루트태블릿의 정보를 읽어온다.
- 마스터는 TS들에게서 태블릿 리스트를 스캔한다.
13.1. 기능명세 ¶
- 태블릿의 크기가 200MB를 넘으면 major compaction
- 태블릿 split시 키는 반드시 sort되어 있어야 한다.
- 태블릿 split시 키는 반드시 sort되어 있어야 한다.
- 후 split한다
- SSTABLE은 논리적으로 분할된다
- 여러 태블릿이 하나의 SSTABLE을 참조할 수 있다.
- ISSUE
- 하나의 sstable을 여러 태블릿이 공유할 수 있게 한다.
- merge compaction등으로 두개의 sstable만들면 sstable의 복수참조를 막을 수 있다.
- 하나의 sstable을 여러 태블릿이 공유할 수 있게 한다.
- 여러 태블릿이 하나의 SSTABLE을 참조할 수 있다.
15. heartbeat ★ ¶
TS가 마스터(또는 Locker)에 일정 간격마다 지속적으로 전송하는 더미 패킷.
TS가 활성화중임을 알린다.
TS가 활성화중임을 알린다.
- ISSUE
- heartbeat에 응답을 해야하나?
- 장 : 마스터 실패를 TS가 감지할 수 있다.
- 단 : 마스터의 부하 증가
- 장 : 마스터 실패를 TS가 감지할 수 있다.
- heartbeat에 응답을 해야하나?
17. 태블릿 서버 ¶
태블릿을 관리하는 서버
- 속성
- 태블릿
- 커밋로그
- 태블릿
- 기능
- 자신의 정보 등록 (Locker)
- 태블릿 스캔 (마스터)
- heartbeat 보내기 (마스터)
- 태블릿 분할 (태블릿)
- 태블릿 합병 (태블릿)
- 태블릿에서 데이터 읽기 (클라이언트)
- 태블릿에 데이터 쓰기 (클라이언트)
- 태블릿 리스트 전달하기(태블릿 서버)
- 태블릿 리스트 받기 (태블릿 서버)
- 커밋로그에 쓰기 (DFS)
- 자신의 정보 등록 (Locker)
18. 마스터 서버 ¶
클러스터 관리 서버
- 속성
- 태블릿 서버 정보/timeout 리스트
- 태블릿 ID 리스트
- 태블릿 서버 정보/timeout 리스트
- 기능
- 자신의 정보(ip, port) 등록 (Locker)
- 태블릿 서버 신규(또는 실패) 감지 (Locker)
- 태블릿 스캔 (태블릿 서버)
- hearbeat 체크, 타임아웃 초기화 (태블릿 서버)
- 로드밸런싱 (태블릿 서버)
- 자신의 정보(ip, port) 등록 (Locker)
19. 클라이언트 ¶
데이터 읽기/쓰기의 주체
Locker나 태블릿 서버 접근은 클라이언트 API로 한다.
Locker나 태블릿 서버 접근은 클라이언트 API로 한다.
- 속성
- root tablet 주소 캐싱
- meta tablet 블럭 캐싱
- root tablet 주소 캐싱
- 기능
- root tablet 주소 요청 (Locker)
- 클라이언트 api 사용
- 클라이언트 api 사용
- 데이터 읽기 요청 (태블릿 서버)
- 클라이언트 api 사용
- 클라이언트 api 사용
- 데이터 쓰기 요청 (태블릿 서버)
- 클라이언트 api 사용
- 클라이언트 api 사용
- root tablet 주소 요청 (Locker)
20. 클라이언트 API ¶
태블릿 서버용 api
클라이언트는 빅테이블의 내부 구조를 알지 못해야 한다.
클라이언트는 빅테이블의 내부 구조를 알지 못해야 한다.
- 기능
- root table 주소 얻기 (Locker)
- 데이터 읽기요청 태블릿 서버)
- 최초 접근시에만 b+ 트리 탐색
- 읽기시 row key 또는 key로 검색가능
- 최초 접근시에만 b+ 트리 탐색
- 데이터 쓰기 요청 (태블릿 서버)
- 최초 접근시에만 b+ 트리 탐색
- 쓰기시 key:value로만 쓰기 가능
- 최초 접근시에만 b+ 트리 탐색
- root table 주소 얻기 (Locker)