๐ŸŒŽ๐ŸŒ๐ŸŒ ์œ ๊ฐ€๋น„ํŠธ ๋Œ€๋ฅ™๊ฐ„ ๋ฐฐ์น˜๐Ÿš€

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

์ด๊ฒƒ์€ outDBaaS platform์—์„œ ์˜จ ๋ณด๊ธฐ๋กœ ๋ถ„ํฌ์‹ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐ„๋‹จํ•œ GUI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.์ด ์„ธ ์ง€์—ญ์€ AWS:eu-west-1์€ ๋ฒ ๋ฅผ๋ฆฐ(์•„์ผ๋žœ๋“œ), us-east-2๋Š” ์˜คํ•˜์ด์˜ค(๋ฏธ๊ตญ), ap-south-1b๋Š” ๋ฒต๊ณจ(์ธ๋„)์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. eu-west-1๋งŒ'์šฐ์„ '๋ฆฌ๋”์‹ญ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์Šค์œ„์Šค์— ์‚ฐ๋‹ค. ๋‚˜๋Š” ์œ ๋Ÿฝ์˜ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ทธ๊ณณ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์„ ํƒํ•œ ์ง€๋„์ž์˜ ์œ„์น˜๋ฅผ ์ •์˜ํ•  ๊ฒƒ์ด๋‹ค.์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๋Šฆ์–ด์ง€๋Š” ์˜๋ฏธ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.
๋‚˜๋Š” ๋‘ ๊ฐœ์˜ ํ‘œ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.ํ•˜๋‚˜๋Š” ์‚ฐ์—ด ๊ตฌ๋ถ„์ด๊ณ , ์ด ๋ฒ”์œ„ ์Šค์บ”์€ 6๊ฐœ์˜ ํƒœ๋ธ”๋ฆฟPC๋ฅผ ์ฝ์„ ๊ฒƒ์ด๋‹ค.๊ทธ๋ฆฌ๊ณ  ํ•œ ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
drop table franck_hash;
drop table franck_range;

create table franck_hash (k int, v int, primary key(k hash)) split into 6 tablets;
create table franck_range (k int, v int, primary key(k asc)) split at values ((100),(200),(300),(400),(500));

insert into franck_hash select generate_series(100,999),1;
insert into franck_range select generate_series(100,999),1;
'์นœ์—ฐ ๋ฆฌ๋”'์—์„œ ํƒœ๋ธ”๋ฆฟPC ๋ชฉ๋ก์€ ๊ฐ™์€ ๋…ธ๋“œ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฆฌ๋”(172.159.25.209)๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด์ œ 100์ค„์„ ์ฝ๊ณ  ์“ฐ๊ธฐ (์—…๋ฐ์ดํŠธ) ํ•˜๊ณ  ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์šดํ–‰ ์‹œ๊ฐ„์„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.๋‚˜๋Š” ๋ฉ”์ธ ํ‚ค์—์„œ ๋ฒ”์œ„๋ฅผ ์ฝ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฐจ ํŒŒํŽธ ์กฐ์ž‘์ด ์—†์—ˆ๋‹ค.

ํƒœ๋ธ”๋ฆฟPC์—์„œ ์ฝ๊ธฐ


\c postgres://yugabyte@eu-west-1.compute.amazonaws.com:5433/yugabyte
psql (15devel, server 11.2-YB-2.9.1.0-b0)

yugabyte=# -- read from one tablet:
yugabyte=# explain analyze select count(*),min(k),max(k)
           from franck_range
           where k between 100 and 100+99;
                                                               QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=4.12..4.13 rows=1 width=16) (actual time=0.768..0.768 rows=1 loops=1)
   ->  Index Scan using franck_range_pkey on franck_range  (cost=0.00..4.12 rows=1 width=4) (actual time=0.706..0.747 rows=100 loops=1)
         Index Cond: ((k >= 100) AND (k <= 199))
 Planning Time: 1.207 ms
 Execution Time: 0.813 ms
(5 rows)

yugabyte=# \watch 0.001
์šฐ๋ฆฌ๋Š” ์„ ๋„์ž๋กœ๋ถ€ํ„ฐ ํƒœ๋ธ”๋ฆฟ (๋ฒ”์œ„๋Š” [100200]) ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋กœ์ปฌ: 0.813๋ฐ€๋ฆฌ ์ดˆ์ž…๋‹ˆ๋‹ค. ๋‹ค์ค‘ ์˜์—ญ์€ ์—ฌ๊ธฐ์— ์„ค์ •๋˜์–ด ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒœ๋ธ”๋ฆฟPC์— ์“ฐ๋‹ค


yugabyte=# -- write in one tablet:
yugabyte=# explain analyze update franck_range 
           set v=v+1 
           where k between 100 and 100+99;
                                                               QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
 Update on franck_range  (cost=0.00..4.12 rows=1 width=40) (actual time=1.378..1.378 rows=0 loops=1)
   ->  Index Scan using franck_range_pkey on franck_range  (cost=0.00..4.12 rows=1 width=40) (actual time=0.946..0.999 rows=100 loops=1)
         Index Cond: ((k >= 100) AND (k <= 199))
 Planning Time: 0.063 ms
 Execution Time: 127.107 ms
(5 rows)

yugabyte=# \watch 0.001
์—…๋ฐ์ดํŠธ๋Š” ์ง€์‹œ์„ ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ƒˆ ๊ฐ’์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.์ด๋Ÿฐ ์ƒํ™ฉ์€ ์œ ๋Ÿฝ์—์„œ ๋ฐœ์ƒํ•˜์˜€๋Š”๋ฐ, ์ง€์—ฐ์€ ์—ฌ์ „ํžˆ ๋งค์šฐ ๋‚ฎ๋‹ค.์—…๋ฐ์ดํŠธ์—์„œ ์‹ค์ œ ์‹œ๊ฐ„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: 1.378๋ฐ€๋ฆฌ์ดˆ.๊ทธ๋Ÿฌ๋‚˜ RF=3 ์ค‘์žฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ง€๋„์ž๋Š” ์ˆ˜ํ–‰์ž๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ๊ธฐ ์กฐ์ž‘์„ ๋ณด๋‚ด๊ณ  ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.์˜คํ•˜์ด์˜ค ์•„์ผ๋žœ๋“œ์˜ ์ง€์—ฐ์€ ๋ฒต๊ณจ๋ณด๋‹ค ๋‚ฎ์„ ์ˆ˜๋„ ์žˆ๋‹ค.์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์‹คํ–‰ ์‹œ๊ฐ„์— ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์„œ์–‘์„ ์™•๋ณตํ•˜๋Š” ๋ฐ 127.107๋ฐ€๋ฆฌ์ดˆ์ด๋‹ค.
์ด๋Š” ์˜์—ญ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค ์—†์ด ํŽ˜์ผ์˜ค๋ฒ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์ž…๋‹ˆ๋‹ค.๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์›๊ฒฉ ์˜์—ญ๊นŒ์ง€์˜ ์ง€์—ฐ์€ ๋กœ์ปฌ ์“ฐ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

๋ชจ๋“  ํƒœ๋ธ”๋ฆฟ ์ฝ๊ธฐ


