[ScyllaDB] ์†Œ๊ฐœ

[์›๋ณธ ๋งํฌ]

Scylladb๋Š” ์ดˆ๋Œ€ํ˜• ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜๋Š” K/V ๊ธฐ๋ฐ˜์˜ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ ํ•˜๋‚˜๋‹ค.

2015๋…„์— ๋‚˜์™”๊ณ , ์นด์‚ฐ๋“œ๋ผDB์™€ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ํ˜ธํ™˜๋œ๋‹ค.
๋” ๋†’์€ ์„ฑ๋Šฅ์œผ๋กœ ์นด์‚ฐ๋“œ๋ผ๋ฅผ ๋Œ€์ฒดํ•˜๋Š”๊ฒŒ ๋ชฉ์ ์ด๊ณ , ์ž˜ ๋‹ฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

Go์™€ Java ์ฒœ๊ตญ์ธ ์š”์ฆ˜ DB ์„ธ์ƒ์„ ๊ฑฐ์Šฌ๋Ÿฌ์„œ C++๋กœ ๋งŒ๋“ค์–ด์กŒ๋Š”๋ฐ, ๊ทธ ๋•๋ถ„์— ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋‚˜ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์•ˆ์ •์ ์ด๋ผ๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›๋Š”๋‹ค.
์นด์‚ฐ๋“œ๋ผ์™€ ๋น„๊ตํ•˜๋ฉด ๋™์ผ ์ŠคํŽ™์—์„œ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋ช‡๋ฐฐ์—์„œ ๋ช‡์‹ญ๋ฐฐ๊นŒ์ง€๋„ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋””์Šค์ฝ”๋“œ๊ฐ€ ์ค‘๋ฐ˜๊นŒ์ง€๋Š” ์นด์‚ฐ๋“œ๋ผDB๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ ๋‹จ์œ„๋ฅผ ๋„˜์–ด๊ฐ€์ž Java ํŠน์œ ์˜ ํ•œ๊ณ„๋ฅผ ๋А๊ปด์„œ Scylladb๋กœ ์˜ฎ๊ธด ์ƒํƒœ๋‹ค.
์ด๊ฑธ๋กœ ์ˆ˜์‹ญ์กฐ๋‹จ์œ„์˜ ๋ฉ”์„ธ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.




Docker๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด, ๋ฐ”๋กœ scylla ๋…ธ๋“œ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค.

docker run --hostname some-scylla -p 9042:9042 scylladb/scylla

9042 ํฌํŠธ๊ฐ€ ๊ธฐ๋ณธ client ์ ‘์† ํฌํŠธ๋‹ค.




Client ์ž‘์„ฑํ•˜๊ธฐ (Go)

ํ•œ๋ฒˆ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์„œ ์ž˜ ๋Œ์•„๊ฐ€๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž.

์นด์‚ฐ๋“œ๋ผ ํ˜ธํ™˜์ด๋ผ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ์นด์‚ฐ๋“œ๋ผ ๋ฒ„์ „์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๋ฉด ๋œ๋‹ค.

์•„๋ž˜๋Š” ํ‚ค์ŠคํŽ˜์ด์Šค์™€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ ๋’ค์— ๋ฐ”๋กœ select๋กœ ๊บผ๋‚ด์˜ค๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋‹ค.

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/gocql/gocql"
)

func main() {
	cluster := gocql.NewCluster("127.0.0.1:9042")

	session, err := cluster.CreateSession()

	if err != nil {
		log.Fatal(err)
	}

    // ํ‚ค์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ
	if err = session.Query("CREATE KEYSPACE IF NOT EXISTS test_space WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };").Exec(); err != nil {
		log.Fatal(err)
	}

    // ํ…Œ์ด๋ธ” ์ƒ์„ฑ 
	if err = session.Query(`CREATE TABLE IF NOT EXISTS test_space.item(
		uuid text PRIMARY KEY,
		item_name text,
		item_price double,
		last_update_timestamp timestamp
	);`).Exec(); err != nil {
		log.Fatal(err)
	}

    // insert
	if err = session.Query(`
		insert into test_space.item(uuid, item_name, item_price, last_update_timestamp)
		values
		('c714d095-0a63-4c1f-921d-42abd954e2c1', 'buldak', 100.5, toTimeStamp(now()));
	`).Exec(); err != nil {
		log.Fatal(err)
	}

    // insert
	if err = session.Query(`
		insert into test_space.item(uuid, item_name, item_price, last_update_timestamp)
		values
		('02773666-f483-4749-a3dd-c526e62daca2', 'eojuk', 4000, toTimeStamp(now()));
	`).Exec(); err != nil {
		log.Fatal(err)
	}

	var uuid string
	var item_name string
	var item_price float64
	var last_update_timestamp time.Time

    // select 
	iter := session.Query(`select * from test_space.item;`).Iter()

	for iter.Scan(&uuid, &item_name, &item_price, &last_update_timestamp) {
		fmt.Println("Row:", uuid, item_name, item_price, last_update_timestamp)
	}

	if err := iter.Close(); err != nil {
		log.Fatal(err)
	}
}

์นด์‚ฐ๋“œ๋ผ์™€ ๋˜‘๊ฐ™์ด ํ‚ค์ŠคํŽ˜์ด์Šค->ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ง€๊ณ , SQL ์Šคํƒ€์ผ์˜ ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ €๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด

์ด๋Ÿฐ์‹์œผ๋กœ ๋  ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://betterprogramming.pub/what-scylladb-is-and-why-you-should-care-58cb35af6cd7
https://hub.docker.com/r/scylladb/scylla/