Shinyproxy: ShinyProxy์—์„œ ๋ฐ˜์ง์ด๋Š” ์•ฑ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2020๋…„ 10์›” 01์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: openanalytics/shinyproxy

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

๋‹ค์Œ url๋กœ ํ’€ ํŒจํ‚ค์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. https://shiny.rstudio.com/articles/pool-basics.html

ํ•œ ์ „๋ฌธ๊ฐ€๋Š” pqbouncer๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ์กฐ์–ธํ•˜์ง€๋งŒ ShinyProxy์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์กฐ์–ธ ๋˜๋Š” ์†”๋ฃจ์…˜์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚ด ๋‘ ์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

์‹ค์ œ๋กœ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ Plumber API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์†Œ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PostgreSQL์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•˜๋Š” ๋ฐฉ๋ฒ•:

  1. ์„œ๋ฒ„: Plumber API๋ฅผ ์‹คํ–‰ํ•˜๋Š” docker-compose ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Plumber API๋Š” SQL์„ ์ˆ˜์‹ ํ•˜๊ณ  R data.frame์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด JSON ๋Œ€์‹  R ๊ฐ์ฒด๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ R ๊ฐœ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜๋ฉด R ์˜ค๋ฅ˜ ๋˜๋Š” ๋ฉ”์‹œ์ง€(์žˆ๋Š” ๊ฒฝ์šฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ: ๋ฐฐํฌ๋œ Plumber API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด httr ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ž˜ํผ ํ•จ์ˆ˜๋Š” HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(์žˆ๋Š” ๊ฒฝ์šฐ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” SQL์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ R ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋‚ด๋ถ€ R ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ๋ž˜ํผ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ SQL ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ฑฐ์˜ ํ•ญ์ƒ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ €์™€ ๊ฐ™์€ ์ผ€์ด์Šค๋ฅผ ๊ฒช์œผ์‹œ๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  8 ๋Œ“๊ธ€

Shinyproxy๊ฐ€ Shiny ์•ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€(์˜ˆ: postgresql, mysql ๋“ฑ)์„ ์ง€์›ํ•œ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์„ํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์‰ฌ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐฐ๊ด€๊ณต์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@shrektan ๋•๋ถ„์— ๋‚˜์ค‘์— ์‹œ๋„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

pgbouncer๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋น›๋‚˜๊ฒŒ ์—ฐ๊ฒฐ์„ pgbouncer ์„œ๋น„์Šค๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š” @chienyuchuan ์†”๋ฃจ์…˜์„ ์ฐพ์•˜
๋”ฐ๋ผ์„œ ์ง€๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.
ShinyProxy์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค!

pgbouncer๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋น›๋‚˜๊ฒŒ ์—ฐ๊ฒฐ์„ pgbouncer ์„œ๋น„์Šค๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@chienyuchuan ์•ˆ๋…•ํ•˜์„ธ์š”! pgbouncer์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค R ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์˜ ์˜ˆ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

pgbouncer๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋น›๋‚˜๊ฒŒ ์—ฐ๊ฒฐ์„ pgbouncer ์„œ๋น„์Šค๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@chienyuchuan ์•ˆ๋…•ํ•˜์„ธ์š”! pgbouncer์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค R ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์˜ ์˜ˆ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@kuzmenkov111 ๋‹˜ , ์ €๋Š” ์—ฌ์ „ํžˆ ์ƒค์ด๋‹ˆ ํ’€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ pgbouncer์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
/etc/pgbouncer/pgbouncer.ini๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ [databases] ์„น์…˜์„ ์ž…๋ ฅํ•œ ํ›„ pool ํŒจํ‚ค์ง€๋กœ [databases] ์„น์…˜์˜ dbname ๋ฐ ํฌํŠธ์— ์—ฐ๊ฒฐํ•˜๋Š” R ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ฐธ์กฐ ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

PgBouncer + ์šฐ๋ถ„ํˆฌ 18.04
https://www.willandskill.se/en/how-to-setup-pgbouncer-on-ubuntu/

PgBouncer๋ฅผ ์‚ฌ์šฉํ•œ PostgreSQL ์—ฐ๊ฒฐ ํ’€๋ง
https://pgdash.io/blog/pgbouncer-connection-pool.html

ํ’€ ํŒจํ‚ค์ง€ ์‚ฌ์šฉ(๊ธฐ๋ณธ)
https://shiny.rstudio.com/articles/pool-basics.html

๋‚ด ๋‘ ์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

์‹ค์ œ๋กœ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ Plumber API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์†Œ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PostgreSQL์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•˜๋Š” ๋ฐฉ๋ฒ•:

  1. ์„œ๋ฒ„: Plumber API๋ฅผ ์‹คํ–‰ํ•˜๋Š” docker-compose ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Plumber API๋Š” SQL์„ ์ˆ˜์‹ ํ•˜๊ณ  R data.frame์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด JSON ๋Œ€์‹  R ๊ฐ์ฒด๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ R ๊ฐœ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜๋ฉด R ์˜ค๋ฅ˜ ๋˜๋Š” ๋ฉ”์‹œ์ง€(์žˆ๋Š” ๊ฒฝ์šฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ: ๋ฐฐํฌ๋œ Plumber API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด httr ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ž˜ํผ ํ•จ์ˆ˜๋Š” HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(์žˆ๋Š” ๊ฒฝ์šฐ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” SQL์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ R ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋‚ด๋ถ€ R ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ๋ž˜ํผ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ SQL ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ฑฐ์˜ ํ•ญ์ƒ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ €์™€ ๊ฐ™์€ ์ผ€์ด์Šค๋ฅผ ๊ฒช์œผ์‹œ๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