๋ถ„ํฌ์‹ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋งŽ์€ ์กฐ์ž‘์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํƒœ๋ธ”๋ฆฟPC๋ฅผ ์ฝ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ๋‹ค. ์™ธ๋ถ€ ํ‚ค ๊ฒ€์‚ฌ, 2๋‹จ๊ณ„ ์ธ๋ฑ์Šค ์ฝ๊ธฐ, ๋ณ‘๋ ฌ ์‚ฌ๋ฌด ์ƒํƒœ ๊ฒ€์‚ฌ.๋‚˜๋Š” ๋ชจ๋“  ํƒœ๋ธ”๋ฆฟPC์˜ ์ฝ๊ธฐ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์‹œ๊ฐ€ ๋‚˜๋ˆ„๋Š” ์‹œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
yugabyte=# -- read from all tablets:
yugabyte=# explain analyze select count(*),min(k),max(k)
           from franck_hash
           where k between 100 and 100+99;

                                                    QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=112.50..112.51 rows=1 width=16) (actual time=4.109..4.109 rows=1 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..105.00 rows=1000 width=4) (actual time=0.962..4.086 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.065 ms
 Execution Time: 4.162 ms
(6 rows)
yugabyte=# \watch 0.001
์ง€์—ฐ์€ ๋” ๋†’์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ์˜์—ญ์˜ ํƒœ๋ธ”๋ฆฟPC ๋ฆฌ๋”๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์œ ์ง€๋œ๋‹ค.๋‹ค์‹œ ํ•œ ๋ฒˆ, ์ง€๋„์ž์˜ ์นœํ™”๋ ฅ ๋•๋ถ„์— ๋‹ค๊ตฌ์—ญ ๋ฐฐ์น˜๋Š” ์ฝ๊ธฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

๋ชจ๋“  ํƒœ๋ธ”๋ฆฟPC์— ์ ํ˜€์žˆ์–ด์š”.


yugabyte=# -- write in all tablets:
yugabyte=# explain analyze update franck_hash
           set v=v+1
           where k between 100 and 100+99;

                                                     QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=389.627..389.627 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=1.015..388.980 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.063 ms
 Execution Time: 498.895 ms
(6 rows)

yugabyte=# \watch 0.001
์“ฐ๊ธฐ ์‹œ ์ค‘์žฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํƒœ๋ธ”๋ฆฟPC์˜ ํฌ๋กœ์Šค ๊ตฌ์—ญ ์ง€์—ฐ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.๋‚ด ํƒœ๋ธ”๋ฆฟPC ์—ฌ์„ฏ ๊ฐœ๋กœ ๊ฑฐ์˜ 0.5์ดˆ์•ผ.์—ฌ๊ธฐ์„œ, ๊ณผ๋„ํ•œ ํฌ๋กœ์Šค ํ˜ธ์ถœ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

us-east-2/us-east-2a์—์„œ ๋…ธ๋“œ ์ •์ง€


์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์—ญ์ด๋‹ค.๋‚˜๋Š” ์˜คํ•˜์ด์˜ค์—์„œ ๋…ธ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ณ  ์ง€์—ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๊ฒƒ์ด๋‹ค.\watch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํƒœ๋ธ”๋ฆฟ write๋ฅผ ์—ฐ์†์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
                                     Wed 01 Dec 2021 05:05:49 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=444.155..444.155 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=48.344..443.480 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.065 ms
 Execution Time: 537.800 ms
(6 rows)

                                     Wed 01 Dec 2021 05:05:49 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=441.697..441.697 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=46.783..441.126 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.065 ms
 Execution Time: 520.722 ms
(6 rows)

                                     Wed 01 Dec 2021 05:05:50 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=573.195..573.195 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=48.276..572.638 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.064 ms
 Execution Time: 799.801 ms
(6 rows)

                                     Wed 01 Dec 2021 05:05:51 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=694.457..694.457 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=89.387..693.864 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.062 ms
 Execution Time: 860.702 ms
(6 rows)

                                     Wed 01 Dec 2021 05:05:52 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=701.733..701.733 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=90.344..701.146 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.074 ms
 Execution Time: 906.075 ms
(6 rows)

                                     Wed 01 Dec 2021 05:05:53 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=810.418..810.418 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=89.464..809.829 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.063 ms
 Execution Time: 932.995 ms
(6 rows)

                                     Wed 01 Dec 2021 05:05:54 PM GMT (every 0.1s)

                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=698.900..698.900 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=90.042..698.259 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.063 ms
 Execution Time: 848.855 ms
(6 rows)
๋—๋ชฉ ์ง€๋„์ž ์„ ๊ฑฐ๋ฅผ ์น˜๋ฅด์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ง€๋„์ž๊ฐ€ ์•„์ผ๋žœ๋“œ์˜ ๋…ธ๋“œ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.๊ทธ๋Ÿฌ๋‚˜ ์ง€์—ฐ์€ ์ฆ๊ฐ€ํ–ˆ๋‹ค. ํ˜„์žฌ ๋ฒ•์ • ์ธ์›์€ ๋” ์ง€์—ฐ๋œ ๋ฉ๋ฉ”์ด๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋‹ค์Œ ํ…Œ์ŠคํŠธ์—์„œ ๋‚˜๋Š” ์˜คํ•˜์ด์˜ค์—์„œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๊ฐ€๋™ํ–ˆ๋‹ค.

๋ฏธ๊ตญ ๋™๋ถ€ 2๋ฒˆ์ง€์— ์—ฐ๊ฒฐ


์ง€๋„์ž์˜ ์นœํ™”๋ ฅ์„ ์ •์˜ํ•˜๋Š” ๋™์ผํ•œ ๊ตฌ์—ญ์— ์—ฐ๊ฒฐํ•จ์œผ๋กœ์จ ๋‚˜๋Š” ์ง€์—ฐ์„ ์ตœ๋Œ€ํ•œ ์ค„์˜€๋‹ค.์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ์ง€ ๋ด…์‹œ๋‹ค.์—ฌ๊ธฐ์—์„œ, ๋‚˜๋Š” ์‹œ์ž‘์ฒ˜๋Ÿผ ์‹คํ–‰ํ•  ๊ฒƒ์ด๋‹ค.๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๊ตญ์˜ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
\c postgres://yugabyte@us-east-2.compute.amazonaws.com:5433/yugabyte
psql (15devel, server 11.2-YB-2.9.1.0-b0)

yugabyte=# -- read from one tablet:
yugabyte=# explain analyze select count(*),min(k),max(k) from franck_range where k between 100 and 100+99;
                                                                QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=4.12..4.13 rows=1 width=16) (actual time=79.167..79.168 rows=1 loops=1)
   ->  Index Scan using franck_range_pkey on franck_range  (cost=0.00..4.12 rows=1 width=4) (actual time=79.115..79.148 rows=100 loops=1)
         Index Cond: ((k >= 100) AND (k <= 199))
 Planning Time: 0.063 ms
 Execution Time: 79.216 ms
