๐๐๐ ์ ๊ฐ๋นํธ ๋๋ฅ๊ฐ ๋ฐฐ์น๐
79502 ๋จ์ด distributeddatabasesqlyugabytedb
์ด๊ฒ์ 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;
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐๐๐ ์ ๊ฐ๋นํธ ๋๋ฅ๊ฐ ๋ฐฐ์น๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/yugabyte/yugabyte-cross-continent-deployment-b7i
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
\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
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;
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐๐๐ ์ ๊ฐ๋นํธ ๋๋ฅ๊ฐ ๋ฐฐ์น๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://dev.to/yugabyte/yugabyte-cross-continent-deployment-b7i
ํ
์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
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
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;
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐๐๐ ์ ๊ฐ๋นํธ ๋๋ฅ๊ฐ ๋ฐฐ์น๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/yugabyte/yugabyte-cross-continent-deployment-b7iํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค