๐Ÿš€YugabyteDB ๐Ÿ˜pgreplay์—์„œ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ

7277 ๋‹จ์–ด replaypostgresyugabytedbrat
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์žฌ์ƒํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Oracle์—๋Š” RAT(Real Application Testing)๊ฐ€ ์žˆ๊ณ  PostgreSQL์—๋Š” Laurenz Albe๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” pgreplay(https://github.com/laurenz/pgreplay)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๋žฉ์—์„œ ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ ๋Œ€์ƒ์„ csvlog ๋กœ ์ •์˜ํ•˜๊ณ  documentation์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋Œ€๋กœ ๋กœ๊ทธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

docker run -v /var/tmp/yb:/var/tmp \
 -d --rm --name yb yugabytedb/yugabyte:2.15.2.0-b87 \
bash -c '

cat > tserver.flagfile <<CAT
--ysql_pg_conf_csv=\
log_destination=csvlog,\
log_statement=all,\
log_min_messages=error,\
log_min_error_statement=log,\
log_connections=on,\
log_disconnections=on
CAT

yugabyted start --tserver_flags=flagfile=tserver.flagfile 

while true ; do tail -F /root/var/logs/tserver/postgres* ; done
'

/var/tmp๋ฅผ ์™ธ๋ถ€ ๋ณผ๋ฅจ์œผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์žฌ์ƒํ•˜๋ ค๋Š” ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. pg_rotate_logfile()๋กœ ๋กœ๊ทธ๋ฅผ ํšŒ์ „ํ•˜๊ณ  pg_current_logfile()๋กœ ํŒŒ์ผ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. YugabyteDB ์ฟผ๋ฆฌ ๋ ˆ์ด์–ด(YSQL)๋Š” PostgreSQL์ด๋ฏ€๋กœ ๋™์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
pgbench๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค(pgbench๋Š” YugabyteDB ๋ฐฐํฌ์—์„œ ysql_bench์ด๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ PostgresSQLpgbench์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค):

docker exec -i yb bash -c '

/home/yugabyte/postgres/bin/ysql_bench -i 

'




ํฌ์ฐฉ



๋‚˜๋Š” ๊ฐ„๋‹จํ•œ pgbench ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด์ „์— ๋กœ๊ทธ ํŒŒ์ผ์„ ํšŒ์ „ํ•˜๋„๋ก ์ฃผ์˜ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰์— /var/tmp ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

docker exec -i yb bash -c "

ysqlsh -c \"select pg_rotate_logfile()\"

/home/yugabyte/postgres/bin/ysql_bench -n

ysqlsh -tc \"
select format('cp %L /var/tmp/workload.csv',pg_current_logfile())
\" | sh -x

"




์ด csvlog ์›Œํฌ๋กœ๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” pgbench๋Š” /var/tmp/workload.csv์ด๋ฉฐ ์žฌ์ƒํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณต์ œ๋ณธ(์ฐธ์กฐ) ๋˜๋Š” pg_dump(ysql_dump๋Š” YugabyteDB ๋ฒ„์ „์ž„)์—์„œ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” pgbench -i ๋กœ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์žฌ์ƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ–‰์„ ์„ธ๊ณ  ํ•ฉ์‚ฐํ•ฉ๋‹ˆ๋‹ค(pgbench๋Š” ์ž„์˜์˜ ์–‘์„ ์‚ฌ์šฉํ•จ).

docker exec -i yb bash -c '
ysqlsh -c "select count(*), sum(abalance) from ysql_bench_accounts;"
/home/yugabyte/postgres/bin/ysql_bench -i 
ysqlsh -c "select count(*), sum(abalance) from ysql_bench_accounts;"
'




๋‹ค์‹œ ํ•˜๋‹ค


pgreplay๋กœ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

git clone https://github.com/laurenz/pgreplay.git
cd pgreplay
docker build -t laurenz/pgreplay -f Dockerfile .

csvlog ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด VisiData๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. pip3 install visidata์™€ ํ•จ๊ป˜ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ /var/tmp/yb ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker run --rm -it -w /logs -v /var/tmp/yb:/logs \
jauderho/visidata:latest \
workload.csv




ํ—ค๋”๋Š” ์—†์ง€๋งŒ ํ˜•์‹์€ https://www.postgresql.org/docs/current/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-CSVLOG์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ pgreplay๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณผ๋ฅจ์— ์•ก์„ธ์Šคํ•˜์—ฌ csvlog๋กœ -v๋ฅผ ์ฝ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•˜์—ฌ --link๋กœ ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

docker run --rm -ti -w /logs --link yb:yb \
-v /var/tmp/yb:/logs \
laurenz/pgreplay pgreplay -c -h yb -p 5433 \
/logs/workload.csv






์žฌ์ƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

docker exec -i yb bash -c '
ysqlsh -c "select count(*), sum(abalance) from ysql_bench_accounts;"
'




์ด ๋ธ”๋กœ๊ทธ๋Š” ๋‹จ์ง€ YugabyteDB์™€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ pgreplay documentation์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋‘ YugabyteDB์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์—์„œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์บก์ฒ˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ฐ ๋…ธ๋“œ์—๋Š” ๋กœ๊ทธ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ ID(์‹œ์ž‘ ์‹œ๊ฐ„ ๋ฐ ๋ฐฑ์—”๋“œ pid์—์„œ ๋นŒ๋“œ๋œ csvlog์˜ 6๋ฒˆ์งธ ํ•„๋“œ๋Š” ๋‹ค๋ฅธ ํ•„๋“œ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ณ ์œ ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์žฌ์ƒ์€ ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์ง€๋งŒ HA ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ์„ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์บก์ฒ˜ํ•˜๋ ค๋Š” ํ•ญ๋ชฉ๊ณผ ์žฌ์ƒํ•˜๋ ค๋Š” ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. PostgreSQL์—์„œ ์บก์ฒ˜ํ•˜๊ณ  YugabyteDB๋กœ ์žฌ์ƒํ•˜๋Š” ๊ฒƒ๋„ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

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