(5 rows)

yugabyte=# -- write in one tablet:
yugabyte=# explain analyze update franck_range set v=v+1 where k between 100 and 100+99;
                                                                QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
 Update on franck_range  (cost=0.00..4.12 rows=1 width=40) (actual time=79.463..79.463 rows=0 loops=1)
   ->  Index Scan using franck_range_pkey on franck_range  (cost=0.00..4.12 rows=1 width=40) (actual time=79.080..79.127 rows=100 loops=1)
         Index Cond: ((k >= 100) AND (k <= 199))
 Planning Time: 0.064 ms
 Execution Time: 310.338 ms
(5 rows)

yugabyte=# -- read from all tablets:
yugabyte=# explain analyze select count(*),min(k),max(k) from franck_hash where k between 100 and 100+99;
                                                     QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=112.50..112.51 rows=1 width=16) (actual time=473.667..473.667 rows=1 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..105.00 rows=1000 width=4) (actual time=79.107..473.640 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.066 ms
 Execution Time: 473.724 ms
(6 rows)

yugabyte=# -- write in all tablets:
yugabyte=# explain analyze update franck_hash set v=v+1 where k between 100 and 100+99;
                                                      QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=1106.744..1106.744 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=79.298..1106.190 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.079 ms
 Execution Time: 1264.824 ms
(6 rows)
๋…์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์•„์ผ๋žœ๋“œ์˜ ์ง€๋„์ž์—๊ฒŒ ๋งก๊ฒจ์•ผ ํ•œ๋‹ค.๋‹จ์ผ ์Šฌ๋ผ์ด์Šค๋Š” 79.216ms, ๋‹ค์ค‘ ์Šฌ๋ผ์ด์Šค๋Š” 473.724ms์ž…๋‹ˆ๋‹ค.๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๊ตญ์— ์žˆ๋‹ค๋ฉด, ๊ทธ๋…€๋Š” ์˜คํ•˜์ด์˜ค์˜ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด SQL ์กฐํšŒ์—์„œ ์ด ์ง€์—ฐ์„ ์–ป๊ฑฐ๋‚˜, ์•„์ผ๋žœ๋“œ์˜ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ๋น ๋ฅธ SQL ์กฐํšŒ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฐ™์€ ์ง€์—ฐ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋˜๋Œ์•„์˜จ๋‹ค๋Š” ๊ฒƒ์€ ์‹ ๊ธฐํ•œ ๊ฒƒ์ด ์—†๋‹ค.์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” yb_read_from_followers = on ๋กœ์ปฌ์—์„œ ์ˆ˜๋™์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.์ตœ์ข… ์ผ์น˜์„ฑ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.์ตœ์ข…์ ์œผ๋กœ ์ผ์น˜์„ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์ง„๋ถ€์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๊ต์  ๋‚ฎ์ง€๋งŒ ๋„คํŠธ์›Œํฌ ๊ตฌ์—ญ์„ ๋‚˜๋ˆ„๋Š” ์ƒํ™ฉ์—์„œ ๋น„๊ต์  ํฌ๋‹ค.YugabyteDB๊ฐ€ ์žˆ์œผ๋ฉด ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„yb_follower_read_staleness_ms์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ ํƒ ์˜์—ญ ์ฐจ๋‹จ eu-west-1


๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฆฌ๋”์‹ญ ๊ตฌ์—ญ์—์„œ ์ผ์–ด๋‚œ ์ผ์€ ์‹คํŒจํ–ˆ๋‚˜์š”?3์ดˆ ์•ˆ์— ์ƒˆ๋กœ์šด ์ง€๋„์ž๊ฐ€ ์ถ”์ข…์ž ์ค‘์—์„œ ์„ ์ถœ๋  ๊ฒƒ์ด๋‹ค.๊ด€๋ จ ๊ทœ์น™์ด ์—†์œผ๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๋‘ ๋…ธ๋“œ์™€ ๊ท ํ˜•์ด ๋งž์Šต๋‹ˆ๋‹ค.

RF=3 ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ธํ•ด ๋…ธ๋“œ๊ฐ€ ๋‹ซํž ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ณ„์† ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.๋‚˜๋Š” ์ตœ์•…์˜ ์ƒํ™ฉ, ์ฆ‰ ๋ฉ€ํ‹ฐํƒœ๋ธ”๋ฆฟ์„ ์‹คํ–‰ํ•  ๊ฒƒ์ด๋‹ค.
yugabyte=# explain analyze 
           update franck_hash set v=v+1 
           where k between 100 and 100+99;

                                                       QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Update on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=2023.501..2023.502 rows=0 loops=1)
   ->  Seq Scan on franck_hash  (cost=0.00..107.50 rows=1000 width=40) (actual time=194.785..2022.931 rows=100 loops=1)
         Filter: ((k >= 100) AND (k <= 199))
         Rows Removed by Filter: 800
 Planning Time: 0.062 ms
 Execution Time: 2220.721 ms
