๋จ์ผ JVM์ด ์๋ ๋ค์ค ์๋ฒ ํ๊ฒฝ์์์ ๋์์ฑ ์ ์ด๋ฅผ ์ํด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฝ ๋๋ Redis, Zookeeper ๋ฑ์ ์ฌ์ฉํ ๋ถ์ฐ ๋ฝ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ ๋์ค ๋ถ์ฐ ๋ฝ ๋์ ์ ์ ๋ ๋์ค์ ๋ํด ๊ณต๋ถํ๋ฉฐ ๋ ๋์ค Persistence์ ์ฃผ์ ์ฌํญ, ์ํคํ ์ฒ ๋ฑ ์๋กญ๊ฒ ์๊ฒ๋ ๊ฒ๋ค์ ๋ํด ์ ๋ฆฌํ ์์ ์ด๋ค.
โ๏ธ ๋ ๋์ค Persistence
๋ ๋์ค๋ ์๊ธฐ์น ๋ชปํ๊ฒ ์๋ฒ๊ฐ ๋ค์ด๋์ด ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํด์ผํ๋ ์ํฉ์ ๋๋นํด ๋๊ฐ์ง Persistence ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
1๏ธโฃ RDB
RDB๋ ์ค๋ ์ท ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ด๋ ํน์ ์๊ฐ๋ง๋ค ์ค๋ ์ท์ ๋ง๋ค์ด ๋์คํฌ์ ์ ์ฅํ ํ, ๋ฐ์ดํฐ ๋ณต๊ตฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ก๋ฉํด์ ์ฌ์ฉํ๋ฉด ๋์ง๋ง ์ค๋ ์ท ์ดํ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ์ ์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ ์ค์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ RDB ๋ฐฉ์์ ์บ์๋ก๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ผ๋ถ ๋ฐ์ดํฐ ์ ์ค์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
`redis.conf` ํ์ผ์ `save` ์ต์ ์ ํตํด ์๋์ผ๋ก ์ ์ฅํ ์ ์์ผ๋ฉฐ cli์์ `BGSAVE` ์ปค๋ฉ๋๋ฅผ ํตํด์ ์๋ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ `SAVE` ์ปค๋ฉ๋๋ Blocking ๋ฐฉ์์ผ๋ก ์๋ํ์ฌ ์งํ ์ค์ธ ๋ค๋ฅธ ์์ ๋ค์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ `fork`๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋๋ก ํ๋ `BGSAVE` ์ปค๋ฉ๋ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋์๋ `del` ์ปค๋ฉ๋ ๋์ `unlink` ์ปค๋ฉ๋ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
//redis.conf ํ์ผ
save 900 1 // 900์ด ๋์ 1๊ฐ ์ด์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์์ ๊ฒฝ์ฐ RDF ํ์ผ ์ฌ์์ฑ
2๏ธโฃ AOF
AOF๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค Log๋ฅผ ๋ชจ๋ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค. AOF๋ FSYNC ์ฃผ๊ธฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ์ ์ ์ค์ด ์ ํ ์๋๋ก ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฅ์ ์ง์ ๊น์ง์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ณด์ฅ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
`redis.conf` ํ์ผ์ `auto-aof-rewrite-percentage` ์ต์ ์ ํตํด ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ์ฌ AOF ํ์ผ ๋๋น AOF ํ์ผ ์ฌ์์ฑ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค. ๋ํ CLI์์ `BGREWRITEAOF` ์ปค๋ฉ๋๋ฅผ ํตํด AOF ํ์ผ ์ฌ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
APPENDFSYNC ์ต์
- always: ๋ ๋์ค ๋ช ๋ น์ด ์คํ๋ ๋ ๋ง๋ค ๋์คํฌ์ ๊ธฐ๋กํ๋ฉฐ ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ง๋ค.
- everysec: ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ 1์ด ๋ง๋ค ๋์คํฌ์ ์ด๋ค. Write()์ fsync() ์์คํ ์ฝ ํธ์ถ์ ์ง์ฐ ์๊ฐ์ ๋ฐ๋ผ์ ์ต๋ 2์ด ์ด๋ด์ ๋ฐ์ดํฐ๋ฅผ ์์ด ๋ฒ๋ฆด ์ ์์ง๋ง, ์ฑ๋ฅ๊ณผ ๋ฐ์ดํฐ ๋ณด์กด ์ ์ธก๋ฉด์์ ์ ์ ํ ๊ฐ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ธ ์ต์ ์ด๋ค.
- no: ๋์คํฌ์ ์ฐ๋ ์์ ์ ์ด์์ฒด์ ์ ๋งก๊ธด๋ค. ๋๋ถ๋ถ์ ๋ฆฌ๋ ์ค ์์คํ ์์๋ 30์ด ๋ง๋ค ๋์คํฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ต๋ 30์ด๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์คํ ์ ์๋ค.
โ๏ธ Redis ์ฃผ์ ์ฌํญ
1. STOP-WRITES-ON-BGSAVE-ERROR
์ด ์ค์ ์ RDB ํ์ผ ์ ์ฅ ์คํจ ์ redis๋ก์ ๋ชจ๋ write๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๋ ์ต์ ์ผ๋ก `yes`๊ฐ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ผ๋ก ๋์ด์๋ค.
ํ์ฌ Redis๋ RDB ๋ฐฉ์๊ณผ AOF๋ฐฉ์์ ๋ชจ๋ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๊ธฐ์น ์์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ค์ ๊ฐ์ `NO`๋ก ์ค์ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
2. MAXMEMORY-POLICY
ํด๋น ์ต์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ๋ ์ฐผ์ ๋์ ์ ์ฑ ์ ๊ด๋ฆฌํ๋ ์ต์ ์ผ๋ก ์๋์ ๊ฐ์ ์ธ๊ฐ์ง ์ต์ ์ด ์กด์ฌํ๋ฉฐ `allkeys-lru` ์ต์ ์ ๊ถ์ฅํ๋ค.
- noeviction (default) - ์ญ์ ํ์ง ์์
- volatile-lru - expire time์ด ์ค์ ๋์ด ์๋ ๊ฒ์ ๋์์ผ๋ก LRU
- allkeys-lru - ๋ชจ๋ ํค๋ฅผ ๋์์ผ๋ก LRU
3. MAXMEMORY ๊ฐ ์ค์
RDB ์ ์ฅ๊ณผ AOF rewirte ์ fork() ์์คํ ์ฝ์ ์ฌ์ฉํ๋ค. ์ด๋ Copy-on-Write๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฐฐ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ Persistence ์ฌ์ฉ ์ MaxMentry๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฐ์ผ๋ก ์ค์ ํด์ผํ๋ค.
4. MEMORY FRAGMENTATION ๊ด๋ฆฌ
๋ ผ๋ฆฌ์ ์ผ๋ก Redis๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ์ธ `used_memory`์ OS๊ฐ Redis์ ํ ๋นํ๊ธฐ ์ํด ์ฌ์ฉํ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ์์ธ `used_memory_rss`์ ์ฐจ์ด๊ฐ ํด ๊ฒ์ fragmentation์ด ํฌ๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค. ์ด๋ TTL๋ก ์ธํ eviction์ด ๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ญ์ ๋๋ ํค๊ฐ ๋ง์ ๋ ๋ฐ์ํ๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด `activedefrag` ์ต์ ์ ์ฌ์ฉํ ์ ์๋๋ฐ, redis ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์ด๋ ํญ์ ์ผ๋๋ ๊ฒ์ด ์๋๋ผ ๋จํธํ๊ฐ ๋ง์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ ์๋์ ์ผ๋๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
`CONFIG SET activedefrag yes`
โ๏ธ ๋ ๋์ค ์ํคํ ์ฒ
1. Replication
Replication์ Master-Replica ๊ตฌ์กฐ๋ก, ๋ฐ์ดํฐ ๋ณต์ ๋ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. Replica๋ Master๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ์ง๋ง, ์ฅ์ ๋ฐ์ ์ ์๋์ผ๋ก ๋ณต๊ตฌํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ์ ๋ฐ์ ์ ์๋์ผ๋ก ์๋ก์ด Redis ์๋ฒ์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํด์ค์ผ ํ๋ค.
2. Sentinel
Redis Sentinel์ ์๋ Failover๊ฐ ๊ฐ๋ฅํ ๊ณ ๊ฐ์ฉ์ฑ(HA) ๊ตฌ์ฑ์ ์ ๊ณตํ๋ค. Sentinel์ Master์ Replica๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก Replica๋ฅผ Master๋ก ์น๊ฒฉํ๋ค. ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ Sentinel์ ํตํด Redis์ ์ฐ๊ฒฐํ๋ฏ๋ก, ์ฅ์ ๋ฐ์ ์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์์ ํ ํ์๊ฐ ์๋ค. ๊ทธ๋ฌ๋ Sentinel ์์ฒด๋ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก 3๊ฐ ์ด์์ Sentinel ๋ ธ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ฑ์ ๋์ฌ์ผ ํ๋ค๋ ์ฃผ์์ฌํญ์ด ์กด์ฌํ๋ค.
3. Cluster
Redis 3.0๋ถํฐ ์ ๊ณต๋๋ Cluster๋ ์ค๋ฉ๊ณผ ๊ณ ๊ฐ์ฉ์ฑ์ ๊ฒฐํฉํ ์ํคํ ์ฒ๋ค. ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ ๋ง์คํฐ ๋ ธ๋์ ๊ทธ์ ๋์ํ๋ Replica ๋ ธ๋๋ค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ์ญ ํ๋กํ ์ฝ์ ํตํด ๋ ธ๋ ๊ฐ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ค. ์ค๋ฉ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ง์คํฐ ๋ ธ๋๋ค์ ๋ถ๋ฐฐํ๊ณ , ๋ฐ์ดํฐ๋ ํด์ ํจ์์ ๋ฐ๋ผ ํน์ ๋ ธ๋์ ์ ์ฅ๋๋ค. Redis ํด๋ฌ์คํฐ๋ ์ฅ์ ๋ฐ์ ์์๋ ์ ์ฒด ๋ ธ๋ ์ค ํ๋๋ผ๋ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด, ๋ชจ๋ ๋ ธ๋์ ์ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฐ๊ฒฐ ์ ๋ณด ๋ณ๊ฒฝ์ด ํ์ ์๋ค.
โ๏ธ ๊ฒฐ๋ก
Redis์์ ๋ค๋ฃจ๋ ์๋ฃ๊ตฌ์กฐ, ๋ค์ํ ์บ์ ์ ์ฅ ๋ฐฉ์ ๋ฑ ๋ง์ ๋ด์ฉ๋ค์ด ์์ง๋ง ์ด๋ฒ ๊ธ์์๋ Redis์ ๋ํด ๊ณต๋ถํ๋ฉฐ ์๋กญ๊ฒ ์๊ฒ ๋ ๊ฒ๋ค์ ๋ํด์๋ง ์ ๋ฆฌํด๋ดค๋ค. ์์ผ๋ก์ ๊ฐ๋ฐ ์ค ๋ง๋๊ฒ ๋ ๋ค์ํ ํธ๋ ์ด๋ ์คํ ์ํฉ์ ๋์์ด ๋๋ ๊ธ์ด ๋ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค.