QueryPie Community Edition is live ๐ŸŽ‰ Get it now for free Download today!

๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ
๋ฐฑ์„œ

ํŠธ๋žœ์žญ์…˜๋ฆฌ์Šค, ์™„๋ฒฝํ•œ CDC(Change Data Capture) ์‹œ์Šคํ…œ ๊ตฌ์ถ•๋ฒ•

์ฟผ๋ฆฌํŒŒ์ด์˜ CDC ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ๋™๊ธฐํ™”ํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ถฉ๋Œ ์—†๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

Mason Oh

Mason Oh

Software Engineer

๋ฉ”์ด์Šจ์€ QueryPie์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ์ œ์–ด ์„œ๋ฒ„, ํ”„๋ก์‹œ ๊ฐœ๋ฐœ ๋ฐ SQL ํŒŒ์‹ฑ(.NET Core 8 ๋ฐ Antlr)์„ ์ „๋ฌธ์œผ๋กœ ํ•˜๋Š” ์ˆ™๋ จ๋œ ์—”์ง€๋‹ˆ์–ด์ž…๋‹ˆ๋‹ค. ๋ฉ”์ด์Šจ์€ Wireshark, dotnet-dump, APM๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TCP ํŒจํ‚ท ๋ถ„์„, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ CPU ์ตœ์ ํ™”์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. AWS ์ „๋ฌธ๊ฐ€๋กœ, NLB ๊ด€๋ จ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝํ—˜์ด ๋งŽ์œผ๋ฉฐ, Docker์— ๋Šฅ์ˆ™ํ•˜๊ณ  Kubernetes ์ง€์‹์„ ์ ๊ทน์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2024๋…„ 11์›” 22์ผ

ํŠธ๋žœ์žญ์…˜๋ฆฌ์Šค, ์™„๋ฒฝํ•œ CDC(Change Data Capture) ์‹œ์Šคํ…œ ๊ตฌ์ถ•๋ฒ•

์„œ๋ฌธ

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

๋งŽ์€ ์„œ๋น„์Šค ์ œ๊ณต์ž๋“ค์€ ์œ„์™€ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ถ”์ ํ•˜๋Š” ๊ธฐ์ˆ ์ธ CDC(Change Data Capture)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” QueryPie์—์„œ๋„ ์—ญ์‹œ CDC๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฑ์„œ์—์„œ๋Š” QueryPie์—์„œ ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ์—†์ด CDC ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋ฌธ์ œ

ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋ฐ˜ CDC๊ฐ€ ๊ฐ€์ง€๋Š” ๋ฌธ์ œ๋“ค

CDC๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ ์ด์ „ ๋ฐ์ดํ„ฐ์™€ ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ UPDATE ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ๋ณ€๊ฒฝ ์ „ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Issue to Solve
*์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ์ด์ „ ๋ฐ์ดํ„ฐ ๋ฐ ์ดํ›„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ*

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

ํŠธ๋žœ์žญ์…˜์˜ ๋กค๋ฐฑ์ด ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€๋Š” ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • MySQL 8.0 (on-premise, 8core(vcore 16), mem 256GB)
  • 100,000๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ DDL์„ ๊ฐ€์ง€๋Š” ํ…Œ์ด๋ธ” actor
  • ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์„ ๋ฌด์‹œํ•  ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅธ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ
CREATE TABLE actor (
    actor_id int NOT NULL AUTO_INCREMENT,
    first_name varchar(255) NOT NULL,
    last_name varchar(255) NOT NULL,
    last_update timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (actor_id)
);

ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด first_name์„ ๋ชจ๋‘ 'Christopher'๋ผ๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŒ์ผ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM actor;
...
100000 rows in set (0.42 sec)

mysql> UPDATE actor4 SET first_name='Christopher' WHERE 1;
Query OK, 100000 rows affected (1.54 sec)
Rows matched: 100000  Changed: 100000  Warnings: 0

mysql> ROLLBACK;
Query OK, 0 rows affected (0.85 sec)

mysql> UPDATE actor4 SET first_name='Christopher' WHERE 1;
Query OK, 100000 rows affected (1.58 sec)
Rows matched: 100000  Changed: 100000  Warnings: 0

mysql> COMMIT;
Query OK, 0 rows affected (0.04 sec)

๋™์ž‘์˜ ์†Œ์š” ์‹œ๊ฐ„์„ ํ…Œ์ด๋ธ”๋กœ ๊ฐ„์†Œํ™”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ํ…Œ์ด๋ธ” ์กฐํšŒ์™€ ์—…๋ฐ์ดํŠธ ์ด์™ธ์— CDC๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋œ ๋™์ž‘์€ ๋…ธ๋ž€์ƒ‰์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๋™์ž‘์ˆ˜ํ–‰ ์‹œ๊ฐ„
ํ…Œ์ด๋ธ” ์กฐํšŒ0.42s
ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ1.54s
ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ0.85s
ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ1.58s
ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹0.04s
์ด ์†Œ์š” ์‹œ๊ฐ„4.43s
์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ ๋™์ž‘์˜ ์ด ์†Œ์š” ์‹œ๊ฐ„2.04s
์ถ”๊ฐ€๋œ ๋™์ž‘์˜ ์ด ์†Œ์š” ์‹œ๊ฐ„2.39s

๋ณด์‹œ๋Š” ๋ฐ”์™€ ๊ฐ™์ด, ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ๊ธฐ๋ฐ˜ CDC์˜ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ์™€ ๋กค๋ฐฑ์œผ๋กœ ์ธํ•ด ๋‘ ๋ฐฐ ์ด์ƒ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” CDC ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด 50%์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ CDC ๊ตฌํ˜„์ด ๊ฐ€์ง€๋Š” ๋ฌธ์ œ๋“ค

์ด์™ธ์—๋„ ํ…Œ์ด๋ธ”์— ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ”์— modified_at ๋“ฑ ๋ณ€๊ฒฝ ์‹œ๊ฐ์ด๋‚˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ์กฐํšŒํ•˜๊ฑฐ๋‚˜, MySQL์˜ binlog์™€ ๊ฐ™์€ ๋กœ๊ทธ ํŒŒ์ผ์„ ํ™œ์šฉํ•˜์—ฌ CDC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ตฌํ˜„๋งˆ๋‹ค์˜ ์žฅ๋‹จ์ ์ด ์กด์žฌํ•˜์ง€๋งŒ, ๊ณตํ†ต์ ์œผ๋กœ๋Š” CDC์˜ ๋™์ž‘์„ ์œ„ํ•ด DBMS๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ CDC์˜ ๋™์ž‘์ด DBMS์— ์ข…์†๋œ๋‹ค๋Š” ๋‹จ์ ์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด DBMS ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ด€๋ จ๋œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ DBMS์— ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•˜์ง€ ์•Š๊ณ , DBMS ์ข…์†์„ฑ์ด ์ƒ๊ธฐ์ง€ ์•Š์œผ๋ฉด์„œ ํšจ๊ณผ์ ์œผ๋กœ CDC๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋ชฉํ‘œ ์„ค์ •

DBMS์— ๊ฐ€ํ•˜๋Š” ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋ ค๋ฉด, CDC ๊ตฌํ˜„ ์‹œ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋™์‹œ์— ๋™์ผํ•œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ค‘๋ณต๋œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ DBMS์™€์˜ ์ข…์†์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CDC์˜ ๋™์ž‘์„ ์œ„ํ•ด DBMS๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

QueryPie์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด, ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์‚ฌ๋‚ด ์ฟผ๋ฆฌ ๋ถ„์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ QSI(Query Structure Interface)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ทจ๋“ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ํ™•์ธํ•˜์ง€ ์•Š๊ณ ๋„ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ์ดํ›„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์†”๋ฃจ์…˜ ๊ฐœ์š”

Solution Overview
*QSI*์—์„œ *CDC* ๊ด€๋ จํ•œ *ActionAnalyzer* ์ชฝ์˜ *after row* ์˜ˆ์ธก ๋กœ์ง ๊ด€๋ จ ๋‹ค์ด์–ด๊ทธ๋žจ

QSI๋Š” ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๋Œ€์‹ , ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ์˜ํ•œ ์ฟผ๋ฆฌ์˜ ์ˆ˜ํ–‰์ด ๊ฐ€์ ธ์˜ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณ€๊ฒฝ ์ „ ํ…Œ์ด๋ธ” ์กฐํšŒ ๊ฒฐ๊ณผ์— ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋ณ€๊ฒฝ ํ›„ ํ…Œ์ด๋ธ” ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ฟผ๋ฆฌ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ํ™•์ธ์˜ ๊ณผ์ •์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, QSI ๋‚ด์—์„œ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋ณด๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” QueryPie์—์„œ๋Š” CDC๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์˜ ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰๊ณผ ๋กค๋ฐฑ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฟผ๋ฆฌ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋™์ž‘์„ ์œ„ํ•œ DBMS์˜ ์ˆ˜์ •๋„ ์š”๊ตฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, QueryPie ์„ค์น˜ ์ฆ‰์‹œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์  ์„ค๋ช… ๋ฐ ์•„ํ‚คํ…์ฒ˜

Technical Description and Architecture

QueryPie์˜ ์›น ์—๋””ํ„ฐ๋‚˜ ํ”„๋ก์‹œ ๋“ฑ์„ ํ†ตํ•ด QSI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ INSERT, UPDATE, DELETE์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ํฌํ•จ๋œ ์ฟผ๋ฆฌ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ถ„์„์„ ์œ„ํ•ด์„œ๋Š” ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ์ด์ „ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ, QSI์—์„œ๋Š” ์ž…๋ ฅ๊ฐ’์ธ ์‚ฌ์šฉ์ž์˜ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์‹ค์ œ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์งˆ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์„ ํŠน์ •ํ•˜๊ณ , ๋ถ„์„๋œ ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ƒ์„ฑ๋œ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ๋ณ€๊ฒฝ ์ˆ˜ํ–‰ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

QueryPie CDC์˜ ์˜ˆ์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ actor ํ…Œ์ด๋ธ”์˜ first_name์ด 'mason'์ธ ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด, last_name์„ 'oh'๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์œ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ QueryPie๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

UPDATE actor SET last_name='oh' WHERE first_name='mason';

QueryPie์—์„œ๋Š” ์œ„ ๊ตฌ๋ฌธ์„ ์ž…๋ ฅ๋ฐ›๊ณ  ์ด๋ฅผ QSI๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. QSI์—์„œ๋Š” ์ž…๋ ฅ๋ฐ›์€ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ, ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์–ป์€ ๊ฒฐ๊ณผ๋ฌผ์€ CDC์˜ โ€˜๋ณ€๊ฒฝ ์ด์ „ ๋ฐ์ดํ„ฐโ€™๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ฟผ๋ฆฌ์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SELECT last_name FROM actor WHERE first_name='mason';

์ด์ œ ์œ„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„์„ํ•œ ๋ฐ์ดํ„ฐ์™€, ๋ณ€๊ฒฝ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, first_name์˜ ๊ฐ’์ด 'mason'์ธ ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด last_name์„ 'oh'๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ actor ํ…Œ์ด๋ธ”์˜ ๋ณ€๊ฒฝ ์ด์ „ ๋ฐ์ดํ„ฐ์— ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ๊ฒฐ๊ณผ๋ฌผ์€ CDC์˜ '๋ณ€๊ฒฝ ์ดํ›„ ๋ฐ์ดํ„ฐโ€™๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ จ์˜ ๊ณผ์ •์„ ํ†ตํ•ด, ์šฐ๋ฆฌ๋Š” CDC์— ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์ด์ „ ๋ฐ์ดํ„ฐ์™€ ๋ณ€๊ฒฝ ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ทจ๋“ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ทจ๋“ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ถ€ DBMS์— ์ €์žฅํ•จ์œผ๋กœ์จ CDC์˜ ๋™์ž‘์„ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์ 

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

๊ธฐ๋Œ€ ํšจ๊ณผ

QueryPie CDC๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์•ž์„œ ๋ฌธ์ œ ๋‹จ๋ฝ์—์„œ ํ™•์ธํ–ˆ๋˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์—์„œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. QSI ์ฟผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋‹จ๊ณ„๋Š” DBMS์— ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ ๋ฐ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๋™์ž‘์ธ ๊ฒƒ ๋˜ํ•œ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ ์ž…๋‹ˆ๋‹ค.


๋™์ž‘์ˆ˜ํ–‰ ์‹œ๊ฐ„
ํ…Œ์ด๋ธ” ์กฐํšŒ0.42s
ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ1.54s -> 0s
ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ0.85s -> 0s
QSI ์ฟผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜1.62s
ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ1.58s
ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹0.04s
์ด ์†Œ์š” ์‹œ๊ฐ„3.66s
์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ ๋™์ž‘์˜ ์ด ์†Œ์š” ์‹œ๊ฐ„2.04s
์ถ”๊ฐ€๋œ ๋™์ž‘์˜ ์ด ์†Œ์š” ์‹œ๊ฐ„2.39s -> 1.62s

์ด์ฒ˜๋Ÿผ QueryPie CDC๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋ฐ˜ CDC ๋Œ€๋น„ 35% ๋” ๋น ๋ฅธ ๋™์ž‘์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, DBMS์— ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ ๋ฐ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์„ ์ƒ๋žตํ•˜์—ฌ DBMS์— ๋Œ€ํ•œ ๋ถ€ํ•˜๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

QueryPie CDC์˜ 3๋Œ€ ์žฅ์ : ์„ฑ๋Šฅ, ์œ ์—ฐ์„ฑ, ํ™•์žฅ์„ฑ

QueryPie CDC๊ฐ€ ๋‹ค๋ฅธ CDC ์†”๋ฃจ์…˜๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์šฐ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๊ฒฐ๋ก 

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

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

๋ฐ์ดํ„ฐ๋Š” ๋ฏธ๋ž˜์˜ ํ•ต์‹ฌ ์ž์‚ฐ์ž…๋‹ˆ๋‹ค. QueryPie๋Š” ํ•ต์‹ฌ ์ž์‚ฐ์„ ๋ณดํ˜ธํ•˜๋ฉฐ, ๊ธฐ์—…๊ณผ ๊ณ ๊ฐ์˜ ์„ฑ๊ณต์„ ์œ„ํ•˜๋Š” ์‹ ๋ขฐ๋ฐ›๋Š” ํŒŒํŠธ๋„ˆ๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜๋ฆฌ์Šค, ์™„๋ฒฝํ•œ CDC(Change Data Capture) ์‹œ์Šคํ…œ ๊ตฌ์ถ•๋ฒ• | QueryPie