Home > ๐Ÿ“– ๊ฐœ์ธ ๊ณต๋ถ€ > ๐Ÿ‘‰ Apache Hadoop > ๐Ÿ“˜ ํ•˜๋‘ก์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ์™€ ์ด๋ก 

๐Ÿ“˜ ํ•˜๋‘ก์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ์™€ ์ด๋ก 
Apache Hadoop Study

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š”, ํ•˜๋‘ก์ด ์–ด๋–ป๊ฒŒ ๋“ฑ์žฅํ–ˆ๋Š”์ง€๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ์—๋Š” ๊ทธ๋Ÿฌํ•œ ํ•˜๋‘ก์˜ ํ•ต์‹ฌ ์š”์†Œ๋“ค์— ๋Œ€ํ•˜์—ฌ ๊ณต๋ถ€ํ•˜๊ณ  ํฌ์ŠคํŒ…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ดํ•ด์™€ ํ•˜๋‘ก์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ


โ—ˆ


๐Ÿ˜ 1. HDFS

HDFS ๋Š” Hadoop ์˜ ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
HDFS ์˜ ์•„ํ‚คํ…์ฒ˜์—๋„ ๋”ฐ๋กœ Block File System, NameNode, DataNode ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
HDFS ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์•Œ์•„๋ณด๊ธฐ ์ „์—, HDFS ๊ฐ€ ์–ด๋–ค ์ฒ ํ•™๊ณผ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€, ๊ทธ ํŠน์ง•์€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

โ‘  HDFS ๋Š” ํ•˜๋“œ์›จ์–ด ์žฅ์• ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
HDFS๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ถ„์‚ฐ ์„œ๋ฒ„์—๋Š” ๋‹ค์–‘ํ•œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ํ•˜๋“œ๋””์Šคํฌ์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒจ์„œ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ, ๋””์Šคํฌ ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜๋Š” ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ ์žฅ์• ๊ฐ€ ์ƒ๊ฒจ ํŠน์ • ๋ถ„์‚ฐ ์„œ๋ฒ„์— ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
HDFS๋Š” ์ด๋Ÿฐ ์žฅ์• ๋ฅผ ๋น ๋ฅธ ์‹œ๊ฐ„์— ๊ฐ์ง€ํ•˜๊ณ  ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
HDFS์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด, ๋ณต์ œ๋ณธ๋„ ํ•จ๊ป˜ ์ €์žฅ๋˜์–ด ๋ฐ์ดํ„ฐ ์œ ์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ๋ถ„์‚ฐ ์„œ๋ฒ„ ์‚ฌ์ด์—๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ health check ๋ฅผ ํ†ตํ•ด ๋น ๋ฅธ ์‹œ๊ฐ„์— ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โ‘ก HDFS ๋Š” Streaming ์‹ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
HDFS๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋™์ผ ์‹œ๊ฐ„ ๋‚ด์— ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ค‘๊ฐ„๋ถ€ํ„ฐ ์ฝ๊ณ , ์“ฐ๋Š” Random Access ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด๊ฐ€๋Š” Streaming ๋ฐฉ์‹์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€๋” ์ด Streaming ๋ฐฉ์‹์ด ์นดํ”„์นด์ฒ˜๋Ÿผ ์‹ค์‹œํ•œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์˜๋ฏธํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋ฐ์— ํŠนํ™”๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค(์˜ˆ: ์ธํ„ฐ๋„ท ๋ฑ…ํ‚น, ์‡ผํ•‘๋ชฐ ๋“ฑ)๋ณด๋‹ค๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ(batch processing)์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

โ‘ข HDFS ๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์…‹ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
HDFS๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ์ˆ˜ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ(GB)์—์„œ ์ˆ˜ ํ…Œ๋ผ๋ฐ”์ดํŠธ(TB)์— ์ด๋ฅด๋Š” ํฌ๊ธฐ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋†’์€ ๋ฐ์ดํ„ฐ ์ „์†ก ๋Œ€์—ญํญ(bandwidth)์„ ์ง€์›ํ•˜๋ฉฐ, ์ˆ˜๋ฐฑ ๋Œ€์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HDFS๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์—์„œ ์ˆ˜์ฒœ๋งŒ ๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก ๋Œ€์—ญํญ์€, ํ•œ ๋ฒˆ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

โ‘ฃ HDFS ๋Š” ์‹ฌํ”Œํ•˜๊ณ , ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, HDFS๋Š” ํ•œ ๋ฒˆ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฅผ write-once-read-many ๋ชจ๋ธ์ด๋ผ ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ›„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด์—๋Š” ์ €์žฅ ํ›„ ์ˆ˜์ •์ด ์ „ํ˜€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” ํŒŒ์ผ์˜ ๋๋ถ€๋ถ„์— ๋ฐ์ดํ„ฐ๋ฅผ append ํ•˜๋Š” ๋ฐฉ์‹์€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋‹จ์ˆœํ•œ ์ผ๊ด€์„ฑ ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๋ฉฐ, ํŠนํžˆ MapReduce์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ํฐ ์žฅ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โ‘ค HDFS ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ ๋…ธ๋“œ์—์„œ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ปดํ“จํŒ… ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค, ์—ฐ์‚ฐ ์ž‘์—…์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ ๊ณณ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋น„์šฉ๊ณผ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋” ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ฐ์ดํ„ฐ ์–‘์ด ๋ฐฉ๋Œ€ํ• ์ˆ˜๋ก ๋”์šฑ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ˜ผ์žก์„ ์ค„์ด๊ณ  ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
HDFS๋Š” ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ ๋…ธ๋“œ์—์„œ ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ํฌ๊ฒŒ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

โ‘ฅ HDFS ๋Š” ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ ๊ฐ„์˜ ์ด์‹์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
HDFS๋Š” ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด ๋ฐ ์šด์˜์ฒด์ œ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ…”์ด๋‚˜ AMD ์นฉ์ด ์„ค์น˜๋œ ์„œ๋ฒ„์—์„œ๋„ ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•˜๋ฉฐ, CentOS๋‚˜ Red Hat Linux์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” HDFS์˜ ์„œ๋ฒ„ ์ฝ”๋“œ๊ฐ€ Java ์–ธ์–ด๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ์ผ์ž…๋‹ˆ๋‹ค. Java์˜ ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ์ด HDFS์˜ ๋†’์€ ์ด์‹์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•ด ์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์€ HDFS๊ฐ€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ €์žฅ ํ”Œ๋žซํผ์œผ๋กœ ๋„๋ฆฌ ์ฑ„ํƒ๋˜๋Š” ์ค‘์š”ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๐Ÿ˜ 1.1. Block File System


HDFS๋Š” ๋ธ”๋ก ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
HDFS์— ์ €์žฅ๋˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์€ ์ผ์ • ํฌ๊ธฐ์˜ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋ถ„ํ• ๋˜์–ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ๋ธ”๋ก ํฌ๊ธฐ๋Š” 128MB์ด๋ฉฐ, ์„ค์ •์„ ํ†ตํ•ด ์กฐ์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ( ํ•˜๋‘ก V1 ์—์„œ๋Š” 64MB์˜€์Šต๋‹ˆ๋‹ค. )
์ด๋Ÿฌํ•œ ๋ธ”๋ก ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋•๋ถ„์— ๋กœ์ปฌ ๋””์Šคํฌ์˜ ์ œํ•œ์„ ๋„˜์–ด์„œ ํŽ˜ํƒ€๋ฐ”์ดํŠธ(PB) ๋‹จ์œ„์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

hdfs-site.xml ์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ถ”์ฒœ์„ ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

<property>
  <name>dfs.blocksize</name>
  <value>134217728</value> <!-- 128MB -->
</property>

โœ… HDFS์—์„œ ํŒŒ์ผ๊ณผ ๋ธ”๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค

๊ตฌ๋ถ„ ์„ค๋ช… ์˜ˆ์‹œ
ํŒŒ์ผ๊ณผ ๋ธ”๋ก ๊ด€๊ณ„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์€ ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ธ”๋ก์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ A โ†’ ๋ธ”๋ก 1๊ฐœ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„ํ•  ์ €์žฅ
๋ธ”๋ก ๊ด€๋ฆฌ ์–ด๋–ค ํŒŒ์ผ์ด ์–ด๋–ค ๋ธ”๋ก์— ์ €์žฅ๋˜๋Š”์ง€๋Š” Namenode๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -
๋ธ”๋ก ๋…๋ฆฝ์„ฑ ํ•˜๋‚˜์˜ ๋ธ”๋ก์—๋Š” ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ญ์ƒ ๋‹จ์ผ ํŒŒ์ผ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋ธ”๋ก B์—๋Š” ์˜ค์ง ํŒŒ์ผ A ์ผ๋ถ€๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ
๋ธ”๋ก ๋ถ„ํ•  ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด, ํŒŒ์ผ์€ ์—ฌ๋Ÿฌ ๋ธ”๋ก์— ๋‚˜๋‰˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ: 128MB + 10byte โ†’ ๋ธ”๋ก 1: 128MB, ๋ธ”๋ก 2: 10byte
๋ธ”๋ก ํฌ๊ธฐ ๋ฏธ๋งŒ์˜ ํŒŒ์ผ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๋ธ”๋ก๋ณด๋‹ค ์ž‘์•„๋„ ์ „์ฒด ๋ธ”๋ก์„ ํ• ๋‹น๋ฐ›์ง€๋งŒ, ์‚ฌ์šฉ๋œ ์šฉ๋Ÿ‰๋งŒ ์‹ค์ œ ๋””์Šคํฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ: 1MB, ๋ธ”๋ก ํฌ๊ธฐ: 128MB โ†’ ๋ธ”๋ก์€ 1MB๋งŒ ์‚ฌ์šฉ
๋ธ”๋ก์ด ๋‚˜๋ˆ ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ์ด ๋ธ”๋ก ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ ๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด, ๋งˆ์ง€๋ง‰ ๋ธ”๋ก์€ ๋‚จ์€ ํฌ๊ธฐ๋งŒํผ ์ ์œ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ: 129MB, ๋ธ”๋ก ํฌ๊ธฐ: 128MB โ†’ ๋ธ”๋ก 1: 128MB, ๋ธ”๋ก 2: 1MB
๋””์Šคํฌ ์ ์œ  ๊ณต๊ฐ„ ์‹ค์ œ ๋””์Šคํฌ์—์„œ ์ ์œ ํ•˜๋Š” ๊ณต๊ฐ„์€ ๋ธ”๋ก ์ „์ฒด๊ฐ€ ์•„๋‹Œ, ํŒŒ์ผ์˜ ์‹ค์ œ ํฌ๊ธฐ๋งŒํผ์ž…๋‹ˆ๋‹ค. ๋ธ”๋ก ํฌ๊ธฐ: 128MB, ํŒŒ์ผ ํฌ๊ธฐ: 1MB โ†’ ๋””์Šคํฌ ์‚ฌ์šฉ: 1MB


โœ… ์ด๋ ‡๊ฒŒ Block System ์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ์จ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โ‘  Seek Time ๊ฐ์†Œ
HDFS๋Š” ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ๊ณ ์ •ํ•˜์—ฌ ๋””์Šคํฌ ํƒ์ƒ‰ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์Šคํฌ ํƒ์ƒ‰ ์‹œ๊ฐ„์€ ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ํƒ์ƒ‰ ์‹œ๊ฐ„(seek time)๊ณผ ํ•ด๋‹น ์œ„์น˜๋กœ ๋””์Šคํฌ ํ—ค๋“œ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๊ฒ€์ƒ‰ ์‹œ๊ฐ„(search time)์˜ ํ•ฉ์ž…๋‹ˆ๋‹ค. ํ•˜๋‘ก์ด ์ฒ˜์Œ ๊ฐœ๋ฐœ๋  ๋‹น์‹œ ์ผ๋ฐ˜์ ์ธ ํ•˜๋“œ๋””์Šคํฌ์˜ ํ‰๊ท  ํƒ์ƒ‰ ์‹œ๊ฐ„์€ ์•ฝ 10ms์˜€๊ณ , ๋””์Šคํฌ I/O ๋Œ€์—ญํญ์€ 100MB/s์˜€์Šต๋‹ˆ๋‹ค. HDFS๋Š” ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ์ „์ฒด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์˜ 1%๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ–ˆ์œผ๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด 100MB๋ฅผ ๋„˜์ง€ ์•Š๊ณ  2์˜ ์ œ๊ณฑ์ˆ˜์— ๊ฐ€๊นŒ์šด 64MB๋ฅผ ๋ธ”๋ก ํฌ๊ธฐ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ํฐ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํšจ์œจ์„ฑ๊ณผ ๊ทธ ๋™์•ˆ ํ•˜๋“œ์›จ์–ด ๋ฐ ๋„คํŠธ์›Œํฌ์˜ ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ๋˜๋Š” ๊ณผ์ •์„ ํ†ตํ•˜์—ฌ V2 ์—์„œ๋Š” 128MB ๋กœ ๋ณ€๊ฒฝ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ( + ํด๋Ÿฌ์Šคํ„ฐ์˜ ํšจ์œจ์„ฑ ๋•Œ๋ฌธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. -> ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ๋” ์ˆ˜์›”ํ•ด์ง. )

โ‘ก ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌ๊ธฐ ๊ฐ์†Œ
Namenode๋Š” ๋ธ”๋ก ์œ„์น˜, ํŒŒ์ผ ์ด๋ฆ„, ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ, ๊ถŒํ•œ ์ •๋ณด ๋“ฑ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ์‹œํ‚ค๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ธ”๋ก ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๋ฉฐ, ์ด์— ๋”ฐ๋ผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์–‘๋„ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ 128MB์ธ ๊ฒฝ์šฐ, 200MB ํŒŒ์ผ์€ ๋‘ ๊ฐœ์˜ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ, Namenode๋Š” ํ•ด๋‹น ๋ธ”๋ก์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ 4KB ๋˜๋Š” 8KB ํฌ๊ธฐ์˜ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ ํฌ๊ธฐ์˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ ค๋ฉด ์ˆ˜๋งŒ ๊ฐœ์˜ ๋ธ”๋ก๊ณผ ๊ทธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ 4KB์ธ ๊ฒฝ์šฐ, 200MB ํŒŒ์ผ์€ ์•ฝ 5๋งŒ ๊ฐœ์˜ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋‰˜๊ณ , 5๋งŒ ๊ฐœ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ Namenode๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Namenode๋Š” ๋‹จ์ผ ์„œ๋ฒ„์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ์•ˆ์ •์„ฑ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Namenode๋Š” 100๋งŒ ๊ฐœ์˜ ๋ธ”๋ก์„ ์ €์žฅํ•  ๋•Œ ์•ฝ 1GB์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ‘ข ํด๋ผ์ด์–ธํŠธ์™€ Namenode ๊ฐ„ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋น„์šฉ ๊ฐ์†Œ
ํด๋ผ์ด์–ธํŠธ๊ฐ€ HDFS์— ์ €์žฅ๋œ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋จผ์ € Namenode์— ํ•ด๋‹น ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ธ”๋ก์˜ ์œ„์น˜๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ ์ž‘์•„ ๋ธ”๋ก ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด, ์กฐํšŒํ•ด์•ผ ํ•  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๊ฑฐ๋‚˜ ์กฐํšŒ ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํŒŒ์ผ๋‹น ๋ธ”๋ก ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค์–ด ์กฐํšŒ์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๊ฐ„์†Œํ™”๋˜๊ณ , ํ†ต์‹  ํšŸ์ˆ˜๋„ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐ ์กฐํšŒ ์ดํ›„์—๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด Namenode์™€์˜ ์ถ”๊ฐ€์ ์ธ ํ†ต์‹  ์—†์ด ์ž‘์—…์„ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ „์ฒด์ ์ธ ํ†ต์‹  ๋น„์šฉ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.


๐Ÿ˜ 1.2. NameNode ์™€ DataNode


HDFS Architecture

์ถœ์ฒ˜ : HDFS ์•„ํ‚คํ…์ฒ˜

โœ… NameNode

NameNode๋Š” HDFS์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ๋กœ์„œ, ๋ธ”๋ก์˜ ์œ„์น˜, ๊ถŒํ•œ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋ฉฐ, ์˜์†์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ํŒŒ์ผ ํ˜•ํƒœ๋กœ๋„ ๋””์Šคํฌ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” File System Image ์ž…๋‹ˆ๋‹ค.
NameNode๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋œ ์ดํ›„๋ถ€ํ„ฐ์˜ HDFS ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ „์ฒด ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ, ํŒŒ์ผ๋ช…, ํŒŒ์ผํฌ๊ธฐ, ์ƒ์„ฑ์‹œ๊ฐ„, ์ˆ˜์ •์‹œ๊ฐ„, ๋ธ”๋ก ๋งคํ•‘ ์ •๋ณด, ์ ‘๊ทผ ์ œ์–ด ์ •๋ณด, ๋ณต์ œ ์ˆ˜, ํŒŒ์ผ ์ƒํƒœ ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š”, Edit Log ์ž…๋‹ˆ๋‹ค.
NameNode๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋œ ์ดํ›„๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•œ ๋กœ๊ทธ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‘ก์˜ NameNode ๋Š” ์‹œ์ž‘๋œ ์ดํ›„์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •๋ณด๋ฅผ File System Image ์— ๊ธฐ๋กํ•˜๊ณ , ๊ทธ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆผ์œผ๋กœ์จ ๋น ๋ฅด๊ฒŒ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ๋“ค์€ ์ „๋ถ€ Edit Log ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ NameNode ๋ฅผ ๋‚ด๋ ธ๋‹ค๊ฐ€ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉด, Secondary NameNode ์— ์˜ํ•ด์„œ ๋””์Šคํฌ์— ์žˆ๋Š” Edit Log ์™€ File System Image ๊ฐ€ ๋ณ‘ํ•ฉ์„ ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด File System Image ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑธ ๋‹ค์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆผ์œผ๋กœ์จ, ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ NameNode ์˜ ์—ญํ• ์€ ํฌ๊ฒŒ ๋‹ค์„ฏ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ํŒŒ์ผ ์ด๋ฆ„, ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ, ํŒŒ์ผ ํฌ๊ธฐ, ์ ‘๊ทผ ์ œ์–ด ์ •๋ณด(access/auth control) ๋ฐ ํŒŒ์ผ๊ณผ ๋ธ”๋ก ๊ฐ„์˜ ๋งคํ•‘ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ์‹ ์†ํ•˜๊ฒŒ ์‘๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์œ ์ง€๋˜๋ฉฐ, ์œ„์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

โ‘ก ๋ฐ์ดํ„ฐ๋…ธ๋“œ ๊ด€๋ฆฌ
ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ชจ๋“  DataNode ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์— ์˜ํ•œ ๋ช…์‹œ์ ์ธ ๋ช…๋ น ๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ DataNode ์ƒํƒœ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

โ‘ข ๋ฐ์ดํ„ฐ๋…ธ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง
๊ฐ DataNode๋Š” 3์ดˆ๋งˆ๋‹ค NameNode์— heartbeat๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. heartbeat์—๋Š” ๋ฐ์ดํ„ฐ๋…ธ๋“œ ์ƒํƒœ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ธ”๋ก ๋ชฉ๋ก(block report)์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. NameNode๋Š” heartbeat ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ DataNode์˜ ๊ฐ€์šฉ์„ฑ, ๋””์Šคํฌ ์šฉ๋Ÿ‰ ์ƒํƒœ ๋“ฑ์„ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ heartbeat๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ•œ DataNode๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๋…ธ๋“œ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

โ‘ฃ ๋ธ”๋ก ๊ด€๋ฆฌ
NameNode๋Š” ๊ฐ ๋ธ”๋ก์˜ ์œ„์น˜, ๋ณต์ œ ์ƒํƒœ, ์†Œ์œ  ๊ด€๊ณ„ ๋“ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ DataNode๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์— ์žˆ๋˜ ๋ธ”๋ก์„ ๋‹ค๋ฅธ ์ •์ƒ ๋…ธ๋“œ๋กœ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•œ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๋ธ”๋ก์„ ์šฉ๋Ÿ‰์ด ์—ฌ์œ  ์žˆ๋Š” ๋…ธ๋“œ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค. ๋ธ”๋ก์˜ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜์—ฌ, ๊ธฐ์ค€ ๋ณต์ œ ์ˆ˜๋ณด๋‹ค ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ๊ฒฝ์šฐ ์ ์ ˆํžˆ ์ถ”๊ฐ€ ๋ณต์ œ ๋˜๋Š” ์‚ญ์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

โ‘ค ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ
ํด๋ผ์ด์–ธํŠธ๊ฐ€ HDFS์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ NameNode๋ฅผ ํ†ตํ•ด ๋จผ์ € ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ €์žฅํ•  ๊ฒฝ์šฐ, ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ, ์ €์žฅ ๊ถŒํ•œ ๊ฒ€์‚ฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์กฐํšŒํ•  ๊ฒฝ์šฐ, ๋ธ”๋ก์ด ์ €์žฅ๋œ DataNode์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โœ… DataNode

DataNode ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ HDFS์— ์ €์žฅํ•˜๋Š” ํŒŒ์ผ์„ ๋””์Šคํฌ์— ์œ ์ง€ํ•˜๋Š” Node ์ž…๋‹ˆ๋‹ค.
์ €์žฅํ•˜๋Š” ํŒŒ์ผ์€ ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜์ธ๋ฐ, ํ•˜๋‚˜๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ(Raw Data) ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š”, checksum ์ด๋‚˜ created time ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์„ค์ •๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ DataNode ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ€ํ„ฐ ์‹ค์ œ ๋ฐ์ดํ„ฐ์˜ read/write ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โ‘ก block ์ƒ์„ฑ,๋ณต์ œ,์‚ญ์ œ
NameNode ๋กœ๋ถ€ํ„ฐ ๋ช…๋ น์„ ๋ฐ›์•„์„œ, ์ž์‹ ์˜ ๋””์Šคํฌ์— ์žˆ๋Š” block ์„ ์ƒ์„ฑ, ๋ณต์ œ, ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

โ‘ข heartbeat ์ „์†ก
HDFS ์˜ ์ƒํƒœ๋ฅผ NameNode ์—๊ฒŒ heartbeat ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

โ‘ฃ block ์ •๋ณด ์ „์†ก
NameNode์—๊ฒŒ ์ž์‹ ์ด ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ block ๋“ค์˜ ๋ฆฌ์ŠคํŠธ์™€ ์ƒํƒœ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ˜ 1.3. Secondary NameNode


secondaryNamenode

์ถœ์ฒ˜ : Secondary Namenode



Secondary NameNode ๋Š” ์ด๋ฆ„๋งŒ ๋“ค์–ด๋ณด๋ฉด, ์ด์ค‘ํ™” ๊ตฌ์„ฑ์„ ํ†ตํ•ด NameNode ๊ฐ€ ๋‹ค์šด๋˜๋ฉด, Active ๋˜๋Š” Standby Node ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, Secondary NameNode ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๊ณ ๊ฐ€์šฉ์„ฑ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Secondary NameNode ๋Š” NameNode ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” File System Image ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ๋ถ„๋‹ดํ•ฉ๋‹ˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด, NameNode ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ HDFS ์˜ Entrypoint ๋กœ์จ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ File ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š”๋ฐ, NameNode ์˜ ์ด๋Ÿฌํ•œ ๋ณธ์—ฐ์˜ ์—ญํ• ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก Secondary NameNode ๋Š” NameNode ์˜ Edit Log ๋ฅผ Merge ํ•˜์—ฌ ์ƒˆ๋กœ์šด New File System Image ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Secondary NameNode ๋Š” NameNode ๊ฐ€ ์˜ฌ๋ผ์˜ค๋Š” ๊ณผ์ •์—์„œ ํ˜„์žฌ๊นŒ์ง€์˜ Edit Log ์„ File System Image ์™€ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ตœ์‹ ์˜ File System Image ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ Secondary NameNode ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ NameNode ์˜ Edit Log ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Edit Log ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ธฐ๋ก๊ณผ File System Image ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด New FsImage ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ File System Image ๋Š” NameNode ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ( ์ฆ‰, NameNode ๊ฐ€ ๋‚ด๋ ค๊ฐ”๋‹ค ์˜ฌ๋ผ์˜ฌ ๋•Œ๋งˆ๋‹ค, ๋ณ‘ํ•ฉ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์คŒ. )

๐Ÿ˜ 1.4. Replication


HDFS๋Š” Fault Tolerance ๋ฅผ ์œ„ํ•ด ๊ฐ ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋ณต์ œํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณต์ œ ๊ฐœ์ˆ˜๋ฅผ ๋ณต์ œ ์ˆ˜(Replication Factor)๋ผ๊ณ  ํ•˜๋ฉฐ, ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ณต์ œ ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 3๊ฐœ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‚˜์˜ ๋ธ”๋ก์ด ์žˆ๋‹ค๋ฉด HDFS๋Š” ์ด๋ฅผ ์„ธ ๊ฐœ์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋‚˜๋ˆ„์–ด ์ €์žฅํ•จ์œผ๋กœ์จ ํ•œ ์„œ๋ฒ„๊ฐ€ ๊ณ ์žฅ ๋‚˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ ์œ ์‹ค์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ ์ˆ˜๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ์ดํ›„์—๋„ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, HDFS์˜ ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ writer๋งŒ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, append๋‚˜ truncate์™€ ๊ฐ™์€ ์ผ๋ถ€ ์˜ˆ์™ธ์ ์ธ ์—ฐ์‚ฐ์—์„œ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์  ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

HDFS์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ธ”๋ก์˜ ๋ณต์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ๋„ค์ž„๋…ธ๋“œ(NameNode)์ž…๋‹ˆ๋‹ค. ๋„ค์ž„๋…ธ๋“œ๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๋…ธ๋“œ(DataNode)๋กœ๋ถ€ํ„ฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ•˜ํŠธ๋น„ํŠธ(heartbeat)์™€ ๋ธ”๋ก ๋ฆฌํฌํŠธ(block report)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋„ค์ž„๋…ธ๋“œ๋Š” ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ณ ์žฅ์ด ๋ฐœ์ƒํ•œ ๋…ธ๋“œ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ํ•ด๋‹น ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ธ”๋ก์ด ์†์‹ค๋˜์ง€ ์•Š๋„๋ก ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋ณต์ œ๋ณธ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŠน์ • ๋…ธ๋“œ์˜ ์ €์žฅ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ ๋ธ”๋ก์„ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์žˆ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธฐ๊ธฐ๋„ ํ•˜๋ฉฐ, ๋ณต์ œ ์ˆ˜๊ฐ€ ์ง€์ •๋œ ๊ฐ’๋ณด๋‹ค ์ ๊ฑฐ๋‚˜ ๋งŽ์€ ๊ฒฝ์šฐ ์ด๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

HDFS๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณต์ œ๋ณธ(replica)์œผ๋กœ ์ €์žฅํ•˜์—ฌ, ์‹ ๋ขฐ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹จ์ˆœํžˆ ๋ณต์ œ๋ณธ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์ด ์ž๋™์œผ๋กœ ์ข‹์•„์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ์ด ์–ด๋””์— ์ €์žฅ๋˜๋А๋ƒ, ์ฆ‰ replica์˜ ์œ„์น˜๋Š” HDFS์˜ ์ „์ฒด ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ HDFS๋Š” ๋ณต์ œ๋ณธ์˜ ๋ฐฐ์น˜ ์ „๋žต(replica placement policy)์„ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉฐ, ์ด ์ „๋žต์€ ๊ธฐ์กด์˜ ๋‹ค๋ฅธ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ HDFS๋ฅผ ์ฐจ๋ณ„ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. HDFS๋Š” ์ด ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์ˆ˜๋งŽ์€ ๊ฒฝํ—˜๊ณผ ์‹คํ—˜์„ ํ†ตํ•ด ์ •์ฑ…์„ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ณต์ œ๋ณธ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์‹ ๋ขฐ์„ฑ๊ณผ, ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์œ„์น˜์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์„œ๋ฒ„๋‚˜ ๋ž™์ด ์‹คํŒจํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์šฉ์„ฑ ํ–ฅ์ƒ, ๊ทธ๋ฆฌ๊ณ  ๋ณต์ œ๋ณธ์ด ๋„คํŠธ์›Œํฌ ๋‚ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋ถ„์‚ฐ๋˜๋„๋ก ํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•จ. ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€๋ฅผ ์ค‘์ ์œผ๋กœ ๊ฐœ์„ ๋˜์–ด์™”์Šต๋‹ˆ๋‹ค.

์ด ์ •์ฑ… ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๋ฐ”๋กœ ๋ž™ ์ธ์‹ ๋ณต์ œ ๋ฐฐ์น˜(Rack-aware Replica Placement)์ž…๋‹ˆ๋‹ค.

hadoop-cluster

์ถœ์ฒ˜ : ํ•˜๋‘ก ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฏธ์ง€์™€ ๋ž™ ๊ตฌ์กฐ



๋Œ€๊ทœ๋ชจ HDFS ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ปดํ“จํŒ… ์ธ์Šคํ„ด์Šค๋“ค์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„ ๋ž™(rack)์— ๋‚˜๋‰˜์–ด ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋ž™์— ์œ„์น˜ํ•œ ์„œ๋ฒ„๋ผ๋ฆฌ๋Š” ๋ž™ ๋‚ด ์Šค์œ„์น˜๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ๋ž™ ๋‚ด ํ†ต์‹ ๋ณด๋‹ค ๋” ๋งŽ์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ตฌ์กฐ์ ์ธ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ Hadoop์€ Rack Awareness ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด NameNode๋Š” ๊ฐ DataNode์˜ ๋ž™ ID๋ฅผ ์ธ์‹ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ณต์ œ๋ณธ์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

HDFS์˜ ๊ธฐ๋ณธ ๋ณต์ œ ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 3์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ๊ธฐ๋ณธ ๋ณต์ œ ๋ฐฐ์น˜ ์ •์ฑ…์ธ BlockPlacementPolicyDefault๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ณต์ œ๋ณธ์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ณต์ œ๋ณธ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ(writer)์™€ ๊ฐ™์€ ๋ž™์— ์žˆ๋Š” DataNode์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ writer๊ฐ€ ํŠน์ • DataNode ์œ„์—์„œ ์ง์ ‘ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ ์ž์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด writer๊ฐ€ ์ผ๋ฐ˜ ๋…ธ๋“œ๋ผ๋ฉด, ๊ฐ™์€ ๋ž™ ๋‚ด์—์„œ ์ž„์˜์˜ DataNode๋ฅผ ์„ ํƒํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ๋ณต์ œ๋ณธ์€ writer์™€๋Š” ๋‹ค๋ฅธ ๋ž™์— ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ DataNode์— ์ €์žฅ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ด ๋‘ ๊ฐœ์˜ ๋ž™์— ๋ณต์ œ๋ณธ์ด ๋ถ„์‚ฐ๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ๋ž™์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ž™์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ •์ฑ…์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žฅ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ ๋ณต์ œ๋ณธ์„ writer์™€ ๋™์ผํ•œ ๋ž™์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋ž™ ๊ฐ„ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์žฅ์• ๊ฐ€ ๋ž™ ์ „์ฒด๋ณด๋‹ค๋Š” ๊ฐœ๋ณ„ ๋…ธ๋“œ์—์„œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณต์ œ๋ณธ์„ ๋‘ ๊ฐœ์˜ ๋ž™์—๋งŒ ๋ถ„์‚ฐ์‹œ์ผœ๋„ ์ถฉ๋ถ„ํ•œ ์‹ ๋ขฐ์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ๋‹จ์  ์—ญ์‹œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ์„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ž™์— ๊ฐ๊ฐ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด ์ „์ฒด ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณต์ œ๋ณธ์ด 1:2์˜ ๋น„์œจ๋กœ ๋ถ„ํฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ž™ ๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐ๋˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ 3๋ณด๋‹ค ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ, ๋„ค ๋ฒˆ์งธ ๋ณต์ œ๋ณธ๋ถ€ํ„ฐ๋Š” ๋ฌด์ž‘์œ„๋กœ ๋ž™๊ณผ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋˜, ๋ž™๋‹น ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ ์ผ์ • ์ƒํ•œ์„  ์ดํ•˜๊ฐ€ ๋˜๋„๋ก ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ƒํ•œ์„ ์€ (๋ณต์ œ๋ณธ ์ˆ˜ - 1) / ๋ž™ ์ˆ˜ + 2๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

NameNode๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ธ”๋ก์— ๋Œ€ํ•ด ๋™์ผํ•œ DataNode์— ์—ฌ๋Ÿฌ ๋ณต์ œ๋ณธ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜์˜ ๋ธ”๋ก์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด DataNode์˜ ์ด ์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก ๋ณต์ œ๋ณธ์ด ์œ„์น˜ํ•  ๋…ธ๋“œ๋ฅผ ์„ ์ •ํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ž™ ์ธ์‹ ๊ทœ์น™์„ ๊ธฐ์ค€์œผ๋กœ ๋ณต์ œ๋ณธ์ด ๋ฐฐ์น˜๋  ํ›„๋ณด ๋…ธ๋“œ๋ฅผ ์„ ์ •.
  2. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํ›„๋ณด ๋…ธ๋“œ๊ฐ€ ์ •์ฑ…์—์„œ ์š”๊ตฌํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ.
  3. ๋งŒ์•ฝ ํ›„๋ณด ๋…ธ๋“œ๊ฐ€ ์š”๊ตฌ๋˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, NameNode๋Š” ๋‹ค๋ฅธ ํ›„๋ณด ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰.
  4. ์œ„์˜ ์ ˆ์ฐจ๋กœ๋„ ์ ์ ˆํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด, fallback ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋ณต์ œ๋ณธ์„ ๋ฐฐ์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„.



์กฐ๊ธˆ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด, ๋ž™ ์ธ์‹ ๊ทœ์น™ ๊ธฐ์ค€์œผ๋กœ ํ›„๋ณด Node ๋“ค์„ ์„ ์ •ํ•˜๊ณ , ์ •์ฑ…์„ SSD ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์œผ๋กœ ์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, SSD ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ›„๋ณด Node ๋“ค์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ์—†๋‹ค๋ฉด, fallback ์œผ๋กœ ์ง€์ •ํ•œ Disk ์— ๋ณต์ œ๋ณธ์„ ๋ฐฐ์น˜ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ์—๋„ ๋„ค ๊ฐ€์ง€ ์ •์ฑ…์ด ์ถ”๊ฐ€๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  BlockPlacementPolicyRackFaultTolerant
ํ•ด๋‹น ์ •์ฑ…์€ ๋ธ”๋ก ๋ณต์ œ๋ณธ์„ ์ตœ์†Œ 3๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ž™์— ๋ถ„์‚ฐ์‹œ์ผœ, 2๊ฐœ์˜ ๋ž™์ด ๋™์‹œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ( Github Code Link )

-- hdfs-site.xml
<property>
  <name>dfs.block.replicator.classname</name>
  <value>org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyRackFaultTolerant</value>
</property>

โ‘ก BlockPlacementPolicyWithNodeGroup
ํ•ด๋‹น ์ •์ฑ…์€ ๋…ธ๋“œ ๊ทธ๋ฃน ๊ฐœ๋…์„ ํ†ตํ•ด, ๋™์ผํ•œ ๋ฌผ๋ฆฌ์  ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ (VM)๋“ค ๊ฐ„์˜ ์žฅ์•  ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ๋…ธ๋“œ ๊ทธ๋ฃน์—๋Š” ๋‘˜ ์ด์ƒ์˜ ๋ณต์ œ๋ณธ์ด ๋ฐฐ์น˜๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Š” ๊ฐ€์ƒํ™”๋œ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ( Github Code Link )

-- core-site.xml
<property>
  <name>net.topology.impl</name>
  <value>org.apache.hadoop.net.NetworkTopologyWithNodeGroup</value>
</property>
<property>
  <name>net.topology.nodegroup.aware</name>
  <value>true</value>
</property>

-- hdfs-site.xml
<property>
  <name>dfs.block.replicator.classname</name>
  <value>org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithNodeGroup</value>
</property>

โ‘ข AvailableSpaceBlockPlacementPolicy
ํ•ด๋‹น ์ •์ฑ…์€ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ์˜ ๋””์Šคํฌ ์‚ฌ์šฉ๋ฅ ์„ ๊ณ ๋ คํ•˜์—ฌ, ๊ฐ€๋Šฅํ•œ ํ•œ ๋œ ์‚ฌ์šฉ๋œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ๋ธ”๋ก์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฐ„ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๊ณ  ํŠน์ • ๋…ธ๋“œ์— ๊ณผ๋„ํ•˜๊ฒŒ ๋ถ€ํ•˜๊ฐ€ ์ง‘์ค‘๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ( Github Code Link )

-- hdfs-site.xml
<property>
  <name>dfs.block.replicator.classname</name>
  <value>org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceBlockPlacementPolicy</value>
</property>

<property>
  <name>dfs.namenode.available-space-block-placement-policy.balanced-space-preference-fraction</name>
  <value>0.6</value>
</property>

<property>
  <name>dfs.namenode.available-space-block-placement-policy.balanced-space-tolerance</name>
  <value>5</value>
</property>

<property>
  <name>dfs.namenode.available-space-block-placement-policy.balance-local-node</name>
  <value>false</value>
</property>

โ‘ฃ AvailableSpaceRackFaultTolerantBlockPlacementPolicy
ํ•ด๋‹น ์ •์ฑ…์€ AvailableSpaceBlockPlacementPolicy ์˜ ๋ฐฉ์‹๊ณผ RackFaultTolerant ํŠน์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ž™ ์ˆ˜๋กœ ๋ธ”๋ก์„ ๋ถ„์‚ฐ์‹œํ‚ค๋ฉด์„œ, ๋‚ฎ์€ ๋””์Šคํฌ ์‚ฌ์šฉ๋ฅ ์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ( Github Code Link )

-- hdfs-site.xml
<property>
  <name>dfs.block.replicator.classname</name>
  <value>org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceRackFaultTolerantBlockPlacementPolicy</value>
</property>

<property>
  <name>dfs.namenode.available-space-rack-fault-tolerant-block-placement-policy.balanced-space-preference-fraction</name>
  <value>0.6</value>
</property>

<property>
  <name>dfs.namenode.available-space-rack-fault-tolerant-block-placement-policy.balanced-space-tolerance</name>
  <value>5</value>
</property>

โœ… Replica ๋ฐ์ดํ„ฐ ์ฝ๋Š” ์ˆœ์„œ

HDFS์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ์— ๋ณต์ œํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์—์„œ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด, HDFS๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๊นŒ์šด ์œ„์น˜์— ์žˆ๋Š” ๋ณต์ œ๋ณธ(replica)์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณต์ œ๋ณธ ์„ ํƒ(Replica Selection)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ DataNode์™€ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ณต์ œ๋ณธ์„ ๋ฐ”๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋™์ผํ•œ ๋…ธ๋“œ์— ๋ณต์ œ๋ณธ์ด ์—†๋‹ค๋ฉด, ๊ฐ™์€ ๋ž™(Rack)์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ๋˜ํ•œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์ตœ์ข…์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ๋ž™์ด๋‚˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ์žˆ๋Š” ๋ณต์ œ๋ณธ์„ ์„ ํƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ, HDFS ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ๊ฑธ์ณ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ์žˆ๋Š” ๋ณต์ œ๋ณธ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๊ธ€๋กœ๋ฒŒ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ(bandwidth)์˜ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ , ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ง€์—ฐ ์‹œ๊ฐ„(latency)์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… SafeMode

Safemode๋Š” NameNode๊ฐ€ ๊ธฐ๋™๋  ๋•Œ ์ง„์ž…ํ•˜๋Š” ์ผ์ข…์˜ ๋ณดํ˜ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” ๋ธ”๋ก ๋ณต์ œ์™€ ๊ฐ™์€ ์“ฐ๊ธฐ ์ž‘์—…์ด ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉฐ, ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์•ˆ์ •์ ์ธ ์ƒํƒœ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

Safemode ๋™์•ˆ NameNode๋Š” ๊ฐ DataNode๋กœ๋ถ€ํ„ฐ block report๋ฅผ ๋ฐ›์•„, ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ธ”๋ก๋“ค์ด ์ œ๋Œ€๋กœ ๋ณต์ œ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ชจ๋“  ๋ธ”๋ก ์ค‘ ์ผ์ • ๋น„์œจ ์ด์ƒ์ด ์ •์ƒ์ ์œผ๋กœ ๋ณต์ œ๋˜์–ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด, Safemode์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋น„์œจ(%)์€ ํ™˜๊ฒฝ ์„ค์ •์„ ํ†ตํ•ด ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Safemode์—์„œ ๋ฒ—์–ด๋‚œ ์ดํ›„์—๋Š”, ์•„์ง ๋ณต์ œ๋ณธ ๊ฐœ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•œ ๋ธ”๋ก๋“ค์— ๋Œ€ํ•ด ๋ณต์ œ ์ž‘์—…์ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, Safemode๋Š” ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๋™์ž‘ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ์ดˆ๊ธฐ ์ƒํƒœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

hdfs dfsadmin -safemode get   # SafeMode ์ƒํƒœ ํ™•์ธ
hdfs dfsadmin -safemode enter # SafeMode ์ผœ๊ธฐ
hdfs dfsadmin -safemode leave # SafeMode ๋„๊ธฐ

๐Ÿ˜ 1.5. Read ์™€ Write ์‹œ ๋‚ด๋ถ€์—์„œ ๋ฒŒ์–ด์ง€๋Š” ์ผ


โœ… HDFS Write

HDFS_write

์ถœ์ฒ˜ : HDFS Write

  1. ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ DistributedFileSystem ์—์„œ create() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. DistributedFileSystem ๋Š” RPC๋กœ namenode์— ์—ฐ๊ฒฐํ•˜๊ณ , ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ Namenode ์€ ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ ์š”์ฒญ์— ๋Œ€ํ•œ verification์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. verification ์€ ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š”์ง€, ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋“ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ verification ์—์„œ ์‹คํŒจํ•˜๋ฉด client์—์„œ๋Š” IOException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. verification์— ์„ฑ๊ณตํ•˜๋ฉด namenode ์—์„œ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ record ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  3. namenode ์—์„œ ํŒŒ์ผ record ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์— FSDataOutputStream ๊ฐ€ ๋ฆฌํ„ด ๋ฉ๋‹ˆ๋‹ค. FSDataOutputStream ์€ write ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. FSDataOutputStream ์€ datanode ์™€ namenode ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” DFSOutputStream ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DFSOutputStream ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ write ํ•˜๊ธฐ ์œ„ํ•œ packet์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•ด๋‹น packet ์€ DataQueue์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  5. DataStreamer ๊ฐ€ NameNode์— ์ƒˆ ๋ธ”๋ก ํ• ๋‹น์„ ์š”์ฒญํ•˜๊ณ , ๋ณต์ œ์— ์‚ฌ์šฉํ•  ๋ฐ”๋žŒ์งํ•œ DataNode๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  6. ๋ณต์ œ ๊ณผ์ •์€ DataNode๋“ค๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋ณต์ œ ์ˆ˜์ค€์ด 3์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ดํ”„๋ผ์ธ์— 3๊ฐœ์˜ DataNode๊ฐ€ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  7. DataStreamer ๋Š” DataQueue ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ consume ํ•ด์„œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฒซ๋ฒˆ์งธ datanode ์— ์ €์žฅํ•  ํŒจํ‚ท์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  8. ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฌถ์ธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋…ธ๋“œ๋Š” ์ €์žฅ์„ ์œ„ํ•ด ๋ฐ›์€ packet ์„ ๋ชจ๋‘ ์ €์žฅํ•˜๊ณ , ์ด๊ฒƒ์„ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋…ธ๋“œ๋กœ foward ํ•ฉ๋‹ˆ๋‹ค.
  9. DFSOutputStream์˜ AckQueue๋Š” DataNodes๋กœ๋ถ€ํ„ฐ โ€˜๊ฐ€๋Šฅโ€™ ์ด๋ผ๋Š” ์Šน์ธ์„ ๋ฐ›์œผ๋ฉด ์ €์žฅ๋˜๋Š” queue์ž…๋‹ˆ๋‹ค.
  10. ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ Ack ๊ฐ€ Queue ์— ๋“ค์–ด์˜ค๋ฉด, AckQueue ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•˜๋‚˜์˜ datanode ๋ผ๋„ ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณผ ack ์ „์†ก์— ์‹คํŒจํ•˜๋ฉด, Ack Queue ์— ๋ฐ›์€ ํŒจํ‚ท์ •๋ณด๋ฅผ ๋ณด๊ณ  ์žฌ์‹œ์ž‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  11. ํด๋ผ์ด์–ธํŠธ์˜ write ์ž‘์—…์ด ๋๋‚˜๋ฉด, close() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. close() ๋Š” ๋ชจ๋“  ๋‚จ์€ data packet ์„ flush ํ•˜๊ณ  ack ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  12. ๋งˆ์ง€๋ง‰ ack๊นŒ์ง€ ๋„์ฐฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” namenode์— write ์ž‘์—…์ด ๋๋‚ฌ์Œ์„ ์•Œ๋ฆฌ๋ฉฐ, ๋งˆ๋ฌด๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.

โœ… HDFS Read

HDFS_read

์ถœ์ฒ˜ : HDFS Read

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ DistributedFileSystem ์˜ open() ๋ฉ”์†Œ๋“œ๋กœ HDFS ํŒŒ์ผ์„ ์ฝ๊ฒ ๋‹ค๋Š” ์š”์ฒญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. DistributedFileSystem์€ RPC๋กœ namenode ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. open ๋Œ€์ƒ์ด ๋˜๋Š” ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์•ˆ์—๋Š” ํ•ด๋‹น ํŒŒ์ผ์ด ์ €์žฅ๋˜์–ด์žˆ๋Š” block์˜ location ์ •๋ณด ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๋ธ”๋ก์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๊ณ  ์ฒ˜์Œ ๋ช‡๊ฐœ์˜ ๋ธ”๋ก์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.)
  4. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ•ด๋‹น ๋ธ”๋ก(copy๋ณธ ํฌํ•จ)์„ ๊ฐ€์ง„ Datanode ๋“ค์˜ ์ฃผ์†Œ๊ฐ€ ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค.
  5. ๋ฐ›์€ DataNode ์ฃผ์†Œ์ •๋ณด๋กœ FSDataInputStream ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด client์—๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. FSDataInputStream๋Š” DataNode ์™€ NameNode ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” DFSInputStream ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. client๊ฐ€ DFSInputStream์— ๋Œ€ํ•ด read() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋Œ€์ƒ ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก์ด ์žˆ๋Š” datanode ์™€ connection ์„ ๋งบ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์ƒ์€ primary datanode๋กœ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    a. ์˜ˆ1 - Local Block Firstblock A๊ฐ€ datanode 1 ์— primary ๋ฒ„์ „์ด ์žˆ๊ณ  datanode 2,3 ์— replica ๋ฒ„์ „์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, datanode2 ์— ์œ„์น˜ํ•œ client ์—์„œ block A ์— ๋Œ€ํ•ด read ์š”์ฒญ์ด ์˜จ๋‹ค๋ฉด, ์ž์‹ ์˜ ๋กœ์ปฌ์ธ datanode 2์˜ replica ๋ฒ„์ „์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
    b. ์˜ˆ2 - Rack Awareness block A๊ฐ€ rack a์— ์œ„์น˜ํ•œ datanode 1 ์— primary ๋ฒ„์ „์ด ์žˆ๊ณ  rack b์— ์œ„์น˜ํ•œ datanode 2, rack b์— ์œ„์น˜ํ•œ datanode 3 ์— replica ๋ฒ„์ „์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, rack2 ์— ์œ„์น˜ํ•œ datanode 4์— ์žˆ๋Š” client ์—์„œ block A ์— ๋Œ€ํ•ด read ์š”์ฒญ์ด ์˜จ๋‹ค๋ฉด, ์ž์‹ ๊ณผ ๊ฐ™์€ rack2 ์— ์œ„์น˜ํ•œ datanode 2์˜ replica ๋ฒ„์ „์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  6. ๋ฐ์ดํ„ฐ๋Š” read() ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ• ๋•Œ๋งˆ๋‹ค stream ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค. read ๊ณผ์ •์€ end of block ์— ๋„๋‹ฌ ํ•  ๋•Œ๊นŒ์ง€ ์ง€์†๋ฉ๋‹ˆ๋‹ค.
  7. end of block ์— ๋„๋‹ฌํ•˜๋ฉด, DFSInputStream ์€ datanode ์™€์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ , ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‹ค์Œ ๋ธ”๋ก์ด ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ์„ ๋งบ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ํ•ด๋‹น ํŒŒ์ผ์˜ ๋ชจ๋“  ๋ธ”๋ก์„ ์ฝ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ๋ฉ๋‹ˆ๋‹ค.
  8. read ๊ณผ์ •์ด ๋๋‚˜๋ฉด client ๋Š” close() ๋กœ ๋ชจ๋“  ์—ฐ๊ฒฐ๊ณผ ์ŠคํŠธ๋ฆผ์„ ๋‹ซ๊ณ  ๋งˆ๋ฌด๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.




โ—ˆ


๐Ÿ˜ 2. Hadoop H/A ํด๋Ÿฌ์Šคํ„ฐ

Hadoop v1.x ๋ฒ„์ „ ๊นŒ์ง€๋Š” NameNode ๋Š” SPOF(single point of failure)์˜€์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ NameNode ๊ฐ€ ๋ง๊ฐ€์ง€๋ฉด ์„œ๋น„์Šค ์ „์ฒด๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค.
Hadoop ์˜ ๊ธฐ๋ณธ ์•„ํ‚คํ…์ฒ˜๋Š” NameNode๋ฅผ Master, Datanode ๋“ค์„ Slave ๋กœ ํ•˜๋Š” Master-Slave ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด ์ค‘ namenode ๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค, datanode ๋Š” ์ˆ˜ํ‰์  ํ™•์žฅ์ด ๊ฐ€๋Šฅํ–ˆ์œผ๋ฏ€๋กœ namenode๋Š” bottleneck ์ด ๋˜๊ธฐ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.
namenode ๊ฐ€ ์ด์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ผ๋ฉด, datanode๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ๋”๋ผ๋„ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด๊ฐ€ ์ด์šฉ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋ฒ„์ „์—์„œ๋Š” namenode์˜ ๋ฐ์ดํ„ฐ ์œ ์‹ค์„ ๋ฐฉ์ง€ํ•˜๋Š” secondary namenode ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ Availability ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜์ง€๋Š” ๋ชปํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํƒœ๋ผ๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์žฅ์•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ณ„ํš๋œ ์—…๊ทธ๋ ˆ์ด๋“œ๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด์„œ downtime ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด H/A ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค.

HA ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ํ•˜๋‚˜์˜ NameNode๊ฐ€ Active ์ƒํƒœ๋กœ ๋™์ž‘ํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Standby ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ NameNode๋Š” ํ•ญ์ƒ ์‹คํ–‰ ์ค‘์ด๋ฉฐ, Active NameNode์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Standby NameNode๊ฐ€ ์ž๋™์œผ๋กœ Active ์ƒํƒœ๋กœ ์ „ํ™˜๋˜์–ด ์„œ๋น„์Šค๋ฅผ ์ง€์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์šดํƒ€์ž„์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Standby NameNode๋Š” ๋‹จ์ˆœํ•œ ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ, Hadoop ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ž๋™ ์žฅ์•  ์กฐ์น˜(Failover) ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋ฐฑ์—… NameNode๋กœ์„œ์˜ ์—ญํ• ๋„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ „ํ™˜ํ•  ํ•„์š” ์—†์ด ์ž๋™ํ™”๋œ ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜ ์ž‘์—… ์ค‘์—๋„ Graceful Failover๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… HA ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ด์Šˆ

์ฒซ ๋ฒˆ์งธ : Active์™€ Standby NameNode๋Š” ํ•ญ์ƒ ๋™๊ธฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‘ NameNode๊ฐ€ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ : ๋™์‹œ์— ๋‘ ๊ฐœ์˜ Active NameNode๊ฐ€ ์กด์žฌํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
๋‘ ๊ฐœ์˜ Active NameNode ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ฐ NameNode ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ( ์‹ค์ œ๋กœ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋‹จ์ ˆ๋˜๋ฉด ์ผ์‹œ์ ์œผ๋กœ 2๊ฐœ์˜ Active NameNode ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. )
์ด๋Ÿฐ ์ƒํ™ฉ์„ Split-brain์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ๋‘ NameNode๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜์–ด ์‹ฌ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Fencing์ด๋ผ๋Š” ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ํ•œ์ชฝ NameNode์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๊ณ , ๋‹จ ํ•˜๋‚˜์˜ Active NameNode๋งŒ ์กด์žฌํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

โœ… HA Architecture์˜ ๊ตฌํ˜„ ๋ฐฉ์‹

Hadoop์—์„œ HA ํ™˜๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ : Quorum Journal Nodes ์‚ฌ์šฉ
์—ฌ๋Ÿฌ ๊ฐœ์˜ JournalNode๋ฅผ ํ†ตํ•ด NameNode ๊ฐ„ ๋กœ๊ทธ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ˆ˜๊ฒฐ(Quorum) ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ์žฅ์•  ๋ณต๊ตฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ : NFS ๊ธฐ๋ฐ˜์˜ ๊ณต์œ  ์ €์žฅ์†Œ ์‚ฌ์šฉ
Active์™€ Standby NameNode๊ฐ€ ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ตฌํ˜„์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‹จ์ˆœํ•˜์ง€๋งŒ, NFS ์ž์ฒด์˜ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์— ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋‘˜์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ „์—, ์ด๋Ÿฌํ•œ H/A ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€ ํ•ต์‹ฌ ์—”์ง„์ธ Zookeeper ์™€ Hadoop ์˜ ๊ด€๊ณ„๋ฅผ ์กฐ๊ธˆ ์งš์–ด๋ณด๊ณ  ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ 2.1. ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ์œ„ํ•ด ์ž ์‹œ ์งš์–ด๊ฐˆ Zookeeper


Apache Zookeeper ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ด๋ก ์€ ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์—์„œ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด๋ฉฐ, ์ง€๊ธˆ์€ ์ด Zookeeper ๊ฐ€ ๋Œ€๋žต ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  Hadoop ์˜ H/A Cluster ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์™œ ํ•„์š”ํ•œ์ง€๋งŒ ๊ฐ„๋žตํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Apache ZooKeeper๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์„œ๋ฒ„๋“ค ๊ฐ„์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐ์œจํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์•™ ์ง‘์ค‘ํ˜• ์ฝ”๋””๋„ค์ด์…˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. Hadoop ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” NameNode์˜ ๊ณ ๊ฐ€์šฉ์„ฑ(High Availability, H/A)์„ ๊ตฌ์„ฑํ•  ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Hadoop์€ ํ•˜๋‚˜์˜ NameNode๋งŒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด NameNode๊ฐ€ ๋‹ค์šด๋˜๋ฉด ์ „์ฒด HDFS๊ฐ€ ์ž‘๋™์„ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด NameNode๋ฅผ Active/Standby ๊ตฌ์กฐ๋กœ ์ด์ค‘ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์–ด๋А NameNode๊ฐ€ Active๊ฐ€ ๋ ์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ์—ญํ• ์„ ZooKeeper๊ฐ€ ๋งก์Šต๋‹ˆ๋‹ค.

ZooKeeper๋Š” Ephemeral ๋…ธ๋“œ์™€ Watch ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‘ NameNode์˜ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‘ NameNode๋Š” ZooKeeper์— ์—ฐ๊ฒฐ๋˜๋ฉฐ, ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•˜๋‚˜๋งŒ Active ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Active๋กœ ์„ ์ถœ๋œ NameNode๋Š” ZooKeeper ๋‚ด ZNode๋ฅผ ์„ ์ ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” Standby ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Active NameNode๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜๋ฉด ZooKeeper๋Š” ์ด ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ , ๋Œ€๊ธฐ ์ค‘์ด๋˜ Standby NameNode๋ฅผ ์ž๋™์œผ๋กœ Active๋กœ ์Šน๊ฒฉ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด NameNode๋ฅผ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ, NameNode ์ƒํƒœ ์ •๋ณด๋ฅผ ZooKeeper์˜ ZNode์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
HDFS ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ HA ๋ชจ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉด, ๊ฐ NameNode๋Š” ZKFailoverController(ZKFC) ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ZKFC๋Š” ZooKeeper์™€ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ์ž์‹ ์˜ NameNode๊ฐ€ Active ๋˜๋Š” Standby ์ƒํƒœ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด๋ฅผ ZooKeeper์˜ ZNode์— Ephemeral(์ž„์‹œ) ZNode๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

/hadoop-ha/[nameservice]/ActiveStandbyElectorLock

์ด ActiveStandbyElectorLock ๋…ธ๋“œ๋Š” ๋‹จ ํ•˜๋‚˜์˜ NameNode๋งŒ ์†Œ์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํ˜„์žฌ Active NameNode๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
( ์ด๋กœ์จ ์Šคํ”Œ๋ฆฟ ๋ธŒ๋ ˆ์ธ ํ˜„์ƒ์„ ์–ด๋А์ •๋„๋Š” ๋ฐฉ์–ดํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Zookeeper ๋Š” ์ž์ฒด ์—”์ง„๋งŒ์œผ๋กœ Lock ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๋งŒํผ ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ๋ฏผ๊ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. )

๋‘๋ฒˆ์งธ, Ephemeral ZNode์™€ Watcher๋ฅผ ํ†ตํ•œ ์ƒํƒœ ๊ฐ์ง€ ๋ฐ ์žฅ์•  ์ธ์‹์„ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ NameNode์—๋Š” ZKFailoverController(ZKFC)๊ฐ€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋ฉฐ, ZooKeeper์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
์ด ZKFC๋Š” ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๋Š” NameNode๊ฐ€ Active ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ, ZooKeeper ๋‚ด๋ถ€์˜ /hadoop-ha/[nameservice]/ActiveStandbyElectorLock ๊ฒฝ๋กœ์— Ephemeral ZNode๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Ephemeral ZNode๋Š” ํ•ด๋‹น ZKFC์™€ ZooKeeper ๊ฐ„์˜ ์„ธ์…˜์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ๋งŒ ์กด์žฌํ•˜๋ฉฐ, ์„ธ์…˜์ด ๋Š๊ธฐ๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
์ด ZNode์—๋Š” ๋‹ค๋ฅธ Standby ์ƒํƒœ์˜ ZKFC ์ธ์Šคํ„ด์Šค๋“ค์ด watcher๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ZooKeeper๋Š” ํ•ด๋‹น ZNode์— ๋ณ€ํ™”(์‚ญ์ œ, ์ˆ˜์ • ๋“ฑ)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, watch๋ฅผ ๋“ฑ๋กํ•œ ๋ชจ๋“  ZKFC์—๊ฒŒ ์ผํšŒ์„ฑ ์ด๋ฒคํŠธ ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” Active NameNode๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜์–ด ์„ธ์…˜์ด ๋Š์–ด์ง€๊ณ , ZNode๊ฐ€ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด ์•Œ๋ฆผ์„ ๋ฐ›์€ Standby NameNode๋“ค์˜ ZKFC๋Š” ์žฅ์•  ์ƒํ™ฉ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ฆ‰์‹œ Leader Election(๋ฆฌ๋” ์„ ์ถœ) ์ ˆ์ฐจ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ZooKeeper๋Š” ์ž์ฒด์ ์œผ๋กœ ์žฅ์• ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, Ephemeral ZNode์™€ watch ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณด์กฐํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์„ธ๋ฒˆ์งธ, ZKFC๊ฐ€ ์ƒํƒœ ๋ณ€ํ™” ๊ฐ์ง€ ํ›„ ๋ฆฌ๋” ์„ ์ถœ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Ephemeral ZNode ์‚ญ์ œ๋Š” ZooKeeper ๋‚ด๋ถ€์ ์œผ๋กœ watcher ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ชจ๋“  ZKFC์— ํ†ต์ง€๋ฉ๋‹ˆ๋‹ค. ๊ฐ Standby NameNode์˜ ZKFC๋Š” ๊ฐ NameNode ์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๋‹ค๊ฐ€, ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฆ‰์‹œ Leader Election(๋ฆฌ๋” ์„ ์ถœ)์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฆฌ๋” ์„ ์ถœ์€ ZooKeeper์˜ ActiveStandbyElector ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ์„ ์ถœ๋œ ๋ฆฌ๋”๋งŒ์ด ActiveStandbyElectorLock ZNode์— ์ƒˆ๋กœ Ephemeral ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๊ถŒํ•œ์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ๋‹จ ํ•˜๋‚˜์˜ Standby NameNode๋งŒ์ด ์Šน๊ฒฉ๋˜์–ด Active ์ƒํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋„ค๋ฒˆ์งธ, ์ƒˆ๋กœ์šด Active NameNode ๋“ฑ๋ก ๋ฐ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
๋ฆฌ๋”๋กœ ์„ ์ถœ๋œ NameNode๋Š” ZooKeeper์˜ ActiveStandbyElectorLock ๊ฒฝ๋กœ์— Ephemeral ZNode๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž์‹ ์ด ์ƒˆ๋กœ์šด Active์ž„์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ(DataNode, Client ๋“ฑ)๋Š” ZooKeeper์—์„œ ์ด ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ, ์ƒˆ๋กญ๊ฒŒ ์Šน๊ฒฉ๋œ NameNode๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์„œ๋น„์Šค๋Š” ์ค‘๋‹จ ์—†์ด ์ง€์†๋ฉ๋‹ˆ๋‹ค.

๋‹ค์„ฏ๋ฒˆ์งธ, ๊ธฐ์กด ์žฅ์•  NameNode ๋ณต๊ตฌ ํ›„ Standby๋กœ ์žฌ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
์žฅ์• ๋กœ ์ธํ•ด ์ข…๋ฃŒ๋˜์—ˆ๋˜ NameNode๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ZKFC๋Š” ๋‹ค์‹œ ZooKeeper์™€ ์—ฐ๊ฒฐํ•˜์—ฌ Standby ์ƒํƒœ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ZooKeeper๋Š” ์ด๋ฏธ Active๊ฐ€ ์กด์žฌํ•จ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ค‘๋ณต ํ™œ์„ฑํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ Standby๋กœ๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Apache Zookeeper ์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋Š” ์ถ”ํ›„ Zookeeper ๋ฅผ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ๋Š” zNode ์˜ ๊ฐœ๋…๊ณผ, watch ์˜ ๊ฐœ๋…. ๊ทธ๋ฆฌ๊ณ  ๋ถ„์‚ฐ๋ฝ์˜ ๊ฐœ๋… ์ •๋„๋งŒ ์•Œ์•„๋‘์–ด๋„, ํ•˜๋‘ก์„ ๊ณต๋ถ€ํ•˜๋Š”๋ฐ์— ๋ฌธ์ œ๊ฐ€ ์—†์„๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ˜ 2.2. Quorum Journal Nodes H/A


QuorumJournalNodes

์ถœ์ฒ˜ : Quorum Journal Nodes



HDFS์˜ ๊ณ ๊ฐ€์šฉ์„ฑ(HA) ์•„ํ‚คํ…์ฒ˜์—์„œ Quorum Journal Nodes(QJN)์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š”, Zookeeper๋งŒ์œผ๋กœ๋Š” EditLog ๋™๊ธฐํ™” ๋ฐ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Zookeeper๋Š” ์ฃผ๋กœ NameNode์˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ Active/Standby ์ „ํ™˜์„ ๋‹ด๋‹นํ•˜์ง€๋งŒ, HDFS์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” EditLog์˜ ์ €์žฅ๊ณผ ๋™๊ธฐํ™”๋Š” ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‘ ๊ฐœ์˜ NameNode๊ฐ€ ๋™์‹œ์— Active๊ฐ€ ๋˜๋Š” Split-brain ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, Quorum Journal Nodes์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Active์™€ Standby NameNode๋Š” Journal Nodes๋ผ๋Š” ๋ณ„๋„์˜ ๋…ธ๋“œ ๊ทธ๋ฃน(๋˜๋Š” ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค)์„ ํ†ตํ•ด ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Journal Nodes๋Š” ring topology๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
Journal Node์— ๋“ค์–ด์˜จ request๋Š” ring ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŠน์ • Journal Node์— failure๊ฐ€ ๋ฐœ์ƒํ•ด๋„ Fault Tolerance๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
Active NameNode๋Š” Journal Node์— ์žˆ๋Š” EditLogs๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
Standby NameNode๋Š” Journal Node๋กœ๋ถ€ํ„ฐ EditLogs์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฝ๊ณ , ๊ทธ๊ฒƒ์„ ์ž์‹ ์˜ namespace์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
Failover ์‹œ์— Standby NameNode๋Š” Active NameNode๊ฐ€ ๋˜๊ธฐ ์ „์— ์šฐ์„  ์ž์‹ ์ด ๊ฐ€์ง„ metadata์˜ ๋‚ด์šฉ์ด Journal Node์— ์žˆ๋Š” ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ˜์˜ํ•œ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Journal Node์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ฑํฌ๋˜์—ˆ๋‹ค๋ฉด ๊ทธ๋•Œ Active NameNode๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  DataNode๋Š” Active NameNode์™€ Standby NameNode์˜ IP ์ฃผ์†Œ๋ฅผ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DataNode๋Š” ์ž์‹ ์˜ heartbeat์™€ block report ๋ฐ์ดํ„ฐ๋ฅผ ๋‘ NameNode์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Standby๋Š” Active๊ฐ€ ๋˜๊ธฐ ์ „์— ์ด๋ฏธ DataNode ์ •๋ณด์™€ block location ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋น ๋ฅด๊ฒŒ failover๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, Split-brain ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, QJN์€ ํ•˜๋‚˜์˜ NameNode๋งŒ์ด EditLog๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. Standby NameNode๊ฐ€ QJN์— ๋Œ€ํ•œ write ๊ถŒํ•œ์„ ํš๋“ํ•˜๋ฉด, ๋‹ค๋ฅธ NameNode๋Š” Active ์ƒํƒœ๋กœ ์ „ํ™˜๋˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ Fencing์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋‘ NameNode๊ฐ€ ๋™์‹œ์— Active ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Fencing์ด ์™„๋ฃŒ๋œ ํ›„, Standby๋Š” Active ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ˜ 2.3. Shared Storage H/A


๋ง ํ˜• ๊ตฌ์กฐ๋กœ ๋ณ„๋„ ์ €๋„ ๋…ธ๋“œ๋“ค์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋™๊ธฐํ™”ํ•˜๋Š” Quorum Journal Nodes ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ณต์œ ํ•˜๋Š” Shared Storage ๋ฐฉ์‹๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € Active NameNode๋Š” EditLog๋ฅผ ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ Standby NameNode๋Š” ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ EditLog๋ฅผ ์ฝ์–ด ์ž์‹ ์˜ namespace์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ Standby NameNode๊ฐ€ Active NameNode๋กœ์„œ์˜ ์—ญํ• ์„ ๋งก์„ ์ค€๋น„๊ฐ€ ๋˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

Failover๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, Standby NameNode๋Š” ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€์— ์žˆ๋Š” EditLog์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ ํ›„, Active NameNode๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, Standby NameNode๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ ํ›„์— Active ์ƒํƒœ๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, Split-brain์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, Shared Storage ํ™˜๊ฒฝ์—์„œ๋„ fencing ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Fencing์€ ๋‘ ๊ฐœ์˜ NameNode๊ฐ€ ๋™์‹œ์— Active ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํ•˜๋‘ก์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ฆฌ์ž๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ fencing ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ fencing ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ.. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” NameNode์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๊ฑฐ๋‚˜, ํ•ด๋‹น NameNode ์˜ ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ˆ์ด์Šคํ’€ํ•œ ์ข…๋ฃŒ๊ฐ€ ์–ด๋ ค์šด ํ™˜๊ฒฝ์— ์žˆ๋‹ค๋ฉด, STONITH(Shoot the Other Node in the Head) ๋ผ๋Š” ๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” fencing ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. STONITH๋Š” ํŠน์ˆ˜ ์ „์› ๊ณต๊ธ‰ ์žฅ์น˜๋ฅผ ์ด์šฉํ•ด ํ™œ์„ฑํ™”๋œ NameNode์˜ ๋จธ์‹ ์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, Split-brain ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ 2.4. Failover


๊ฒฐ๊ตญ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์„ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š”, ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์žฅ์•  ์กฐ์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์žฅ์•  ์กฐ์น˜๋Š”, ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์‹œ์Šคํ…œ์œผ๋กœ ์ž๋™์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

์žฅ์•  ์กฐ์น˜์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ, ๊ด€๋ฆฌ์ž๊ฐ€ ๊ณ„ํš์ ์ด๊ณ  ์˜๋„์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” Graceful Failover ๊ฐ€ ์žˆ๊ณ , ๊ด€๋ฆฌ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ํƒ€์ด๋ฐ์— ๊ฐ‘์ž๊ธฐ ์ง„ํ–‰๋˜๋Š” Atomic Failover ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์•Œ์•„๋ณด์•˜๋˜, Zookeeper ๋ฅผ ํ†ตํ•œ Failover ๊ณผ์ •์€ ์ด๋Ÿฌํ•œ Atomic Failover ๊ณผ์ •์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ 2.5. Observer NameNode ( ONN )


ํ•˜๋‘ก์— ๋Œ€ํ•œ ์ฒซ ๊ฒŒ์‹œ๊ธ€์ธ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ดํ•ด์™€ ํ•˜๋‘ก์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ ์—์„œ Version ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ… ๋ถ€๋ถ„์—์„œ ๋ฏธ์ฒ˜ ์ด์•ผ๊ธฐ ํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ Observer NameNode ์ž…๋‹ˆ๋‹ค. Observer NameNode ๋Š” ํ•˜๋‘ก 3.x ๋ฒ„์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ( ์˜๋„์ ์œผ๋กœ ๋นผ๋จน์€ ๊ฑด ์•„๋‹ˆ๊ณ , ๊นœ๋นกํ–ˆ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž.. )

๊ทธ๋Ÿผ ๋Œ€์ฒด Observer NameNode ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์™œ ์ƒ๊ธด ๊ฒƒ์ผ๊นŒ์š”.

์œ„์—์„œ ํฌ์ŠคํŒ…ํ•œ HA ์•„ํ‚คํ…์ฒ˜์—์„œ Active NameNode๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉฐ, Standby NameNode๋Š” ๋‹จ์ˆœํžˆ Active NameNode์™€ ๊ฐ™๋„๋ก ๋™๊ธฐํ™”๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. HA๋Š” ๋‹ฌ์„ฑ๋˜์—ˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋‹จ์ผ Active NameNode๊ฐ€ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผํ‚ค๋Š” ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ Active NameNode์— ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์ง€๋ฉด, HA๋ฅผ ์ด์šฉํ•˜์—ฌ Failover๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ถ€ํ•˜๋กœ ์ธํ•ด Active NameNode๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ์—ฐ์‡„์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋“ฑ์žฅํ•œ ๊ฒƒ์ด Observer NameNode ์ž…๋‹ˆ๋‹ค.

Observer NameNode๋Š” HDFS์—์„œ Active NameNode์™€ Standby NameNode์˜ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Standby NameNode๋Š” Active NameNode์™€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ์žฅ์•  ๋ฐœ์ƒ ์‹œ Failover๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, Observer NameNode๋Š” Standby์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ, Active NameNode์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์š”์ฒญ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Observer NameNode๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด Active NameNode์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HDFS์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” โ€œwrite-once-read-manyโ€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ฆ‰, ํ•œ ๋ฒˆ ์“ฐ๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— Observer NameNode๊ฐ€ ์ฝ๊ธฐ ์š”์ฒญ์„ ๋ถ„๋‹ดํ•จ์œผ๋กœ์จ Active NameNode์˜ ๋ถ€ํ•˜๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ Active NameNode๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ฝ๊ธฐ ์ž‘์—…์˜ ์–‘์ด ์ค„์–ด๋“ค์–ด ์‹œ์Šคํ…œ์˜ ์ „์ฒด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋”ฐ๋ผ, NameNode ๋Š” ํ•˜๋‘ก 3 ๋ฒ„์ „๋ถ€ํ„ฐ, HA Hadoop Cluster ์—์„œ 3๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ( Active, Standby, Observer )

๋˜ํ•œ, NameNode ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.



active โ†’ observer ( : โŒ ๋ถˆ๊ฐ€๋Šฅ )
observer โ†’ active ( : โŒ ๋ถˆ๊ฐ€๋Šฅ )
active โ†’ standby โ†’ observer ( : โœ… ๊ฐ€๋Šฅ )
observer โ†’ standby โ†’ active ( : โœ… ๊ฐ€๋Šฅ )

์ฆ‰, ๊ฐ€๋Šฅํ•œ ์ „์ด ์ˆœ์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ค‘๊ฐ„์— standby๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ •ํ•œ ์ด์œ ๋Š”, ์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ์ •์„ฑ๊ณผ ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ observer๋Š” passive(์ˆ˜๋™์ ) ์—ญํ• ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ณง๋ฐ”๋กœ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋Š” active๋กœ ์ „ํ™˜๋˜๋ฉด ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์–ด ์ด๋Ÿฐ ์ œํ•œ์„ ๋‘ก๋‹ˆ๋‹ค.

โœ… Read-Write ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€ ๋ฐฉ๋ฒ• ( ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ - read your own writes )

๊ธฐ์กด ํ•˜๋‘ก์€ ์“ฐ๊ธฐ ์ž‘์—…์ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์–ด close() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋จ์œผ๋กœ์จ NameNode์˜ edit log์— ๋ฐ˜์˜๋˜๊ณ , ํ•ด๋‹น block์ด ์ตœ์ข…์ ์œผ๋กœ commit๋˜๊ธฐ ์ „๊นŒ์ง€๋Š”, ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฌผ๋ก , ๋™์ผ ํด๋ผ์ด์–ธํŠธ๋ผ๋„ ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— write ๋„์ค‘ read ๋ฅผ ํ•˜์—ฌ๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ฒŒ๋” ์„ค๊ณ„๊ฐ€ ๋˜์–ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋‘ก V3 ์— ๋“ฑ์žฅํ•œ Observer NameNode ๋Š”, wrtie ๊ฐ€ close() ๋Š” ๋˜์—ˆ์ง€๋งŒ, NameNode ๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌ๋ฅผ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์œ„์—์„œ ์„ค๋ช…ํ•˜์˜€๋“ฏ, Observer NameNode ๋Š” Active NameNode ์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ read ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ผ๊ด€์„ฑ์ด ๊นจ์ง€๊ฒŒ ๋˜๋ฉด, ์ฝ๊ธฐ ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋‘ก V3 ๋ถ€ํ„ฐ๋Š” State ID ๋ผ๋Š” ๊ฒƒ์„ ๋„์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
Iceberg ๋‚˜, Hudi ๋“ฑ์„ ๊ณต๋ถ€ํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ์ด ํ…Œ์ด๋ธ” ํฌ๋ฉง๋“ค์ด ACID ๋ฅผ ๋ณด์žฅํ•ด ์ค„ ๋•Œ, ์Šค๋ƒ…์ƒท ์•„์ด๋””๋ผ๋Š” ๊ฒƒ์„ ์“ฐ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‘ก๋„ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ State ID ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

state ID๋Š” Namenode์˜ transaction ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด state ID๋ฅผ RPC ์š”์ฒญ์˜ ํ—ค๋”์— ํฌํ•จ์‹œ์ผœ NameNode์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด state ID๋Š” Hadoop ๋‚ด๋ถ€์˜ DFSClient์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์œผ๋กœ ์œ ์ง€๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์“ฐ๊ธฐ๋‚˜ ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐฑ์‹ ๋˜๊ณ  ์ „์†ก๋ฉ๋‹ˆ๋‹ค

์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ Active NameNode๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ HDFS์— ์”๋‹ˆ๋‹ค. Active NameNode๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ DataNode์— ์ €์žฅํ•˜๋„๋ก ์ง€์‹œํ•˜๊ณ , ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ transaction ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด transaction ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ state ID๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด Observer NameNode ์— ์ฝ๊ธฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด์ „์— ๊ฐฑ์‹ ํ•œ state ID๋ฅผ Observer NameNode์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

Observer NameNode๋Š” ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜„์žฌ transaction ID์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ state ID๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ( ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ์ผ ๊ฒฝ์šฐ, write ํ•œ ์ชฝ์—์„œ ๊ณ„์† state ID ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. )

๋งŒ์•ฝ, Observer NameNode์˜ transaction ID๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ state ID๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ตœ์‹ ์ด๋ผ๋ฉด, Observer๋Š” ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์“ด ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐฑ์‹ ๋œ ์ƒํƒœ ID๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์€ ๊ฒฝ์šฐ, Observer NameNode๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก Stats ID ๋Š” โ€œํŒŒ์ผ ๋‹จ์œ„โ€๋‚˜ โ€œ๋””๋ ‰ํ† ๋ฆฌ ๋‹จ์œ„โ€๊ฐ€ ์•„๋‹ˆ๋ผ, HDFS ์ „์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ๊ธ€๋กœ๋ฒŒํ•œ ๋ณ€๊ฒฝ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

โœ… Observer NameNode ์˜ Edit Log Tailing

Observer NameNode์—๊ฒŒ Edit log tailing์€ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Active NameNode์— ๊ธฐ๋ก๋˜๋Š” ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜๋“ค์„ Observer NameNode๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ, ์ฝ๊ธฐ ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ •ํ™•๋„๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Observer NameNode๋Š” ์ฝ๊ธฐ ์ „์šฉ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ Active NameNode์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์‹  ์ƒํƒœ๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ตํ•˜๊ฒŒ ๋˜์–ด ์ „์ฒด ์‹œ์Šคํ…œ ์‹ ๋ขฐ๋„์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Edit log tailing์˜ ๋ฐ˜์˜ ์ง€์—ฐ ์‹œ๊ฐ„, ์ฆ‰ latency๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ Edit log tailing ๋ฐฉ์‹์€ HTTP ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜์˜€๊ณ , Edit log๊ฐ€ ๋””์Šคํฌ์— flush๋œ ์ดํ›„์—์•ผ Observer๊ฐ€ ๋กœ๊ทธ๋ฅผ tailingํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ํ†ต์‹  ์†๋„์™€ ๋””์Šคํฌ I/O ์˜์กด์„ฑ ์ธก๋ฉด์—์„œ latency๊ฐ€ ํด ์ˆ˜๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋œ Edit Tailing Fast-Path ๋ฐฉ์‹์€ latency๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋ณ€๊ฒฝ์ ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ๊ธฐ์กด์˜ HTTP ํ†ต์‹  ๋Œ€์‹  RPC ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋”์šฑ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋กœ๊ทธ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. RPC๋Š” ๋ฌด๊ฑฐ์šด ๊ธฐ๋Šฅ ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ํ†ต์‹ ํ• ์ง€ ์ง์ ‘ ์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋ถˆํ•„์š”ํ•œ ์ง€์—ฐ์ด ์ค„์–ด๋“ค๊ณ  ๋” ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, JournalNode์˜ in-memory cache๋ฅผ ํ™œ์šฉํ•จ์œผ๋กœ์จ ๋””์Šคํฌ์— ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ edit log ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Observer NameNode๋Š” ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊นŒ์šด ๋กœ๊ทธ ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ Edit Tailing Fast-Path๋Š” Observer NameNode์˜ latency๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๋ฉฐ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ˜์˜ ์†๋„๋ฅผ ๋†’์—ฌ ์ „์ฒด HDFS ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ํฌ๊ฒŒ ๊ธฐ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… Client-side Proxy Provider