(6 rows)
์˜คํ•˜์ด์˜ค์™€ ๋ฉ๋ฉ”์ด์˜ ์ง€๋„์ž, ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๋ž˜๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์˜ ํƒœ๋ธ”๋ฆฟPC์— ๊ธฐ๋ก๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์„œ๋น„์Šค๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง€์—ฐ์ด ๋งค์šฐ ๋†’๋‹ค.์ด๊ฒƒ์€ ์ตœ์•…์˜ ์ƒํ™ฉ์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„์‹ค๋˜์ง€ ์•Š์•˜๋‹ค.ํ”„๋ ˆ์  ํ…Œ์ด์…˜์—์„œ ๋‚˜๋Š” ์„ธ ๊ฐœ์˜ ๋จผ ์ง€์—ญ์—์„œ๋งŒ ์„ธ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.์‹ค์ œ ๋ฐฐ์น˜์—์„œ, ๋‹น์‹ ์€ ์ง€์—ญ์˜ ๊ฐ€์šฉ์„ฑ ๊ตฌ์—ญ๊ณผ ๋” ๊ฐ€๊นŒ์šด ๊ตฌ์—ญ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•๋ณดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ ๋Ÿฝ์—์„œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ง€์—ญ์˜ ํƒœ๋ธ”๋ฆฟPC ๋™์—…์ž๋Š” ์ž๋™์œผ๋กœ ๋ฆฌ๋”๋กœ ์„ ์ถœ๋˜์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ์ง€์—ญ์€ ์ฒซ ๋ฒˆ์งธ ์„ ํƒ ์ง€์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

์„œ๋ฒ„ ํด๋ก


๋ฉ”์ธ ์„œ๋ฒ„๋„ eu-west-a1๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํƒœ๋ธ”๋ฆฟ ์„œ๋ฒ„์— ์ผ๋ฐ˜์ ์ธ ์‹ฌ์žฅ ๋ฐ•๋™์„ ๋ณด๋‚ผ ๋•Œ ์™•๋ณต ์ง€์—ฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ถ„๋ช…ํžˆ eu-west-1a๋Š” ๋ฉ๋ฉ”์ด๋ณด๋‹ค ๋น ๋ฅผ ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์˜ ํ…Œ์ŠคํŠธ์—์„œ ๋ณด๋“ฏ์ด ์™•๋ณต ์‹œ๊ฐ„์€ 77.98๋ฐ€๋ฆฌ์ดˆ์ด๊ณ  ์™•๋ณต ์‹œ๊ฐ„์€ 120.39๋ฐ€๋ฆฌ์ดˆ์ด๋‹ค.๊ธฐ๋ณธ ์„ค์ • ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃน์„ ์„ค์ •ํ•  ๋•Œ ์ด ์ ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.๋„ˆ๋„ cloudping์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์ด๊ณณ์—์„œ ํ•œ ์ผ์„ ์žฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์žฅ์ด๋‹ค.
drop table franck_hash;
drop table franck_range;
-- create tables
create table franck_hash (k int, v int, primary key(k hash)) split into 6 tablets;
create table franck_range (k int, v int, primary key(k asc)) split at values ((100),(200),(300),(400),(500));
-- insert rows
insert into franck_hash select generate_series(100,999),1;
insert into franck_range select generate_series(100,999),1;
-- list the nodes
select * from yb_servers();
-- read from one tablet:
explain analyze select count(*),min(k),max(k) from franck_range where k between 100 and 100+99;
-- write in one tablet:
explain analyze update franck_range set v=v+1 where k between 100 and 100+99;
-- read from all tablets:
explain analyze select count(*),min(k),max(k) from franck_hash where k between 100 and 100+99;
-- write in all tablets:
explain analyze update franck_hash set v=v+1 where k between 100 and 100+99;

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