Apache Cassandra ํบ์๋ณด๊ธฐ - 2ํธ
Apache Cassandra ํบ์๋ณด๊ธฐ - 2ํธ ๊ด๋ จ
1. ๋ค์ด๊ฐ๊ธฐ์ ์์.
์๋ ํ์ธ์. NHN์ํฐํ ์ธ๋จผํธ ์์ธ์ง์ ๋๋ค.
์ง๋๋ฒ Cassandra ํบ์๋ณด๊ธฐ 1ํธ์ ์ฌ๋ฆฐ ๋ค๋ก ์๊ฐ๋ณด๋ค ๋ง์ ๋ถ๋ค์ ์ข์ ๋ฐ์์ ํ์ ๋ด์ด 2ํธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค. ์ฌ์ค 1ํธ์์๋ ์ฒ์ Cassandra๋ฅผ ์ ํ๋ฉด์ ์ ๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ๋ ์ ๋ณด๋ค์ ์ค์ฌ์ ์ผ๋ก ์ ๋ฆฌํ ๊ธ์ ๊ฐ๊น์์, ์ธํฐ๋ท์ ํตํ์ฌ ๊ฒ์ํ๋ฉด ์ฝ๊ฒ ์ฐพ์๋ณผ ์ ์๋ ๋ด์ฉ์ด๋ผ๊ฑฐ๋ ์ดํด๋ฅผ ๋๊ธฐ ์ํ ์์ธํ ์์ ๋ค์ ๋ถ๋์ ์๋ตํ ๋ถ๋ถ์ด ์์์ต๋๋ค. ๋ฐฉ๋ํ Cassandra์ ๋ด์ฉ์ ๋ชจ๋ ๋ด์ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ๋ฌธ์์์๋ ์ต๋ํ ์ค์ํ๊ฑฐ๋ ํน์ ์ฐพ๊ธฐ ํ๋ ๋ด์ฉ๋ค๋ก ๊ฐ์ถ๋ ธ๋ค๋ ์ ์ ์ ๋ ํด์ฃผ์๊ณ , Cassandra๋ฅผ ์์ธํ ์๊ณ ์ถ์ผ์ ๋ถ๋ค์ Datastax์ ๊ณต์ ๋ฌธ์๋ ์ธ๊ตญ ๋์๋ฅผ ์ฝ์ผ์๋ ํธ์ ๊ฑฐ๋ญ ์ถ์ฒํด ๋๋ฆฝ๋๋ค.
2. Cassandra์ ๋ฐ์ดํฐ ๋ถ์ฐ
์ง๋ 1ํธ์ ํตํ์ฌ ์ฐ๋ฆฌ๋ Cassandra๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ Ring ํํ๋ฅผ ๋๊ณ ์๋ค๋ ๊ฒ๊ณผ ๊ฐ ๋ ธ๋๋ ๊ฐ๊ฐ์ hash token ๋ฒ์๋ฅผ ๋ด๋นํ๊ณ ์์ผ๋ฉฐ, partition key๋ก ์ง์ ํ column์ value๋ค๋ก Row key๋ฅผ ๊ฒฐ์ ํ๊ณ , ์ด๋ฅผ hashingํ token์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ ธ๋๋ณ๋ก ๋ถ์ฐํ์ฌ ์ ์ฅํ๋ค๋ ์ฌ์ค์ ์ ๋ฆฌํ ๋ฐ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ Virtual Node๊ฐ ๋ฌด์จ ์ฉ์ด์ธ์ง๋ ๋์ถฉ ์์์ผ๋, ์ด์ ๋ ์ผ์ถ ์ด๋ ํ ์๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐํ๋์ง ๋๋ต์ ์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ์์ฐ์ค๋ฝ๊ฒ Read/Write์ ๋ฐ๋ฅธ Cassandra์ ๋์ ๊ณผ์ ์ ํ์ธํด์ผ๊ฒ ์ง๋ง, ๊ทธ ์ ์ Cassandra์ ๋ฐ์ดํฐ ๋ถ์ฐ ๋ฐฉ์์ ๋ํด ์์ฃผ ์ด์ง์ฟต ์ข ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
์๋๊ตฌ์? ๊ทธ๋ฅ ๋์ด๊ฐ๊ธฐ์ ์๊ฐ๋ณด๋ค ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ์ค ์ง๊ธ๊น์ง Cassandra์ ๋ํด ์ ๋ฆฌํ ๋ด์ฉ์๋ ๋๋ฆ ์ค์ํ ๋ช ๊ฐ์ง ์ฌ์ค๋ค์ด ๋น ์ ธ์์ต๋๋ค. ๊ทธ์ค์์๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฐ๋ก Row key๋ฅผ token์ผ๋ก ์ด๋ป๊ฒ ๋ณํํ๋๋๋ ์ ์ ๋๋ค. Cassandra์์๋ ์ด๋ ๋ฏ Row key๋ฅผ token์ผ๋ก ๋ณํํด์ฃผ๋ ๋ชจ๋์ Partitioner๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. conf/cassandra.yaml์ partitioner ํญ๋ชฉ์ ๋ณด๋ฉด ํด๋น Cassandra๊ฐ ์ด๋ค Partitioner๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธ ํ ์ ์์ผ๋ฉฐ, Cassandra๋ ๊ธฐ๋ณธ์ ์ผ๋ก RandomPartitioner, Murmur3Partitioner, ByteOrderedPartitioner๋ผ๋ ์ด๋ฆ์ ์ธ ๊ฐ์ง Partitioner๋ฅผ ์ ๊ณตํฉ๋๋ค. (๋ฌผ๋ก ์ฌ์ฉ์๊ฐ org.apache.cassandra.dht.IPartitioner ๋ฅผ ์์ํ์ฌ ์ํ๋ Partitioner๋ฅผ ๊ตฌํ ํ ์๋ ์์ง๋ง ์ด๋ฅผ ์ถ์ฒํ์ง๋ ์์ต๋๋ค. ์ด๋ ต๊ธฐ๋ ํ๊ณ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ๋ ํ๋ค๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฌผ๋ก , ์ด์์์ ๋ฌธ์ ๋ ๊ฐ์ด ๋ฐ์ ํ ์ ์๊ฒ ์ฃ .)
RandomPartitioner๋ Row key๋ฅผ MD5๋ก hashingํ์ฌ token์ ์์ฑํฉ๋๋ค. Murmur3Partitioner๋ Murmur5๋ก Hashingํ์ฌ token์ ์์ฑํ์ฃ . ํ์ง๋ง ByteOrderedPartitioner(์ดํ BOP)๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. BOP๋ Row key๋ฅผ 16์ง์ ํํ๋ก ๋ณํํ์ฌ ์ด ๊ฐ์ token์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ฆ, BOP ๋ณํ๋ token์ ๋ฌธ์ ์์๋ก ์ ๋ ฌ๋์ด ๊ฐ ๋ ธ๋์ ๋ถ์ฐ๋๋ค๋ ์ด์ผ๊ธฐ๊ฐ ๋ฉ๋๋ค. ๋ง์ฝ BOP๋ฅผ ์ฐ๊ฒ ๋๋ค๋ฉด, Row key๋ค์ด ํญ์ ๋ฌธ์ ์์๋๋ก ์ ๋ ฌ๋์ด์์ผ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํน๋ณํ ๊ฐ๊ณต ์์ด ๊ทธ๋๋ก range query๋ฅผ ํ ์ ์๋ ๋ฑ, ์ฌ๋ฌ ๊ฐ์ง๋ก ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ ํ ์ ์๊ฒ ์ฃ . ํ์ง๋ง BOP๋ ๋ํ์ ์ธ Cassandra์ Anti-Pattern ์ค์ ํ๋์ ๋๋ค. ์์ผ๊น์? ์ด์ ๋ BOP๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Hotspot์ด ๋ฐ์ํ ํ๋ฅ ์ด ๋งค์ฐ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
BOP๋ฅผ ์ฌ์ฉํ์ฌ Row key ๋ฌธ์ ์์๋๋ก ๊ฐ ๋ ธ๋๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐํ๊ฒ ๋๋ค๋ฉด, ๋ชจ๋ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ท ์ผํ๊ฒ ๋ถ์ฐํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ์ ๋ถ์ฐ ๊ธฐ์ค์ ๋ด๋นํ๋ Row key ์์ฒด๊ฐ ๋ชจ๋ ๋ฌธ์์ด์ ๋ํด์ ๊ท ์ผํ๊ฒ ๋ถํฌํด์ผ ํฉ๋๋ค. ํ์ง๋ง ํ์ค์ ๊ทธ๋ ์ง ์์ฃ . BOP๋ฅผ ์ฌ์ฉ ํ ๊ฒฝ์ฐ, ํน์ ๋ฌธ์๋ก ๋ฐ์ง๋์ด์๋ Row key๋ค์ ์ ์ฅํ๋ ๋ ธ๋๊ฐ ์์ฐ์ค๋ฝ๊ฒ Hotspot์ด ๋์ด๋ฒ๋ฆฝ๋๋ค. ๋๊ตฌ๋ ์ด๋ ๋จ์ํ ๋ ธ๋๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ธ๋ค๊ณ ํด์ ํด๊ฒฐ๋๋ ์ผ์ด ์๋๋๋ค. ๋ ธ๋๋ฅผ ๋๋ ธ๋๋ ์คํ๋ ค ์ ํ ์ฌ์ฉํ์ง ์๋ ๋ ธ๋๊ฐ ๋ค์ ์๊ธธ ์๋ ์๊ณ , ๋ ธ๋๋ฅผ ์ค์๋๋ ๋ ์ฌ๊ฐํ Hotspot์ด ์๊ฒจ๋ฒ๋ฆด ์๋ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ์ด๋ BOP์ ๊ฒฝ์ฐ ๋ถ์ฐ์ ์ ๋๊ฐ ์ ์ ์ผ๋ก Row key์ ๋ถํฌ์ ๋ฌ๋ ค์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก Cassandra๋ Murmur3Partitioner๋ฅผ default Partitioner๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. MurMur3 hash function์ ์ด์ฉํจ์ผ๋ก ์ธํด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋น๊ต์ ๊ท ์ผํ๊ฒ ๋ชจ๋ ๋ ธ๋์ ๋ถ์ฐ ํ ์ ์๋ ๊ฒ์ด์ฃ . ๋ฌผ๋ก ์ด ์ญ์ ๋จ์ ์ ์กด์ฌํฉ๋๋ค. ๋ฌธ์์ด์ด ์๋ Hash ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ๊ฐ ๋ ธ๋์ ์ ์ฅ๋๋ฏ๋ก, Row key์ ๋ฌธ์์ด๋ก ์ ๋ ฌ๋ ๋ฐ์ดํฐ๊ฐ ํ์ ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค์ Application Layer์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ์ ๋ ฌํ์ฌ์ผ ํฉ๋๋ค. ๊ฐ๋ น ์์ฒญ๋ ์์ ๋ฐ์ดํฐ๊ฐ ๋ถ์ฐ๋์ด ์ ์ฅ๋์ด์๋๋ฐ, Row key๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ pagingํ๋ ๋ฑ์ ์์ ์ ๋ถ๊ฐ๋ฅํ ์ผ์ธ ์ ์ด์ฃ . ๊ทธ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์์ ์ง์ ์ ๋ ฌํด์ผ ์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ํ๋ ์์น์ ๋ฐ์ดํฐ ์งํฉ์ ๋ฝ์๋ผ ์ ์์ ํ ๋๊น์. ๋ฐ๋ผ์ ์ฌ์ฉ์๋ ์์ ์ ์๋น์ค๊ฐ ์ฌ์ฉ ํ ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ์์ฑ ํ ๋, ์ฒ์๋ถํฐ ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์คํ ๊ฒฐ์ ํ์ฌ์ผ ํฉ๋๋ค.
์ง๊ธ๊น์ง Partitioner์ ๋ํด ๋๋ต์ ์ผ๋ก ์ง์ด ๋ณด์์ผ๋ ์ด๋ฒ์ Cassandra์ Data Consistency์ Replication์ ๋ํด ๊ฐ๋จํ ์์๋ณผ ์ฐจ๋ก์ ๋๋ค.
Cassandra๋ ๊ธฐ๋ณธ์ ์ผ๋ก CQL์ ํตํด ์ฟผ๋ฆฌ ์์ ์ Read์ Wirte์ ๋ฐ๋ฅธ ๋ค์ํ Consistency Level์ ํตํด์ ๋ช ๊ฐ์ Replication์ ํตํด ์ด๋ ์ ๋ ์์ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ํ๋ณด ํ ๊ฒ์ธ์ง ์ ํ ํ ์ ์์ต๋๋ค. ๋ํ, ์ฒ์ Keyspace ์์ฑ ํ ๋ Replication์ ๋ฐฐ์น ์ ๋ต๊ณผ ๊ทธ ์ ๋ต์ ๋ง๋ Replication ๋ณต์ ๊ฐ์, ์์น ์์น๋ฅผ ๊ฒฐ์ ํ ์ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํด์ conf/cassandra.yaml์ endpoin_snitch ํญ๋ชฉ์ snitch์ ์ข ๋ฅ๋ฅผ ์ธํ ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด snitch๋ ๋ญ๊น์? ์ฝ๊ฒ ๋งํ์๋ฉด, ๋ฐ์ดํฐ์ผํฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง, ์ฅ๋น๊ฐ ์ค์น๋ ๋ ์ด ์ด๋ป๊ฒ ๋๋์ด์ ธ ์๋์ง์ ๋ํ topology๋ฅผ Cassandra์๊ฒ ์๋ ค์ฃผ๊ธฐ ์ํ ์ต์ ์ ๋๋ค.
Cassandra์์ ์ ๊ณตํ๋ snitch์ ์ข ๋ฅ๋ ๋งค์ฐ ๋ค์ํฉ๋๋ค. snitch๋ ๋จ์ํ 1๊ฐ์ Data Center๋ฅผ ๊ฐ์ ํ ๊ฒ๋ ์๊ณ , ๋ค์์ Data Center์ ๋ค์ํ Rack ๋ฐฐ์น๊น์ง ๊ณ ๋ คํ ๊ฒ๋ ์์ผ๋ฉฐ, ์ฌ์ง์ด Cloud Stack์ด๋ Google Cloud์ ๊ฐ์ Cloud ์๋น์ค์ ํนํ๋ snitch๋ ์กด์ฌํฉ๋๋ค. ์ด๋ฌํ snitch๋ฅผ ๋ฐํ์ผ๋ก Cassandra๋ ์ฌ์ฉ์๊ฐ ์ ์ํ ์คํค๋ง์ ๋ฐ๋ผ์ ์ด๋ Data Center์ ์ด๋ Rack์๋ค๊ฐ ๊ฐ๊ฐ ๋ช ๊ฐ์ Replication Data๋ฅผ ๋๋์ด ์ ์ฅ ํ ๊ฒ์ธ์ง ๋ฑ์ ๊ฒฐ์ ํ๋ ๊ฒ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๊ตฌ์ฑ๋ Cassandra์ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ CRUDํ๊ณ ์ ํ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ํด๋น ์ฟผ๋ฆฌ์ ํจ๊ป ์ง์ ํ Consistency Level์ ํตํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
Read/Write์ ๋ฐ๋ฅธ Consistency Level์ ์ข ๋ฅ์ ํน์ง, ๋ค์ํ snitch๋ค ๊ฐ๊ฐ์ ์์ธํ ์ค๋ช ๋ค์ ๋ถ๋์ ์ด ๊ธ์์ ๋ชจ๋ ๋ค๋ฃจ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ Datastax์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ์กฐํ์๊ธธ ๋ถํ๋๋ฆฝ๋๋ค.
3. Cassandra์ Read/Write.
์ด์ ๋ ๋ฐ์ดํฐ์ ๋ถ์ฐ์ด๋ผ๋ ๊ด์ ์์ Cassandra๋ฅผ ์ด๋ ์ ๋ ์ดํด๋ณด์์ผ๋ ์ด์ ์ค์ ๋ก Cassandra๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ๋ ์ผ์ด๋๋ ๋์์ ๋ํด์ ์ดํด๋ณผ ์ฐจ๋ก์ ๋๋ค. ๋จผ์ Cassandra์ ๋ฐ์ดํฐ๋ฅผ Writeํ๋ ์ํฉ์ ๊ฐ์ ํด๋ด ์๋ค.
์ฌ์ฉ์๋ Cassandra์ ์ด๋ ๋ ธ๋๋ค ์ค ํ๋์ Write ์์ฒญ์ ํฉ๋๋ค. Cassandra์์๋ ์์ฒญ์ ๋ฐ๊ฒ ๋๋ ์ต์ด์ ๋ ธ๋๋ฅผ Coordinator ๋ ธ๋๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ฉด, ์ด Coordinator๋ ํด๋น ๋ฐ์ดํฐ์ Row key๋ฅผ hashingํ์ฌ ์ด๋ ๋ ธ๋๋ค์ ๋ฐ์ดํฐ๋ฅผ Writeํด์ผ ํ๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ์ฟผ๋ฆฌ์ ์ง์ ๋ Consistency Level์ ๋ฐ๋ผ ๋ช ๊ฐ์ ๋ ธ๋์ Writeํด์ผํ๋์ง ์ฐธ๊ณ ํ์ฌ ํ์ฌ์ ๋ฐ์ดํฐ๋ฅผ Writeํด์ผ ํ ๋ ธ๋๋ค์ status๊ฐ ์ ์์ธ์ง๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋, ํน์ ๋ ธ๋์ status๊ฐ ์ ์์ด ์๋๋ผ๋ฉด Consistency Level์ ๋ฐ๋ผ "hint hand off"๋ผ๋ ๋ก์ปฌ ์์ ์ ์ฅ๊ณต๊ฐ์ Write ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ง์ฝ ๋์ค์ ๋น์ ์ ์ํ์ ๋ ธ๋๊ฐ ์ ์์ผ๋ก ๋์์ค๋ฉด Coordinator ๋ ธ๋๊ฐ data๋ฅผ Writeํด์ฃผ๊ธฐ ์ํด์์ด์ฃ . ์ด๋ ์ฃผ์ ํ ์ ์ hint hand off๊ฐ ํญ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ Consistency๋ฅผ ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ๋๋ค. ๋น๋ก ๋ฐ์ดํฐ์ ๋ณต์์ ํฐ ๋์์ด ๋๋ ๊ธฐ๋ฅ์ผ์ง๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก hint hand off๋ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ๋ ๊ณต๊ฐ์ด๊ธฐ ์ ๋๋ค.(๋ง์ฝ hint hand off์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅํ ๋ค ํด๋น Coordinator ๋ ธ๋๊ฐ ์ฃฝ์ด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด๋ณด์๊ธธ ๋ฐ๋๋๋ค.)
์ด์จ๊ฑฐ๋ hint hand off์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํ๋ค๋ฉด, Coordinator ๋ ธ๋๋ Cassandra์ topology๋ฅผ ํ์ธํ์ฌ ์ด๋ ๋ฐ์ดํฐ ์ผํฐ์ ์ด๋ ๋ ์ ์๋ ๋ ธ๋์ ๋จผ์ ์ ๊ทผ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ์ฌ ๋ฐ์ดํฐ์ ํจ๊ป Write๋ฅผ ์์ฒญํฉ๋๋ค.
์ค์ ๋ก ๋ฐ์ดํฐ ์ ์ฅํ๊ฒ ๋ ๋ ธ๋๋ Write ์์ฒญ์ด ์ค๋ฉด ํน์ ๋ชจ๋ฅผ ์ฅ์ ์ ๋๋นํ์ฌ, "CommitLog"๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ก์ปฌ ๋์คํฌ์ ํ์ผ์ ๊ธฐ๋ก์ ๋จ๊น๋๋ค. ๊ทธ๋ฐ ๋ค์ "MemTable"์ด๋ผ๋ ์ด๋ฆ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ Writeํ ๋ค, ์ฑ๊ณต ๋ฉ์์ง๋ฅผ ๋๋ ค์ค์ผ๋ก์จ Write ์์ฒญ์ ๋ํ ๋์์ ๋ง๋ฌด๋ฆฌ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ ธ๋๋ MemTable์ ๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถํ ์์ด๋ฉด ๋์คํฌ ๋ฒ์ ์ MemTable์ธ "SSTable"์ ๋ฐ์ดํฐ๋ฅผ Flushํฉ๋๋ค. ์ด๋, SSTable์ immutableํ๋ฉฐ, sequentialํ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ Cassandra๋ ์ด๋ฌํ ๋ค์์ SSTable์ Compactionํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด Read์ ์ฒ๋ฆฌ๊ณผ์ ์ ์ด๋จ๊น์? ์์๋ด ์๋ค.
์ฌ์ฉ์๋ Cassandra์ ์ด๋ ๋ ธ๋๋ค ์ค ํ๋์ Read ์์ฒญ์ ํฉ๋๋ค. Coordinator ๋ ธ๋๋ ํด๋น ์์ฒญ์ Row key๋ฅผ hashingํ์ฌ ์ ๊ทผํด์ผ ํ ๋ ธ๋์ ์์น๋ฅผ ํ์ ํ ๋ค, Consistency Level์ ์ฒดํฌํ์ฌ ๋ช ๊ฐ์ Replication์ ํ์ธํด์ผ ํ ์ง ๊ฒฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Coordinator ๋ ธ๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋์๋ Data Request๋ฅผ ์์ฒญํ๊ณ , ๊ทธ๋ค์ ๊ฐ๊น์ด ๋ ธ๋๋ค์๋ Data Digest Request๋ฅผ ์์ฒญํฉ๋๋ค. Coordinator ๋ ธ๋๋ ์ด๋ ๊ฒ ๊ฐ์ ธ์จ Data์ Data Digest๋ฅผ ํ์ธํ์ฌ ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ๋ค์ ๋ ธ๋๋ค๋ก๋ถํฐ Full Data๋ฅผ ๊ฐ์ ธ์์ ๊ทธ์ค ๊ฐ์ฅ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋๋ ค์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋๋ ค์ค ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋จธ์ง ๋ ธ๋๋ค์ ๋ฐ์ดํฐ๋ค์ ์๋ฆฌํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ ธ๋ ์์์๋ ์ด๋ค ๊ณผ์ ์ผ๋ก ๋์ํ ๊น์?
์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด์๋ ๋ ธ๋์ ๋ฐ์ดํฐ ์์ฒญ์ด ์ค๊ฒ ๋๋ฉด, ๋จผ์ MemTable์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ ํ์ธํฉ๋๋ค. ์ด๋, ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ข์ง๋ง ์๋ค๋ฉด ์ด๋ฏธ Flushing๋ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋์ด์๋ SSTable๋ค์ ํ์ธํด์ผ๊ฒ ์ฃ . ๊ทธ๋ ๋ค๊ณ ๋น์ฅ SSTable์ ์ ๊ทผํ๋ ๊ฒ์ ์๋๋๋ค. ๊ฐ๊ฐ์ SSTable์ ํ์ธ ํ ๋, ์ฑ๋ฅ ํฅ์์ ์ํด์ ํด๋น SSTable๊ณผ ์ง์ง์ด์ ๊ตฌ์ฑ๋์ด ์๋ Bloom Fileter์ Index๋ผ๋ ๊ฒ์ ๋จผ์ ํ์ธํ๋ ๊ฒ์ด์ฃ . (์ฌ๊ธฐ์ Index๋ ์ถํ ์๊ฐ ํ Secondery Index์๋ ๋ค๋ฅธ ์ฉ์ด์ ๋๋ค.)
Bloom Filter๋ ๊ธ์ ์ค๋ฅ๋ ๋ฐ์ ํ ์ ์์ง๋ง, ๋ถ์ ์ค๋ฅ๋ ๋ฐ์ํ์ง ์๋ ํ๋ฅ ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์ฝ๊ฒ ๋งํด์, ์๋ ๊ฑธ ์๋ค๊ณ ๊ฑฐ์ง๋ง ํ ์๋ ์์ง๋ง, ์๋ ๊ฑธ ์๋ค๊ณ ๊ฑฐ์ง๋ง ํ์ง๋ ์๋๋ค๋ ๊ฒ์ด์ฃ . I/O๊ฐ ์ผ์ด๋๊ธฐ ์ ์ ์ผ์ฐจ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด์๋ Bloom Filter๋ฅผ ํตํ์ฌ ์ง๊ฟ SSTable์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง๋ฅผ ํ์ธํ๋ค๋ฉด, ๊ทธ ๋ค์์ ์ญ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด์๋ Summery Index๋ฅผ ํตํด ๋์คํฌ์ ์ ์ฅ๋์ด์๋ ์๋ณธ Index๋ฅผ ํ์ธํ์ฌ SSTable ๋ด Data ์์น์ ๋ํ offset์ ์๊ฒ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ชจ๋ ๊ฑฐ์น ๋ค์์ผ ๋น๋ก์ ํด๋น SSTable์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋๋ ค์ค ์ ์๋ ๊ฒ์ด์ฃ . ์ด๋ฌํ ๋ฐ์ดํฐ์ ๊ฒ์ ๊ณผ์ ์ ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑ๋ SSTable๋ถํฐ ์ฐจ๋ก๋๋ก ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค.
๊ธ์ด ๊ธธ์ด์ก์ง๋ง ์์ง ์ง๊ณ ๋์ด๊ฐ์ผ ํ ์ ์ด ๋จ์ ์์ต๋๋ค. Delete์ ๋ํ ์ด์ผ๊ธฐ์ ๋๋ค.
Cassandra๋ Delete๋ฅผ ๋ฐ๋ก ์ํํ์ง ์์ต๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ์๋ Tombstone์ด๋ผ๋ marker๊ฐ ์กด์ฌํ๋ฉฐ, ํน์ ๋ฐ์ดํฐ์ Delete ์์ฒญ์ด ์ผ์ด๋ ๊ฒฝ์ฐ ์ด Tombstone์ ๋งํน์ ํ ๋ค์ ์ฃผ๊ธฐ์ ์ธ Garbage Collection์ด๋ SSTable์ Compaction ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ํ ๋ ๋น๋ก์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ง๋ก ์ญ์ ํ๋ ๊ฒ์ด์ฃ . ์ด๋ฌํ Tombstone์ ๊ฝค๋ ์ค์ํ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋์ง์ ๋ํด์ Cassandra์ ์ํฐํจํด๊ณผ ๊ด๋ จํ์ฌ ๋์ค์ ํ ๋ฒ ๋ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
์ด๋ ๊ฒ Cassandra์ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ์ ๋ฆฌํ๊ณ ๋ณด๋ ํ๊ฐ์ง ๋น ์ง ๋ถ๋ถ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ก Update์ ๋๋ค. ํ์ง๋ง ์์ ๋ง์ ๋ด์ฉ๋ค์ ์ด๋ฏธ ์ค๋ช ํ์๊ธฐ ๋๋ฌธ์ Update๋ ๋ช ๊ฐ์ง ์ค์ํ ๋ถ๋ถ๋ง ์ด์ง ์ง๊ณ ๋์ด๊ฐ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. Cassandra์ Update๋ ๋ด๋ถ์ ์ผ๋ก Delete/Write๋ก ๊ตฌํ๋์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ ๋งํ๋ฏ์ด ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ SSTable์ immutableํ๋ฏ๋ก Delete๋ฅผ ํตํด Tombstone์ ๋งํน์ ํ๊ฒ ๋๊ณ , Update ํด์ผ ํ ์๋ก์ด ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๊ณณ์ ์ฐ์ฌ์ง๊ฒ ๋ฉ๋๋ค.
4. 2ํธ์ ๋ง์น๋ฉฐ.
์ด์ฉ๋ค ๋ณด๋ 2ํธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ด์ฉ์ด ๋ง์ด ๊ธธ์ด์ง๊ฒ ๋์ด ์ฃ์กํ ๋ง์์ ๋๋ค. ์ต๋ํ ๊ฐ์ถ๋ฆฐ๋ค๊ณ ๊ฐ์ถ๋ ธ๋๋ฐ ์ฝ์ง๊ฐ ์์์ต๋๋ค. ์ด๋ฒ ํธ์์ ๋ฏธ์ฒ ๋ค๋ฃจ์ง ๋ชปํ Cassandra๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค, ์์ฃผ ์ฐ์ด๊ฑฐ๋ ์จ์๋ ์ ๋๋ ํจํด ๋ฑ์ ๋ด์ฉ์ ๋ง์ง๋ง 3ํธ์์ ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.