ObserverReadProxyProvider ๋ผ๋Š” ํด๋ž˜์Šค๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ธก ํ”„๋ก์‹œ ์ œ๊ณต์ž์ž…๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๊ธฐ์กด์˜ ConfiguredFailoverProxyProvider ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ active namenode๋ฟ๋งŒ ์•„๋‹ˆ๋ผ observer namenode์—์„œ๋„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ๊ธฐ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ObserverReadProxyProvider๋Š” ๋จผ์ € ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ observer namenode๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ชจ๋“  observer namenode์—์„œ ์ฝ๊ธฐ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ, ๊ทธ๋•Œ์„œ์•ผ active namenode๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

Read-Write ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€ ๋ฐฉ๋ฒ• ( ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ - Maintaining Client Consistency)

์•ž์—์„œ ์„ค๋ช…ํ•œ โ€œread your own writesโ€ ๊ฐœ๋…์— ๋”ฐ๋ผ, ํด๋ผ์ด์–ธํŠธ โ€˜Aโ€™๊ฐ€ active NameNode์— a.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, โ€˜Aโ€™๊ฐ€ observer NameNode์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ผ๊ณ  ์š”์ฒญํ•˜๋ฉด, observer๋Š” a.txt ํŒŒ์ผ์ด ์™„์ „ํžˆ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, โ€˜Aโ€™๋Š” ์ž์‹ ์ด ์“ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ โ€˜Aโ€™๊ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค, ์ด ์‚ฌ์‹ค์„ HDFS์™€ ๋ฌด๊ด€ํ•œ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ โ€˜Bโ€™์—๊ฒŒ ์•Œ๋ ค์ฃผ์—ˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ์ดํ›„ โ€˜Bโ€™๊ฐ€ HDFS์—์„œ a.txt๋ฅผ ์ฝ์œผ๋ ค๊ณ  ์‹œ๋„ํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” โ€˜Bโ€™๊ฐ€ observer NameNode๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค ํ•  ๋•Œ, ํ•ด๋‹น observer๊ฐ€ ์•„์ง ์ตœ์‹  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ, ์ฆ‰ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ผ๊ด€์„ฑ ๊ฒฐ์—ฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด msync()๋ผ๋Š” ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. msync()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” active NameNode์˜ ์ตœ์‹  ์ƒํƒœ ID(state ID)๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ์ดํ›„ ๋ชจ๋“  ์ฝ๊ธฐ ์š”์ฒญ์€ ํ•ด๋‹น ์‹œ์ ๊นŒ์ง€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, โ€˜Bโ€™๊ฐ€ msync()๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•œ ํ›„ a.txt๋ฅผ ์กฐํšŒํ•˜๋ฉด, ํŒŒ์ผ์„ ์ •์ƒ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

msync()๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋กœ ์ˆ˜์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” observer NameNode์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ msync()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ดˆ๊ธฐํ™” ์ „์— ๋ฐœ์ƒํ•œ ์“ฐ๊ธฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ObserverReadProxyProvider๋Š” ์ž๋™ msync() ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ์ž๋™์œผ๋กœ msync()๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์ด ๊ธฐ๋Šฅ์€ msync() ํ˜ธ์ถœ๋งˆ๋‹ค active NameNode์— RPC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์ • ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

-- hdfs-site.xml
<property>
  <name>dfs.client.observer.auto-msync.enabled</name>
  <value>true</value>
</property>

<property>
  <name>dfs.client.observer.auto-msync.interval.ms</name>
  <value>5000</value> <!-- 5์ดˆ๋งˆ๋‹ค `msync()` ์ˆ˜ํ–‰ -->
</property>

์ด ๋‚ด์šฉ์„ ์ข€ ๋” ์ง๊ด€์ ์ด๊ณ , ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. A ํด๋ผ์ด์–ธํŠธ(foo)๊ฐ€ a.txt ํŒŒ์ผ ์ƒ์„ฑ
    A๋Š” active NameNode์— a.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” write ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    ์ด write๋Š” active NameNode์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ , ์ดํ›„ observer NameNode๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋น„๋™๊ธฐ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.

  2. B ํด๋ผ์ด์–ธํŠธ(bar)๊ฐ€ observer NameNode์— read ์š”์ฒญ
    B๋Š” a.txt ํŒŒ์ผ์„ ์ฝ๊ธฐ ์œ„ํ•ด observer NameNode์— read ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    ํ•˜์ง€๋งŒ ์ด ์‹œ์ ์— observer NameNode๊ฐ€ ์•„์ง ์ตœ์‹  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(a.txt ์ƒ์„ฑ ์ •๋ณด)๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  3. B๊ฐ€ a.txt๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
    observer๊ฐ€ ์•„์ง ๋™๊ธฐํ™”๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, B๋Š” a.txt ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์ผ๊ด€์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ
    ๊ฐ™์€ ์‹œ์ ์— A๋Š” ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, B๋Š” ๋ณผ ์ˆ˜ ์—†๋Š” read-your-own-writes ๋ถˆ์ผ์น˜ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  5. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ msync() ํ˜ธ์ถœ
    B๊ฐ€ msync()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ž๋™ msync() ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด, B๋Š” active NameNode์˜ ์ตœ์‹  ์ƒํƒœ ID๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  6. B๊ฐ€ observer์— ๋‹ค์‹œ read ์š”์ฒญ
    ์ด์ œ observer๋Š” active NameNode์—์„œ ์ „ํŒŒ๋œ ์ตœ์‹  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜๊ฒŒ ๋˜์–ด, B๋Š” ์ •์ƒ์ ์œผ๋กœ a.txt๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

msync() ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ msync() ํ˜ธ์ถœ โ†’ active NameNode์— ์ตœ์‹  state ID ์š”์ฒญ โ†’ active NameNode๊ฐ€ ์ตœ์‹  state ID ์‘๋‹ต โ†’ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น state ID ๊ธฐ์ค€์œผ๋กœ observer NameNode์™€ ๋™๊ธฐํ™” ์—ฌ๋ถ€ ํ™•์ธ โ†’ observer๊ฐ€ ์ตœ์‹ ์ด๋ฉด observer์—์„œ read, ์•„๋‹ˆ๋ฉด active๋กœ read ์šฐํšŒ์˜ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.




โ—ˆ


๐Ÿ˜ 3. Eraser Coding

๐Ÿ˜ 3.1. Software Data Fault Tolerance


Hadoop์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ๋Œ€ํ•ด 3๊ฐœ์˜ ๋ณต์ œ๋ณธ(replica)์„ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณต์ œ๋ณธ๋“ค์€ ์„œ๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ์ €์žฅ๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋จธ์‹ , ๋‹ค๋ฅธ ๋ž™(Rack), ์‹ฌ์ง€์–ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— ๋ถ„์‚ฐ์‹œ์ผœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ ํŠน์ • ํ•˜๋“œ์›จ์–ด์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐฉ์‹์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์ฒซ์งธ, ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒŒ ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋” ๋งŽ์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Write ์ž‘์—… ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‘˜์งธ, 3๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์˜ 3๋ฐฐ ์ด์ƒ์˜ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ €์žฅ ๋น„์šฉ์ด ์ƒ๋‹นํžˆ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ ์ค‘ ํ•˜๋‚˜๋กœ Hadoop 3์—์„œ๋Š” Erasure Coding(์‚ญ์ œ ์ฝ”๋“œ) ๊ธฐ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ ์Šคํ† ๋ฆฌ์ง€ ํšจ์œจ์„ฑ๊ณผ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. (โ€ป Erasure Coding์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.)

๐Ÿ˜ 3.2. Hardware Data Fault Tolerance & RAID


Hadoop ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ๋ณต์ œ๋ณธ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์œ ์‹ค์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์‹œ์Šคํ…œ ์ „์ฒด์˜ ๋‚ด๊ฒฐํ•จ์„ฑ ์ˆ˜์ค€์„ ๋” ๋†’์ด๊ธฐ ์œ„ํ•ด ํ•˜๋“œ์›จ์–ด ์ฐจ์›์—์„œ์˜ ๋ณด์™„ ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” RAID(Redundant Array of Independent Disks) ๊ตฌ์„ฑ์„ ํ†ตํ•ด ํ•˜๋“œ์›จ์–ด ์ž์ฒด์—์„œ ์žฅ์• ์— ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด RAID-5๋‚˜ RAID-6 ๊ฐ™์€ ๋ฐฉ์‹์€ ๋””์Šคํฌ ์ผ๋ถ€์— ํŒจ๋ฆฌํ‹ฐ(Parity) ์ •๋ณด๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ, ํŠน์ • ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜์˜ Fault Tolerance๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์ˆ˜์ค€์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ RAID ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์ €์žฅ ๋˜๋Š” ๋ณต๊ตฌ ์‹œ ๋” ๋งŽ์€ ์‹œ์Šคํ…œ ์ž์›์ด ์†Œ๋ชจ๋˜๋ฏ€๋กœ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด, ๋ณธ๊ฒฉ์ ์ธ Hadoop ์˜ Eraser Coding ์„ ์•Œ์•„๋ณด๊ธฐ ์ „์—, RAID ์˜ ๊ฐœ๋…์„ ๊ฐ„๋‹จํ•˜๊ฒŒ๋‚˜๋งˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

โœ… RAID ๋ž€?

RAID๋Š” Redundant Array of Inexpensive Disks์˜ ์•ฝ์ž๋กœ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํ•˜๋“œ ๋””์Šคํฌ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ์žฅ์น˜๋กœ ๋ฌถ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋ง๋กœ๋Š” ๋ณดํ†ต ์ค‘๋ณต ๋ฐฐ์—ด ๋””์Šคํฌ ๋˜๋Š” ๋ณต์ˆ˜ ์ €๊ฐ€ํ˜• ๋””์Šคํฌ ๋ฐฐ์—ด์ด๋ผ๊ณ  ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, 1๊ฐœ์˜ Disk ๋ฅผ ๊ฐ€์ƒํ™”๋กœ ๊ฐ ๋…๋ฆฝ์ ์ธ ๋ฐฐ์—ด Drive ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ RAID ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ( ex - 1๊ฐœ์˜ Disk ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, C ๋“œ๋ผ์ด๋ธŒ์™€ D ๋“œ๋ผ์ด๋ธŒ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ. ) ํšŒ์‚ฌ by ํšŒ์‚ฌ๊ฒ ์ง€๋งŒ, ๋ณดํ†ต ํ˜„์—…์—์„œ๋Š” 1 Disk ๋‹น, 1 Drive ๋กœ Mapping ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

RAID๋Š” ๋””์Šคํฌ๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ€์ƒํ™”ํ•˜์—ฌ ๊ตฌ์„ฑํ•จ์œผ๋กœ์จ, ์„ฑ๋Šฅ(Performance), ์šฉ๋Ÿ‰(Capacity), ์‹ ๋ขฐ์„ฑ(Reliability) ์ธก๋ฉด์—์„œ ์‹œ์Šคํ…œ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์–ด I/O ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋ฉฐ, ์ผ๋ถ€ ๋””์Šคํฌ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ๋””์Šคํฌ์˜ ์ •๋ณด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

RAID ๊ตฌํ˜„ ๋ฐฉ์‹์€ ํฌ๊ฒŒ ํ•˜๋“œ์›จ์–ด RAID์™€ ์†Œํ”„ํŠธ์›จ์–ด RAID๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด RAID๋Š” ์ „์šฉ RAID ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RAID ๊ตฌ์„ฑ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์šด์˜์ฒด์ œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ์ž์› ์†Œ๋ชจ๊ฐ€ ์ ๊ณ  ์•ˆ์ •์„ฑ ๋ฐ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ „์šฉ ์žฅ๋น„๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ตฌ์ถ• ๋น„์šฉ์ด ๋†’๊ณ , ์ปจํŠธ๋กค๋Ÿฌ ๊ณ ์žฅ ์‹œ ์ „์ฒด ์‹œ์Šคํ…œ์ด ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด RAID๋Š” RAID ๊ธฐ๋Šฅ์„ ์šด์˜์ฒด์ œ๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ์ €๋ ดํ•˜๊ณ  ์„ค์ •์ด ์œ ์—ฐํ•˜์ง€๋งŒ, CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ์‹œ์Šคํ…œ ์ž์›์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, ์„ฑ๋Šฅ ๋ฉด์—์„œ๋Š” ํ•˜๋“œ์›จ์–ด RAID์— ๋น„ํ•ด ๋‹ค์†Œ ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RAID๋Š” ๊ตฌ์„ฑ ๋ฐฉ์‹์— ๋”ฐ๋ผ RAID 0, RAID 1, RAID 5, RAID 6, RAID 10 ๋“ฑ ์—ฌ๋Ÿฌ ๋ ˆ๋ฒจ๋กœ ๋‚˜๋‰˜๋ฉฐ, ๊ฐ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์ˆ˜์ค€, ์“ฐ๊ธฐ/์ฝ๊ธฐ ์„ฑ๋Šฅ, ๋””์Šคํฌ ์‚ฌ์šฉ ํšจ์œจ์„ฑ์— ๋”ฐ๋ผ ์„ ํƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ 0, 1, 5, 6, 10 ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์€ ํ•˜๋“œ์›จ์–ด RAID๋“  ์†Œํ”„ํŠธ์›จ์–ด RAID๋“  ๋‘˜ ๋‹ค์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” RAID ์˜ ์ข…๋ฅ˜ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ( Hadoop ๋‚ด์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์—, RAID ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ๋งŒ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. )


โœ… RAID 0

RAID0


์ถœ์ฒ˜ : RAID 0 Image



RAID 0์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋ถ„ํ• (striping)ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋“œ๋ผ์ด๋ธŒ์— ๋ถ„์‚ฐ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๋””์Šคํฌ์— ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋“œ๋ผ์ด๋ธŒ ์ˆ˜๋งŒํผ ๋™์‹œ์— ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, I/O ์„ฑ๋Šฅ์ด ๋งค์šฐ ์šฐ์ˆ˜ํ•˜๋ฉฐ ์ €์žฅ ๊ณต๊ฐ„์˜ ์†์‹ค๋„ ์—†์ด ์ „์ฒด ๋””์Šคํฌ ์šฉ๋Ÿ‰์„ ๋ชจ๋‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŒจ๋ฆฌํ‹ฐ ๊ณ„์‚ฐ์ด๋‚˜ ์ค‘๋ณต ์ €์žฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ RAID 0์€ ๋ฐ์ดํ„ฐ ์ค‘๋ณต(redundancy)์ด ์ „ํ˜€ ์—†๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ๋””์Šคํฌ๋ผ๋„ ๊ณ ์žฅ์ด ๋‚˜๋ฉด ํ•ด๋‹น ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ „์ฒด ํŒŒ์ผ์ด ์†์ƒ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด RAID 0์€ ์‹ ๋ขฐ์„ฑ๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ RAID 0์€ ๋ฐ์ดํ„ฐ ๋ณด์กด์ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์ž„์‹œ ์ž‘์—… ๊ณต๊ฐ„์ด๋‚˜ ๊ณ ์† ์บ์‹œ, ๋น„์ค‘์š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋“ฑ์— ํ™œ์šฉ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ณด๊ด€์ด๋‚˜ ๋ณต๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ ˆ๋Œ€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


โœ… RAID 1

RAID1


์ถœ์ฒ˜ : RAID 1 Image



RAID 1์€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ์— ๋™์ผํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ๋“œ๋ผ์ด๋ธŒ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„, ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ธŒ์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์œ ์‹ค ์—†์ด ์•ˆ์ •์ ์ธ ์šด์˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์žฅ์•  ํ—ˆ์šฉ(fault tolerance) ๋Šฅ๋ ฅ์ด RAID 0๋ณด๋‹ค ํ›จ์”ฌ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, RAID 1์€ ์ฝ๊ธฐ(Read) ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•œ ํŽธ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋‘ ๊ฐœ์˜ ๋””์Šคํฌ ์ค‘ ๋” ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ชฝ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ‘๋ ฌ ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์‘๋‹ต ์†๋„๊ฐ€ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ์“ฐ๊ธฐ(Write) ์„ฑ๋Šฅ์€ RAID 0์— ๋น„ํ•ด ๋А๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋“  ๋“œ๋ผ์ด๋ธŒ์— ์ค‘๋ณต ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ RAID 1์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์šฉ๋Ÿ‰์€ ์ ˆ๋ฐ˜ ์ˆ˜์ค€์ธ 50%์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1TB ๋””์Šคํฌ 2๊ฐœ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์‹ค์งˆ์ ์œผ๋กœ๋Š” 1TB์˜ ๊ณต๊ฐ„๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ RAID 1์€ ๋ฐ์ดํ„ฐ ์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๋ฉฐ, ์†๋„๋ณด๋‹ค ๊ฐ€์šฉ์„ฑ๊ณผ ๋ณต๊ตฌ ๊ฐ€๋Šฅ์„ฑ์„ ์šฐ์„ ์‹œํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก RAID 5, 6๋ฅผ ๋ฐฐ์šฐ๊ธฐ์ „์—, Parity ์— ๋Œ€ํ•˜์—ฌ

RAID 5์™€ RAID 6์€ ๋‹จ์ˆœ ๋ณต์ œ(RAID 1)๋‚˜ ๋ถ„์‚ฐ ์ €์žฅ(RAID 0)๊ณผ ๋‹ฌ๋ฆฌ, โ€˜ํŒจ๋ฆฌํ‹ฐ(Parity)โ€™๋ผ๋Š” ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด ํŒจ๋ฆฌํ‹ฐ๊ฐ€ RAID์˜ ํ•ต์‹ฌ์ ์ธ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋จผ์ € Parity๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด RAID 5/6์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Parity(ํŒจ๋ฆฌํ‹ฐ)๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋ฐ์ดํ„ฐ์˜ ์˜ค๋ฅ˜ ๊ฒ€์ถœ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋น„ํŠธ์ž…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ๋Š” 7๋น„ํŠธ์˜ ์›๋ž˜ ๋ฐ์ดํ„ฐ์— 1๋น„ํŠธ์˜ Parity Bit๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „์†ก ๋„์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Parity๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • Even Parity (์ง์ˆ˜ ํŒจ๋ฆฌํ‹ฐ): ์ „์ฒด ๋น„ํŠธ ์ค‘ 1์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ง์ˆ˜๊ฐ€ ๋˜๋„๋ก Parity Bit๋ฅผ ์„ค์ •
  • Odd Parity (ํ™€์ˆ˜ ํŒจ๋ฆฌํ‹ฐ): ์ „์ฒด ๋น„ํŠธ ์ค‘ 1์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ™€์ˆ˜๊ฐ€ ๋˜๋„๋ก Parity Bit๋ฅผ ์„ค์ •


๐Ÿ’ก Parity ์˜ˆ์‹œ: 7๋น„ํŠธ ๋ฐ์ดํ„ฐ โ†’ 8๋น„ํŠธ ํŒจ๋ฆฌํ‹ฐ ์ฒ˜๋ฆฌ

