๐Ÿ’ป/MLOps

Apache Cassandra

ruhz 2023. 7. 31. 18:37

๊ฐœ์š”

์•„ํŒŒ์น˜ ์นด์‚ฐ๋“œ๋ผ(Apache Cassandra)๋Š” ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ฐœ๋ฐœ๋œ ๋ถ„์‚ฐํ˜• NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒํ‹ฐ์…˜๋œ ๋„“์€ ์—ด(column) ์ €์žฅ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ตœ์ข… ์ผ๊ด€์„ฑ(eventual consistency)์„ ๊ฐ€์ง„๋‹ค.

์•„ํŒŒ์น˜ ์นด์‚ฐ๋“œ๋ผ๋Š” ์›๋ž˜ Facebook์—์„œ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, staged event-driven architecture (SEDA)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Amazon์˜ Dynamo ๋ถ„์‚ฐ ์ €์žฅ ๋ฐ ๋ณต์ œ ๊ธฐ์ˆ ๊ณผ Google์˜ Bigtable ๋ฐ์ดํ„ฐ ๋ฐ ์ €์žฅ ์—”์ง„ ๋ชจ๋ธ์˜ ๊ฒฐํ•ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. Dynamo์™€ Bigtable์€ ๋ชจ๋‘ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ์ด ๋†’์œผ๋ฉฐ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๊ฐ–์ถ˜ ์ €์žฅ ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ๊ฐ์€ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์นด์‚ฐ๋“œ๋ผ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ๋„์ „์— ๋Œ€๋น„ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค๊ณ„ ๋ชฉํ‘œ๋ฅผ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค:

  • ์ „์ฒด ๋‹ค์ค‘ ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ(Full multi-master database replication)
  • ์ €์ง€์—ฐ ์ „ ์„ธ๊ณ„์ ์ธ ๊ฐ€์šฉ์„ฑ(Global availability at low latency)
  • ์ €๊ฐ€์˜ ํ•˜๋“œ์›จ์–ด์—์„œ์˜ ํ™•์žฅ(Scaling out on commodity hardware)
  • ๊ฐ ์ถ”๊ฐ€ ํ”„๋กœ์„ธ์„œ๋งˆ๋‹ค ์„ ํ˜•์ ์ธ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€(Linear throughput increase with each additional processor)
  • ์˜จ๋ผ์ธ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ํ™•์žฅ(Online load balancing and cluster growth)
  • ํŒŒํ‹ฐ์…˜ ํ‚ค ์ง€ํ–ฅ ์ฟผ๋ฆฌ(Partitioned key-oriented queries)
  • ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ(Flexible schema)

 

ํŠน์ง•

์นด์‚ฐ๋“œ๋ผ(Cassandra)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด SQL๊ณผ ์œ ์‚ฌํ•œ ์–ธ์–ด์ธ ์นด์‚ฐ๋“œ๋ผ ์ฟผ๋ฆฌ ์–ธ์–ด(CQL, Cassandra Query Language)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. CQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์นด์‚ฐ๋“œ๋ผ ๋…ธ๋“œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Keyspace(ํ‚ค์ŠคํŽ˜์ด์Šค): ๋ฐ์ดํ„ฐ์…‹์ด ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋งˆ๋‹ค ์–ด๋–ป๊ฒŒ ๋ณต์ œ๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‹น ์ €์žฅ๋˜๋Š” ์‚ฌ๋ณธ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ‚ค์ŠคํŽ˜์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • Table(ํ…Œ์ด๋ธ”): ํŒŒํ‹ฐ์…˜๋“ค์˜ ๋ชจ์Œ์— ๋Œ€ํ•œ ํƒ€์ž…ํ™”๋œ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์€ ํŒŒํ‹ฐ์…˜๋“ค์„ ํฌํ•จํ•˜๋ฉฐ, ํŒŒํ‹ฐ์…˜์€ ๋กœ์šฐ๋“ค์„, ๋กœ์šฐ๋Š” ์ปฌ๋Ÿผ๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์นด์‚ฐ๋“œ๋ผ ํ…Œ์ด๋ธ”์€ ๊ธฐ์กด ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ๋“ค์„ ์˜ํ–ฅ ์—†์ด ์œ ์—ฐํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Partition(ํŒŒํ‹ฐ์…˜): ์นด์‚ฐ๋“œ๋ผ์˜ ๋ชจ๋“  ๋กœ์šฐ๋“ค์ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์ €์žฅ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๊ธฐ๋ณธ ํ‚ค์˜ ์ผ๋ถ€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ์ฟผ๋ฆฌ๋Š” ์ฟผ๋ฆฌ์— ํŒŒํ‹ฐ์…˜ ํ‚ค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Row(๋กœ์šฐ): ํŒŒํ‹ฐ์…˜ ํ‚ค์™€ ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋“ค๋กœ ์‹๋ณ„๋˜๋Š” ์ปฌ๋Ÿผ๋“ค์˜ ๋ชจ์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • Column(์ปฌ๋Ÿผ): ๋กœ์šฐ์— ์†ํ•˜๋Š” ๋‹จ์ผํ•œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ์„œ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

