๐0. ์๋ก
ํ ํ๋ก์ ํธ์์ Redis๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, ์ ๊ธฐํ ํ์์ ๋ฐ๊ฒฌํ๋ค.
์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ๋์ปค๋ฅผ ํตํด ๋ ๋์ค ์๋ฒ๋ฅผ ๋๋ฆฌ๊ณ ์์๊ณ , JWT Refresh Token์ ๋ ๋์ค ์๋ฒ์ ์ ์ฅํ๊ณ ์์๋๋ฐ ๋์ปค๋ฅผ ์ค์งํ๊ณ ๋ฉฐ์น ๋ค์ ๋ค์ ์คํ์ ํด๋ณธ ๊ฒฐ๊ณผ ์์ง ํด๋น ํ ํฐ๋ค์ด ๋จ์์๋ ํ์์ ๋ฐ๊ฒฌํ๋ค.
"์ฅ? Redis๋ InMemory DB๋ก ์ข ๋ฃ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ชจ๋ ํ๋ฐ๋์ด ๋ฐ์ดํฐ๊ฐ ์๋๊ฒ ๋ง์ง ์๋?"
์ด๋ฌํ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์๊ณ , Redis์ ๋ฐฑ์ ์ ๊ด๋ จ๋ ๋ด์ฉ์ ๊ณต๋ถํ์ ํด๋น ์ค๋ง๋ฆฌ๋ฅผ ํ์ด๋ผ ์ ์์๋ค.
๐ค 1. Redis์ ๋ฐฑ์ ๋ฐฉ์
1-1. RDB(Redis DataBase ๋ฐฉ์)
์ฌ๊ธฐ์ RDB๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ, Redis์ ์์ฒด์ ์ธ ๋ฐฑ์ ๋ฐฉ์์ธ Redis Database ๋ฐฉ์์ ์๋ฏธํ๋ค.
Redis๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค Redis๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ค๋ ์ท ํํ๋ก ์ ์ฅํด .rdb ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ก ๋ง๋ค์ด ๋ด๋ ๋ฐฉ์์ด ๋ฐ๋ก RDB์ด๋ค. ํด๋น ๋ฐฑ์ ์ Redis ์๋ฒ๋ฅผ fork๋ฅผ ๋ ์ ์งํ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ค์ ์ผ๋ก Redis๋ฅผ ์ฌ์ฉํ๋ฉด RDB ๋ฐฉ์์ด ์ธํ ๋์ด์๊ธฐ ๋๋ฌธ์, ์์์ ๋ ๋์ค๋ฅผ ์ข ๋ฃํด๋ ํ ํฐ์ด ๊ทธ๋๋ก ๋จ์์๋ ํ์์ ์ฌ์์ํ ํ RDB ํ์ผ์ ๋ถ๋ฌ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ๋จ์์๋ค๊ณ ๋ณผ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ์ท ํํ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์์ ํ์ผ ์ฌ์ด์ฆ๋ก ๋ฐฑ์ ํ์ผ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๊ณ , ์๊ฒฉ์ง ๋ฐฑ์ ์ด๋ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ฝ๋ค.
๋ํ ํด๋น ๋ฐฑ์ ์ด ๋๋ ๊ณผ์ ์ Redis ์๋ฒ๋ฅผ fork๋ฅผ ๋ ์ ์์ ์๋ฒ์์ ๋ฐฑ์ ์ ํ๊ฒ ๋๋ฏ๋ก ๋ณธ ํ๋ก์ธ์ค์๋ ์ฑ๋ฅ์ ์ํฅ์ด ์๋ค.
๋ ๋ฐ์ดํฐ ์ค๋ ์ท์ ๊ทธ๋๋ก ๋ณต๊ตฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๋จ์ ์ด๋ผ๊ณ ํ๋ฉด, ์ด๋ฌํ RDB ๋ฐฉ์์ ๋ํ ์ดํด๊ฐ ์๋ค๋ฉด ์ฝ๊ฒ ์ ์ถํ ์ ์๋ค.
์ค๋ ์ท์ ์ ์ฅํ๋ '์์ '์ด ๋ถ๋ช ํ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ทธ ์ฌ์ด์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ค๋ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์ค๋ ์ท์ 1๋ถ๋ง๋ค ์ ์ฅํ๋ ์ํฉ์์ ์ค๋ ์ท์ด ์ ์ฅ๋๊ธฐ 1์ด ์ ์ ์๋ฒ๊ฐ ์ค๋จ๋๋ค๋ฉด 59์ด๊ฐ์ ๋ฐ์ดํฐ ์์ค์ ๋ง์ ์ ์๋ค.
๋ํ ๋ณธ ํ๋ก์ธ์ค์ ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น์ง๋ ์์ง๋ง, fork๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ ๋ฐ CPU์ ๋ฉ๋ชจ๋ฆฌ ์์์ ์๋ชจํ๋ค๋ ๊ฒ๋ ๋จ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด๋ ์ ํฉ์ฑ์ ๋ํ ์๊ตฌ๊ฐ ํฌ์ง ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ์ข๋ค. ์ฌ์ค Redis๋ฅผ ์บ์ ์๋ฒ๋ก ์ฌ์ฉํ๊ณ ์ ์ ํ ์บ์ฑ ๋ก์ง์ ๊ตฌ์ฑํ๋ค๋ฉด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด๋ ์ ํฉ์ฑ์ ๋ํ ์๊ตฌ๊ฐ ํฌ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ๋ฐ์ํ๋ค. ์ด๋ฌํ ์ ์๋ ๊ฐ๋จํ RDB ๋ฐฉ์์ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ ๋ณด์ธ๋ค. ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํฉ์ฑ์ ๊ฐ๋ ฅํ๊ฒ ์ง์ผ์ผ ํ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ Redis ๋ณด๋ค๋ RDB๋ฅผ ๊ณ ๋ คํ๊ฒ ๋ ๊ฒ์ด๋ ๋ง์ด๋ค.
์ด๋ฌํ RDB ๋ฐฉ์์ ๋ํด ์ปค์คํ ์ ํ๊ณ ์ถ๋ค๋ฉด, redis.conf ํ์ผ์ ์์ ํ๋ฉด ๋๋ค.
https://redis.io/docs/management/config/
Redis configuration
Overview of redis.conf, the Redis configuration file
redis.io
์์ ๋งํฌ์์ ๋ฒ์ ์ ๋ง๋ redis.conf ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์ ์์ ํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
1-2. AOF(Append Only File ๋ฐฉ์)
RDB ๋ฐฉ์์ ํด๋น ์์ ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ ์ท ๋ฐฉ์์ผ๋ก ์ ์ฅํ๊ณ , ๋ค์ ๋ณต๊ตฌํ๋ ๋ฐฉ์์ด๋ค.
๋ฐ๋ฉด AOF๋ ์ค๋ ์ท ๋ฐฉ์์ด ์๋, ๋ชจ๋ ์ฐ๊ธฐ ์์ฒญ์ ๋ํ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋์ค ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค๋ฉด, ํด๋น ๋ช ๋ น ํ๋ํ๋๋ฅผ ๋ชจ๋ ๊ธฐ๋กํด์ AOF ํ์ผ์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
์ค๋ ์ท ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์ฌ์์์ ํ๋ค๋ฉด, ์ฌํ๊ป ๊ธฐ๋ก๋ ๋ช ๋ น์ ํ์คํ ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ์คํํด ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฐฉ์์ด๋ค.
์ด๋ฌํ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ด ๊ธฐ๋ก๋๋ฏ๋ก RDB ๋ฐฉ์์ ๋นํด ๋์ฑ ๋ ์์ ์ฑ์ ์ป์ ์ ์๋ค๋ ๊ฒ์ด ์ฅ์ ์ด๋ค.
AOF ํ์ผ์ ์ด๋ฆ๊ฐ ๋ต๊ฒ Append Only ํ์ผ์ด๋ฏ๋ก ๋ช ๋ น ์ํ์ ๋ํ ๋ด์ฉ์ ์ฝ์ ํ๊ธฐ๋ง ํ๋ฏ๋ก ๋ฐฑ์ ํ์ผ์ ๋ํ ์์ ์ํ์ด ๊ต์ฅํ ์ ๋ค.
๋ํ ์ค์ ์ํ๋ ๋ช ๋ น์ด๊ฐ ์ ์ฅ๋์ด์์ด ์ฌ๋์ด ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๊ณ ํด๋น ๋ด์ฉ์ ์ผ๋ถ ์์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฆฌ๋ ๋ฐฉ์๋ ๊ฐ๋ฅํ๋ค.
์ค๋ ์ท ๋ฐฉ์์ด๋ผ๋ฉด ์ด๋ฌํ ํ์คํ ๋ฆฌ๋ฅผ ์์ง๋ ๋ชปํ ๋ฟ๋๋ฌ, ์ ์ฅ ๊ฐ๊ฒฉ ํ์ ์งํค์ง ๋ชปํ ์ ํฉ์ฑ์ ์๋๋๋ก ๋๋ฆด ์๊ฐ๋ ํ๊ธฐ ์ด๋ ต๋ค.
๋จ์ ์ผ๋ก๋ RDB๋ ์๊ฐ์ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ ์ท์ผ๋ก ์ ์ฅํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ๋ชจ๋ ํ์คํ ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๋ฏ๋ก ํ์ผ ์ฌ์ด์ฆ๊ฐ ์ปค์ง๊ณ , ํด๋น ํ์คํ ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ์คํ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ ์๋๊ฐ ๋๋ฆฐ ํธ์ด๋ค.
AOF ๋ฐฑ์ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, redis.conf ํ์ผ์์
appendonly yes
์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค. ํ ํ๋ฆฟ ํ์ผ์์๋ ์ฃผ์ ์ฒ๋ฆฌ๊ฐ ๋์ด์์ผ๋ฏ๋ก ํด์ ํ๋ฉด ๋๋ค.
์์ฑ๋ AOF ํ์ผ๋ช ์ญ์ redis.conf ํ์ผ์์
appendfilename appendonly.aof
ํด๋น ๋ถ๋ถ์ ์์ ํ๋ฉด ๋๋ค.
appendfsync everysec
๋ง์ง๋ง์ผ๋ก๋ fsync์ ๋ํ ์ ์ฑ ์ค์ ์ด ๊ฐ๋ฅํ๋ฐ fsync() ํธ์ถ์ OS์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ฐ๋๋ก ํ๋ ๊ฒ์ด๋ค.
ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค๊ณ ํด์ ๋ฐ๋ก ๋์คํฌ์ ์ ์ฅ๋๋ ๊ฒ์ด ์๋๋ผ OS๋ฅผ ํตํด ์ผ์ ์๊ฐ ๋ฒํผ๋ง์ด ์กด์ฌํ๋๋ฐ(์์ ํ ์ค์๊ฐ์ด ์๋), ์ด๋ฌํ ํ์ผ ์ฐ๊ธฐ์ ๊ฐ์ ํธ์ถ์ ํตํด ๊ฐ๊ฒฉ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค.
always๋ฅผ ์ฃผ๋ฉด ์๋ก์ด ์ปค๋งจ๋ ํ๋๊ฐ AOF๊ฐ ์ถ๊ฐ๋๋ฉด fsync๊ฐ ์ฆ์ ํธ์ถ๋๋ ๋ฐฉ์์ผ๋ก ๋์คํฌ์ ํ์คํ ๊ธฐ๋ก๋๊ฒํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ฅ ์์ ํ์ง๋ง ๊ฐ์ฅ ๋๋ฆฐ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์๋ค. ๋๋ฌด ๋๋ ค์ Redis์ ์ฅ์ ์ด ํด์๋๊ธฐ๋ ํ๋ค๊ณ ํ๋ค.
์์ ์ ๋์จ everysec์ 1์ด๋ง๋ค fsync๋ฅผ ์ํํ๋ฉฐ, ์ฑ๋ฅ์ RDB ์์ค์ ๊ทผ์ ํ๋ค. ์ค๊ฐ์์ค์ ํํ์ด๋ผ ๋ง์ด ์ฌ์ฉํ๋ ์ต์ ์ด๋ผ๊ณ ํ๋ค.
no ๋ฐฉ์์ OS์ ์์ ํ fsync ํธ์ถ์ ๋ง๊ธฐ๋ ๋ฐฉ์์ด๋ฉฐ, ๊ฐ์ฅ ๋น ๋ฅด์ง๋ง ๋ ์์ ํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ธ์ ์ ์ฅ์ด ๋ ์ง ๋ถํ์คํ๋ค.
AOF ๋ฐฉ์์ด ๋ฐ์ ํ๋ฉด์ AOF ๋ฐฉ์๊ณผ RDB ๋ฐฉ์์ด ํผํฉ๋ ํํ๊ฐ ๋์ค๊ธฐ ์์ํ๋๋ฐ ๊ทธ ๊ฐ๋ ์ ๋ํด ์์๋ณด์.
Log rewriting์ AOF์์ ๋ชจ๋ ํ์คํ ๋ฆฌ๋ฅผ ์ ์ฅํด ํ์คํ ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ์ง๋์น๊ฒ ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฐ๋ ์ผ๋ก, ์ต์ข ์ํ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ต์ํ์ ๋ก๊ทธ๋ง ๋จ๊ธฐ๊ธฐ ์ํด ์ผ๋ถ๋ฅผ ์๋ก ์ฐ๋ ๋ฐฉ์์ด๋ค.
์๋ฅผ ๋ค์ด SET ๋ช ๋ น์ด๋ฅผ ํตํด ๊ฐ์ ํค์ ๋ํด ๊ฐ ์์ ์ 100ํ ์งํํ๋ค๊ณ ํ๋๋ผ๋ ์ต์ข ์ํ๋ 1๊ฐ ์ด๋ฏ๋ก SET 1๊ฐ๋ก ๋์ฒด ํ ์ ์๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ํ์คํ ๋ฆฌ๊ฐ ์ง๋์น๊ฒ ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๋ Multipart AOF์ ๊ฐ๋ ์ด Redis 7๋ถํฐ ๋์ค๊ฒ ๋๋ค.
AOF ๋จ์ผ ํ์ผ๋ก ๊ตฌ์ฑ๋ ๊ณผ๊ฑฐ์ ๋ฌ๋ฆฌ Base file, Incremental file, Manifest file ์ธ ๊ฐ์ง์ ๊ณ ์ ํ ์ญํ ์ ๊ฐ์ง ํ์ผ์ผ๋ก ๋ถํ ๋๊ฒ ๋๋ค.
Base File์ RDB ํ์ผ๋ก, ๋ง์ง๋ง Rewrite ์์ ์ค๋ ์ท์ ์ ์ฅํด ๋ชจ๋ ํ์คํ ๋ฆฌ์ ์ฌ์์์ ๋ฐฉ์งํด ๋ฐฑ์ ์ ์๋๋ฅผ ํฅ์์ํจ๋ค.
Incremental File์ ๋ง์ง๋ง์ผ๋ก Base File์ด ์์ฑ๋ ์ดํ์ ํ์คํ ๋ฆฌ๊ฐ ์์ด๊ฒ ๋๋ AOF ํ์ผ์ด๋ค.
Manifest File์ ์ด๋ฌํ ํ์ผ๋ค์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
์ฆ Multipart AOF ๊ฐ๋ ์ RDB + AOF ๋ฐฉ์์ ์ตํฉ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๐ค 2. ๋ฐฑ์ ๋ง์ผ๋ก๋ ์ฅ์ ๋๋น์ ๋ถ์กฑํด..!
2-1. Replication๊ณผ Sentinel
RDB์ ์ฌ๋ก์์ ๋ณด์๋ฏ์ด ๋ฐฑ์ ์ด ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๊ณ , ๋ณต๊ตฌ๋ฅผ ํ๋๋ฐ ์๊ฐ์ด ์์๋๋ค.
์ด ์ฌ์ด์ ๋ฐ์ํ ์ ์๋ ์ฅ์ ๊ฐ ์ถฉ๋ถํ ์์ ์ ์์ผ๋ฏ๋ก ๋ฐฑ์ ๋ง์ผ๋ก๋ ์ฅ์ ๋๋น์ ๋ถ์กฑํ๋ค.
RDB(๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ๋น์ทํ๊ฒ Redis๋ ๋ณต์ ๋ฅผ ํตํด ๊ฐ์ฉ์ฑ์ ํ๋ณดํ๊ณ ๋น ๋ฅธ ์ฅ์ ์กฐ์น๊ฐ ๊ฐ๋ฅํ๋ค.
์ฆ, ์ฝ๊ธฐ๊ฐ ๊ฐ๋ฅํ Master Redis ์๋ฒ์ ๋์ผํ ๋ด์ฉ์ ๊ฐ์ง Replica Redis ์๋ฒ๋ฅผ ๊ฐ์ง ์ ์๊ณ , Master ์๋ฒ๊ฐ ์ฃฝ์์ ๊ฒฝ์ฐ Replica ์ค ํ๋๋ฅผ Master๋ก ์ ํํด ์ฆ์ ์๋น์ค๋ฅผ ์ ์ํ ์ํฌ ์๋ ์๋ค.
๋ํ Replica๋ Read-only ๋ ธ๋์ด๊ธฐ ๋๋ฌธ์ ํธ๋ํฝ ๋ถ์ฐ์ ์ญํ ๋ ํ ์ ์๋ค. (์ฝ๋ ์ฐ์ฐ์ Replica๋ก, ์ฐ๊ธฐ ์ฐ์ฐ์ Master๋ก)
Master ๋ ธ๋๋ RDB๋ AOF๋ฅผ ์ด์ฉํ ๋ฐฑ์ ๊ธฐ๋ฅ ํ์ฑํ๊ฐ ํ์์ ์ด๋ค. (์ฌ์์ ํ์ ๋น์ด์๋ ๋ฐ์ดํฐ ์ํ๊ฐ ๋ณต์ ๋๋ ๊ฒฝ์ฐ ๋ฐฉ์ง)
๋จ์ํ Master ๋ ธ๋๊ฐ ์ฃฝ์์ ๋ Replica๋ฅผ Master๋ก ์๋์ผ๋ก ์น๊ฒฉ์ํฌ ์๋ ์์ง๋ง, Redis๋ ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด Sentinel์ด๋ผ๋ ์ฅ์น๋ฅผ ๋ง๋ จํ๋ค.
Master-Replica ๊ตฌ์กฐ์์ Master๊ฐ ๋ค์ด ์ Replica๋ฅผ ์๋์ผ๋ก Master๋ก ์น๊ฒฉ์ํค๋ Auto-Failover๋ฅผ ์ํํ๋ ๊ฒ์ด ์ผํฐ๋ฌ์ ์ญํ ์ด๋ค.
์ผํฐ๋ฌ ๋ ธ๋๋ 3๊ฐ ์ด์์ผ๋ก ๊ตฌ์ฑํ๋๋ฐ, ๊ทธ ์ด์ ๋ ์๋ฒ๊ฐ ๋ค์ด๋๋ค๋ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํ '๊ณผ๋ฐ์'๋ผ๋ ๊ฐ๋ ์ ๊ฐ๊ธฐ ์ํด์๋ 3๋ช ์ด ์ต์ ๋ ธ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค. (Quorum : ์ ์กฑ์)
๋ง์ฝ ์ฐฐ๋์ ๋คํธ์ํฌ ๋จ์ ์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๊ณง๋ฐ๋ก ๋ณต๊ตฌ๋์๋ค๊ณ ๊ฐ์ ํ์. ๋จ ํ๋์ ์ผํฐ๋ฌ๋ง ์๋ฒ๊ฐ ๋ค์ด๋์๋ค๊ณ ํ๋จํ๊ณ ๋ ์ผํฐ๋ฌ์ ์๋ฒ๊ฐ ์ ์์ ์ด๋ค๋ผ๋ ํ๋จ์ ๋ด๋ฆฌ๋ฉด, Master ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์๋๋์๋ค๊ณ ํ๋จํ๋ ๊ฒ์ด๋ค. ์ฆ ์๋น์ค์ ์ง์ฅ์ด ๊ฐ์ง ์๋ ์ค๋ฅ๋ก ์ธํด Master ๋ ธ๋๋ฅผ ๋ค์ด์ด๋ผ ํ๋จํ๊ณ Replica ์๋ฒ๋ฅผ ์น๊ฒฉ์ํค๋ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํค๋ ์ผ์ ์ค์ผ ์ ์๋ค.
์ผํฐ๋ฌ 1๋๊ฐ Master ๋ ธ๋๊ฐ ๋ค์ด๋์๋ค๊ณ ํ๋จํ๋ ๊ฒ์ SDOWN(Subjective Down)
์ ์กฑ์๊ฐ ์ถฉ์กฑ๋์ด Master ๋ ธ๋๊ฐ ๋ค์ด๋์๋ค๊ณ ํ๋จํ๋ ๊ฒ์ ODOWN(Objective Down)์ด๋ผ๊ณ ํ๋ค.
์ด๋ฌํ 3๊ฐ ์ด์์ ์ผํฐ๋ฌ ๋ ธ๋๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด์๊ณ , ์ฐ๊ฒฐ๋ Redis Master์ Replica๋ฅผ ๋ชจ๋ํฐ๋งํ๋ค.
Client๋ Master์ Replica ๋ ธ๋์ ์ ๊ทผํ๋ ๊ฒ์ด ์๋๋ผ, ์ด ์ผํฐ๋ฌ ๋ ธ๋๋ค์ ํตํด Redis์ ์ ๊ทผํ ์ ์๋ค.
๋ฐ๋ผ์ SpringBoot + Redis Replica with Sentinel์ ๊ตฌ์กฐ๋ผ๋ฉด, ์ผํฐ๋ฌ ๋ ธ๋๋ค์ IP-Port๋ฅผ ๊ธฐ์ ํด ์ฐ๊ฒฐํด์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค.
์ผํฐ๋ฌ์ด ์ ์ ํ Master-Replica ๋ ธ๋์ ์ ์ ํ ์ฃผ์๋ฅผ ์๋์ผ๋ก ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋๋ Docker Compose ํ์ผ์ ํตํด Redis Replication + Sentinel์ ๊ตฌ์ฑํ ์์ ์ด๋ค.
version: "3"
services:
my-redis-a:
hostname: redis-master
container_name: redis-master
image: "bitnami/redis"
environment:
- REDIS_REPLICATION_MODE=master
- ALLOW_EMPTY_PASSWORD=yes
ports:
- 5000:6379
my-redis-b:
hostname: redis-replicas-1
container_name: redis-replicas-1
image: "bitnami/redis"
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis-master
- ALLOW_EMPTY_PASSWORD=yes
ports:
- 5001:6379
depends_on:
- my-redis-a
redis-sentinel-1:
container_name: sentinel1
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_SET=mymaster
- REDIS_SENTINEL_QUORUM=2
ports:
- 26379:26379
depends_on:
- my-redis-a
- my-redis-b
redis-sentinel-2:
container_name: sentinel2
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_SET=mymaster
- REDIS_SENTINEL_QUORUM=2
ports:
- 26380:26379
depends_on:
- my-redis-a
- my-redis-b
redis-sentinel-3:
container_name: sentinel3
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_SET=mymaster
- REDIS_SENTINEL_QUORUM=2
ports:
- 26381:26379
depends_on:
- my-redis-a
- my-redis-b
์๋๋ SpringBoot ํ๋ก์ ํธ์์์ application.yml ํ์ผ์ด๋ค.
spring:
redis:
sentinel:
master: mymaster
nodes: 127.0.0.1:26379, 127.0.0.1:26380, 127.0.0.1:26381
๊ธฐ์กด์ Redis ์ฐ๊ฒฐ์์ ํด๋น ํํธ๋ง ๋ณ๊ฒฝํ๋ค๋ฉด, ๋ฌธ์ ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
2-2. Redis Cluster
Redis Cluster๋ ์ฌ๋ฌ ๋ ธ๋์ ์๋์ ์ธ ๋ฐ์ดํฐ ๋ถ์ฐ์ ์ฒ๋ฆฌํด์ฃผ๋ฉฐ, Sentinel๊ณผ ๋น์ทํ๊ฒ ์ผ๋ถ ๋ ธ๋์ ์คํจ๋ ํต์ ๋จ์ ์๋ ๊ณ์ ์๋ํ๋ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ๋ฉฐ, ๊ณ ์ฑ๋ฅ๊ณผ ์ ํ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ค.
์ฆ ์ค๋ฉ์ ์ญํ ์ ํ๋ค๊ณ ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ค.
Redis Cluster์ ํน์ง์ ์์ ๊ฐ์ด Full-mesh ๊ตฌ์กฐ๋ก ํต์ ํ๊ฒ ๋๋ค. ์ฆ ๋ชจ๋ ๋ ธ๋๊ฐ ์์ ์ ์ ์ธํ ๋๋จธ์ง ๋ ธ๋์ ์ ๋ถ ์ฐ๊ฒฐ๋์ด ํต์ ๋๋ค๋ ๋ป์ด๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ์ ์ ์ก์ด ์ด๋ค์ง๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ถ๊ธ์ฆ์ด ์๊ธธ ์ ์๋ค.
"์์ ์ ์ ์ธํ ๋๋จธ์ง ๋ชจ๋ ๋ ธ๋์ ๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค๋ฉด ์ง๋์น๊ฒ ๋ง์ ํต์ ๋์ด ์๊ตฌ๋๋ ๊ฒ ์๋๊ฐ?"
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Redis Cluster๋ Gossip Protocol์ด๋ผ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค. Gossip์ด๋ผ๋ ์ด๋ฆ๋ต๊ฒ ์๋ฌธ์ด ํผ์ง๋ ํ์์ฒ๋ผ ํต์ ์ ๊ฐ์๋ฅผ ์ค์ด๋๋ผ๋ ๋ชจ๋ ํต์ ์ด ๋๊ฒ๋ ๋ง๋๋ ํ๋กํ ์ฝ์ด๋ค.
Gossip Protocol์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋์ ๊ธ์์ ์ป์ ์ ์์๋ค.
http://highscalability.com/blog/2023/7/16/gossip-protocol-explained.html
Gossip Protocol Explained - High Scalability -
You can subscribe to the system design newsletter to excel in system design interviews and soft...
highscalability.com
Redis Cluster๋ Cluster Bus๋ผ๋ ๋ณ๋์ ํฌํธ๋ฅผ ์ฌ์ฉํด์ ์๋ก ํต์ ํ๊ฒ ๋๋ค.
๋ํ '์ค๋ฉ'์ด ์ ์ฉ๋๋ฏ๋ก ํค์ ๋ฐ๋ผ ๋ค๋ฅธ Master-Replica Redis ์๋ฒ์ ๊ฐ์ด ์ ์ฅ๋๊ฒ๋๋๋ฐ, ์ด๋ฌํ ํค์ ๋ฐ๋ฅธ ๋ ๋์ค ์๋ฒ ์ ํ์ Hash Slot์ด๋ผ๋ ๋ฐฉ์์ ์ํด ๊ฒฐ์ ๋๋ค.
Sentinel๊ณผ ๋ค๋ฅธ ์ ์ผ๋ก๋, Sentinel ์ญ์ HA๋ฅผ ์ํ ๋๊ตฌ์ด๊ธฐ๋ ํ๋, ์ค์ง ํ ์์ Master-Replica ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ํ๊ณ๊ฐ ์กด์ฌํ๋ค. ๋ ๋์ค ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฉ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์ฑ ๋ ๋์ ์์ค์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ด๋ฃฐ ์ ์๋ค.
๋ํ ๋ ๋์ค ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก Full-Mesh ๊ตฌ์กฐ๋ก ํต์ ํ๋ฉฐ ์๋ก์ Heart Beat๋ฅผ ์ฒดํฌํ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ชจ๋ํฐ๋ง ์๋น์ค(Sentinel)์ด ํ์ ์๊ฒ ๋๋ค.
Sentinel์์ ํด๋ผ์ด์ธํธ๊ฐ ๋ชจ๋ ์ผํฐ๋ฌ ๋ ธ๋์ ์ ์์ ํ๋ ๊ฒ์ฒ๋ผ, Redis Cluster ์ญ์ ํด๋ผ์ด์ธํธ๋ ๋ชจ๋ Cluster ๋ ธ๋์ ์ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ค์ง๋ค.
Redis Cluster๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฐ์ ์ ํ ์ฌํญ์ด ์กด์ฌํ๋๋ฐ, ๊ทธ๊ฒ์ ๋ฐ๋ก DB0๋ง ์ฌ์ฉํ๋ค๋ ๊ฒ๊ณผ, MultiKey Operation์ด ๋ถ๊ฐํ๋ค๋ ์ ์ด๋ค. ์ด๋ฌํ ์ ํ์ฌํญ์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๊ณ , ๊ณ ๊ฐ์ฉ์ฑ์ ์ฑ๊ธฐ๊ณ ์ถ๋ค๋ฉด Redis Cluster๋ฅผ ์ ํํ๋ ๊ฒ์ ์ข์ ๋ฐฉํฅ์ผ๋ก ๋ณด์ธ๋ค.
๋ฐ๋ฉด์ ๊ท๋ชจ๊ฐ ๊ทธ๋ค์ง ํฌ์ง ์๊ฑฐ๋ MultiKey Operation์ด ํ์ํ ๊ฒฝ์ฐ์๋ Redis Cluster๋ณด๋ค๋ Sentinel์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์์์ ํค์ ๋ฐ๋ผ ์ด๋ค ํด๋ฌ์คํฐ ๋ ธ๋์ ๋ค์ด๊ฐ๋ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ก Hash Slot์ ์ด์ฉํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ธ๊ธํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ค๋ฉ์ ๋จ์ ํด์๋ฅผ ํตํด ํด๋น ๋ ธ๋๋ฅผ ์ถ์ ํ๊ฒ ๋๋๋ฐ, ์ด ๋ฐฉ๋ฒ์ ๊ต์ฅํ ์ข๊ณ ๊ฐ๋จํ๋ค.
์๋ฅผ ๋ค์ด key ๊ฐ์ด 'fruit'๋ผ๊ณ ํ๋ฉด, ํด์ํจ์๋ฅผ ํตํด key ๊ฐ์ ํด์๊ฐ์ ๊ตฌํ๊ณ , ์ค๋ฉ๋ ์ด ๋ ธ๋์ ๊ฐ์๋งํผ ๋ชจ๋๋ฌ ์ฐ์ฐ์ ํตํด ์ด๋ ๋ ธ๋์ ์ ์ฅ๋ ์ง ๊ฒฐ์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค!
๊ต์ฅํ ์ง๊ด์ ์ด๊ณ ๊ฐ๋ ฅํ๊ณ ์ข์ ๋ฐฉ๋ฒ์ด์ง๋ง, ๋จ์ ์ด ๋ถ๊ฐ๋๋ ์ํฉ์ ํด๋ฌ์คํฐ๊ฐ ์ถ๊ฐ๋์์ ๊ฒฝ์ฐ์ด๋ค.
์๋ฅผ ๋ค์ด Hash ๊ฐ์ด 2๋ผ๊ณ ๊ฐ์ ํ๊ณ , ํด๋ฌ์คํฐ ๋ณ๊ฒฝ ์ ์ด ๋ ธ๋ ์๊ฐ 2๊ฐ, ๋ณ๊ฒฝ ์ดํ๋ 3๊ฐ๋ผ๊ณ ๊ฐ์ ํ์.
๋ณ๊ฒฝ์ ์๋ 2 % 2 = 0 ์ผ๋ก 0๋ฒ ๋ ธ๋์ ์ ์ฅ๋์ง๋ง, ๋ณ๊ฒฝ ํ์๋ 2 % 3 = 2๋ก 2๋ฒ ๋ ธ๋์ ์ ์ฅ๋๊ฒ ๋๋ค.
๋จ์ ํด์์์๋ ํด๋ฌ์คํฐ์ ์์ ๋ณ๊ฒฝ์ ์ํด ๋ชจ๋ ๋งคํ์ด ์๋ก ๊ณ์ฐ๋์ด์ผ๋ง ํ๋ ์์๊ฐ ์๊ธธ ์ ๋ฐ์ ์๋ค. ์ด๊ฒ์ ์น๋ช ์ ์ธ ๋จ์ ์ด๋ค.
Hash Slot์ ํตํ ๋ฐ์ดํฐ ๋ถ์ฐ์ ์ฝ๊ฐ ๋ค๋ฅด๋ค.
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, Redis Cluter๊ฐ ์ด 3๊ฐ์ Master ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. Redis Cluster Hash Slot์ 0~16383์ ์ฌ๋กฏ์ ๋ฏธ๋ฆฌ ๊ตฌ์ฑํด๋๊ณ , ํด๋น ์ฌ๋กฏ์ ๊ฐ ๋ฒ์๋ฅผ Cluster๊ฐ ๊ฐ๊ฐ ๋๋ ๊ฐ์ง๊ฒ ๋๋ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ๋ค.
Hash ์๊ณ ๋ฆฌ์ฆ์ CRC16์ ์ฌ์ฉํ๋ฉฐ, ํค๊ฐ์ ํด๋น ์ฐ์ฐ์ ํตํด ํด์ ๊ฐ์ ์ป์ด๋ธ ์ดํ, ๋ชจ๋๋ฌ ์ฐ์ฐ์ ํตํด Hash Slot์ ๊ฐ์ ์ป์ด๋ธ๋ค.
ํด๋น HashSlot์ ๋งคํ๋ ํด๋ฌ์คํฐ๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
์ด๋ ๊ฒ ๋๋ฉด, ํด๋ฌ์คํฐ๊ฐ ์ถ๊ฐ๋๊ณ ์ญ์ ๋๋ฉด ์ํฅ์ด ๊ฐ๋ Hash Slot์ ๋ํด์๋ง ๋ฐ์ดํฐ์ ์ฌ๊ตฌ์ฑ์ด ์ด๋ค์ง๋ฉด ๋๋ค.
๋ชจ๋ ๋ฐ์ดํฐ์ ์ํฅ์ด ๊ฐ๋ ๊ธฐ์กด ๋ฐฉ์๊ณผ๋ ์ฝ๊ฐ ๋ค๋ฅธ ์ ์ด๋ค.
๋ง์ฝ ํด์์ฌ๋กฏ์ ๋งคํ๋์ง ์์ ๋ค๋ฅธ ํด๋ฌ์คํฐ์ ์์ฒญ์ด ๊ฐ๋ฉด Redis๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น?
Redis Cluster๋ ๋ค์๊ณผ ๊ฐ์ MOVED ์๋ฌ๋ฅผ ๋ด๋ณด๋ธ๋ค.
MOVED [Hash Slot Num] [IP:Port]์ ํ์์ผ๋ก, ํด๋น ๋ ธ๋๊ฐ ๋ด๋นํ์ง ์๋๋ค๋ ์๋ฏธ์ ์๋ฌ๋ฅผ ๋ด๋ณด๋ด๊ณ , ํด๋น ํด์์ฌ๋กฏ์ ๋ด๋นํ๋ ์ฌ๋ฐ๋ฅธ ํด๋ฌ์คํฐ ์๋ฒ์ IP์ ํฌํธ๋ฒํธ๋ฅผ ์๋ ค์ฃผ๊ฒ ๋๋ค.
"๊ทธ๋ผ Redis๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ ํด๋ฌ์คํฐ์ ์์ฒญ์ ๋์ง๊ณ MOVED ์๋ฌ์ ๋ํ ํ์ฒ๋ฆฌ๊น์ง ๊ณ ๋ คํด์ผ ํ๋ ์๊ณ ๋ก์์ด ๋ ์์ง ์๋๋?"
๋ผ๋ ์ง๋ฌธ์ ํ ์ ์๋๋ฐ, Spring ํ๊ฒฝ์์๋ ์ด๋ฌํ ์ ์ ์ ๊ฒฝ์ฐ์ง ์๋๋ก ์์์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๋ด๋ถ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ key-node๋ฅผ ๋งต์ ์บ์ฑํด์ ์ด๋ฌํ ์ค๋ฅ๊ฐ ๋ ๋ฐ์ํ๊ฒ๋ ๋ง๋ค๊ณ , ๋ฐ์ํ๋๋ผ๋ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๊ฒ๋(Redirect ๊ธฐ๋ฅ) ํธ๋ฆฌํ๊ฒ ๊ตฌ์ฑ๋์ด์๋ค.
์ด๋ฌํ Redis Cluster๋ฅผ ํตํด์ Single Redis๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋งํผ์ ํผํฌ๋จผ์ค๋ฅผ ๋ผ ์ ์๋ค.
๋ค๋ง, Redis Cluster๊ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ํญ์ ์ง์ผ์ง๋๋?๋ผ๊ณ ํ๋ค๋ฉด ๊ทธ๊ฒ์ ์๋๋ค.
ํญ์ ๋ถ์ฐ์์คํ ์์๋ ์ฑ๋ฅ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ๊ณผ trade-off ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
Redis Cluster๋ Master-Replica ๊ฐ ๋ฐ์ดํฐ ๋ณต์ ๊ฐ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ด๋ค์ง๋ค. ์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ข ๋ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
์ฌ์ฉ์๊ฐ Master ์๋ฒ์ ์ฐ๊ธฐ ์์ฒญ์ ๋ณด๋ด๋ฉด Master์์ Replica๋ก์ ๋ณต์ ๋ฅผ ํ๋ ๊ณผ์ ๊ณผ, ํด๋น ๋ด์ฉ์ ์ฐ๊ธฐ ์๋ฃํ๋ค๋ Ack ์ ํธ ๋ฆฌํด์ด ๋์์ ์ด๋ค์ง๋ค. ๋ง์ฝ ์๋์ ๊ฐ์ ์๋๋ฆฌ์ค๊ฐ ์ด๋ค์ง๋ค๋ฉด ๋ณต์ ๋ ์คํจํ๊ฒ ๋์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
1) ์ฐ๊ธฐ ์์ฒญ ๋ง์คํฐ ๋ ธ๋์ ์ ๋ฌ
2) Replica๋ก ๋ณต์ ์์ฒญ๊ณผ Ack ์ ํธ๋ฅผ ๋์์ ์ ๋ฌ
3) ๋ณต์ ์์ฒญ์ด ์ด๋ค์ง๊ธฐ ์ master ๋ ธ๋์ ๋ค์ด ๋ฐ์
4) ๋ฐ์ดํฐ ์ ์ค
Redis Cluster๋ Sentinel๊ณผ ๋น์ทํ๊ฒ Auto Failover ๊ธฐ๋ฅ์ ์ง์ํ๋ค. ํน์ Master ๋ ธ๋๊ฐ ๋ค์ด๋๋๋ผ๋ ๊ณผ๋ฐ์ ์ด์์ Master ๋ ธ๋๊ฐ ์ด์์์ผ๋ฉฐ ๋ค์ด๋ ๋ ธ๋์ Replica๊ฐ ์ด์์๋ค๋ฉด Failover ์ฒ๋ฆฌ๋ฅผ ํ๊ณ Replica๋ฅผ Master๋ก ์น๊ฒฉ์ํค๋ ์์ ์ ์๋์ผ๋ก ์ํํ๋ค.
๋ง์ฝ Replica๊ฐ Master๋ก ์น๊ฒฉ๋ ์ดํ์ ํด๋น Master ๋ ธ๋์ ํต์ ์ด ์ฌ๊ฐ๋๊ฑฐ๋ ์ฌ์์์ ํ๋ค๋ฉด, ์ด๋ฏธ Replica๊ฐ Master๋ก ์น๊ฒฉ๋์์ผ๋ฏ๋ก ํด๋น ๋ ธ๋๋ Replica๋ก์จ ๋์ํ๊ฒ ๋๋ค.
๋ํ Master๊ฐ ํต์ ๋ถ๋ฅ์ด๋ผ๋ ํ๋จ์ ๊ณผ๋ฐ์์ master ๋ ธ๋์ ํต์ ํ์ง ๋ชปํ ๊ฒฝ์ฐ ์ค์ค๋ก error state๋ก ๋น ์ง๊ฒ ๋๋ฉฐ write ์์ฒญ์ ๋ฐ์ง ์๋๋ค.