2022λ…„ 11μ›” 30일 단 ν•œμ€„μ˜ μ½”λ“œλ‘œ μΈν•˜μ—¬ μ‹œμŠ€ν…œμ„ μ •μƒμ μœΌλ‘œ μ΄μš©ν•  수 μ—†λŠ” μƒνƒœλ‘œ λ§Œλ“€μ–΄λ²„λ¦¬λŠ” μ‹¬κ°ν•œ 결함을 λ§Œλ“€μ—ˆλ‹€. κ³Όμ—° μ–΄λ–€ λ¬Έμ œκ°€ λ°œμƒν–ˆκ³  κ·Έ 원인은 λ¬΄μ—‡μ΄μ—ˆλŠ”μ§€ λ˜λŒμ•„λ³΄λ©° μ—¬λŸ¬λΆ„μ—κ²Œ κ³΅μœ ν•˜κ³ μž ν•œλ‹€.

일반적인 μ›Ή μ„œλΉ„μŠ€μ²˜λŸΌ μ‹€μ‹œκ°„μœΌλ‘œ λ§Žμ€ μ‚¬μš©μžμ™€ 그리고 각 μ‚¬μš©μžμ— μ˜ν•΄ λŒ€λŸ‰μ˜ νŠΈλž˜ν”½μ΄ λ°œμƒν•˜λŠ” μ‹œμŠ€ν…œ ν™˜κ²½μ€ μ•„λ‹™λ‹ˆλ‹€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μŠ€μΌ€μΌ μ•„μ›ƒλ˜μ–΄ λΆ„μ‚°ν™”λ˜λŠ” 것을 κ³ λ €ν•˜μ—¬ μ„Έμ…˜ ν΄λŸ¬μŠ€ν„°λ§μ„ μœ„ν•˜μ—¬ μŠ€ν”„λ§ μ„Έμ…˜κ³Ό ν•¨κ»˜ μ„Έμ…˜ 정보λ₯Ό λ ˆλ””μŠ€λΌλŠ” 인메λͺ¨λ¦¬ μ €μž₯μ†Œμ— μ—°κ³„ν•˜λ„λ‘ μŠ€ν”„λ§ μ„Έμ…˜ λ ˆλ””μŠ€λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ‹€. μ‹œμŠ€ν…œ ν™˜κ²½ 규λͺ¨ 상 λ§Žμ€ μ‚¬μš©μžμ˜ μ„Έμ…˜ 데이터가 μ €μž₯λ˜λŠ” 것은 μ•„λ‹ˆλ―€λ‘œ 1GB μ •λ„μ˜ λ©”λͺ¨λ¦¬ 사양을 κ°€μ§€λŠ” μž‘μ€ 단일 μΈμŠ€ν„΄μŠ€μ— λ ˆλ””μŠ€λ₯Ό μ„€μΉ˜ν•˜μ—¬ μŠ€νƒ λ‹€λ“œ-μ–Όλ‘  λͺ¨λ“œλ‘œμ¨ μ‚¬μš©ν•˜λ”λΌλ„ 큰 λ¬Έμ œκ°€ μ—†μ—ˆλ‹€. μ„Έμ…˜ μ €μž₯μ†Œλ‘œμ¨ λ ˆλ””μŠ€λ₯Ό λ„μž…ν•˜μ˜€μœΌλ‚˜ μ‹€μ œλ‘œ μ‚¬μš©μžμ— μ˜ν•΄ λ°œμƒν•˜λŠ” μ„Έμ…˜ 데이터가 많이 μ €μž₯λ˜μ§€ μ•Šμ„ κ²ƒμ΄λ―€λ‘œ 일뢀 λ°μ΄ν„°λ² μ΄μŠ€ μ‘°νšŒμ— λŒ€ν•΄μ„œ λΆ€ν•˜λ₯Ό 쀄일 수 μžˆλ„λ‘ 자주 변경될 κ°€λŠ₯성이 μ—†λŠ” 일뢀 데이터λ₯Ό μ‘°νšŒν•˜λŠ” ν”„λ‘œμ‹œμ € ν˜ΈμΆœμ— λŒ€ν•΄μ„œ μŠ€ν”„λ§ μΊμ‹œλ₯Ό μ μš©ν•˜μ˜€λ‹€. κ·ΈλŸ¬λ‚˜, μ„Έμ…˜κ³Ό μΊμ‹œ 데이터λ₯Ό ν¬ν•¨ν•˜μ—¬ 생각보닀 μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬λŠ” λ―ΈλΉ„ν–ˆμ—ˆκΈ°μ— μ„Έμ…˜μ΄λ‚˜ μΊμ‹œμ— λŒ€ν•΄ 그닀지 κ³ λ―Όν•  ν•„μš”μ„±μ€ μ—†μ—ˆλ‹€κ³  μƒκ°λœλ‹€.

κ·ΈλŸ¬λ‚˜, μ–΄λŠ μ‹œμ λΆ€ν„° νŠΉμ • ν™˜κ²½μ—μ„œ λ ˆλ””μŠ€κ°€ μ„€μΉ˜λœ μ„œλ²„μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ‘°κΈˆμ”© 였λ₯Έλ‹€λŠ” λͺ¨λ‹ˆν„°λ§ μ§€ν‘œλ₯Ό μ „λ‹¬λ°›μ•˜μœΌλ©° λͺ¨λ‹ˆν„°λ§ μ§€ν‘œκ°€ μ „λ‹¬λ˜λŠ” κ³Όμ •μ—μ„œ μ‹œκ°„μ΄ 많이 ν˜λ €κΈ°μ— κΈ΄κΈ‰ν•˜κ²Œ λ ˆλ””μŠ€κ°€ μ„€μΉ˜λœ μ„œλ²„μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λ†’μœΌλ©° μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ˜ CPU λΆ€ν•˜κ°€ λ†’κ³  μ‹œμŠ€ν…œμ„ μ •μƒμ μœΌλ‘œ μ΄μš©ν•  수 μ—†λŠ” μƒνƒœκ°€ λ˜μ—ˆλ‹€κ³  보고 λ°›κ²Œ λ˜μ—ˆλ‹€.

λ ˆλ””μŠ€μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 높아진 원인

μ²˜μŒμ—λŠ” λ ˆλ””μŠ€κ°€ μ„€μΉ˜λœ μ„œλ²„μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λ†’μ•„μ§„λ‹€λŠ” μ΄μ•ΌκΈ°λ§Œ μ „λ‹¬λ°›μ•˜κΈ°μ— (이전에 λ°œμƒν•œ 이λ ₯을 ν† λŒ€λ‘œ) λ³΄μ•ˆ 및 λͺ¨λ‹ˆν„°λ§ λͺ©μ μœΌλ‘œ 각 μ„œλ²„μ— μ„€μΉ˜λœ λ°±μ‹  ν”„λ‘œκ·Έλž¨μ΄λ‚˜ λͺ¨λ‹ˆν„°λ§ μ—μ΄μ „νŠΈλ‘œ 인해 λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν–ˆμ„ 것이라고 μ˜μ‹¬ν–ˆμœΌλ‚˜ λ ˆλ””μŠ€ μ„œλ²„μ— 접속 ν›„ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜λŠ”λ° 버벅거릴 μ •λ„λ‘œ μ„œλ²„μ˜ μ—¬μœ  λ©”λͺ¨λ¦¬κ°€ λ‚¨μ•„μžˆμ§€ μ•Šμ€ μƒνƒœκ°€ λ˜μ–΄μžˆμ—ˆμœΌλ©° λ ˆλ””μŠ€κ°€ μ‹€μ‹œκ°„μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©λŸ‰μ΄ μ„œλ²„ λ©”λͺ¨λ¦¬λ₯Ό 거의 μ μœ ν•˜κ³  μžˆμ—ˆμŒμ„ ν™•μΈν•˜μ˜€λ‹€.

λ ˆλ””μŠ€κ°€ μ„œλ²„ λ©”λͺ¨λ¦¬λ₯Ό 거의 μ‚¬μš©ν•œ 이유