CQL์€ ํŒŒํ‹ฐ์…˜๋œ ๋ฐ์ดํ„ฐ์…‹์„ ๋Œ€์ƒ์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

1. ๋‹จ์ผ ํŒŒํ‹ฐ์…˜ ๊ฒฝ๋Ÿ‰ ํŠธ๋žœ์žญ์…˜: ์›์ž์ ์ธ ๋น„๊ต ๋ฐ ์„ค์ • ์˜๋ฏธ๋ก ์„ ๊ฐ€์ง„ ๋‹จ์ผ ํŒŒํ‹ฐ์…˜ ๊ฒฝ๋Ÿ‰ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
2. ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•, ํ•จ์ˆ˜ ๋ฐ ์ง‘๊ณ„ ํ•จ์ˆ˜
3. ์„ธํŠธ, ๋งต ๋ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ์ปฌ๋ ‰์…˜ ์œ ํ˜•
4. ๋กœ์ปฌ ๋ณด์กฐ ์ธ๋ฑ์Šค
5. (์‹คํ—˜์ ์ธ) ๋จธํ‹ฐ๋ฆฌ์–ผ๋ผ์ด์ฆˆ๋“œ ๋ทฐ

์นด์‚ฐ๋“œ๋ผ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋Š๋ฆฌ๊ณ  ๋†’์€ ๊ฐ€์šฉ์„ฑ์œผ๋กœ ์ „ ์„ธ๊ณ„์  ์˜๋ฏธ๋ก ์„ ์ œ๊ณตํ•˜๊ธฐ ์–ด๋ ค์šด ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์นด์‚ฐ๋“œ๋ผ๋Š” ๋‹ค์Œ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

1. ํŒŒํ‹ฐ์…˜ ๊ฐ„ ํŠธ๋žœ์žญ์…˜
2. ๋ถ„์‚ฐ ์กฐ์ธ
3. ์™ธ๋ž˜ ํ‚ค ๋˜๋Š” ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ

 

์šด์˜

์•„ํŒŒ์น˜ ์นด์‚ฐ๋“œ๋ผ(Apache Cassandra) ๊ตฌ์„ฑ ์„ค์ •์€ cassandra.yaml ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์ง์ ‘ ํŽธ์ง‘ํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ๋„์›€์œผ๋กœ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์„ค์ •์€ ์˜จ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์„ค์ •์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์นด์‚ฐ๋“œ๋ผ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. nodetool ๋ช…๋ น์€ ์นด์‚ฐ๋“œ๋ผ์˜ ์‹ค์‹œ๊ฐ„ ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ cassandra.yaml์—์„œ ๋งŽ์€ ์„ค์ •์„ ๋Ÿฐํƒ€์ž„์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. auditlogviewer๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ๋ณด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. fqltool์€ ์ „์ฒด ์ฟผ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ , ์žฌ์‹คํ–‰ํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. auditlogviewer์™€ fqltool์€ ์•„ํŒŒ์น˜ ์นด์‚ฐ๋“œ๋ผ 4.0์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

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

์•„ํŒŒ์น˜ ์นด์‚ฐ๋“œ๋ผ 4.0์€ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”, ์ผ์‹œ์  ๋ณต์ œ(์‹คํ—˜์ ), ๊ฐ์‚ฌ ๋กœ๊น…, ์ „์ฒด ์ฟผ๋ฆฌ ๋กœ๊น… ๋ฐ ์ž๋ฐ” 11 ์ง€์›(4.0.2 ๋ฒ„์ „๋ถ€ํ„ฐ ์™„์ „ ์ง€์›)์„ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.