7 bits of data 1-bit count 8 bits (Even Parity) 8 bits (Odd Parity)
0000000 0 00000000 00000001
1010001 3 10100011 10100010
1101001 4 11010010 11010011
1111111 7 11111111 11111110

ํŒจ๋ฆฌํ‹ฐ ๋น„ํŠธ๋Š” ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜ ๊ฐ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, RAID ์‹œ์Šคํ…œ์—์„œ๋Š” ์žฅ์•  ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก Parity ๋ธ”๋ก์˜ ํŠน์ง•

์ฃผ๋กœ XOR ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ณต์ˆ˜์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก๋“ค์„ XOR ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ํŒจ๋ฆฌํ‹ฐ ๋ธ”๋ก์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ ํ•˜๋‚˜๊ฐ€ ๊ณ ์žฅ๋‚˜๋ฉด, ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ + ํŒจ๋ฆฌํ‹ฐ๋กœ ์œ ์‹ค๋œ ๋ธ”๋ก์„ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก XOR(๋ฐฐํƒ€์  ๋…ผ๋ฆฌํ•ฉ, Exclusive OR) ์—ฐ์‚ฐ : ๋‘ ๊ฐœ์˜ ๋น„ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ 1, ๊ฐ™์„ ๋•Œ๋Š” 0์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.
๐Ÿ’ก 0 โŠ• 0 = 0 ๊ทธ๋ฆฌ๊ณ , 1 โŠ• 1 = 0 ๊ทธ๋ฆฌ๊ณ , 0 โŠ• 1 = 1 ๊ทธ๋ฆฌ๊ณ , 1 โŠ• 0 = 1 ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก Parity ์˜ˆ์ œ: 5๊ฐœ์˜ ๋””์Šคํฌ ์ค‘ 1๊ฐœ๊ฐ€ ์žฅ์•  ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ

โญ• ์ •์ƒ ์ƒํƒœ ์˜ˆ์‹œ:

DISK 1 DISK 2 DISK 3 DISK 4 DISK 5 (Parity)
0 0 0 0 0 = 0โŠ•0โŠ•0โŠ•0
0 1 0 1 0 = 0โŠ•1โŠ•0โŠ•1
0 1 1 0 0 = 0โŠ•1โŠ•1โŠ•0
1 0 0 1 0 = 1โŠ•0โŠ•0โŠ•1
1 0 0 0 1 = 1โŠ•0โŠ•0โŠ•0

โŒ DISK 3 ์žฅ์•  ๋ฐœ์ƒ ์‹œ:

DISK 1 DISK 2 DISK 3 (โŒ) DISK 4 DISK 5 (Parity)
0 0 โŒ 0 0
0 1 โŒ 1 0
0 1 โŒ 0 0
1 0 โŒ 1 0
1 0 โŒ 0 1


๐Ÿ” Parity ๋ณต๊ตฌ ๋ฐฉ์‹

ํŒจ๋ฆฌํ‹ฐ๋Š” XOR ์—ฐ์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์œ ์‹ค๋œ ๋ธ”๋ก์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธ”๋ก๊ณผ ํŒจ๋ฆฌํ‹ฐ๋ฅผ XOR ํ•˜๋ฉด ์œ ์‹ค๋œ ๋ธ”๋ก ๊ฐ’์„ ์—ญ์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… RAID 5

๊ทธ๋Ÿผ ๋‹ค์‹œ RAID ๋กœ ๋Œ์•„์™€์„œ, ์ด๋ฒˆ์—๋Š” RAID 5์ž…๋‹ˆ๋‹ค.

RAID5


์ถœ์ฒ˜ : RAID 5 Image



RAID 5๋Š” ์ตœ์†Œ 3๊ฐœ ์ด์ƒ์˜ ๋“œ๋ผ์ด๋ธŒ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๋“œ๋ผ์ด๋ธŒ์— ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๋ฉฐ, ๊ฐœ๋ณ„ ๋ธ”๋ก์„ ํ†ต์งธ๋กœ ๋ณต์ œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ํŒจ๋ฆฌํ‹ฐ(parity) ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํŠน๋ณ„ํ•œ ๋ธ”๋ก์„ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ธŒ์— ๋ถ„์‚ฐ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ•˜๋‚˜์˜ ๋“œ๋ผ์ด๋ธŒ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ํ•ด๋‹น ๋“œ๋ผ์ด๋ธŒ์— ์žˆ๋˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์€ ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ธŒ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ํŒจ๋ฆฌํ‹ฐ ๋ธ”๋ก์„ ์ด์šฉํ•ด ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‹จ์ผ ๋“œ๋ผ์ด๋ธŒ ์žฅ์•  ์‹œ์—๋„ ์ œ๋กœ ๋‹ค์šดํƒ€์ž„(Zero downtime)์ด ๋ณด์žฅ๋˜๋ฉฐ, ์ฝ๊ธฐ ์„ฑ๋Šฅ๋„ ๋น ๋ฅธ ํŽธ์ž…๋‹ˆ๋‹ค.

RAID 5๋Š” ์ „์ฒด ๋””์Šคํฌ ์šฉ๋Ÿ‰ ์ค‘ ์•ฝ 33% (3๊ฐœ ๋“œ๋ผ์ด๋ธŒ ๊ธฐ์ค€)๋ฅผ ํŒจ๋ฆฌํ‹ฐ ์ €์žฅ ๊ณต๊ฐ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ RAID 1๊ณผ ๋น„๊ตํ•ด ๋” ๋†’์€ ์ €์žฅ ํšจ์œจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 3๊ฐœ์˜ 1TB ๋“œ๋ผ์ด๋ธŒ๋กœ RAID 5๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์ด 3TB์˜ ์šฉ๋Ÿ‰์ด ํ•„์š”ํ•˜์ง€๋งŒ, ์‹ค์ œ ์ €์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰์€ 2TB์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ๋””์Šคํฌ ๋ถ„๋Ÿ‰์ด ํŒจ๋ฆฌํ‹ฐ ์ €์žฅ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ 1TB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด, ์ตœ์†Œ 1.5TB ์ด์ƒ์˜ ์ด ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” 4๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ๋กœ ๊ตฌ์„ฑํ•ด ์•ฝ 25%์˜ ์šฉ๋Ÿ‰ ์†์‹ค๋กœ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 4๊ฐœ์˜ 1TB ๋“œ๋ผ์ด๋ธŒ๋ฅผ RAID 5๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ์ด 4TB ์šฉ๋Ÿ‰ ์ค‘ 3TB๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ํŒจ๋ฆฌํ‹ฐ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์€ ๋‹ค์†Œ ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ๋™์‹œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

RAID 5๋Š” ์ตœ๋Œ€ 16๊ฐœ ๋“œ๋ผ์ด๋ธŒ๊นŒ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋””์Šคํฌ ์ˆ˜๊ฐ€ ์ œํ•œ๋œ ํŒŒ์ผ ์„œ๋ฒ„๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ์ ํ•ฉํ•œ ๊ตฌ์„ฑ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

4๊ฐœ์˜ ๋””์Šคํฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ๊ฐ ๋””์Šคํฌ์—๋Š” ๋ฐ์ดํ„ฐ ์กฐ๊ฐ๊ณผ ํ•จ๊ป˜ ํŒจ๋ฆฌํ‹ฐ๋ผ๋Š” ํŠน๋ณ„ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋ฆฌํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ โ€˜์ฒดํฌํฌ์ธํŠธโ€™ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋””์Šคํฌ 1์—๋Š” ์ˆซ์ž 5, ๋””์Šคํฌ 2์—๋Š” ์ˆซ์ž 7, ๋””์Šคํฌ 3์—๋Š” ์ˆซ์ž 3์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ๋””์Šคํฌ 4์—๋Š” ์ด ์ˆซ์ž๋“ค์„ XOR ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ์ธ ํŒจ๋ฆฌํ‹ฐ ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋””์Šคํฌ 2๊ฐ€ ๊ณ ์žฅ ๋‚˜์„œ ์ˆซ์ž 7์„ ์žƒ์–ด๋ฒ„๋ ธ๋‹ค๋ฉด, ๋‚˜๋จธ์ง€ ์ˆซ์ž๋“ค๊ณผ ํŒจ๋ฆฌํ‹ฐ ๊ฐ’์„ ์ด์šฉํ•ด ์žƒ์–ด๋ฒ„๋ฆฐ ์ˆซ์ž 7์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ RAID 5๋Š” ํ•˜๋‚˜์˜ ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ ๋‚˜๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์ง€ ์•Š๊ณ  ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


โœ… RAID 6

RAID5


์ถœ์ฒ˜ : RAID 6 Image



RAID 6๋Š” RAID 5์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์ด์ง€๋งŒ, ํŒจ๋ฆฌํ‹ฐ(parity) ๋ธ”๋ก์ด ๋‘ ๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ์— ๋‚˜๋ˆ„์–ด ์ €์žฅ๋œ๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, RAID 5์—์„œ ์‚ฌ์šฉ๋˜๋Š” XOR ์—ฐ์‚ฐ ๋Œ€์‹ ์— Reed-Solomon ๋ถ€ํ˜ธ๋ผ๋Š” ๋” ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

RAID 6๋Š” ์ตœ์†Œ 4๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ๋™์‹œ์— ๋‘ ๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์„ฑ๋Šฅ์€ RAID 5์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ํŒจ๋ฆฌํ‹ฐ ๋ธ”๋ก์ด ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์„ฑ๋Šฅ์€ RAID 5๋ณด๋‹ค ๋А๋ฆฐ ํŽธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— RAID 6๋Š” ์ฝ๊ธฐ ์œ„์ฃผ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋งŽ์€ ์›น ์„œ๋ฒ„์— ์ ํ•ฉํ•˜๋ฉฐ, ์“ฐ๊ธฐ ์ž‘์—…์ด ๋นˆ๋ฒˆํ•œ ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก Reed-Solomon ๋ถ€ํ˜ธ๋ž€? ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ์•„์ง ์ •ํ™•ํžˆ ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋˜๊ฑฐ๋‚˜ ์ผ๋ถ€๊ฐ€ ์‚ฌ๋ผ์ ธ๋„, ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์›๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.



ํ•˜๋‚˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

4๊ฐœ์˜ ๋””์Šคํฌ๋กœ RAID 6๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด๋•Œ, ๋ฐ์ดํ„ฐ ๋ธ”๋ก๋ฟ ์•„๋‹ˆ๋ผ ๋‘ ์ข…๋ฅ˜์˜ ํŒจ๋ฆฌํ‹ฐ ์ •๋ณด๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋‘ ๋””์Šคํฌ์— ๋‚˜๋ˆ„์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋””์Šคํฌ 1๊ณผ ๋””์Šคํฌ 2์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ๋””์Šคํฌ 3๊ณผ ๋””์Šคํฌ 4์—๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํŒจ๋ฆฌํ‹ฐ ์ •๋ณด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋””์Šคํฌ 2์™€ ๋””์Šคํฌ 4๊ฐ€ ๋™์‹œ์— ๊ณ ์žฅ ๋‚˜๋”๋ผ๋„, ๋‚˜๋จธ์ง€ ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์™€ ๋‘ ์ข…๋ฅ˜์˜ ํŒจ๋ฆฌํ‹ฐ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์†์‹ค๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ RAID 6๋Š” ํ•œ ๋ฒˆ์— ๋‘ ๊ฐœ์˜ ๋””์Šคํฌ ์žฅ์• ๊นŒ์ง€ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์–ด, ๋” ๋†’์€ ์•ˆ์ •์„ฑ์ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


โœ… RAID 10

RAID10


์ถœ์ฒ˜ : RAID 10 Image



RAID 10์€ RAID 0๊ณผ RAID 1์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ( ๊ทธ๋ž˜์„œ RAID 10 ์ด ์•„๋‹ˆ๋ผ, RAID 1 + 0 ์ด๋ผ๊ณ  ๋ณด๋Š”๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค :D ) ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ๋Œ€ํ•ด ๋ณต์ œ๋ณธ์„ ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ธŒ์— ์œ ์ง€ํ•˜๋ฉด์„œ, ์ „์ฒด ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์„œ๋กœ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋“œ๋ผ์ด๋ธŒ์— ๋‚˜๋ˆ„์–ด ๋ถ„๋ฐฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ตœ์†Œ 4๊ฐœ์˜ ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

RAID 10์€ RAID 0 ์ˆ˜์ค€์˜ ๋น ๋ฅธ ์†๋„์™€ RAID 1 ์ˆ˜์ค€์˜ ๋†’์€ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๋™์‹œ์— ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋“œ๋ผ์ด๋ธŒ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ณต์ œ๋ณธ์ด ์œ ์ง€๋œ ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ๋Š” RAID 1๊ณผ ๋™์ผํ•˜๊ฒŒ 50%๋งŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด, RAID 5๋‚˜ RAID 6์— ๋น„ํ•ด ์ €์žฅ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋น„์šฉ์ด ๋” ๋†’๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… RAID ํŠน์ง•๋“ค์„ ๊ฐ„๋‹จํžˆ ํ‘œ๋กœ ์ •๋ฆฌ

ํŠน์ง• RAID 0 RAID 1 RAID 5 RAID 6 RAID 10
์ตœ์†Œ ๋“œ๋ผ์ด๋ธŒ ์ˆ˜ 2 2 3 4 4
๋‚ด๊ฒฐํ•จ์„ฑ ์—†์Œ ๋‹จ์ผ ๋“œ๋ผ์ด๋ธŒ ์žฅ์•  ๊ฐ€๋Šฅ ๋‹จ์ผ ๋“œ๋ผ์ด๋ธŒ ์žฅ์•  ๊ฐ€๋Šฅ ๋‘ ๊ฐœ ๋“œ๋ผ์ด๋ธŒ ์žฅ์•  ๊ฐ€๋Šฅ ๊ฐ ์„œ๋ธŒ์–ด๋ ˆ์ด๋ณ„ 1๊ฐœ ์žฅ์•  ๊ฐ€๋Šฅ
์ฝ๊ธฐ ์„ฑ๋Šฅ ๋†’์Œ ์ค‘๊ฐ„ ๋‚ฎ์Œ ๋‚ฎ์Œ ๋†’์Œ
์“ฐ๊ธฐ ์„ฑ๋Šฅ ๋†’์Œ ์ค‘๊ฐ„ ๋‚ฎ์Œ ๋‚ฎ์Œ ์ค‘๊ฐ„
์šฉ๋Ÿ‰ ํ™œ์šฉ๋„ 100% 50% 67% ~ 94% 50% ~ 88% 50%
์ฃผ์š” ์‚ฌ์šฉ์ฒ˜ ๊ณ ์„ฑ๋Šฅ ์›Œํฌ์Šคํ…Œ์ด์…˜, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์šด์˜์ฒด์ œ, ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค, ์›น์„œ๋ฒ„, ์•„์นด์ด๋น™ ๋ฐ์ดํ„ฐ ๋ฐฑ์—…, ๊ณ ๊ฐ€์šฉ์„ฑ ์„œ๋ฒ„ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ ์„œ๋ฒ„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„

๋‚ด๊ฒฐํ•จ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•œ๋‹ค๋ฉด RAID 5, RAID 6, RAID 10 ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, RAID 10์€ ์šฉ๋Ÿ‰ ์†์‹ค์ด ํฌ๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„์‹ค์ ์œผ๋กœ๋Š” RAID 5๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์„ ํƒํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค.


๐Ÿ˜ 3.3. Hadoopโ€™s Eraser Coding


์ด์ œ ํ•˜๋‘ก์—์„œ Erasure Coding์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ๊ณต๋ถ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‘ก์€ Replication์„ ์œ„ํ•œ ๋ณต์ œ ๋ฐ์ดํ„ฐ๋ฅผ 2๊ฐœ๊นŒ์ง€ ๋ณต์‚ฌํ•ด๋‘ก๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ์•  ๋Œ€์‘์— ํšจ๊ณผ์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, Disk ํ™œ์šฉ ๋ฉด์—์„œ๋Š” ์ตœ์•…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์„ ํ†ตํ‹€์–ด 1TB ์ •๋„ ๊ณต๊ฐ„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, Replication์„ ์œ„ํ•œ ๋ณต์ œ๋ณธ๊นŒ์ง€ ๋‹ด๊ธฐ ์œ„ํ•ด, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” 333.33GB๋ฐ–์— ๋‹ด์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Hadoop V3๋ถ€ํ„ฐ๋Š” Erasure Coding ๋ฐฉ๋ฒ•์„ ๊ธฐ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

RAID๋Š” ํ•˜๋“œ์›จ์–ด ๋ฐฉ์‹๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ํ•˜๋“œ์›จ์–ด RAID๋Š” ๋ณ„๋„์˜ RAID ์ปจํŠธ๋กค๋Ÿฌ ์นด๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํŒจ๋ฆฌํ‹ฐ ๊ณ„์‚ฐ์ด๋‚˜ ์ฝ๊ธฐยท์“ฐ๊ธฐ ์ž‘์—…์„ ์ „๋‹ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ์˜ CPU์— ๋ถ€๋‹ด์„ ์ฃผ์ง€ ์•Š๊ณ  ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปจํŠธ๋กค๋Ÿฌ ์นด๋“œ ์ž์ฒด๊ฐ€ ๊ณ ๊ฐ€๋ผ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด RAID๋Š” ๊ธฐ์กด ์ปดํ“จํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋””์Šคํฌ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด ์—†์ด๋„ RAID๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ž‘์—…์ด CPU ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ž‘์—…๋“ค๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜๋ˆ„๊ฒŒ ๋˜์–ด ์ „๋ฐ˜์ ์ธ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



erasurecoding1


์ถœ์ฒ˜ : Hadoop Erasure Coding Image 1


๐Ÿ’ก ์ค‘์š” ๐Ÿ’ก
N: ๋ช‡๊ฐœ์˜ chunk ๋กœ ๋‚˜๋ˆŒ์ง€
K: ๋ช‡๊ฐœ์˜ parity ๋กœ ๊ตฌ์„ฑํ• ์ง€
RS(N,K) ๋กœ ํ‘œํ˜„ํ•จ.



Hadoop์˜ Erasure Coding์€ RAID ๋ฐฉ์‹์„ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. RAID 5๋‚˜ RAID 6์ฒ˜๋Ÿผ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด์ง€๋งŒ, ํŒจ๋ฆฌํ‹ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์—์„œ ์ฐจ์ด๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , Reed-Solomon๊ณผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ํŒจ๋ฆฌํ‹ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์ˆ˜์ค€์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๊ธฐ์กด RAID์™€ ์ฐจ๋ณ„ํ™”๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, n๊ฐœ์˜ ๋ธ”๋ก์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ , ์—ฌ๊ธฐ์— ๋Œ€ํ•ด k๊ฐœ์˜ ํŒจ๋ฆฌํ‹ฐ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ด n+k๊ฐœ์˜ ๋ธ”๋ก ์ค‘ ์ตœ๋Œ€ k๊ฐœ์˜ ๋ธ”๋ก์ด ์†์‹ค๋˜๋”๋ผ๋„ n๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ RS(n, k) ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.



erasurecoding2


์ถœ์ฒ˜ : Hadoop Erasure Coding Image 2