μ„œλ²„μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ—„μ²­λ‚˜κ²Œ λ†’μ•˜λ˜ μ΄μœ λŠ” λ ˆλ””μŠ€κ°€ 거의 λŒ€λΆ€λΆ„μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆκΈ° λ•Œλ¬Έμ΄λ©° μ΄λ ‡κ²ŒκΉŒμ§€ λ˜μ–΄λ²„λ¦° μ‚¬μœ μ— λŒ€ν•΄μ„œλŠ” 운영적인 츑면을 κ³ λ €ν•˜μ§€ μ•Šκ³  인프라 및 μ„œλ²„ ν™˜κ²½ ꡬ좕 μ‹œ λ ˆλ””μŠ€λ₯Ό μ„€μΉ˜ν•˜κ³ λ‚˜μ„œ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ˜΅μ…˜μ— λŒ€ν•΄μ„œλŠ” κΈ°λ³Έκ°’μœΌλ‘œ κ΅¬λ™ν•˜μ˜€κΈ° λ•Œλ¬Έμ΄λ‹€. 사싀 상 λ ˆλ””μŠ€λΌλŠ” κΈ°μˆ μ— λŒ€ν•΄μ„œ λΌμΈμ΄λ‚˜ μΉ΄μΉ΄μ˜€μ™€ 같은 규λͺ¨μ˜ 쑰직이 μ•„λ‹ˆλΌλ©΄ 기술적인 κ²½ν—˜μ΄ λΆ€μ‘±ν•΄μ„œ λ ˆλ””μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” 기본값을 μ‚¬μš©ν•˜λŠ” 곳이 λ§Žμ„μ§€λ„ λͺ¨λ₯΄κ² λ‹€.

μ•„λ¬΄νŠΌ λ ˆλ””μŠ€λ₯Ό μ„€μΉ˜ν•˜μ˜€μ„λ•Œ 기본적으둜 μ œκ³΅ν•˜λŠ” μ„€μ • νŒŒμΌμ—μ„œ λ ˆλ””μŠ€κ°€ μ‚¬μš©ν•˜λŠ” μ΅œλŒ€ 맀λͺ¨λ¦¬μ— λŒ€ν•œ μ œν•œμ€ 없도둝 λ˜μ–΄μžˆμœΌλ©° κ²½κ³  문ꡬλ₯Ό 톡해 μ„Έμ…˜μ΄λ‚˜ μΊμ‹œλ₯Ό μœ„ν•΄μ„œ λ ˆλ””μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ΅œλŒ€ λ©”λͺ¨λ¦¬ 섀정을 ν•˜λŠ” 것이 쒋을 수 μžˆλ‹€κ³  μ•ˆλ‚΄ν•˜κ³  μžˆλ‹€. λ ˆλ””μŠ€κ°€ μ„œλ²„ λ©”λͺ¨λ¦¬λ₯Ό μ œν•œμ—†μ΄ μ‚¬μš©ν•˜κ²Œ λ˜λ©΄μ„œ μ„œλ²„ μƒνƒœκ°€ 이상해진 것을 κ²½ν—˜ν•˜κ³  λ‚˜μ„œμ•Ό ν•΄λ‹Ή μ˜΅μ…˜μ΄ μ μš©λ˜μ–΄ μžˆμ§€ μ•ŠμŒμ„ ν™•μΈν•˜μ˜€κ³  이에 λŒ€ν•΄ κΈ΄κΈ‰ μž μ • μ‘°μΉ˜κ°€ ν•„μš”ν•¨μ„ μš°μ„  μ „λ‹¬ν•˜μ˜€λ‹€.

μ΅œλŒ€ λ©”λͺ¨λ¦¬ 섀정은 μ„œλ²„ λ©”λͺ¨λ¦¬λ₯Ό λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜κ²Œ λ˜μ–΄ 가상 λ©”λͺ¨λ¦¬κΉŒμ§€ μŠ€μ™‘ν•˜μ—¬ μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•œ μ˜ˆλ°©μ±…μΌ 뿐 근본적인 원인에 λŒ€ν•΄ κ²€ν† λ˜μ§€ μ•Šμ•˜κ³  ν•΄κ²° 방법은 μ•„λ‹ˆλ‹€. μš°μ„  λ ˆλ””μŠ€ μ„œλ²„μ˜ μƒνƒœλ₯Ό μ•ˆμ •μ μœΌλ‘œ μœ μ§€ν•  수 μžˆλ„λ‘ μ΅œλŒ€ λ©”λͺ¨λ¦¬λ₯Ό μ„€μ • 및 μŠ€λƒ…μƒ·λœ νŒŒμΌμ„ μ‚­μ œν•˜κ³  λ ˆλ””μŠ€λ₯Ό μž¬μ‹œμž‘ν•˜μ˜€λ‹€.

λ ˆλ””μŠ€ μŠ€λƒ…μƒ·μ„ 톡해 데이터 뢄석

λ ˆλ””μŠ€μ˜ μ΅œλŒ€ λ©”λͺ¨λ¦¬ μ„€μ • 쑰치λ₯Ό μˆ˜ν–‰ν•˜κΈ° 전에 λ ˆλ””μŠ€μ—μ„œ 기본값에 μ˜ν•΄ 자체적으둜 μ €μž₯ν•΄λ‘μ—ˆλ˜ μŠ€λƒ…μƒ·(dump.rdb) νŒŒμΌμ„ λ°±μ—…ν•œ ν›„ 둜컬 ν™˜κ²½μ—μ„œ 도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 λ ˆλ””μŠ€λ₯Ό μŠ€λƒ…μƒ· κΈ°μ€€μœΌλ‘œ κ΅¬λ™ν•œ ν›„ λ ˆλ””μŠ€κ°€ μ μœ ν•˜κ³  있던 λ©”λͺ¨λ¦¬κ°€ μ–΄λ–€ λ°μ΄ν„°λ‘œ μΈν•œ 것인지 κ²€ν† ν•˜μ˜€λ‹€. λ ˆλ””μŠ€ ν΄λΌμ΄μ–ΈνŠΈ(redis-cli)λ₯Ό 톡해 μ €μž₯된 λ°μ΄ν„°λ“€μ˜ ν‚€λ₯Ό μ‘°νšŒν•˜μ˜€μœΌλ©° μš΄μ˜μ€‘μΈ ν™˜κ²½μ΄ μ•„λ‹ˆλ―€λ‘œ KEYS λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜μ—¬ λŒ€λž΅μ μΈ 킀듀을 ν™•μΈν–ˆκ³  λ„ˆλ¬΄ λ§Žμ€ ν‚€λ“€λ‘œ μΈν•˜μ—¬ μ œλŒ€λ‘œ 확인을 ν•  수 μ—†λ‹€κ³  νŒλ‹¨λ˜μ–΄ μŠ€ν”„λ§ μ„Έμ…˜ κ΄€λ ¨ 킀와 μΊμ‹œλ‘œ μ €μž₯ν•˜λŠ” 킀듀을 μ •λ¦¬ν•˜κ³  μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°μ— 곡유된 λŒ“κΈ€ 쀑 eval λͺ…λ Ήμ–΄λ₯Ό ν™œμš©ν•œ μ˜ˆμ‹œλ₯Ό μ°Έκ³ ν•˜μ—¬ μ•„λž˜μ™€ 같이 μˆ˜ν–‰ν•˜μ˜€λ‹€.

eval "return #redis.call('keys', 'spring:session:*')" 0
eval "return #redis.call('keys', 'spring:session:sessions:*')" 0
eval "return #redis.call('keys', 'spring:session:sessions:expires*')" 0
eval "return #redis.call('keys', 'spring:session:expirations*')" 0

μ„Έμ…˜ κ΄€λ ¨ 킀듀은 μ•½ 60만 κ°œκ°€ λ“±λ‘λ˜μ–΄μžˆμ—ˆμœΌλ©° μ„Έμ…˜ κ΄€λ ¨ 킀듀을 μ‚­μ œν•˜λ‹ˆ λ‚¨μ•„μžˆλ˜ μΊμ‹œ λ°μ΄ν„°λ‘œ 인해 μ μœ μ€‘μΈ λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©λŸ‰μ€ μ•½ 200MBκ°€ λ˜μ—ˆλ‹€. 일뢀 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ μ‚¬μš©μžμ˜ μΆ”κ°€λ‘œ μΈν•˜μ—¬ μΊμ‹œλ˜λŠ” λ°μ΄ν„°μ˜ 양이 μ‘°κΈˆμ€ λ§Žμ•„μ‘ŒμœΌλ‚˜ μ‹œμŠ€ν…œμ— μ‹€μ‹œκ°„μœΌλ‘œ μ ‘μ†ν•˜λŠ” μ‚¬μš©μžμ— λŒ€ν•œ μ„Έμ…˜μ€ λ§Žμ§€ μ•ŠκΈ°μ— λ¬΄λΆ„λ³„ν•˜κ²Œ λΆˆν•„μš”ν•œ μ„Έμ…˜ 킀듀이 λ“±λ‘λ˜μ—ˆμŒμ„ μΈμ§€ν•˜κ²Œ λ˜μ—ˆλ‹€. λ‹¨μˆœν•˜κ²Œ 바라보면 일반적으둜 μ„Έμ…˜μ˜ 만료 μ‹œκ°„μ„ 짧게 ν•˜λŠ”λ° μ‹œμŠ€ν…œ μš”κ΅¬μ‚¬ν•­ νŠΉμ„± 상 μ„Έμ…˜ νƒ€μž„μ•„μ›ƒμ΄ 7일둜 μ§€μ •λ˜μ–΄ μžˆμ—ˆκΈ°μ— λ“±λ‘λœ μ„Έμ…˜ κ΄€λ ¨ 킀듀을 μ˜€λž˜λ™μ•ˆ λ ˆλ””μŠ€λ₯Ό μ μœ ν•˜κ²Œ λ˜λŠ” 상황이 λ˜μ–΄λ²„λ Έλ‹€.

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ κ΅¬ν˜„μ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•œ 이유둜 λΆˆν•„μš”ν•œ μ„Έμ…˜ 정보λ₯Ό μ €μž₯

λ³΄μ•ˆ μš”κ΅¬μ‚¬ν•­μ— μ˜ν•΄ μ‚¬μš©μžμ˜ μš”μ²­μ΄λ‚˜ 내뢀적인 μŠ€μΌ€μ€„ μž‘μ—…μ— μ˜ν•΄ ν˜ΈμΆœλ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μš”μ²­μ— λŒ€ν•΄μ„œ 일련의 과정을 κ°μ‹œν•  수 μžˆλ„λ‘ API μš”μ²­μ— λŒ€ν•œ λ‘œκ·Έλ‚˜ μ–΄λ–€ ν”„λ‘œμ‹œμ €λ₯Ό ν˜ΈμΆœν•˜λŠ”μ§€ 둜그둜써 κΈ°λ‘ν•΄μ•Όν–ˆκ³  이 κ³Όμ •μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ μš”μ²­μ„ μˆ˜ν–‰ν•˜λŠ” μ„Έμ…˜μ˜ 아이디가 μ €μž₯λ˜μ–΄μ•Όν•  ν•­λͺ©μ— ν¬ν•¨λ˜μ–΄μžˆμ—ˆλ‹€. 이 μš”κ΅¬μ‚¬ν•­μ— λŒ€ν•œ μž‘μ—…μ€ 곡톡 λͺ¨λ“ˆλ‘œμ¨ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλŠ”λ° λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν˜ΈμΆœν•˜λŠ” ν΄λž˜μŠ€κ°€ 곡톡 λͺ¨λ“ˆμ— μžˆμ—ˆμœΌλ©° ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 빈으둜 κ΄€λ¦¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ 맀번 μƒμ„±λ˜μ–΄μ•Όν•˜λŠ” ꡬ쑰둜 λ˜μ–΄μžˆλ‹€λ³΄λ‹ˆ μŠ€ν”„λ§μ—μ„œ μ§€μ›ν•˜λŠ” AOPλ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ μš”μ²­μ— λŒ€ν•΄μ„œ κ°€λ‘œμ±„μ–΄ 기둝할 수 μ—†μ—ˆλ‹€.

μ•„λ¬΄νŠΌ λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ ν”„λ‘œμ‹œμ €λ₯Ό ν˜ΈμΆœν•˜λŠ” κ³Όμ •μ—μ„œ μ λ‹Ήν•œ μœ„μΉ˜λ₯Ό κ³ λ €ν•˜μ—¬ μ„ μ •ν–ˆκ³  ν”„λ‘œμ‹œμ € λͺ…κ³Ό μ—¬λŸ¬κ°€μ§€ 정보와 ν•¨κ»˜ μ„Έμ…˜ 아이디λ₯Ό κΈ°λ‘ν•˜κΈ° μœ„ν•΄μ„œ μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” RequestContextHolderλ₯Ό 톡해 RequestAttributesλ₯Ό κ°€μ Έμ˜¨ ν›„ μ„Έμ…˜ 아이디λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ„λ‘ μž‘μ„±ν•˜μ˜€λ‹€.

이 방식이 μ–΄λ–€ λ¬Έμ œκ°€ μžˆλŠ”μ§€ λ°”λ‘œ μ•Œμ•„μ±ˆ 뢄듀이라면 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ κ΅¬ν˜„μ„ μ œλŒ€λ‘œ μ•Œκ±°λ‚˜ λ§Žμ€ κ²½ν—˜μ΄ μžˆλ‹€κ³  보여진닀. μ•„λ§ˆ λŒ€λΆ€λΆ„μ€ μ € ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ”κ²Œ μ™œ λ ˆλ””μŠ€μ™€ 연관이 μžˆλŠ”μ§€ μ˜ˆμƒν•˜κΈ° νž˜λ“€κ²ƒμ΄λ‹€.

사싀 λ‹¨μˆœνžˆ μ € ν•¨μˆ˜λͺ…을 바라본닀면 λ³΄μ•ˆ μš”κ΅¬μ‚¬ν•­μ— λŒ€ν•œ 처리 둜직 κ³Όμ •μ—μ„œ λ¬΄λΆ„λ³„ν•˜κ²Œ μ„Έμ…˜ 정보가 μ €μž₯될 수 μžˆλŠ”μ§€ κ²€ν† ν•˜λŠ” 건 μ½”λ“œ 리뷰λ₯Ό ν–ˆλ”λΌλ„ 어렀웠을 κ²ƒμ΄λΌλŠ” 생각이 λ“ λ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ ν˜€μžˆλŠ” μƒμ„Έν•œ λ‚΄μš©μ„ ν™•μΈν•˜λ©΄ μ•„λž˜μ™€ 같이 NULL 값이 될 수 μ—†λŠ” λ¬Έμžμ—΄μ΄ λ°˜ν™˜λ˜μ–΄μ•Όν•œλ‹€κ³  λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

/**
 * Return an id for the current underlying session.
 * @return the session id as String (never {@code null})
 */
String getSessionId();

이에 따라 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” ServletRequestAttributes κ΅¬ν˜„μ²΄μ—μ„œ μ„Έμ…˜ 아이디가 λ°˜λ“œμ‹œ λ°˜ν™˜λ˜μ–΄μ•Όν•˜λ―€λ‘œ μš”μ²­ μ •λ³΄μ—μ„œ μ„Έμ…˜μ„ κ°€μ Έμ˜¬ λ•Œ μ—†μœΌλ©΄ μƒμ„±λ˜λ„λ‘ μΈμžκ°€ λ°˜λ“œμ‹œ true인 μƒνƒœλ‘œ λ™μž‘ν•˜κ²Œ κ΅¬ν˜„ν•΄λ‘μ—ˆλ‹€. 일반적으둜 μ„Έμ…˜ 방식과 토큰 기반의 μΈμ¦μ΄λ‚˜ API μš”μ²­μœΌλ‘œ κ΅¬λΆ„λ˜λŠ”λ° μŠ€ν”„λ§ μ›Ή MVC μ—μ„œλŠ” λ‘κ°œ λͺ¨λ‘ μ„œλΈ”λ¦Ώ μš”μ²­μΌ λΏμ΄λ―€λ‘œ μŠ€λ ˆλ“œ λ‘œμ»¬μ— μš”μ²­ μŠ€λ ˆλ“œκ°€ μ €μž₯λ˜μ–΄ μ–Έμ œλ“  κ°€μ Έμ˜¬ 수 μžˆλŠ” μƒνƒœκ°€ λœλ‹€.

그런데, μ„Έμ…˜ 아이디라 함은 μ„Έμ…˜ λ°©μ‹μ˜ μš”μ²­μ— λŒ€ν•΄μ„œλ§Œ μ˜λ―Έκ°€ μžˆμœΌλ―€λ‘œ μ„Έμ…˜μ΄ ν™œμš©λ˜μ§€ μ•ŠλŠ” 토큰 기반 μš”μ²­μ— λŒ€ν•΄μ„œλŠ” λ‚΄λΆ€μ μœΌλ‘œ μ„Έμ…˜μ„ μ €μž₯ν•˜λŠ” μ½”λ“œκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ, 토큰 기반 μš”μ²­ μ‹œ μ„Έμ…˜μ΄ μƒμ„±λ˜μ§€ μ•Šμ•„μ•Ό 함에 λΆˆκ΅¬ν•˜κ³  μ„Έμ…˜ 아이디λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλŠ” μœ„ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 μƒˆλ‘œμš΄ μ„Έμ…˜μ΄ μƒμ„±λ˜κ³  μŠ€ν”„λ§ μ„Έμ…˜μ— λŒ€ν•œ ν•„ν„°κ°€ κ°€μž₯ λ¨Όμ € μ²˜λ¦¬λ˜λ―€λ‘œ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  μ‘λ‹΅ν•˜λŠ” κ³Όμ •μ—μ„œ μƒμ„±λœ μ„Έμ…˜μ΄λ‚˜ λ³€κ²½λœ μ„Έμ…˜ 정보λ₯Ό κ°±μ‹ ν•˜κΈ° μœ„ν•΄ μŠ€ν”„λ§ μ„Έμ…˜ λ ˆλ””μŠ€ κ΅¬ν˜„ λ™μž‘μ΄ ν˜ΈμΆœλ˜μ–΄ λ ˆλ””μŠ€μ— λΆˆν•„μš”ν•œ μ„Έμ…˜ 킀듀을 μƒμ„±ν•˜κ²Œ 된 것이닀.

μ„Έμ…˜ 아이디λ₯Ό μ‘°νšŒν•˜λŠ” μ½”λ“œ 둜직의 λ³€κ²½

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜μ˜ κ΅¬ν˜„μ„ μ œλŒ€λ‘œ ν™•μΈν•˜μ§€ λͺ»ν•œ μƒνƒœμ—μ„œ μš”κ΅¬μ‚¬ν•­μ„ μ²˜λ¦¬ν•œ λ‚˜μ˜ μ‹€μˆ˜ 인 것은 λͺ…ν™•ν•˜λ‹€. ServletRequestAttributesλ₯Ό 톡해 μ„Έμ…˜ 아이디λ₯Ό μ‰½κ²Œ κ°€μ Έμ˜¬ 수 μžˆμ—ˆμœΌλ‚˜ 상황에 따라 μ˜ˆμƒν•˜μ§€ λͺ»ν–ˆλ˜ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€κ²Œ λ˜μ—ˆμœΌλ―€λ‘œ μ„Έμ…˜ 아이디λ₯Ό μ‘°νšŒν•˜λŠ” μ½”λ“œλ₯Ό HttpServletRequestλ‘œλΆ€ν„° ν˜„μž¬ μŠ€λ ˆλ“œ 둜컬 내에 μ„Έμ…˜μ΄ μžˆλ‹€λ©΄ κ°€μ Έμ˜€λ„λ‘ λ³€κ²½ν–ˆλ‹€. μ΄μ œλŠ” μƒˆλ‘œμš΄ μ„Έμ…˜μ„ λ§Œλ“œλŠ” 과정이 μ—†μœΌλ―€λ‘œ 토큰 기반 APIκ°€ μš”μ²­λ  λ•Œ λ ˆλ””μŠ€μ— 무수히 λ§Žμ€ μ„Έμ…˜ ν‚€κ°€ λ“±λ‘λ˜μ§€ μ•ŠλŠ”λ‹€.

운영적인 츑면의 λ ˆλ””μŠ€ μ˜΅μ…˜ ꢌ고

tcp-backlog 1024
maxmemory 400mb
maxmemory-policy allkeys-lfu
ulimit -n 65535
echo 'net.ipv4.tcp_max_syn_backlog=1024' >> /etc/sysctl.conf
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo never > /sys/kernel/mm/transparent_hugepage/enabled

λ ˆλ””μŠ€ κ²°ν•¨μœΌλ‘œ 인해 ν™•μΈλœ λ ˆλ””μŠ€ μ˜΅μ…˜μ— λŒ€ν•œ λ¬Έμ œλ„ κ²€ν† ν•˜μ—¬ μœ„μ™€ 같이 운영적인 μΈ‘λ©΄μ—μ„œμ˜ μ˜΅μ…˜μ„ μ •λ¦¬ν•œ ν›„ λ ˆλ””μŠ€ μ„œλ²„ ν™˜κ²½μ— μ μš©ν•  μ€€λΉ„λ₯Ό ν•˜κ³  μžˆλ‹€. ν•œκ°€μ§€ λͺ…ν™•ν•˜μ§€ μ•Šμ€ 뢀뢄은 μ΅œλŒ€ λ©”λͺ¨λ¦¬ μ˜΅μ…˜μ— μ μš©λ˜μ–΄μ•Όν•  μ λ‹Ήν•œ μˆ˜μΉ˜κ°€ 무엇이냐인데 BGSAVEλ₯Ό 톡해 RDB μŠ€λƒ…μƒ·μ„ μˆ˜ν–‰ν•˜λŠ” 경우 Fork λ°©μ‹μœΌλ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³΅μ œν•˜μ—¬ 덀프 νŒŒμΌμ„ μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 두배 이상이 될 수 μžˆλ‹€λŠ” 점을 κ°μ•ˆν•œλ‹€λ©΄ 절반 μ΄ν•˜μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ•Όν•  것 κ°™λ‹€. λ”κ΅¬λ‚˜ λ ˆλ””μŠ€ 뿐만 μ•„λ‹ˆλΌ CPUλ‚˜ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” λ°±μ‹  ν”„λ‘œκ·Έλž¨μ΄ κ΅¬λ™μ€‘μ΄λ―€λ‘œ 인터넷에 μ •λ¦¬λœ 60% μ •λ„μ˜ λ©”λͺ¨λ¦¬ 섀정은 μ ν•©ν•˜μ§€ μ•Šλ‹€κ³  μƒκ°λœλ‹€.

νŠΈλŸ¬λΈ”μŠˆνŒ… 회고

κ°œλ°œμžλ‘œμ¨λŠ” 생각지도 λͺ»ν•˜κ²Œ 단 ν•œμ€„μ˜ μ½”λ“œλ‘œ μΈν•˜μ—¬ μ‹œμŠ€ν…œμ„ λ§ˆλΉ„μ‹œν‚€λŠ” κ²½ν—˜μ„ ν•œ 큰 μ΄μŠˆμ˜€μœΌλ©° 고객의 μž…μž₯μ—μ„œλŠ” μ‚¬μš©μ€‘μΈ μ‹œμŠ€ν…œμ— λŒ€ν•œ μ•ˆμ •μ„±κ³Ό 신뒰성을 λ¬Έμ œμ‚Όμ„ 수 μžˆλŠ” κ±΄μ΄μ—ˆλ‹€. μ•„λ¬΄νŠΌ μ‘°μ§μ—μ„œλŠ” 이에 λŒ€ν•œ μž₯μ•  보고λ₯Ό 고객 μΈ‘μ—κ²Œ μ „λ‹¬ν•˜κΈ° μœ„ν•˜μ—¬ κ΄€λ ¨ 정보λ₯Ό μ •λ¦¬ν•˜κ³  있으며 κ΄€λ ¨ μ΄μŠˆκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ μ–΄λ–€ 쑰치λ₯Ό ν•  것인지λ₯Ό κ³ λ―Όν•˜κ³  μžˆλ‹€. 이 λ¬Έμ œμ— λŒ€ν•΄μ„œ λŒμ•„λ³΄λ©΄μ„œ ν™•μΈν•˜κ²Œ 된 μ•„λž˜μ˜ 글듀을 κ³΅μœ ν•˜λ©° 마치고자 ν•œλ‹€.