์ด ๊ธฐ์ฌ์์๋ PostgreSQL ๋ด๊ฒฐํจ์ฑ ๋ฌธ์ ์ ์ด๋ป๊ฒ ์ ๊ทผํ๋์ง, ์ด๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ์ ์ค์ํด์ก๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ์ธ๊ณ์ ์ผ๋ก 2,5๋ง ๋ช ์ ์ฌ์ฉ์, ๋งค์ผ 50๋ช ์ด์์ ํ์ฑ ์ฌ์ฉ์๊ฐ ์์ต๋๋ค. ์๋ฒ๋ ์์ผ๋๋์ ํ ์ง์ญ์ ์๋ Amazone์ ์์ต๋๋ค. 100๊ฐ ์ด์์ ์๋ก ๋ค๋ฅธ ์๋ฒ๊ฐ ์ง์์ ์ผ๋ก ์๋ํ๊ณ ์์ผ๋ฉฐ ๊ทธ ์ค ๊ฑฐ์ 50๊ฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๊ป ์์ต๋๋ค.
์ ์ฒด ๋ฐฑ์๋๋ ํด๋ผ์ด์ธํธ์ ์ง์์ ์ธ ์น ์์ผ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๋๊ท๋ชจ ๋ชจ๋๋ฆฌ์ ์ํ ์ ์ฅ Java ์ ํ๋ฆฌ์ผ์ด์
์
๋๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋์ผํ ๋ณด๋์์ ์์
ํ ๋ ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋กํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ๋ณผ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋น ์ฝ 10K ์์ฒญ์ด ์์ต๋๋ค. Redis์ ์ต๋ ๋ก๋ ์ ์ด๋น 80-100K ์์ฒญ์ ์์ฑํฉ๋๋ค.
Redis์์ PostgreSQL๋ก ์ ํํ ์ด์
์ฒ์์ ์ฐ๋ฆฌ ์๋น์ค๋ ์๋ฒ์ RAM์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํค-๊ฐ ์ ์ฅ์์ธ Redis์ ํจ๊ป ์๋ํ์ต๋๋ค.
๋ ๋์ค์ ์ฅ์ :
- ์๋ต์๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ฉ๋๋ค.
- ๊ฐํธํ ๋ฐฑ์ ๋ฐ ๋ณต์ .
Redis์ ๋จ์ :
- ์ค์ ๊ฑฐ๋๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์์ ์๋ฎฌ๋ ์ด์ ์ ์๋ํ์ต๋๋ค. ๋ถํํ๋ ์ด๊ฒ์ ํญ์ ์ ๋๋ก ์๋ํ์ง ์์๊ณ ๋งค์ฐ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ต๋๋ค.
- ๋ฐ์ดํฐ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ํด ์ ํ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์์ด ๋์ด๋ ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ ๋์ด๋๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ์ ํํ ์ธ์คํด์ค์ ํน์ฑ์ ๋ถ๋ชํ๊ฒ ๋๋๋ฐ, AWS์์๋ ์ธ์คํด์ค ์ ํ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์๋น์ค๋ฅผ ์ค๋จํด์ผ ํฉ๋๋ค.
- ์ง์์ ์ผ๋ก ๋ฎ์ ๋๊ธฐ ์๊ฐ ์์ค์ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋งค์ฐ ๋ง์ ์์ ์์ฒญ์ด ์์ต๋๋ค. ์ต์ ์ ์ง์ฐ ์์ค์ 17-20ms์ ๋๋ค. 30-40ms ์์ค์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ ๋ํ ๊ธด ์๋ต๊ณผ ์๋น์ค ์ ํ๋ฅผ ์ป์ต๋๋ค. ์ํ๊น๊ฒ๋ 2018๋ 2์ Redis๊ฐ ์๋ ์ธ์คํด์ค ์ค ํ๋๊ฐ ์ด๋ค ์ด์ ๋ก ํ์๋ณด๋ค XNUMX๋ฐฐ ๋ ๋ง์ ๋๊ธฐ ์๊ฐ์ ์์ ํ์ ๋ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋์ง ์์ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ํด ์ ์ค์ ์๋น์ค๋ฅผ ์ค๋จํ๊ณ ๋ฌธ์ ๊ฐ ์๋ Redis ์ธ์คํด์ค๋ฅผ ๊ต์ฒดํ์ต๋๋ค.
- ์ฝ๋์ ์ฌ์ํ ์ค๋ฅ๊ฐ ์์ด๋ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ณ ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋จ์ ์ ๊ณ ๋ คํ๊ณ ์ ์์ ์ธ ๊ฑฐ๋๊ฐ ๊ฐ๋ฅํ๊ณ ๋๊ธฐ ์๊ฐ์ ๋ ์์กดํ๋ ๋ ํธ๋ฆฌํ ๊ฒ์ผ๋ก ์ ํํด์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ฐ๊ตฌ๋ฅผ ์ํํ๊ณ ๋ง์ ์ต์ ์ ๋ถ์ํ ํ PostgreSQL์ ์ ํํ์ต๋๋ค.
์ด๋ฏธ 1,5๋
์ ๋ถํฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฎ๊ฒจ์๊ณ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ง ์ฎ๊ฒผ๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ Redis์ PostgreSQL์ ๋์์ ์์
ํ๊ณ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ ๋ฐ์ดํฐ ์ด๋ ๋ฐ ์ ํ ๋จ๊ณ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์ ๋ฌธ์์ ๊ธฐ๋ก๋์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฒ์ ์ด๋์ ์์ํ์ ๋ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์์
ํ๊ณ ๋ง์คํฐ Redis ๋ฐ PostgreSQL์ ์ก์ธ์คํ์ต๋๋ค. PostgreSQL ํด๋ฌ์คํฐ๋ ๋ง์คํฐ์ ๋น๋๊ธฐ์ ๋ณต์ ๊ฐ ์๋ ๋ณต์ ๋ณธ์ผ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PgBouncer ๊ตฌํ
์ด๋ํ๋ ๋์ ์ ํ๋ ๊ฐ๋ฐ ์ค์ด์์ต๋๋ค. PostgreSQL๊ณผ ํจ๊ป ์๋ํ๋ ์ฌ์ฉ์ ์์ ์๋ฒ ์๊ฐ ์ฆ๊ฐํ๊ณ ์ฐ๊ฒฐ์ด ๋ถ์กฑํ๊ธฐ ์์ํ์ต๋๋ค. PostgreSQL์ ๊ฐ ์ฐ๊ฒฐ์ ๋ํด ๋ณ๋์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ๋ฆฌ์์ค๋ฅผ ์๋นํฉ๋๋ค. ํน์ ์ง์ ๊น์ง ์ฐ๊ฒฐ ์๋ฅผ ๋๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ต์ ์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์ ์ด์์ ์ธ ์ต์ ์ ๊ธฐ์ง ์์ ์๊ฒ ๋ ์ฐ๊ฒฐ ๊ด๋ฆฌ์๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค.
์ฐ๊ฒฐ ๊ด๋ฆฌ์์๋ Pgpool๊ณผ PgBouncer๋ผ๋ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ํธ๋์ญ์ ๋ชจ๋๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก PgBouncer๋ฅผ ์ ํํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์
์ฒด๊ณ๋ฅผ ์ค์ ํ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋์ PgBouncer์ ์ก์ธ์คํ๊ณ ๊ทธ ๋ค์๋ PostgreSQL ๋ง์คํฐ๊ฐ ์๊ณ ๊ฐ ๋ง์คํฐ ๋ค์๋ ๋น๋๊ธฐ ๋ณต์ ๊ฐ ์๋ ํ๋์ ๋ณต์ ๋ณธ์ด ์์ต๋๋ค.
๋์์ PostgreSQL์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์๋๊ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์
์์ค์์ PostgreSQL ์ค๋ฉ์ ์์ํ์ต๋๋ค. ์์์ ์ค๋ช
ํ ์ฒด๊ณ๋ ์ด๋ฅผ ์ํด ์๋์ ์ผ๋ก ํธ๋ฆฌํฉ๋๋ค. ์ PostgreSQL ์ค๋๋ฅผ ์ถ๊ฐํ ๋ PgBouncer ๊ตฌ์ฑ์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ค๋์ ์ฆ์ ์์
ํ ์ ์์ต๋๋ค.
PgBouncer ์ฅ์ ์กฐ์น
์ด ๋ฐฉ์์ ์ ์ผํ PgBouncer ์ธ์คํด์ค๊ฐ ์ข ๋ฃ๋๋ ์๊ฐ๊น์ง ์๋ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฃฝ๋ ํ๋์จ์ด์์ ์คํ๋๋ AWS์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์ธ์คํด์ค๋ ๋จ์ํ ์ ํ๋์จ์ด๋ก ์ด๋ํ๊ณ ๋ค์ ์๋ํฉ๋๋ค. ์ด๊ฒ์ PgBouncer์์ ๋ฐ์ํ์ง๋ง ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฒ ๊ฐ์์ ๊ฒฐ๊ณผ๋ 25๋ถ ๋์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์์ต๋๋ค. AWS๋ ์ด๋ฌํ ์ํฉ์ ๋ํด ๋น์ ์ฐ๋ฆฌ๋๋ผ์์ ๊ตฌํ๋์ง ์์ ์ฌ์ฉ์ ์ธก ์ค๋ณต์ฑ์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
๊ทธ ํ PgBouncer ๋ฐ PostgreSQL ํด๋ฌ์คํฐ์ ๋ด๊ฒฐํจ์ฑ์ ๋ํด ์ง์งํ๊ฒ ์๊ฐํ์ต๋๋ค. AWS ๊ณ์ ์ ๋ชจ๋ ์ธ์คํด์ค์์ ์ ์ฌํ ์ํฉ์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด PgBouncer ๋ด๊ฒฐํจ์ฑ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ Network Load Balancer์ ์ก์ธ์คํ๊ณ ๊ทธ ๋ค์ ๋ ๊ฐ์ PgBouncer๊ฐ ์์ต๋๋ค. ๊ฐ PgBouncer๋ ๊ฐ ์ค๋์ ๋์ผํ PostgreSQL ๋ง์คํฐ๋ฅผ ํ์ธํฉ๋๋ค. AWS ์ธ์คํด์ค ์ถฉ๋์ด ๋ค์ ๋ฐ์ํ๋ฉด ๋ชจ๋ ํธ๋ํฝ์ด ๋ค๋ฅธ PgBouncer๋ฅผ ํตํด ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค. Network Load Balancer ์ฅ์ ์กฐ์น๋ AWS์์ ์ ๊ณตํฉ๋๋ค.
์ด ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์ PgBouncer ์๋ฒ๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
PostgreSQL ์ฅ์ ์กฐ์น ํด๋ฌ์คํฐ ์์ฑ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์์ฒด ์์ฑ ์ฅ์ ์กฐ์น, repmgr, AWS RDS, Patroni์ ๊ฐ์ ๋ค์ํ ์ต์ ์ ๊ณ ๋ คํ์ต๋๋ค.
์์ฒด ์์ฑ ์คํฌ๋ฆฝํธ
๋ง์คํฐ์ ์์ ์ ๋ชจ๋ํฐ๋งํ๊ณ ์คํจํ ๊ฒฝ์ฐ ๋ณต์ ๋ณธ์ ๋ง์คํฐ๋ก ์น๊ฒฉํ๊ณ PgBouncer ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฅ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์์ฑํ๊ณ ์๋ ๋ฐฉ์์ ์ ํํ ์ดํดํ๊ธฐ ๋๋ฌธ์ ์ต๋์ ๋จ์์ฑ์ ๋๋ค.
๋จ์ :
- ๋ง์คํฐ๊ฐ ์ฃฝ์ง ์์์ ์๋ ์๊ณ ๋์ ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ ํ์ผ์ค๋ฒ๋ ์ด์ ๋ง์คํฐ๊ฐ ๊ณ์ ์๋ํ๋ ๋์ ๋ณต์ ๋ณธ์ ๋ง์คํฐ๋ก ์น๊ฒฉํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋ง์คํฐ ์ญํ ์ ํ๋ ๋ ๊ฐ์ ์๋ฒ๋ฅผ ๊ฐ๊ฒ ๋๋ฉฐ ์ด๋ ๊ฒ์ด ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ ์ ์์ต๋๋ค. ์ด ์ํฉ์ ์คํ๋ฆฟ ๋ธ๋ ์ธ(split-brain)์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ์๋ต ์์ด ๋จ๊ฒจ์ก์ต๋๋ค. ์ฐ๋ฆฌ ๊ตฌ์ฑ์์ ๋ง์คํฐ์ ํ๋์ ๋ณต์ ๋ณธ์ ์ ํ ํ ๋ณต์ ๋ณธ์ด ๋ง์คํฐ๋ก ์ด๋ํ๊ณ ๋ ์ด์ ๋ณต์ ๋ณธ์ด ์์ผ๋ฏ๋ก ์ ๋ณต์ ๋ณธ์ ์๋์ผ๋ก ์ถ๊ฐํด์ผ ํฉ๋๋ค.
- 12๊ฐ์ PostgreSQL ์ค๋๊ฐ ์๋ ๋์ ์ฅ์ ์กฐ์น ์์ ์ ๋ํ ์ถ๊ฐ ๋ชจ๋ํฐ๋ง์ด ํ์ํ๋ฏ๋ก 12๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค. ์ค๋ ์๊ฐ ์ฆ๊ฐํ๋ฉด ์ฅ์ ์กฐ์น๋ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
์์ฒด ์์ฑ ์ฅ์ ์กฐ์น๋ ๋งค์ฐ ๋ณต์กํด ๋ณด์ด๋ฉฐ ์ ์ง ์์ ์ง์์ด ํ์ํฉ๋๋ค. ๋จ์ผ PostgreSQL ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๊ฒ์ด ๊ฐ์ฅ ์ฌ์ด ์ต์ ์ด์ง๋ง ํ์ฅ๋์ง ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ์๊ฒ ์ ํฉํ์ง ์์ต๋๋ค.
Repmgr
PostgreSQL ํด๋ฌ์คํฐ์ ์์ ์ ๊ด๋ฆฌํ ์ ์๋ Replication Manager for PostgreSQL ํด๋ฌ์คํฐ. ๋์์ ์๋ ์ฅ์ ์กฐ์น ๊ธฐ๋ฅ์ด ์์ผ๋ฏ๋ก ์์ ์ ์ํด ์์ฑ๋ ์๋ฃจ์ ์์ ๊ณ ์ ํ "๋ํผ"๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๊ฒ์ด ์ง์ ์์ฑํ ์คํฌ๋ฆฝํธ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํ ์ ์์ผ๋ฏ๋ก Repmgr์ ์๋์กฐ์ฐจ ํ์ง ์์์ต๋๋ค.
AWS RDS
ํ์ํ ๋ชจ๋ ๊ฒ์ ์ง์ํ๊ณ ๋ฐฑ์ ๋ฐฉ๋ฒ์ ์๊ณ ์ฐ๊ฒฐ ํ์ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. ์๋ ์ ํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ง์คํฐ๊ฐ ์ฃฝ์ผ๋ฉด ๋ณต์ ๋ณธ์ด ์ ๋ง์คํฐ๊ฐ ๋๊ณ AWS๋ dns ๋ ์ฝ๋๋ฅผ ์ ๋ง์คํฐ๋ก ๋ณ๊ฒฝํ์ง๋ง ๋ณต์ ๋ณธ์ ๋ค๋ฅธ AZ์ ์์ ์ ์์ต๋๋ค.
๋จ์ ์ ๋ฏธ์ธ ์กฐ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฏธ์ธ ์กฐ์ ์ ์: ์ธ์คํด์ค์๋ tcp ์ฐ๊ฒฐ์ ๋ํ ์ ํ์ด ์์ง๋ง ๋ถํํ๋ RDS์์๋ ์ํํ ์ ์์ต๋๋ค.
net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3
๋ํ AWS RDS๋ ์ผ๋ฐ ์ธ์คํด์ค ๊ฐ๊ฒฉ๋ณด๋ค ๊ฑฐ์ ๋ ๋ฐฐ๋ ๋น์ธ์ ์ด ์๋ฃจ์ ์ ํฌ๊ธฐํ ์ฃผ๋ ์ด์ ์์ต๋๋ค.
ํจํธ๋ก๋
์ด๊ฒ์ ํ๋ฅญํ ๋ฌธ์ํ, ์๋ ์ฅ์ ์กฐ์น ๋ฐ github์ ์์ค ์ฝ๋๋ก PostgreSQL์ ๊ด๋ฆฌํ๊ธฐ ์ํ Python ํ ํ๋ฆฟ์ ๋๋ค.
Patroni์ ์ฅ์ :
- ๊ฐ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๊ฐ ์ค๋ช ๋์ด ์์ผ๋ฉฐ ์๋ ๋ฐฉ์์ด ๋ช ํํฉ๋๋ค.
- ์๋ ์ฅ์ ์กฐ์น๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํฉ๋๋ค.
- ํ์ด์ฌ์ผ๋ก ์์ฑ๋์๊ณ ์ฐ๋ฆฌ๋ ํ์ด์ฌ์ผ๋ก ๋ง์ด ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ด๋ฉฐ ์๋ง๋ ํ๋ก์ ํธ ๊ฐ๋ฐ์๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- PostgreSQL์ ์๋ฒฝํ๊ฒ ๊ด๋ฆฌํ๊ณ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์์ ํ ๋ฒ์ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ์ ๊ตฌ์ฑ์ ์ ์ฉํ๊ธฐ ์ํด ํด๋ฌ์คํฐ๋ฅผ ๋ค์ ์์ํด์ผ ํ๋ ๊ฒฝ์ฐ Patroni๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์ํํ ์ ์์ต๋๋ค.
๋จ์ :
- PgBouncer๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์์์ ๋ช ํํ์ง ์์ต๋๋ค. ๋ง์ด๋์ค๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ์ด๋ ต์ง๋ง Patroni์ ์๋ฌด๋ PostgreSQL์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๊ณ Patroni์ ๋ํ ์ฐ๊ฒฐ์ด ์ด๋ป๊ฒ ์งํ๋ ์ง๋ ์ด๋ฏธ ์ฐ๋ฆฌ์ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
- Patroni๋ฅผ ๋๋์ผ๋ก ๊ตฌํํ ์๋ ๊ฑฐ์ ์์ง๋ง ์ฒ์๋ถํฐ ๊ตฌํํ ์๋ ๋ง์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ ์ฅ์ ์กฐ์น ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด Patroni๋ฅผ ์ ํํ์ต๋๋ค.
Patroni ๊ตฌํ ํ๋ก์ธ์ค
Patroni ์ด์ ์๋ ๋น๋๊ธฐ์ ๋ณต์ ๊ฐ ํฌํจ๋ ํ๋์ ๋ง์คํฐ์ ํ๋์ ๋ณต์ ๋ณธ ๊ตฌ์ฑ์ 12๊ฐ์ PostgreSQL ์ค๋๊ฐ ์์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ Network Load Balancer๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ์ผ๋ฉฐ ๊ทธ ๋ค์๋ PgBouncer๊ฐ ์๋ ๋ ๊ฐ์ ์ธ์คํด์ค๊ฐ ์์๊ณ ๊ทธ ๋ค์๋ ๋ชจ๋ PostgreSQL ์๋ฒ๊ฐ ์์์ต๋๋ค.
Patroni๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ถ์ฐ ์คํ ๋ฆฌ์ง ํด๋ฌ์คํฐ ๊ตฌ์ฑ์ ์ ํํด์ผ ํ์ต๋๋ค. Patroni๋ etcd, Zookeeper, Consul๊ณผ ๊ฐ์ ๋ถ์ฐ ๊ตฌ์ฑ ์คํ ๋ฆฌ์ง ์์คํ
๊ณผ ํจ๊ป ์๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ Vault์ ํจ๊ป ์๋ํ๋ ๋ณธ๊ฒฉ์ ์ธ Consul ํด๋ฌ์คํฐ๋ฅผ ์์ฅ์ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์๋๋ ๋ชฉ์ ์ ๋ง๊ฒ Consul์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ ์ข์ ์ด์ ์
๋๋ค.
Patroni๊ฐ Consul๊ณผ ํ๋ ฅํ๋ ๋ฐฉ์
์ธ ๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ Consul ํด๋ฌ์คํฐ์ ๋ฆฌ๋์ ๋ณต์ ๋ณธ์ผ๋ก ๊ตฌ์ฑ๋ Patroni ํด๋ฌ์คํฐ๊ฐ ์์ต๋๋ค(Patroni์์๋ ๋ง์คํฐ๋ฅผ ํด๋ฌ์คํฐ ๋ฆฌ๋๋ผ๊ณ ํ๊ณ ์ฌ๋ ์ด๋ธ๋ฅผ ๋ณต์ ๋ณธ์ด๋ผ๊ณ ํฉ๋๋ค). Patroni ํด๋ฌ์คํฐ์ ๊ฐ ์ธ์คํด์ค๋ ์ง์์ ์ผ๋ก ํด๋ฌ์คํฐ ์ํ์ ๋ํ ์ ๋ณด๋ฅผ Consul์ ๋ณด๋ ๋๋ค. ๋ฐ๋ผ์ Consul์์ Patroni ํด๋ฌ์คํฐ์ ํ์ฌ ๊ตฌ์ฑ๊ณผ ํ์ฌ ๋ฆฌ๋๊ฐ ๋๊ตฌ์ธ์ง ํญ์ ํ์ธํ ์ ์์ต๋๋ค.
Patroni๋ฅผ Consul์ ์ฐ๊ฒฐํ๋ ค๋ฉด Consul๊ณผ์ ์์
๋ฐฉ์ ๋ฐ ์ ํ์ ์ผ๋ก ์ฐ๊ฒฐ ์ฒด๊ณ์ ๋ฐ๋ผ http ๋๋ https ํ์์ผ๋ก ํธ์คํธ๋ฅผ ์ง์ ํด์ผ ํ๋ค๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐ๊ตฌํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http
๊ฐ๋จํด ๋ณด์ด์ง๋ง ์ฌ๊ธฐ์ ํจ์ ์ด ์์๋ฉ๋๋ค. Consul์ ์ฌ์ฉํ์ฌ https๋ฅผ ํตํ ๋ณด์ ์ฐ๊ฒฐ์ ํตํด ์์ ํ๊ณ ์ฐ๊ฒฐ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
consul:
host: https://server.production.consul:8080
verify: true
cacert: {{ consul_cacert }}
cert: {{ consul_cert }}
key: {{ consul_key }}
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์๋ํ์ง ์์ต๋๋ค. ์์ ์ Patroni๋ Consul์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด์จ๋ http๋ฅผ ํตํด ์ด๋ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Patroni์ ์์ค ์ฝ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค. ์ข์ ์ ์ ํ์ด์ฌ์ผ๋ก ์์ฑ๋์์ต๋๋ค. ํธ์คํธ ๋งค๊ฐ๋ณ์๋ ์ด๋ค ์์ผ๋ก๋ ๊ตฌ๋ฌธ ๋ถ์๋์ง ์์ผ๋ฉฐ ํ๋กํ ์ฝ์ ์คํค๋ง์ ์ง์ ๋์ด์ผ ํฉ๋๋ค. Consul ์์ ์ ์ํ ์์ ๊ตฌ์ฑ ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
consul:
host: server.production.consul:8080
scheme: https
verify: true
cacert: {{ consul_cacert }}
cert: {{ consul_cert }}
key: {{ consul_key }}
์์ฌ ํ ํ๋ฆฟ
๋ฐ๋ผ์ ๊ตฌ์ฑ์ ์ํ ์คํ ๋ฆฌ์ง๋ฅผ ์ ํํ์ต๋๋ค. ์ด์ Patroni ํด๋ฌ์คํฐ์์ ๋ฆฌ๋๋ฅผ ๋ณ๊ฒฝํ ๋ PgBouncer๊ฐ ๊ตฌ์ฑ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ดํดํด์ผ ํฉ๋๋ค. ์ค๋ช ์์๋ ์ด ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์์ต๋๋ค. ์๋ํ๋ฉด. ์์น์ ์ผ๋ก PgBouncer ์์ ์ ์ค๋ช ๋์ด ์์ง ์์ต๋๋ค.
์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ะกonsul-template์ด PgBouncer์ Patroni๋ฅผ ํ์ด๋งํ๋ ๋ฐ ๋ง์ ๋์์ด ๋์๋ค๊ณ ์ฐ์ฌ์ง ๊ธฐ์ฌ(๋ถํํ๋ ์ ๋ชฉ์ด ๊ธฐ์ต๋์ง ์์ต๋๋ค)๋ฅผ ์ฐพ์์ต๋๋ค. ์ด๋ก ์ธํด Consul-template์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์กฐ์ฌํ๊ฒ ๋์์ต๋๋ค.
Consul-template์ Consul์์ PostgreSQL ํด๋ฌ์คํฐ์ ๊ตฌ์ฑ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋ฆฌ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด PgBouncer ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ๊ณ ๋ค์ ๋ก๋ํ๋ผ๋ ๋ช ๋ น์ ๋ณด๋ ๋๋ค.
ํ
ํ๋ฆฟ์ ํฐ ์ฅ์ ์ ์ฝ๋๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ ์ค๋๋ฅผ ์ถ๊ฐํ ๋ ์ ์ปค๋ฐ์ ๋ง๋ค๊ณ ํ
ํ๋ฆฟ์ ์๋์ผ๋ก ์
๋ฐ์ดํธํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ์ฌ Infrastructure as Code ์์น์ ์ง์ํฉ๋๋ค.
Patroni๋ฅผ ์ฌ์ฉํ ์๋ก์ด ์ํคํ ์ฒ
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์ ์์
๊ณํ์ ์ป์์ต๋๋ค.
๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๊ฐ ๋ฐธ๋ฐ์์ ์ก์ธ์ค โ ๊ทธ ๋ค์ ๋ ๊ฐ์ PgBouncer ์ธ์คํด์ค๊ฐ ์์ โ ๊ฐ ์ธ์คํด์ค์์ ๊ฐ Patroni ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ํ์ฌ ๋ฆฌ๋์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ PgBouncer ๊ตฌ์ฑ์ ๊ด๋ จ์ฑ์ ๋ชจ๋ํฐ๋งํ๋ Consul ํ
ํ๋ฆฟ์ด ์์๋ฉ๋๋ค. ๊ฐ ํด๋ฌ์คํฐ์.
์๋ ํ ์คํธ
์๊ท๋ชจ ํ ์คํธ ํ๊ฒฝ์์ ์์ํ๊ธฐ ์ ์ ์ด ๊ตฌ์ฑํ๋ฅผ ์คํํ๊ณ ์๋ ์ ํ ์๋์ ํ์ธํ์ต๋๋ค. ๊ทธ๋ค์ ๋ณด๋๋ฅผ ์ด๊ณ ์คํฐ์ปค๋ฅผ ์ฎ๊ฒผ๊ณ ๊ทธ ์๊ฐ ํด๋ฌ์คํฐ์ ๋ฆฌ๋๋ฅผ "์ฃฝ์์ต๋๋ค". AWS์์๋ ์ฝ์์ ํตํด ์ธ์คํด์ค๋ฅผ ์ข ๋ฃํ๋ ๊ฒ๋งํผ ๊ฐ๋จํฉ๋๋ค.
์คํฐ์ปค๋ 10-20์ด ์ด๋ด์ ๋ค์ ๋์์ค๋๋ ๋ค์ ์ ์์ ์ผ๋ก ์์ง์ด๊ธฐ ์์ํ์ต๋๋ค. ์ด๋ Patroni ํด๋ฌ์คํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์์ ์๋ฏธํฉ๋๋ค. ๋ฆฌ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ๋ณด๋ฅผ ะกonsul๋ก ๋ณด๋์ผ๋ฉฐ ะกonsul-template์ ์ฆ์ ์ด ์ ๋ณด๋ฅผ ์ ํํ๊ณ PgBouncer ๊ตฌ์ฑ์ ๊ต์ฒดํ๊ณ ๋ค์ ๋ก๋ํ๋ผ๋ ๋ช
๋ น์ ๋ณด๋์ต๋๋ค.
๋์ ๋ถํ์์ ์์กดํ๊ณ ๊ฐ๋ ์ค์ง ์๊ฐ์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ชจ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค! ๊ทธ๋ฌ๋ ์๋ก์ด ์ง๋ฌธ์ด ์์ต๋๋ค. ๋์ ๋ถํ์์ ์ด๋ป๊ฒ ์๋ํ ๊น์? ํ๋ก๋์ ์์ ๋ชจ๋ ๊ฒ์ ๋น ๋ฅด๊ณ ์์ ํ๊ฒ ๋กค์์ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ถํ ํ ์คํธ๋ฅผ ์ํํ๋ ํ ์คํธ ํ๊ฒฝ์ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ํคํ ์ฒ ์ธก๋ฉด์์ ํ๋ก๋์ ๊ณผ ์์ ํ ๋์ผํ๋ฉฐ ํ๋ก๋์ ๊ณผ ๊ฑฐ์ ๋์ผํ ๋ณผ๋ฅจ์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ต๋๋ค. ํ ์คํธ ์ค์ PostgreSQL ๋ง์คํฐ ์ค ํ๋๋ฅผ "์ฃฝ์ด๊ธฐ"๋ก ๊ฒฐ์ ํ๊ณ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ ์ ์๋ ๋กค๋ง์ ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ํ๊ฒฝ์๋ ์ฌ๋ฌ PostgreSQL ์ค๋๊ฐ ์์ผ๋ฏ๋ก ํ๋ก๋์ ์ ์ ๊ตฌ์ฑ ์คํฌ๋ฆฝํธ์ ๋ํ ์ฐ์ํ ํ ์คํธ๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ ์์ ๋ชจ๋ ์ผ์ฌ์ฐจ๊ฒ ๋ณด์ด์ง๋ง PostgreSQL 9.6์ด ์์ต๋๋ค. 11.2๋ก ์ฆ์ ์ ๊ทธ๋ ์ด๋ํ ์ ์์ต๋๊น?
2๋จ๊ณ๋ก ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋จผ์ 11.2๋ก ์ ๊ทธ๋ ์ด๋ํ ๋ค์ Patroni๋ฅผ ์คํํฉ๋๋ค.
PostgreSQL ์ ๋ฐ์ดํธ
PostgreSQL ๋ฒ์ ์ ๋น ๋ฅด๊ฒ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ์ต์ ์ ์ฌ์ฉํ์ญ์์ค. -k, ํ๋ ๋งํฌ๊ฐ ๋์คํฌ์ ์์ฑ๋๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ์๊ฐ ์์ต๋๋ค. 300~400GB ๊ธฐ์ค์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐ 1์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
์ค๋๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ์ํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ ์ฒด ์ ๋ฐ์ดํธ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ Ansible ํ๋ ์ด๋ถ์ ์์ฑํ์ต๋๋ค.
/usr/lib/postgresql/11/bin/pg_upgrade
<b>--link </b>
--old-datadir='' --new-datadir=''
--old-bindir='' --new-bindir=''
--old-options=' -c config_file='
--new-options=' -c config_file='
์ฌ๊ธฐ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ค์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํํด์ผ ํ๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. --ํ์ธํ๋ค์ ๊ทธ๋ ์ด๋ํ ์ ์๋์ง ํ์ธํฉ๋๋ค. ๋ํ ์คํฌ๋ฆฝํธ๋ ์ ๊ทธ๋ ์ด๋ ๊ธฐ๊ฐ ๋์ ๊ตฌ์ฑ์ ๋์ฒดํฉ๋๋ค. ์ฐ๋ฆฌ์ ์คํฌ๋ฆฝํธ๋ 30์ด ๋ง์ ์๋ฃ๋์์ผ๋ฉฐ ์ด๋ ํ๋ฅญํ ๊ฒฐ๊ณผ์ ๋๋ค.
Patroni ์คํ
๋ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด Patroni ๊ตฌ์ฑ์ ์ดํด๋ณด์ญ์์ค. ๊ณต์ ๋ฆฌํฌ์งํ ๋ฆฌ์๋ Patroni๋ฅผ ์ฒ์ ์์ํ ๋ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํ๋ ์ญํ ์ ํ๋ initdb๋ฅผ ์ฌ์ฉํ ์์ ๊ตฌ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ด๋ฏธ ์์ผ๋ฏ๋ก ๊ตฌ์ฑ์์ ์ด ์น์ ์ ๊ฐ๋จํ ์ ๊ฑฐํ์ต๋๋ค.
์ด๋ฏธ ์กด์ฌํ๋ PostgreSQL ํด๋ฌ์คํฐ์ Patroni๋ฅผ ์ค์นํ๊ณ ์คํํ๊ธฐ ์์ํ์ ๋ ์๋ก์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ๋ ์๋ฒ ๋ชจ๋ ๋ฆฌ๋๋ก ์์๋์์ต๋๋ค. Patroni๋ ํด๋ฌ์คํฐ์ ์ด๊ธฐ ์ํ์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ณ ๋ ์๋ฒ๋ฅผ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋ ๊ฐ์ ๊ฐ๋ณ ํด๋ฌ์คํฐ๋ก ์์ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฌ๋ ์ด๋ธ์์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํด์ผ ํฉ๋๋ค.
rm -rf /var/lib/postgresql/
์ด๊ฒ์ ์ฌ๋ ์ด๋ธ์์๋ง ์ํํด์ผ ํฉ๋๋ค!
ํด๋ฆฐ ๋ ํ๋ฆฌ์นด๊ฐ ์ฐ๊ฒฐ๋๋ฉด ํจํธ๋ก๋๋ ๋ฒ ์ด์ค๋ฐฑ์ ๋ฆฌ๋๋ฅผ ๋ง๋ค์ด ๋ ํ๋ฆฌ์นด์ ๋ณต์ํ ํ wallog์ ๋ฐ๋ผ ํ์ฌ ์ํ๋ฅผ ๋ฐ๋ผ์ก๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ง๋ฉดํ ๋ ๋ค๋ฅธ ์ด๋ ค์์ ๋ชจ๋ PostgreSQL ํด๋ฌ์คํฐ์ ์ด๋ฆ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ณธ์ผ๋ก ์ง์ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ ํด๋ฌ์คํฐ๊ฐ ์๋ก์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ ์ด๋ ์ ์์ ๋๋ค. ๊ทธ๋ฌ๋ Patroni๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ชจ๋ ํด๋ฌ์คํฐ์ ๊ณ ์ ํ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค. ํด๊ฒฐ์ฑ ์ PostgreSQL ๊ตฌ์ฑ์์ ํด๋ฌ์คํฐ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค.
๋ถํ ํ ์คํธ
๋ณด๋์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์๋ฎฌ๋ ์ด์ ํ๋ ํ ์คํธ๋ฅผ ์์ํ์ต๋๋ค. ๋ถํ๊ฐ ์ผ์ผ ํ๊ท ๊ฐ์ ๋๋ฌํ์ ๋ ์ ํํ ๋์ผํ ํ ์คํธ๋ฅผ ๋ฐ๋ณตํ๊ณ PostgreSQL ๋ฆฌ๋๊ฐ ์๋ ์ธ์คํด์ค ํ๋๋ฅผ ๋๋๋ค. ์๋ ์ฅ์ ์กฐ์น๋ ์์๋๋ก ์๋ํ์ต๋๋ค. Patroni๋ ๋ฆฌ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ Consul-template์ PgBouncer ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ์ผ๋ฉฐ ๋ค์ ๋ก๋ํ๋ผ๋ ๋ช ๋ น์ ๋ณด๋์ต๋๋ค. Grafana์ ๊ทธ๋ํ์ ๋ฐ๋ฅด๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊ณผ ๊ด๋ จ๋ ์๋ฒ์์ 20-30์ด์ ์ง์ฐ๊ณผ ์ฝ๊ฐ์ ์ค๋ฅ๊ฐ ์์์ด ๋ถ๋ช ํ์ต๋๋ค. ์ด๊ฒ์ ์ ์์ ์ธ ์ํฉ์ด๋ฉฐ ์ด๋ฌํ ๊ฐ์ ์ฅ์ ์กฐ์น์ ํ์ฉ๋๋ฉฐ ์๋น์ค ์ค๋จ ์๊ฐ๋ณด๋ค ํ์คํ ๋ซ์ต๋๋ค.
Patroni๋ฅผ ํ๋ก๋์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ
๊ทธ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ๊ณํ์ ์ธ์ ์ต๋๋ค.
- Consul-template์ PgBouncer ์๋ฒ์ ๋ฐฐํฌํ๊ณ ์์ํฉ๋๋ค.
- ๋ฒ์ 11.2๋ก PostgreSQL ์ ๋ฐ์ดํธ;
- ํด๋ฌ์คํฐ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ญ์์ค.
- Patroni ํด๋ฌ์คํฐ ์์.
๋์์ ์ฐ๋ฆฌ์ ์ฒด๊ณ๋ฅผ ํตํด ๊ฑฐ์ ์ธ์ ๋ ์ง ์ฒซ ๋ฒ์งธ ์์ ์ ๋ง๋ค ์ ์์ผ๋ฉฐ ์์ ์์ ๊ฐ PgBouncer๋ฅผ ์ฐจ๋ก๋ก ์ ๊ฑฐํ๊ณ consul-template์ ๋ฐฐํฌํ๊ณ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํ๋ค.
๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์ํด ํ ์คํธ ํ๊ฒฝ์์ ๋ชจ๋ ํ๋ ์ด๋ถ์ ์ด๋ฏธ ํ ์คํธํ์ผ๋ฉฐ ์ ์ฒด ์คํฌ๋ฆฝํธ์ ์คํ ์๊ฐ์ด ๊ฐ ์ค๋์ ๋ํด 1,5~2๋ถ์ด์๊ธฐ ๋๋ฌธ์ Ansible์ ์ฌ์ฉํ์ต๋๋ค. ์๋น์ค๋ฅผ ์ค๋จํ์ง ์๊ณ ๊ฐ ์ค๋์ ์ฐจ๋ก๋ก ๋ชจ๋ ๊ฒ์ ๋กค์์ํ ์ ์์ง๋ง ๊ฐ PostgreSQL์ ๋ช ๋ถ ๋์ ๊บผ์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ด ์ค๋์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฌ์ฉ์๋ ํ์ฌ ์์ ํ ์๋ํ ์ ์์ผ๋ฉฐ ์ด๋ ํ์ฉ๋์ง ์์ต๋๋ค.
์ด ์ํฉ์์ ๋ฒ์ด๋ ์ ์๋ ๋ฐฉ๋ฒ์ 3๊ฐ์๋ง๋ค ์งํ๋๋ ๊ณํ๋ ์ ์ง ๋ณด์์์ต๋๋ค. ์๋น์ค๋ฅผ ์์ ํ ์ข
๋ฃํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๋ฅผ ์
๊ทธ๋ ์ด๋ํ๋ ์์ ๋ ์์
์ฐฝ์
๋๋ค. ๋ค์ ์ฐฝ๊ตฌ๊น์ง XNUMX์ฃผ์ผ ๋จ์๊ณ , ๋ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์ค๋นํ๊ธฐ๋ก ํ์ต๋๋ค. ๋๊ธฐ ์๊ฐ ๋์ ์ฐ๋ฆฌ๋ ์ถ๊ฐ๋ก ์ฐ๋ฆฌ ์์ ์ ํ๋ณดํ์ต๋๋ค. ๊ฐ PostgreSQL ์ค๋์ ๋ํด ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ฌ๋ถ์ ๋ณต์ ๋ณธ์ ์์ฑํ๊ณ ๊ฐ ์ค๋์ ๋ํ ์ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํ์ฌ Patroni ํด๋ฌ์คํฐ์ ์ ๋ณต์ ๋ณธ์ด ๋์ด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ ์ญ์ ๋ช
๋ น์ ์คํํ์ง ์๋๋ก ํฉ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ์ค๋ฅ ์ํ์ ์ต์ํํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์๋น์ค๋ฅผ ๋ค์ ์์ํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ๊ณ ์ฌ์ฉ์๋ ๊ณ์ ์๋ํ์ง๋ง ๊ทธ๋ํ์์ Consul ์๋ฒ์ ๋น์ ์์ ์ผ๋ก ๋์ ๋ถํ๊ฐ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
ํ
์คํธ ํ๊ฒฝ์์ ์ด๊ฒ์ ๋ณด์ง ๋ชปํ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ด ๋ฌธ์ ๋ Infrastructure as Code ์์น์ ๋ฐ๋ฅด๊ณ ํ
์คํธ ํ๊ฒฝ์์ ํ๋ก๋์
์ ์ด๋ฅด๊ธฐ๊น์ง ์ ์ฒด ์ธํ๋ผ๋ฅผ ๊ฐ์ ํด์ผ ํ๋ค๋ ๊ฒ์ ์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ป๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ฌด์จ ์ผ์ด์์? Consul์ ํ๋ก๋์
์ ์ฒ์ ๋ฑ์ฅํ ๋ค์ ํ
์คํธ ํ๊ฒฝ์ ๋ํ ๋ฌ์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ํ
์คํธ ํ๊ฒฝ์์ Consul ๋ฒ์ ์ด ํ๋ก๋์
๋ณด๋ค ๋์์ต๋๋ค. ๋ฆด๋ฆฌ์ค ์ค ํ๋์์ consul-template์ผ๋ก ์์
ํ ๋ CPU ๋์๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋จํ Consul์ ์
๋ฐ์ดํธํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
Patroni ํด๋ฌ์คํฐ ๋ค์ ์์
๊ทธ๋ฌ๋ ์์ฌ์กฐ์ฐจ ํ์ง ์์๋ ์๋ก์ด ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค. Consul์ ์ ๋ฐ์ดํธํ ๋ consul leave ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์์ Consul ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. โ Patroni๊ฐ ๋ค๋ฅธ Consul ์๋ฒ์ ์ฐ๊ฒฐ โ ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ Consul ํด๋ฌ์คํฐ์ ๋ง์ง๋ง ์ธ์คํด์ค์ ๋๋ฌํ์ฌ consul leave ๋ช ๋ น์ ๋ณด๋์ ๋ ๋ชจ๋ Patroni ํด๋ฌ์คํฐ๊ฐ ๋ค์ ์์๋์๊ณ ๋ก๊ทธ์ ๋ค์ ์ค๋ฅ๊ฐ ํ์๋์์ต๋๋ค.
ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>
Patroni ํด๋ฌ์คํฐ๊ฐ ํด๋น ํด๋ฌ์คํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์์ด ๋ค์ ์์๋์์ต๋๋ค.
ํด๊ฒฐ์ฑ ์ ์ฐพ๊ธฐ ์ํด github์ ๋ฌธ์ ๋ฅผ ํตํด Patroni ์์ฑ์์๊ฒ ์ฐ๋ฝํ์ต๋๋ค. ๊ตฌ์ฑ ํ์ผ์ ๋ํ ๊ฐ์ ์ฌํญ์ ์ ์ํ์ต๋๋ค.
consul:
consul.checks: []
bootstrap:
dcs:
retry_timeout: 8
์ฐ๋ฆฌ๋ ํ ์คํธ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์๊ณ ๊ทธ๊ณณ์์ ์ด๋ฌํ ์ต์ ์ ํ ์คํธํ์ง๋ง ์ํ๊น๊ฒ๋ ์๋ํ์ง ์์์ต๋๋ค.
๋ฌธ์ ๋ ์ฌ์ ํ ๋ฏธํด๊ฒฐ ์ํ๋ก ๋จ์ ์์ต๋๋ค. ๋ค์ ์๋ฃจ์ ์ ์๋ํ ๊ณํ์ ๋๋ค.
- ๊ฐ Patroni ํด๋ฌ์คํฐ ์ธ์คํด์ค์์ Consul-agent๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์ฝ๋์์ ๋ฌธ์ ๋ฅผ ์์ ํ์ญ์์ค.
์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น๋ฅผ ์ดํดํฉ๋๋ค. ๋ฌธ์ ๋ ์๋ง๋ ๊ตฌ์ฑ ํ์ผ์ ํตํด ์ฌ์ ์๋์ง ์์ ๊ธฐ๋ณธ ์๊ฐ ์ด๊ณผ ์ฌ์ฉ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค. ๋ง์ง๋ง Consul ์๋ฒ๊ฐ ํด๋ฌ์คํฐ์์ ์ ๊ฑฐ๋๋ฉด ์ ์ฒด Consul ํด๋ฌ์คํฐ๊ฐ XNUMX์ด ์ด์ ์ค๋จ๋ฉ๋๋ค. ์ด๋ก ์ธํด Patroni๋ ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ ์ ์ฒด ํด๋ฌ์คํฐ๋ฅผ ์์ ํ ๋ค์ ์์ํฉ๋๋ค.
๋คํํ ๋ ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค.
Patroni ์ฌ์ฉ ๊ฒฐ๊ณผ
Patroni๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ถ์ํ ํ ๊ฐ ํด๋ฌ์คํฐ์ ์ถ๊ฐ ๋ณต์ ๋ณธ์ ์ถ๊ฐํ์ต๋๋ค. ์ด์ ๊ฐ ํด๋ฌ์คํฐ์๋ ์ ํ ์ ์คํ๋ฆฟ ๋ธ๋ ์ธ์ ๊ฒฝ์ฐ ์์ ๋ง์ ์ํ ํ๋์ ๋ฆฌ๋์ ๋ ๊ฐ์ ๋ณต์ ๋ณธ๊ณผ ๊ฐ์ ์ฟผ๋ผ๊ณผ ์ ์ฌํฉ๋๋ค.
Patroni๋ XNUMX๊ฐ์ ์ด์ ํ๋ก๋์
์์
์ ์งํํ์ต๋๋ค. ์ด ๊ธฐ๊ฐ ๋์ ๊ทธ๋ ์ด๋ฏธ ์ฐ๋ฆฌ๋ฅผ ๋์์ฃผ์์ต๋๋ค. ์ต๊ทผ ํด๋ฌ์คํฐ ์ค ํ๋์ ๋ฆฌ๋๊ฐ AWS์์ ์ฌ๋งํ๊ณ ์๋ ์ฅ์ ์กฐ์น๊ฐ ์๋ํ์ผ๋ฉฐ ์ฌ์ฉ์๋ ๊ณ์ ์๋ํ์ต๋๋ค. Patroni๋ ์ฃผ์ ์์
์ ์ํํ์ต๋๋ค.
Patroni ์ฌ์ฉ์ ๋ํ ๊ฐ๋ตํ ์์ฝ:
- ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ์ฉ์ดํฉ๋๋ค. ํ๋์ ์ธ์คํด์ค์์ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ฉฐ ์ ์ฒด ํด๋ฌ์คํฐ๋ก ํ์ ๋ฉ๋๋ค. ์ ๊ตฌ์ฑ์ ์ ์ฉํ๊ธฐ ์ํด ์ฌ๋ถํ ์ด ํ์ํ ๊ฒฝ์ฐ Patroni์์ ์๋ ค๋๋ฆฝ๋๋ค. Patroni๋ ๋จ์ผ ๋ช ๋ น์ผ๋ก ์ ์ฒด ํด๋ฌ์คํฐ๋ฅผ ๋ค์ ์์ํ ์ ์์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค.
- ์๋ ์ฅ์ ์กฐ์น๊ฐ ์๋ํ๊ณ ์ด๋ฏธ ์ฐ๋ฆฌ๋ฅผ ๋์์ฃผ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ดํ์ ์๋ PostgreSQL ์ ๋ฐ์ดํธ. ๋จผ์ ๋ณต์ ๋ณธ์ ์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ๋ค์ Patroni ํด๋ฌ์คํฐ์ ๋ฆฌ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ด์ ๋ฆฌ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ํ์ํ ์๋ ์ฅ์ ์กฐ์น ํ ์คํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ถ์ฒ : habr.com