์œ„ ๊ทธ๋ฆผ์€ Hadoop์—์„œ Erasure Coding ์ด ์ ์šฉ๋˜๊ธฐ ์ „๊ณผ ํ›„์˜ ๋ธ”๋ก ๊ตฌ์กฐ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
์ฆ‰, ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ธ”๋ก(Logical Block)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจ๋ฆฌํ‹ฐ(parity)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์˜ ๋ณ€ํ™”๋ฅผ ์„ค๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ ๋กœ ๋…ผ๋ฆฌ์  ๋ธ”๋ก ํฌ๊ธฐ ์ž์ฒด๋Š” Erasure Coding ๊ฐ€ ์ ์šฉ๋˜๋”๋ผ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋จผ์ €, Contiguous Block ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๋ธ”๋ก์ด ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ ๋ธ”๋ก(Storage Block)์— ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ด ๊ตฌ์กฐ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ Erasure Coding ์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฐ๋‚ด์–ด ์—ฌ๋Ÿฌ ๋””์Šคํฌ์— ๋ถ„์‚ฐ์‹œ์ผœ์•ผ ํ•˜๋ฏ€๋กœ, ์ด๋ ‡๊ฒŒ ๋‹จ์ผ ๋ธ”๋ก์— ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์—์„œ๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋‚˜ ํŒจ๋ฆฌํ‹ฐ ๋ถ„์‚ฐ ์ €์žฅ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ธ”๋ก ๋‹จ์œ„๋กœ๋งŒ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋‚˜ IO ๋ถ„์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, Striped Block ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๋ธ”๋ก์„ ๋” ์ž‘์€ ๋‹จ์œ„์ธ ์…€(cell)๋กœ ์ชผ๊ฐ  ๋‹ค์Œ,
์ด ์…€๋“ค์„ stripe(์—ฌ๋Ÿฌ ์…€๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ)๋กœ ๊ตฌ์„ฑํ•ด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šคํ† ๋ฆฌ์ง€ ๋ธ”๋ก ์„ธํŠธ์— ๋ผ์šด๋“œ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋ˆ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ์–‡๊ฒŒ ์ฐ์–ด์„œ ์—ฌ๋Ÿฌ ๋””์Šคํฌ์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ์‹œ์ผœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ์„ ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๋ธ”๋ก์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ์…€์„ ๋ณ‘๋ ฌ๋กœ ๋™์‹œ์— ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
์ฝ๊ธฐ ์†๋„(read performance)๊ฐ€ ๊ธฐ์กด ๊ตฌ์กฐ๋ณด๋‹ค ๋” ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹ ๋•๋ถ„์— ๋‹จ์ผ ๋ธ”๋ก์— ๋Œ€ํ•ด์„œ๋„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ,
์„ฑ๋Šฅ ํ–ฅ์ƒ์ด๋ผ๋Š” ์ธก๋ฉด์—์„œ๋„ ํšจ๊ณผ๊ฐ€ ํฝ๋‹ˆ๋‹ค.


โœ… Erasure Coding ์˜ ์žฅ์ 

Erasure Coding์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๋Šฅ๋ ฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ €์žฅ ๊ณต๊ฐ„์„ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
๊ธฐ์กด์˜ Hadoop์€ ์žฅ์•  ๋Œ€๋น„๋ฅผ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋ธ”๋ก์„ 3๊ฐœ๊นŒ์ง€ ๋ณต์ œ(3-way replication) ํ•˜๋‹ค ๋ณด๋‹ˆ,
์ „์ฒด ์ €์žฅ ๊ณต๊ฐ„์˜ 2/3๊ฐ€ ๋ณต์ œ๋ณธ ์ €์žฅ์— ์†Œ๋ชจ๋˜๋Š” ๋น„ํšจ์œจ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ EC๋ฅผ ๋„์ž…ํ•˜๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด RS(6,3)์ฒ˜๋Ÿผ 6๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก๊ณผ 3๊ฐœ์˜ ํŒจ๋ฆฌํ‹ฐ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด ์ด 9๊ฐœ์˜ ๋ธ”๋ก์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ 3๊ฐœ์˜ ๋ธ”๋ก์ด ์†์ƒ๋˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ๋ธ”๋ก์œผ๋กœ ์›๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๊ณ ,
์ „์ฒด ์ €์žฅ ๊ณต๊ฐ„์˜ ํ™œ์šฉ๋ฅ ๋„ ํ›จ์”ฌ ๋†’์•„์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.



erasurecoding3


์ถœ์ฒ˜ : Hadoop Erasure Coding ๋น„๊ต ํ‘œ



ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, RS(10, 4) ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, ์Šคํ† ๋ฆฌ์ง€์˜ 40%๋งŒ์„ ๋ณต์›์„ ์œ„ํ•ด ์“ฐ๊ฒŒ ๋˜์ง€๋งŒ, ๊ธฐ์กด ๋ฐฉ์‹๋Œ€๋กœ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด 200%๋ฅผ ๋ณต์›์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ๊ทน๋ช…ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ‘œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



erasurecoding4


์ถœ์ฒ˜ : EC ์ ์šฉ ์ „ ํ›„์— ๋Œ€ํ•œ Read ์„ฑ๋Šฅ ์ง€ํ‘œ

๋˜ํ•œ ์•ž์„œ ์„ค๋ช…ํ•œ Striped Block ๊ตฌ์กฐ ๋•๋ถ„์— ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ,
ํŒŒ์ผ์„ ์ฝ๋Š” ์„ฑ๋Šฅ์ด ๊ธฐ์กด๋ณด๋‹ค ๋” ๊ฐœ์„ ๋˜๋Š” ๊ฒฐ๊ณผ๋„ ํ•จ๊ป˜ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•œ ์„ฑ๋Šฅ ์ง€ํ‘œ ์ฐธ๊ณ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.


โœ… Erasure Coding ์˜ ๋‹จ์ 

๋ฌผ๋ก  ๋‹จ์ ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
RAID์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋‹จ์ˆœ ๋ณต์ œ ๋ฐฉ์‹์— ๋น„ํ•ด Erasure Coding ์€ ๋” ๋งŽ์€ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” ํŒจ๋ฆฌํ‹ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ธ์ฝ”๋”ฉ(encoding) ์ž‘์—…์ด ํ•„์š”ํ•˜๊ณ ,
์†์ƒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ๋•Œ๋Š” ๋””์ฝ”๋”ฉ(decoding) ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
ํŠนํžˆ ์“ฐ๊ธฐ ์„ฑ๋Šฅ(write performance) ๋ฉด์—์„œ๋Š” ๊ธฐ์กด๋ณด๋‹ค ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋‹จ์ ๋„ ์™„์ „ํžˆ ํ•ด๊ฒฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
Intel์—์„œ ์ œ๊ณตํ•˜๋Š” ISA-L encoder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋•๋ถ„์—,
ํŒจ๋ฆฌํ‹ฐ ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๊ฐœ์„ ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์–ด๋А ์ •๋„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ ์ธก์ •ํ•ด๋ณด๋ฉด, ์“ฐ๊ธฐ ์„ฑ๋Šฅ์€ ์•ฝ 30% ์ •๋„๋งŒ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.



erasurecoding5


์ถœ์ฒ˜ : 100GB ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์ง€ํ‘œ



