[[TableOfContents]] [[pagelist(^Bigtable/)]] * êµ¬ê¸€ì˜ ë¶„ì‚° ë°ì´í„°ë² ì´ìФ Bigtable ë¶„ì„í•˜ê³ ì„¤ê³„í•˜ê¸° * http://nforge.zeropage.org/projects/bigtablet * ì•„ 잘못만들었네 == 기능 == 태블릿 í• ë‹¹ ★★★★★ B+ 트리 ê°±ì‹ â˜…â˜…â˜…â˜…â˜… 마스터 SCAN ★★★★★ í´ë¼ì´ì–¸íŠ¸ì˜ ìš”ì² â˜…â˜…â˜…â˜… ì»¤ë°‹ë¡œê·¸ì— ì“°ê¸° ★★★ TS ë“±ë¡ â˜…â˜…â˜… í´ë¼ì´ì–¸íЏ ì—러코드 ★★ SSTABLE Compaction ★★★ 태블릿 복구 ★★ 마스터 복구 ★★ 태블릿 Split ★★ heartbeat ★ 만기 ★ == 로드 밸런싱 ★★★★★ == 가장 loadê°€ ì ì€ TSì—게 가장 loadê°€ ë§Žì€ TSì˜ íƒœë¸”ë¦¿ì„ í• ë‹¹. TS와 TSê°„ì˜ íƒœë¸”ë¦¿ í• ë‹¹ ì‹ ê·œ TSì— íƒœë¸”ë¦¿ í• ë‹¹í•˜ê¸°ë„ ê°™ìŒ. === 기능명세 === 1. 트리거 1. 태블릿 개수, cpu rate, 메모리 ì‚¬ìš©ëŸ‰ì˜ ë¹„ìœ¨ì„ ê³„ì‚°í•´ì„œ 1. ISSUE : í‰ê· +ì¼ì • 수치를 ì´ìš©í•œ ê³„ì‚°ì‹ í•„ìš” 1. í‰ê· 으로 트리거를 ê²°ì •í•˜ì§€ë§Œ ê°’ì´ ì¼ì • 수치보다 작다면 로드 ë°¸ëŸ°ì‹±ì€ ì¼ì–´ë‚˜ì§€ 않는다. * 마스터 ì—í• 1. 가장loadê°€ í° TS(source)와 가장loadê°€ ì ì€ TS(target)ì™€ì˜ ì°¨ì´ê°€ ì¼ì •수준 ì´ìƒì¼ë•Œ 1. source ì—게 targetì˜ ip와 ì „ë‹¬í• íƒœë¸”ë¦¿ì˜ ê°œìˆ˜ë¥¼ ì „ë‹¬ * TS ì—í• 1. 소스 TS 1. 해당 íƒœë¸”ë¦¿ì˜ SSTABLEë“¤ì„ minor compaction 1. source는 targetì—게 ì •í•´ì§„ 갯수만í¼ì˜ íƒœë¸”ë¦¿ì„ ë¦¬ìŠ¤íŠ¸ë¡œ ì´ë¦„ì „ë‹¬ ( ì—°ì†ëœ íƒœë¸”ë¦¿ì„ ì „ë‹¬í•œë‹¤) 1. ìžì‹ ì˜ íƒœë¸”ë¦¿ 리스트ì—서 ì „ë‹¬í•œ íƒœë¸”ë¦¿ë“¤ì„ ì‚ì œ 1. targetì—게서 ì œëŒ€ë¡œ ì „ë‹¬ë°›ì•˜ëŠ”ì§€ í™•ì¸ 1. 타겟 TS 1. ì „ë‹¬ë°›ì€ íƒœë¸”ë¦¿ 리스트로 íƒœë¸”ë¦¿ë“¤ì„ ì½ì–´ì˜¨ë‹¤ 1. 소스 TSì—게 성공 메세지 보냄 1. 소스 TS 1. 마스터ì—게 성공 메세지 ì „ë‹¬(마스터 ì—…ë°ì´íЏ) * 마스터 ì—í• 1. b+ 트리(메타태블릿) ê°±ì‹ * ISSUE 1. í´ëŸ¬ìŠ¤í„°ì˜ ë¡œë“œê°€ ì 어서 í•˜ë‚˜ì˜ TSê°€ ì»¤ë²„í• ìˆ˜ 있는 ì •ë„ë„ ë¡œë“œ ë°¸ëŸ°ì‹±ì´ í•„ìš”í•œê°€? 1. targetì´ ì œëŒ€ë¡œ ì „ë‹¬ë°›ì•˜ëŠ”ì§€ 어떻게 알지? 1. targetì´ ì§ì ‘ 마스터ì—게 ìžì‹ ì˜ íƒœë¸”ë¦¿ 리스트를 ì „ë‹¬í•˜ê³ ë§ˆìŠ¤í„°ê°€ targetì˜ ì´ì „ 태블릿 리스트와 현재 태블릿 리스트를 비êµí•´ ë°¸ëŸ°ì‹±ì´ ìž˜ ë˜ì—ˆëŠ”ì§€ 확ì¸. 1. ë” ë‚˜ì€ ë¡œë“œë°¸ëŸ°ì‹± ì •ì±…í•„ìš” 1. 로드밸런싱시 ì „ì†¡í• íƒœë¸”ë¦¿ 개수 어떻게? == TS 복구 ★★★★★ == TSê°€ 다운ë˜ë©´ 해당 TSê°€ ê°€ì§€ê³ ìžˆë˜ íƒœë¸”ë¦¿ë“¤ì„ ë‹¤ë¥¸ TSì— ë¶„ì‚°í•´ 나누어준다. 마스터와 TS사ì´ì˜ 태블릿 í• ë‹¹ === 기능명세 === * 마스터 1. 마스터는 주기ì 으로 TS들ì—게서 heartbeat를 받는다 1. 마스터는 주기ì 으로 TSë“¤ì˜ íƒœë¸”ë¦¿ 리스트를 스캔한다. 1. 스캔한 태블릿 리스트들과 메타태블릿(루트태블릿ì´ì—ˆë‚˜?)ê³¼ 비êµí•´ 누ë½ëœ 태블릿 리스트가 있는지 검사 1. 누ë½ëœ 태블릿 리스트가 있다면 해당 태블릿 리스트를 ê°€ì§€ê³ ìžˆëŠ” TSê°€ ë§Œê¸°ëœ ê²ƒìž„.(<- 만기가 ë˜ì§€ 않았다면?) 1. 해당 태블릿 리스트를 다른 TS들ì—게 í• ë‹¹í•´ì•¼í•¨. 1. targetë“¤ì„ ì •í•œë‹¤. (ì–´ë–¤ 기준으로? 몇개나?) 1. traget들ì—게 ì§ì ‘ 태블릿 리스트를 ì „ë‹¬í•œë‹¤. * TS 1. ì½ê¸° 성공시 마스터ì—게 성공 메세지 ì „ë‹¬ (마스터 ì—…ë°ì´íЏ) * ISSUE 1. 태블릿 분산시 ì–´ë–¤ ì •ì±…ì„ ì“¸ê¹Œ? 1. í‰ê· ? 1. 개수? === ISSUE === * 메타ë°ì´í„° 태블릿 ê°±ì‹ (B+ 트리 ê°±ì‹ ) 1. ê°±ì‹ : 마스터가 1. ì–¸ì œ : 마스터 ì—…ë°ì´íЏ 후 1. 마스터 ì—…ë°ì´íЏ : targetì´ íƒœë¸”ë¦¿ 리스트를 ì „ë‹¬ë°›ê³ DFSì—서 태블릿 ì½ê¸°ì— 성공하면 sourceì—게 성공 메세지 ì „ë‹¬. 1. source는 targetì—게 성공 메세지를 받으면 ìžì‹ ì˜ íƒœë¸”ë¦¿ 리스트ì—서 ì „ë‹¬í•œ íƒœë¸”ë¦¿ë“¤ì„ ì‚ì œí•œë‹¤. 1. source는 마스터ì—게 성공 메세지를 ë³´ë‚´ 마스터를 ì—…ë°ì´íŠ¸í•œë‹¤. 1. 마스터는 ë©”íƒ€íƒœë¸”ë¦¿ì„ ì—…ë°ì´íŠ¸í•œë‹¤. 1. 로드 밸런싱 ì¤‘ê°„ì— targetì´ ë‹¤ìš´ëœë‹¤ë©´ : 마스터는 ë¡œë“œë°¸ëŸ°ì‹±ì„ ìœ„í•´ 다른 targetì„ ì„ íƒ. ì´í›„ TS 복구를 한다. 1. 로드 밸런싱 ì¤‘ê°„ì— sourceê°€ 다운ëœë‹¤ë©´? : TS 복구 1. 소스TS는 ì „ë‹¬í• íƒœë¸”ë¦¿ì„ ì–´ë–»ê²Œ ì •í• ê²ƒì¸ê°€ : 태블릿 리스트ì—서 앞ì—서부터 ì—°ì†ë˜ëŠ” 태블릿 Nê°œ 1. DFSì—서 태블릿 ì½ê¸° 실패시 대처 1. 무한 ì½ê¸° ì‹œë„ -> DFS 부하 ì¦ê°€ 1. ì½ê¸° 실패한 태블릿 ì‚ì œìš”ì² -> ì •ë³´ ì†ì‹¤ == B+ 트리 ê°±ì‹ â˜…â˜…â˜…â˜…â˜… == íƒœë¸”ë¦¿ì˜ ì‚½ìž…(í˜¹ì€ split)ì´ ìžˆì„ ë•Œë§ˆë‹¤ 마스터(ë˜ëŠ” TS 스스로)ê°€ b+ 트리를 ê°±ì‹ í•œë‹¤. client는 b+ 트리를 ì´ìš©í•´ row key íƒìƒ‰ì„ í• ìˆ˜ 있다. == 마스터 SCAN ★★★★★ == ë§ˆìŠ¤í„°ì˜ ìŠ¤ìº”ìš”ì²ì— 대한 ì‘답. TSê°€ ê´€ë¦¬ì¤‘ì¸ ëª¨ë“ íƒœë¸”ë¦¿ì˜ ë¦¬ìŠ¤íŠ¸ë¥¼ 마스터ì—게 ì „ë‹¬í•œë‹¤. 1. ë§ˆìŠ¤í„°ì˜ ìŠ¤ìº”ìš”ì² 1. TSê°€ ìžì‹ ì´ ê´€ë¦¬í•˜ê³ ìžˆëŠ” íƒœë¸”ë¦¿ì˜ ë¦¬ìŠ¤íŠ¸ë“¤ì„ ì „ë‹¬í•œë‹¤. === 기능명세 === == í´ë¼ì´ì–¸íŠ¸ì˜ ìš”ì² â˜…â˜…â˜…â˜… == * ìºì‹± í•„ìš” === 기능명세 === ==== read ==== * í´ë¼ì´ì–¸íЏ ì—í• 1. B+트리ì—서 ì›í•˜ëŠ” row를 ê°€ì§€ê³ ìžˆëŠ” TS를 íƒìƒ‰ * TSì—í• 1. í´ë¼ì´ì–¸íŠ¸ì˜ ROWì˜ ì½ê¸° ìš”ì²ì´ 들어온다 (ISSUE 6. í´ë¼ì´ì–¸íŠ¸ëŠ” ì–´ë–¤ 형ì‹ìœ¼ë¡œ TSì—게 ROW를 ìš”ì²í• 것ì¸ê°€) 1. TS는 ìžì‹ ì´ ê°€ì§„ 태블릿들ì—서 ìš”ì²ë°›ì€ ROW를 검색 1. ê²€ìƒ‰ê²°ê³¼ë“¤ì„ '''merge'''한다. 1. merge결과를 Stringì˜ ë¦¬ìŠ¤íŠ¸ë¡œ í´ë¼ì´ì–¸íЏì—게 ëŒë ¤ì¤€ë‹¤ ==== write ==== * í´ë¼ì´ì–¸íЏ ì—í• 1. (íƒœë¸”ë¦¿ì€ ê°™ì€ ROW를 ë‹´ê³ ìžˆìœ¼ë¯€ë¡œ í´ë¼ì´ì–¸íŠ¸ëŠ” 트리íƒìƒ‰ì„ 통해 TS를 í• ë‹¹ë°›ëŠ”ë‹¤) * TS ì—í• 1. í´ë¼ì´ì–¸íЏì—게 ìš”ì²ë°›ì€ row는 ë¨¼ì € ì»¤ë°‹ë¡œê·¸ì— ê¸°ë¡ í›„ memtableì— ì“´ë‹¤. == ì»¤ë°‹ë¡œê·¸ì— ì“°ê¸° ★★★ == 쓰기(write) 연산시ì—ë§Œ 기ë¡ë¨ í¬ê¸° ì œí•œ(2GB) í•„ìš” ì›í˜• ìžë£Œêµ¬ì¡°ë¥¼ 사용해 ê³µê°„ì˜ ìž¬í™œìš©í•„ìš” -> 한바퀴 ëŒì•„서 ê³µê°„ì´ ì—†ì–´ì§€ë©´ memtableë“¤ì˜ minor compactionì´ í•„ìš”í•˜ë‹¤. 그러나 compaction시ì—는 ëª¨ë“ ìˆ˜ì •ìž‘ì—…ì´ ì¤‘ì§€ë˜ë¯€ë¡œ 로그는 ì ì ˆížˆ 커야한다. === 기능명세 === ==== ê¸°ë¡ ==== 1. memtableì— ì“°ê¸°ë¥¼ 하기 ì „ 1. ì»¤ë°‹ë¡œê·¸ì— sstable명과 ì“°ë ¤ëŠ” ê°’ ê¸°ë¡ ==== ë§ì†Œ ==== 1. memtableì´ copaction으로 sstableì´ ë˜ë©´ 해당 sstableì˜ ë¡œê·¸ëŠ” ì‚ì œë˜ì–´ì•¼ 한다. 1. ë¡œê·¸ì˜ ì‚ì œë„ ì“°ê¸°ì—°ì‚° 1. 플래그를 ì´ìš©í•´ ì‚ì œë¨ì„ 명시 === 비기능 명세 === 1. 커밋로그는 DFSì— ìžˆë‹¤. 1. TS당 한개. == TS ë“±ë¡ â˜…â˜…â˜… == ì‹ ê·œ TS는 Lockerì— ìžì‹ ì˜ ì •ë³´ë¥¼ 등ë¡í•œë‹¤ Locker는 ìž ê¸ˆíŒŒì¼ì„ ì´ìš©í•´ TS를 관리한다. === 기능명세 === 1. Lockerì— ìžì‹ ì˜ ì •ë³´ë¥¼ 등ë¡í•œë‹¤ 1. ìžì‹ ì˜ ip 1. port 1. ê·¸ ì™¸ì˜ ì‹œìŠ¤í…œ ì „ì²´ê°€ ê³µìœ í•´ì•¼ 하는 ì •ë³´ëŠ”? 1. Locker는 해당 ip와 port#로 파ì¼ì„ ìƒì„±í•˜ë©° 해당 TSì—게만 ìˆ˜ì •ê¶Œí•œì„ ì¤€ë‹¤. == í´ë¼ì´ì–¸íЏ ì—러코드 ★★ == í´ë¼ì´ì–¸íŠ¸ì˜ ìš”ì²ì´ ì œëŒ€ë¡œ 수행ë˜ì§€ ì•Šì•˜ì„ ë•Œ TSì—게 ë°›ì€ ì‘답메세지별로 다른 시ë„를 í• ìˆ˜ 있다. === 비기능명세 === 1. TS ì‹œìž‘ì‹œì— ë“±ë¡í•œë‹¤. 등ë¡ì— 성공하지 못하면 다시 시ë„한다. 1. 재시ë„í• ë•Œ 마다 시간간격 늘림 1. ì¼ì •횟수 ì´ìƒì‹œ 멈춤(Lockerì˜ ë¶€í•˜ ê³ ë ¤) == SSTABLE Compaction ★★★ == 마스터는 íƒœë¸”ë¦¿ì˜ SSTABLE ë¦¬ìŠ¤íŠ¸ë„ ì•Œê³ ìžˆì–´ì•¼ 하나? === Minor Compaction === memtableì— ë”ì´ìƒ 쓰기 ì—°ì‚°ì„ ìˆ˜í–‰í• ìˆ˜ ì—†ì„ ë•Œ SSTABLE로 변환. 파ì¼í˜•태로 DFSì— ì“´ë‹¤. 1. 트리거 1. memtableì—게 í• ë‹¹ëœ ë©”ëª¨ë¦¬ë¥¼ 다 사용해서 ë” ì´ìƒ 쓰기를 í• ìˆ˜ ì—†ì„ ë•Œ 1. 커밋로그ì—게 í• ë‹¹ëœ ìš©ëŸ‰ì„ ë‹¤ 사용해서 ë” ì´ìƒ 쓰기를 í• ìˆ˜ ì—†ì„ ë•Œ === Major Compaction === SSTABLEë“¤ì„ í•©ë³‘í•˜ì—¬ 최근 기ë¡ë§Œì„ 남긴다. clientì˜ ì½ê¸° ìš”ì² ì‘ë‹µì‹œì— íš¨ìœ¨ì´ ì¢‹ìŒ * ISSUE 1. SSTABLE 합병 시기? 1. major compactionì„ í•˜ë©´ SSTABLEì´ í•ìƒ 1개가ë˜ë‚˜? == 태블릿 Split ★★ == íƒœë¸”ë¦¿ì˜ í¬ê¸°ê°€ ì¼ì • 수준 ì´ìƒ 커지면 ë‘개로 나눈다. === 기능명세 === 1. íƒœë¸”ë¦¿ì˜ í¬ê¸°ê°€ 200MB를 넘으면 major compaction 1. 태블릿 split시 키는 반드시 sortë˜ì–´ 있어야 한다. 1. 후 split한다 1. SSTABLEì€ ë…¼ë¦¬ì 으로 ë¶„í• ëœë‹¤ 1. 여러 íƒœë¸”ë¦¿ì´ í•˜ë‚˜ì˜ SSTABLEì„ ì°¸ì¡°í• ìˆ˜ 있다. 1. '''ISSUE''' : merge compaction등으로 ë‘ê°œì˜ sstable만들면 sstableì˜ ë³µìˆ˜ì°¸ì¡°ë¥¼ ë§‰ì„ ìˆ˜ 있다. === ISSUE === == 태블릿 복구 ★★ == 커밋로그ì—서 로그를 ì½ì–´ì™€ memtable 복구하는 것 === 기능명세 === 1. map&reduce 연산으로 TS별 ì •ë ¬ì´ í•„ìš”í•˜ë‹¤. 1. ì •ë ¬ëœ ë¡œê·¸ì—서 íŠ¹ì • TSì˜ ë¡œê·¸ë¥¼ 재실행(redo)한다. == 마스터 복구 ★★ == 마스터 서버 다운시 복구 === 기능명세 === 1. 마스터가 다운ë˜ì—ˆìŒì„ ê°ì§€í•˜ëŠ” 즉시 ?는 새로운 마스터를 ê²°ì •í•œë‹¤. 1. ISSUE 1. ë§ˆìŠ¤í„°ì˜ ë‹¤ìš´ì„ ì–´ë–»ê²Œ ê°ì§€í•˜ì§€? 1. 누가 새로운 마스터를 ê²°ì •í•˜ì§€? 1. 새로운 ë§ˆìŠ¤í„°ì˜ ì‹œìž‘ì„ ì•Œë¦°ë‹¤ 1. ISSUE : 누가 마스터를 알리지? 1. 마스터가? TSê°€? 1. 마스터는 Lockerì—서 TS리스트를 ì½ì–´ì˜¨ë‹¤. 1. 마스터는 Lockerì—서 ë£¨íŠ¸íƒœë¸”ë¦¿ì˜ ì •ë³´ë¥¼ ì½ì–´ì˜¨ë‹¤. 1. 마스터는 TS들ì—게서 태블릿 리스트를 스캔한다. == heartbeat ★ == TSê°€ 마스터(ë˜ëŠ” Locker)ì— ì¼ì • 간격마다 ì§€ì†ì 으로 ì „ì†¡í•˜ëŠ” ë”미 패킷. TSê°€ í™œì„±í™”ì¤‘ìž„ì„ ì•Œë¦°ë‹¤. * ISSUE 1. heartbeatì— ì‘ë‹µì„ í•´ì•¼í•˜ë‚˜? 1. 장 : 마스터 실패를 TSê°€ ê°ì§€í• 수 있다. 1. 단 : ë§ˆìŠ¤í„°ì˜ ë¶€í•˜ ì¦ê°€ == 만기 ★ == ìœ ë‹›ë“¤ì€ ìŠ¤ìŠ¤ë¡œë¥¼ 파기하지 않는다. ì„œë²„ì— ìž¥ì• ê°€ ìƒê²¨ ê¸°ëŠ¥ì„ í•˜ì§€ 못하게 ë˜ì—ˆì„ 때 만기(expired) ë˜ì—ˆë‹¤ê³ 한다. === 기능명세 === 1. TS 복구 1. 마스터 복구 1. Locker와 DFSì˜ ë³µêµ¬ëŠ” 논외로 한다. === 비기능명세 === 1. 만기/실패시 복구