ํ•ด๋‹น ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ ISA-L(์ธํ…”์˜ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ์‚ฌ์šฉ ์‹œ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค. ํŒจ๋ฆฌํ‹ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ธ์ฝ”๋”ฉ ๋ถ€๋‹ด์ด ์ปค์ ธ ๊ธฐ๋ณธ์ ์œผ๋กœ ์“ฐ๊ธฐ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜์ง€๋งŒ, ISA-L ๋•๋ถ„์— ์ด๋ฅผ ์ƒ๋‹น ๋ถ€๋ถ„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•˜๋‘ก์—์„œ Erasure Coding์„ ์“ธ ๋•Œ ISA-L ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ์ตœ์ ํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์™„ํ™”ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ˜ 3.4. FIFO Queue vs Fair Call Queue


Hadoop๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์‹œ์— ์„œ๋ฒ„(NameNode, DataNode ๋“ฑ)์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์š”์ฒญ๋“ค์€ ๊ณง๋ฐ”๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์—†๊ณ , ์ž ์‹œ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ Call Queue (์š”์ฒญ ํ) ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ์š”์ฒญ ํ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ ์ž‘์—… ์š”์ฒญ์„ ์ž„์‹œ๋กœ ๋ณด๊ด€ํ•˜๊ณ , ์„œ๋ฒ„์˜ ๊ฐ€์šฉํ•œ ๋ฆฌ์†Œ์Šค์— ๋งž์ถฐ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€๊ธฐ์—ด ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.


โœ… FIFO Queue๋ž€?

fifoqueue


์ถœ์ฒ˜ : FIFO Queue

FIFO (First-In-First-Out) Queue๋Š” ๋จผ์ € ๋“ค์–ด์˜จ ์š”์ฒญ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์˜ ํ(queue)์ž…๋‹ˆ๋‹ค.
Hadoop์—์„œ Fair Call Queue๊ฐ€ ๋„์ž…๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ์ด ๋‹จ์ผ FIFO ํ์— ์ €์žฅํ•œ ๋’ค, ์š”์ฒญ ๋„์ฐฉ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์„ค์ •์€ core-site.xml ์—์„œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ( * ์„ค์ •์ด ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์œผ๋กœ๋Š” FIFO Queue ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. )

<property>
  <name>ipc.server.callqueue.class</name>
  <value>org.apache.hadoop.ipc.FifoCallQueue</value>
  <description>RPC ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ FIFO Queue๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •</description>
</property>

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ž‘์—… ์š”์ฒญ์ด ๋„์ฐฉํ•˜๋ฉด, Reader Thread๊ฐ€ ์ด ์š”์ฒญ์„ ํ•˜๋‚˜์˜ FIFO ํ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Handler๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋˜๋ฉด, ์ด ํ์—์„œ ๋งจ ์•ž์— ์žˆ๋Š” ์š”์ฒญ์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์–ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์˜ ์˜ˆ์‹œ๋กœ๋Š” ์ •๋ณด ์กฐํšŒ๋‚˜, ์ƒ์„ฑ, append ์ž‘์—…, ํŒŒ์ผ๋ฆฌ์ŠคํŠธ ์กฐํšŒ(๋Œ€๊ทœ๋ชจ์˜ ๊ฒฝ์šฐ ๋ณ‘๋ชฉ ๋ฐœ์ƒ), ๋ณ€๊ฒฝ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•œ ์ž‘์—…์ด๋“ , hdfs dfs ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•œ ์ž‘์—…์ด๋“  ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜๊ณ  ๊ตฌํ˜„์ด ์‰ฌ์šฐ๋ฉฐ, ์š”์ฒญ ์ˆœ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฌ๊ฐํ•œ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณต์ •์„ฑ๊ณผ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.


โœ… FIFO Queue ์˜ ๋‹จ์ 

FIFO ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š”, ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋Ÿ‰์˜ ์š”์ฒญ.. ํ˜น์€ ๋ฌด๊ฑฐ์šด ์š”์ฒญ์„ ์ „์†กํ•  ๊ฒฝ์šฐ ํ๋ฅผ ์‚ฌ์‹ค์ƒ ์ ๋ นํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ heavy user๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์˜ ์š”์ฒญ์€ ๋’ค๋กœ ๋ฐ€๋ ค, ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค.


โ›”๏ธ ์˜ˆ: ํ•˜๋‚˜์˜ ์œ ์ €๊ฐ€ ์ˆ˜์ฒœ ๊ฐœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ์ €์˜ ์š”์ฒญ์€ ํ•ด๋‹น ์š”์ฒญ ๋’ค์— ๋Œ€๊ธฐํ•˜๊ฒŒ ๋˜์–ด ์ˆ˜๋ฐฑ ms ์ด์ƒ์˜ ์ง€์—ฐ ๋ฐœ์ƒ



๋˜ํ•œ, Hadoop์˜ NameNode๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ๋กœ, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  read, write, create, delete ์š”์ฒญ์ด ์ด ๋…ธ๋“œ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ FIFO Queue ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์š”์ฒญ๋“ค์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ณ , ๋ชจ๋“  ์š”์ฒญ์ด ํ•˜๋‚˜์˜ ์ค„์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘๋ชฉ์ด ๋งค์šฐ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๊ณผ๊ฑฐ ํ•˜๋‘ก์„ ์šด์˜ํ•˜๋Š” ์—…์ฒด๋“ค์€ ์ˆ˜๋งŽ์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ˆ˜ ms~์ˆ˜๋ฐฑ ms ๋‹จ์œ„์˜ ์‘๋‹ต ์ง€์—ฐ์ด ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ, ์ด๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด๊ฒฝ์šฐ ๊ณผ๊ฑฐ์—๋Š” ํ๋ฅผ ๋…์ ํ•œ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ(kill) ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ kill ์„ ํ•ด๋ฒ„๋ฆฌ๋ฉด, ์ด๋ฏธ ์ฒ˜๋ฆฌ ์ค‘์ด๋˜ ์š”์ฒญ์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์†์ƒ์ด ์ƒ๊ธฐ๊ฑฐ๋‚˜, ์ข…๋ฃŒ ๋„์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์žฌ์‹œ๋„ ์‹คํŒจ, ๊ทธ๋ฆฌ๊ณ  ์‹ฌํ•œ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด๊ฐ€ ์ˆ˜ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฉˆ์ถ”๋Š” ์ƒํ™ฉ๊นŒ์ง€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

fifoqueue_error


์ถœ์ฒ˜ : FIFO Queue ์˜ ๋ฌธ์ œ์  ๋น„๊ต ํ†ต๊ณ„



๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๋Œ€๋Ÿ‰ ์š”์ฒญ์ด ์‚ฌ์šฉ์ž์˜ ์ž˜๋ชป๋œ MapReduce ์ž‘์—…์— ์˜ํ•ด ์ž์ฃผ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์˜๋„ํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„, ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ณผ๋„ํ•œ ์š”์ฒญ์„ ๋ฐœ์ƒ์‹œ์ผœ ์‹œ์Šคํ…œ ์ „์ฒด์— ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€, ์˜๋„์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ DDoS ๊ณต๊ฒฉ์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ์„ ๋งˆ๋น„์‹œํ‚ค๋Š” ์•…์˜์ ์ธ ํ–‰์œ„๋„ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹จ์ˆœํ•œ FIFO ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ๊ณต์ •์„ฑ ๊ฒฐ์—ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ณด์•ˆ ์ธก๋ฉด์—์„œ๋„ ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก DDos ๋ž€?: ๋ถ„์‚ฐ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ์œผ๋กœ, ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ(๋ถ„์‚ฐ๋œ ์—ฌ๋Ÿฌ ๊ณต๊ฒฉ์ž)๊ฐ€ ๋™์‹œ์— ํŠน์ • ์„œ๋ฒ„๋‚˜ ๋„คํŠธ์›Œํฌ์— ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์ •์ƒ์ ์ธ ์„œ๋น„์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉํ•ดํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.


โœ… Fair Call Queue ๋ž€?

faircallqueue


์ถœ์ฒ˜ : Fair Call Queue



Hadoop์—์„œ ๊ธฐ์กด์˜ FIFO Queue๊ฐ€ ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด, ๋ผ์šฐํ„ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” QoS(Quality of Service) ๊ธฐ๋Šฅ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ FIFO Queue๋ฅผ Fair Call Queue๋กœ ๊ต์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

QoS๋Š” ๋„คํŠธ์›Œํฌ ์žฅ๋น„์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•ด ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ ์ ˆํ•œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ Hadoop์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ์ ์šฉํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ๋ณ„ ์š”์ฒญ์ด ๊ณต์ •ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ , ํŠน์ • ํด๋ผ์ด์–ธํŠธ์˜ ๊ณผ๋„ํ•œ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์ „์ฒด ์„œ๋น„์Šค๊ฐ€ ์ง€์—ฐ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์„ค์ •์€ core-site.xml ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<property>
  <name>ipc.server.callqueue.class</name>
  <value>org.apache.hadoop.ipc.FairCallQueue</value>
  <description>RPC ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ Fair Call Queue๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •</description>
</property>

Fair Call Queue๋Š” ํฌ๊ฒŒ scheduler, multiplexer , ๊ทธ๋ฆฌ๊ณ  multi-level queue ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • RPC Scheduler
    ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ณ„ ํ์— ๋‹ด๊ธด ์š”์ฒญ๋“ค์„ ์ ์ ˆํ•œ ๋น„์œจ๋กœ ์„ ํƒํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ๊ณต์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ , ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฐฐํ•˜์—ฌ ์‘๋‹ต ์ง€์—ฐ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • Multi-level Queue
    ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ ์š”์ฒญ๋“ค์ด ๋“ค์–ด๊ฐ€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ๋กœ, ํด๋ผ์ด์–ธํŠธ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๋Œ€๊ธฐ์—ด์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    ์ด 4๋‹จ๊ณ„์˜ ํ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (priority 0 ~ 3)

  • RPC Multiplexer
    ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋“ค์„ ๋ฐ›์•„ ๊ฐ๊ฐ์˜ ํด๋ผ์ด์–ธํŠธ๋ณ„ ํ๋กœ ๋ถ„๋ฐฐํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    ์ฆ‰, ์š”์ฒญ์„ ํ•œ ๊ณณ์— ๋ชฐ์•„๋‘์ง€ ์•Š๊ณ  ๊ฐ ์‚ฌ์šฉ์ž๋ณ„๋กœ ์š”์ฒญ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•๋ถ„์— Fair Call Queue๋Š” ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ณผ๋„ํ•œ ์š”์ฒญ์ด ์ „์ฒด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์™„ํ™”ํ•˜๋ฉฐ, Hadoop ํด๋Ÿฌ์Šคํ„ฐ์˜ ์•ˆ์ •์„ฑ๊ณผ ์‘๋‹ต์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.


โœ… Fair Call Queue - RPC Scheduler

ํด๋ผ์ด์–ธํŠธ์˜ RPC ์š”์ฒญ์ด Listen Queue์— ๋„์ฐฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Reader Thread๊ฐ€ ์š”์ฒญ์„ RpcScheduler์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. RpcScheduler๋Š” ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Priority Queue๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์š”์ฒญ์€ ์šฐ์„ ์ˆœ์œ„(priority)๋ฅผ ๊ณ„์‚ฐํ•œ ๋’ค, ํ•ด๋‹น Priority Queue์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. RPC Scheduler๋Š” pluggable ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์–ด, ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RPC Scheduler ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋Š” DecayRpcScheduler์ž…๋‹ˆ๋‹ค. ( ๊นƒํ—ˆ๋ธŒ ์ฝ”๋“œ )

DecayRpcScheduler๋Š” ๊ฐ ์‚ฌ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š”์ง€๋ฅผ ์ถ”์ ํ•˜๊ณ , ์ด ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์˜ค๋ž˜ ์ „์— ๋ณด๋‚ธ ์š”์ฒญ์€ ์ค‘์š”๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ˆ˜์น˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š”(decay) ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘ ๊ณผ์ •์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์‚ฌ์šฉ์ž๊ฐ€ RPC ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค, ๊ทธ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์š”์ฒญ ํšŸ์ˆ˜(count)๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ 5์ดˆ๋งˆ๋‹ค(sweep period) ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์š”์ฒญ ์ˆ˜๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ˆœํžˆ ์š”์ฒญ ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด ์š”์ฒญ ์ˆ˜์— Decay Factor๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๊ธฐ์กด ์š”์ฒญ ์ˆ˜๊ฐ€ 10์ด๊ณ  decay factor๊ฐ€ 0.5๋ผ๋ฉด 10 ร— 0.5 ๋ฅผ ํ•ด์„œ 5 ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ Decay ๋œ ๊ฐ’์— ์ด๋ฒˆ sweep ์ฃผ๊ธฐ ๋™์•ˆ ์ƒˆ๋กญ๊ฒŒ ๋“ค์–ด์˜จ ์š”์ฒญ ์ˆ˜๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค. Decay ๋œ ๊ฐ’์ด 5์ด๊ณ , ์ƒˆ ์š”์ฒญ์ด 4๊ฑด์ด๋ฉด 5 + 4 ํ•ด์„œ 9 ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ decay๋œ ์š”์ฒญ ์ˆ˜๋ฅผ ํ•ฉ์‚ฐํ•˜์—ฌ ์ „์ฒด ์š”์ฒญ๋Ÿ‰์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„(priority)๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์‚ฐ๋œ ์šฐ์„ ์ˆœ์œ„๋Š” ์บ์‹œ์— ์ €์žฅ๋˜์–ด ๋‹ค์Œ sweep ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋ฉฐ, ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋Š” ์ด priority๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ์ ˆํ•œ priority queue์— ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ƒˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋“ฑ์žฅํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด, ์ด์ „ ์บ์‹œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— on-the-fly๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ๋„ ์ „์ฒด ์š”์ฒญ ๋Œ€๋น„ ๋น„์œจ์„ ๋”ฐ์ ธ์„œ ์ž„์‹œ๋กœ priority๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Sweep ์ฃผ๊ธฐ๋Š” 5์ดˆ, Decay Factor ๋Š” 0.5๋กœ ์žก์€ ์ƒํƒœ์—์„œ 3๋ช…์˜ User ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์š”์ฒญ ์ˆ˜ ๋ณ€ํ™” ๋ฐ ์šฐ์„ ์ˆœ์œ„ ๊ณ„์‚ฐ ์˜ˆ์‹œ

์‹œ๊ฐ„(์ดˆ) ์‚ฌ์šฉ์ž ์ด์ „ ์š”์ฒญ ์ˆ˜ Decay ์ ์šฉ ํ›„ ์ƒˆ ์š”์ฒญ ์ˆ˜ ํ˜„์žฌ ์š”์ฒญ ์ˆ˜ (Decay + ์ƒˆ ์š”์ฒญ) ์ „์ฒด ํ•ฉ ์ „์ฒด ๋Œ€๋น„ ๋น„์œจ Priority
0 userA 0 - 10 10 24 41.7% 2
0 userB 0 - 8 8 ย  33.3% 2
0 userC 0 - 6 6 ย  25.0% 1
5 userA 10 5 4 9 18.75 48.0% 2
5 userB 8 4 2 6 ย  32.0% 2
5 userC 6 3 0.75 3.75 ย  20.0% 1
10 userA 9 4.5 0 4.5 10.125 44.4% 2
10 userB 6 3 0 3 ย  29.6% 2
10 userC 3.75 1.875 0.75 2.625 ย  25.9% 1

๐Ÿ“Œ ์šฐ์„ ์ˆœ์œ„ ๊ธฐ์ค€ (๊ธฐ๋ณธ ์„ค์ •)

์ „์ฒด ์ ์œ ์œจ ๊ธฐ์ค€ Priority ์„ค๋ช…
โ‰ฅ 50% 3 ์ตœํ•˜ ์šฐ์„ ์ˆœ์œ„
25% ~ 50% 2 ์ค‘๊ฐ„ ์‚ฌ์šฉ์ž
12.5% ~ 25% 1 ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž
< 12.5% 0 ์ตœ์ƒ ์šฐ์„ ์ˆœ์œ„

์ฐธ๊ณ ๋กœ Sweep ์ฃผ๊ธฐ์™€ Decay Factor ๋Š” core-site.xml ์—์„œ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<property>
  <name>ipc.server.callqueue.sweep.period.ms</name>
  <value>5000</value>
  <description>Sweep ์ฃผ๊ธฐ๋ฅผ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ • (๊ธฐ๋ณธ 5์ดˆ)</description>
</property>
<property>
  <name>ipc.server.callqueue.decay.factor</name>
  <value>0.5</value>
  <description>Decay Factor ๊ฐ’์„ ์„ค์ • (๊ธฐ๋ณธ 0.5)</description>
</property>


โœ… Fair Call Queue - Multi-level Queue

Multi-level Queue๋Š” ์š”์ฒญ(Call)์„ ์šฐ์„ ์ˆœ์œ„๋‚˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ๋ฒจ(๊ณ„์ธต) ํ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋Š” ํ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ์˜ ์š”์ฒญ์ด ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๊ณ , ๋งŒ์•ฝ ํ•ด๋‹น ํ์— ์š”์ฒญ์ด ์—†์œผ๋ฉด ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


โœ… Fair Call Queue - RPC Multiplexer

RPC Multiplexer ๋Š” ์—ฌ๋Ÿฌ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์šฐ์„ ์ˆœ์œ„ ํ(์˜ˆ: high-priority, low-priority)๋ฅผ ๋น„๊ตํ•˜์—ฌ ์š”์ฒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๋” ์ž์ฃผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ค‘์š”ํ•œ ์š”์ฒญ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์—, ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ๋„ ์ผ์ • ๋น„์œจ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ starvation(์ฒ˜๋ฆฌ ์ง€์—ฐ)์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Multiplexer ๋Š” ํ˜„์žฌ ๊ตฌํ˜„์ฒด๋กœ WeightedRoundRobinMultiplexer๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ( ๊นƒํ—ˆ๋ธŒ ์ฝ”๋“œ )

WeightedRoundRobinMultiplexer ๋Š” ๊ฐ ์šฐ์„ ์ˆœ์œ„ ํ๋ณ„๋กœ ๊ฐ€์ค‘์น˜(weight)๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ๋น„์œจ์— ๋”ฐ๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐ€์ค‘์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

์šฐ์„ ์ˆœ์œ„ ๋ ˆ๋ฒจ ๊ฐ€์ค‘์น˜ (Weight) ์ฒ˜๋ฆฌ ๋ฐฉ์‹
Highest priority (0) 8 ํ์—์„œ 8๊ฐœ์˜ ์š”์ฒญ์„ ์—ฐ์†์œผ๋กœ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌ
2nd highest priority (1) 4 ํ์—์„œ 4๊ฐœ์˜ ์š”์ฒญ์„ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌ
3rd highest priority (2) 2 ํ์—์„œ 2๊ฐœ์˜ ์š”์ฒญ์„ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌ
Lowest priority (3) 1 ํ์—์„œ 1๊ฐœ์˜ ์š”์ฒญ์„ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌ

์ด ๋ฐฉ์‹์œผ๋กœ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๋” ๋งŽ์€ ์š”์ฒญ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ๋„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌ ์ง€์—ฐ ํ˜„์ƒ(starvation)์„ ๋ฐฉ์ง€ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ๋ฆ„์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด,

Fair Call Queue ๊ฐ€ ๋„์ž…๋˜๊ณ , RPC Scheduler ๋Š” Decay Factor ๋ฅผ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚˜๋ˆ„์–ด ์ด 4๊ฐœ์˜ Multi-level Queue ๋กœ ์ž‘์—…์„ ๋„ฃ์–ด์ฃผ๊ณ , RPC Multiplexer ๋Š” ํ•ด๋‹น ํ์—์„œ, ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ ์ • ์ˆ˜์˜ ์ž‘์—…์„ ๊บผ๋‚ด ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… Fair Call Queue - Backoff

Backoff๋Š” priority-weighting ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์ถ”๊ฐ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

BackOff ๋Š” ์š”์ฒญ์„ ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์˜ˆ์™ธ(Exception)๋ฅผ ๋˜์ง€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ „ํ˜•์ ์œผ๋กœ request queue๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, backkoff by response time ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•œ๋А๋ฐ ์ด๋Š” ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ํ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋А๋ ค์งˆ ๊ฒฝ์šฐ, ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ์˜ ์š”์ฒญ์„ backoff ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, priority 1์˜ response time threshold๊ฐ€ 10์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ํ์˜ ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์ด 12์ดˆ๋ผ๋ฉด, priority 2 ์ดํ•˜์˜ ์š”์ฒญ์€ backoff exception์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— priority 0๊ณผ 1์˜ ์š”์ฒญ์€ ์ •์ƒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ์‹œ์Šคํ…œ์— ๋ถ€ํ•˜๊ฐ€ ๋†’์•„์ ธ ๋†’์€ ์šฐ์„ ์ˆœ์œ„ ์‚ฌ์šฉ์ž๊นŒ์ง€ ์˜ํ–ฅ๋ฐ›์„ ๋•Œ, heavy user์—๊ฒŒ backoff๋ฅผ ๊ฐ•์ œํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Hadoop Client๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋Š” backoff์— ์˜ํ•œ ์˜ˆ์™ธ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ์ž์‹ ์˜ ์š”์ฒญ์ด ์‹œ์Šคํ…œ์— ๊ณผ๋„ํ•œ ๋ถ€ํ•˜๋ฅผ ์ฃผ๊ณ  ์žˆ์ง€ ์•Š์€์ง€ ์ ๊ฒ€ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- Backoff ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” -->
<property>
  <name>ipc.decay.scheduler.enable.backoff</name>
  <value>true</value>
</property>

<!-- ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ Backoff ๊ธฐ์ค€ ํ™œ์„ฑํ™” -->
<property>
  <name>ipc.decay.scheduler.enable.response.time.backoff</name>
  <value>true</value>
</property>

<!-- Priority 1์˜ ์‘๋‹ต์‹œ๊ฐ„ Backoff ๊ธฐ์ค€ (์ดˆ ๋‹จ์œ„) -->
<property>
  <name>ipc.decay.scheduler.response.time.threshold.priority.1</name>
  <value>10</value>
</property>


โœ… Fair Call Queue - Identity Provider

์œ„์—์„œ ์„ค๋ช…ํ•œ RPC Scheduler ๋Š” ์‚ฌ์šฉ์ž ๋‹จ์œ„๋กœ ์š”์ฒญ ์ˆ˜, ์šฐ์„ ์ˆœ์œ„, decay, backoff ๋“ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋•Œ โ€œ์‚ฌ์šฉ์žโ€๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ง€ ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ IdentityProvider์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, userA, userB์˜ ์š”์ฒญ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด user.name ๊ธฐ์ค€์œผ๋กœ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋™์ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋‚˜ IP์—์„œ ์˜ค๋Š” ์š”์ฒญ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์€ UserIdentityProvider๋กœ, ๋‹จ์ˆœํžˆ client์˜ username ์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.


โœ… Cost based Fair Call Queue ?

Fair Call Queue๋Š” ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์š”์ฒญ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ priority ์ฒ˜๋ฆฌ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์š”์ฒญ์ด ์–ผ๋งˆ๋‚˜ ๋น„์‹ผ ์ž‘์—…์ธ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ ค๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์š”์ฒญ ์ˆ˜๋Š” ๊ฐ™์ง€๋งŒ ์‹œ์Šคํ…œ ์ž์›์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต์ •์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ 3๊ฐ€์ง€ ์š”์ฒญ์„ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. getFileInfo ์š”์ฒญ 1000๊ฐœ์™€, listStatus ์š”์ฒญ 1000๊ฐœ (ํฐ ๋””๋ ‰ํ† ๋ฆฌ ๋Œ€์ƒ), ๊ทธ๋ฆฌ๊ณ  mkdir ์š”์ฒญ 1000๊ฐœ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

getFileInfo, listStatus๋Š” ๋‹จ์ˆœ ์กฐํšŒ๋ผ์„œ ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, mkdir์€ ํŒŒ์ผ์‹œ์Šคํ…œ์— ์ง์ ‘ ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๊ณ , exclusive lock์ด ํ•„์š”ํ•ด์„œ ํ›จ์”ฌ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Fair Call Queue๋Š” ๋‹จ์ˆœํžˆ โ€œ1000๋ฒˆ ์š”์ฒญโ€๋งŒ ๋ณด๋‹ˆ, ์ด ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ„ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‘ก์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์š”์ฒญ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์‹œ์Šคํ…œ ์ž์›์„ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์šฐ์„ ์ˆœ์œ„์— ๋ฐ˜์˜ํ•˜๋Š” Cost-based Fair Call Queue ๊ธฐ๋Šฅ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์š”์ฒญ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด ์š”์ฒญ์„ ์ž์ฃผ ๋ณด๋‚ด๋Š” ์‚ฌ์šฉ์ž๋Š” ์ž๋™์œผ๋กœ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฐ›๋Š”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cost based Fair Call Queue ๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ์— ๊ฑธ๋ฆฐ ์‹ค์ œ ์‹œ๊ฐ„ + ์‚ฌ์šฉ๋œ lock์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ์ˆœ ์ž‘์—…: lock ์—†์ด ์‹คํ–‰๋œ ์‹œ๊ฐ„ โ†’ ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜ (ร—1)

  • ๊ณต์œ  ๋ฝ(shared lock)์ด ๊ฑธ๋ฆฐ ์ž‘์—…: ร—10 ๊ฐ€์ค‘์น˜

  • ๋ฐฐํƒ€ ๋ฝ(exclusive lock)์ด ๊ฑธ๋ฆฐ ์ž‘์—…: ร—100 ๊ฐ€์ค‘์น˜

๋‹จ, ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(queue ๋Œ€๊ธฐ)์ด๋‚˜ ๋ฝ์„ ์–ป๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๊ณ„์‚ฐ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋„ ์ด ๋ถ€๋ถ„์„ ๊ณต๋ถ€ํ•  ๋•Œ ์ดํ•ด๊ฐ€ ์ข€ ๋˜์ง€ ์•Š์•„์„œ, ํ‘œ๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋จผ์ €, 3๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์š”์ฒญ์„ ํ•œ ๊ฒฝ์šฐ ์•„๋ž˜ ํ‘œ์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์š”์ฒญ ์ข…๋ฅ˜ ์‹คํ–‰ ์‹œ๊ฐ„(ms) Lock ์ข…๋ฅ˜ ๊ฐ€์ค‘์น˜ Cost ๊ณ„์‚ฐ (์‹œ๊ฐ„ ร— ๊ฐ€์ค‘์น˜)
userA getFileInfo 10 ์—†์Œ ร—1 10
userB listStatus 20 Shared Lock ร—10 200
userC mkdir 15 Exclusive Lock ร—100 1500

๊ทธ๋Ÿฌ๋ฉด, ๋‹ค์Œ ํ‘œ์ฒ˜๋Ÿผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. (๋น„์ค‘ ๊ธฐ์ค€)

์‚ฌ์šฉ์ž Cost ์ „์ฒด ๋น„์ค‘ (%) ์šฐ์„ ์ˆœ์œ„ (๊ธฐ๋ณธ ๊ธฐ์ค€)
userA 10 0.58% 0 (์ตœ์ƒ์œ„)
userB 200 11.7% 0 (์ตœ์ƒ์œ„)
userC 1500 87.7% 3 (์ตœํ•˜์œ„)

๊ทธ๋Ÿฌ๋ฉด, ์š”์ฒญ ๋ฐ˜๋ณต ์‹œ ๋ˆ„์  Cost ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. (์ด ๋•Œ, Decay ๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์‚ฌ์šฉ์ž ์š”์ฒญ 1ํšŒ๋‹น Cost ์š”์ฒญ ํšŸ์ˆ˜ ๋ˆ„์  Cost
userA 10 2ํšŒ 20
userB 200 2ํšŒ 400
userC 1500 2ํšŒ 3000

์ตœ์ข…์ ์œผ๋กœ๋Š” ์•„๋ž˜ ํ‘œ์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ „์ฒด ๋น„์ค‘ (%) ์šฐ์„ ์ˆœ์œ„
userA 0.58% 0
userB 11.7% 0
userC 87.7% 3

์„ค์ •์€ core-site.xml ์—์„œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด Fair Call Queue๊ฐ€ ์š”์ฒญ์˜ ์‹ค์ œ ๋น„์šฉ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ ์‚ฌ์šฉ์ž ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<property>
  <name>ipc.costprovider.class</name>
  <value>org.apache.hadoop.ipc.WeightedTimeCostProvider</value>
</property>

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด, FIFO Queue ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ , ๋ฌด์—‡๋ณด๋‹ค DoS ๊ณต๊ฒฉ์— ๋Œ€ํ•ด์„œ ์ผ์ • ์ˆ˜์ค€ ์ดํ•˜์˜ ๋‚ฎ์€ latency๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.




โ—ˆ


โœ๏ธ ๊ฒฐ๋ก 


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ•˜๋‘ก์˜ ํ•ต์‹ฌ ์ด๋ก ๋“ค์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. HDFS ์˜ ์•„ํ‚คํ…์ฒ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ HA ๊ตฌ์„ฑ, ONN ๊ทธ๋ฆฌ๊ณ  EC ์™€ Fair Call Queue ๊นŒ์ง€.. ํšŒ์‚ฌ์—์„œ ๋‹จ์ˆœํžˆ ํ•˜๋‘ก์„ ๋‹ค๋ฃจ๋Š” ๊ฑฐ ๋งŒ์œผ๋กœ๋Š” ์•Œ ์ˆ˜ ์—†์—ˆ๋˜ ๋ฐฉ๋Œ€ํ•œ ์ง€์‹๋“ค์„ ๊ณต๋ถ€ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‘ก์€ ๋‹จ์ˆœํ•œ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ด์ƒ์˜ ์˜๋ฏธ๋ฅผ ์ง€๋‹™๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ ์š”์ฒญ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ฐ€๋Š” ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š”์ง€, ์–ด๋–ค ์›๋ฆฌ์™€ ๊ธฐ๋ฒ•๋“ค์ด ๊ทธ ๋ฐ”ํƒ•์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ๊ฒŒ ๋˜๋ฉด, ๋น„๋กœ์†Œ ํ•˜๋‘ก์„ โ€˜์ž˜ ๋‹ค๋ฃฌ๋‹คโ€™๋Š” ๋ง์ด ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ๊นŠ์ด ๊ณต๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ•™์Šต์„ ํ†ตํ•ด ์•Œ๊ฒŒ ๋œ ์—ฌ๋Ÿฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋“ค์€ ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์ ์ธ ์ง€์‹์— ๋จธ๋ฌด๋ฅด์ง€ ์•Š๊ณ , ์‹ค์ œ ํ˜„์žฅ์—์„œ ๋งˆ์ฃผํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ๊ฐ€ ๋˜์–ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ž์œผ๋กœ๋„ ํ•˜๋‘ก๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์„ ๋‹ค๋ฃจ๋ฉด์„œ, ์ด๋ก ๊ณผ ์‹ค๋ฌด์˜ ๊ฐ„๊ทน์„ ์ค„์ด๊ณ , ์ง€์†์ ์œผ๋กœ ์„ฑ์žฅํ•ด ๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค๋Š” ๋‹ค์ง์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํฌ์ŠคํŒ…์„ ์ฝ์–ด์ฃผ์‹  ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด ๊ธ€์„ ํ†ตํ•ด ํ•˜๋‘ก์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•œ์ธต ๋” ๊นŠ์–ด์ง€๊ณ , ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ์†์—์„œ ๋‚˜๋งŒ์˜ ํ†ต์ฐฐ์„ ์–ป์–ด๊ฐ€์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” YARN ์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.




โ—ˆ


๐Ÿ“š ๊ณต๋ถ€ ์ฐธ๊ณ  ์ž๋ฃŒ


๐Ÿ“‘ 1. ํŒจ์ŠคํŠธ ์บ ํผ์Šค - ํ•œ ๋ฒˆ์— ๋๋‚ด๋Š” ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ์ดˆ๊ฒฉ์ฐจ ํŒจํ‚ค์ง€ Online.

๐Ÿ“‘ 2. HDFS NameNode RPC QoS ์ตœ์ ํ™”

๐Ÿ“‘ 3. Hadoop์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๐Ÿ“‘ 4. ํ•˜๋‘ก 3.0์—์„  ๋ฌด์—‡์ด ๋‹ฌ๋ผ์กŒ์„๊นŒ? ( Erasure Coding ์„ ์ดํ•ดํ•˜๊ธฐ ์ข‹์€ ๊ธ€ )

๐Ÿ“‘ 5. OREILLY ํ•˜๋‘ก ์™„๋ฒฝ ๊ฐ€์ด๋“œ 4ํŒ

๐Ÿ“‘ 6. HDFS ์•„ํ‚คํ…์ฒ˜

๐Ÿ“‘ 7. NameNode High Availability with Quorum Journal Manager

๐Ÿ“‘ 8. RAID ์— ๋Œ€ํ•˜์—ฌ

๐Ÿ“‘ 9. ํ•˜๋‘ก๊ณผ ์ฃผํ‚คํผ