Distributed Lock

λΆ„μ‚° 락 (Distributed Lock)

μ„œλ²„κ°€ μ—¬λŸ¬ λŒ€μΈ μƒν™©μ—μ„œ λ™μΌν•œ 데이터에 λŒ€ν•œ 동기화λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

ν•„μš”ν•œ 이유

μ„œλ²„κ°€ ν•œ λŒ€κ°€ μ•„λ‹ˆλΌ μ—¬λŸ¬ λŒ€μΈ 경우, μ—¬λŸ¬ μ„œλ²„λ‘œ APIκ°€ λΆ„μ‚° ν˜ΈμΆœλœλ‹€.

μ„œλ²„λ“€κ°„μ— λ™κΈ°ν™”λœ μ²˜λ¦¬κ°€ ν•„μš”ν•˜κ³ , μ—¬λŸ¬ μ„œλ²„μ— κ³΅ν†΅λœ 락을 μ μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— redisλ₯Ό μ΄μš©ν•˜μ—¬ λΆ„μ‚° 락을 μ΄μš©ν•œλ‹€.

λΆ„μ‚° 락 같은 경우 db λ“± κ³΅ν†΅λœ 데이터 μ €μž₯μ†Œλ₯Ό μ΄μš©ν•΄ μžμ›μ΄ μ‚¬μš©μ€‘μΈμ§€ ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— 전체 μ„œλ²„μ— λ™κΈ°ν™”λœ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

μŠ€ν•€ 락

Redisμ—μ„œ λΆ„μ‚° 락을 κ΅¬ν˜„ν•  λ•Œ, μŠ€ν•€ 락에 λŒ€ν•΄μ„œ λ¨Όμ € μ•Œμ•„μ•Όν•œλ‹€.

μŠ€ν”½ 락은 λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ Lock을 μ†Œμœ ν•˜κ³  μžˆλ‹€λ©΄ κ·Έ Lock이 λ°˜ν™˜λ  λ•ŒκΉŒμ§€ 계속 ν™•μΈν•˜λ©° κΈ°λ‹€λ¦¬λŠ” 것이닀.

Lock 을 μ μœ ν•˜λŠ” μ‹œκ°„μ΄ 짧을 경우 μœ μš©ν•˜μ§€λ§Œ μŠ€λ ˆλ“œκ°€ Lock 을 였래 μœ μ§€ν•˜λŠ” 경우 CPU 에 뢀담을 쀄 수 μžˆλ‹€.

Lock의 νƒ€μž„μ•„μ›ƒ μ§€μ •

μŠ€ν•€ 락을 κ΅¬ν˜„ν–ˆμ„ λ•Œ, λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ 락을 μ μœ ν•˜λ©΄ 또 λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” 락을 νšλ“ν•  λ•ŒκΉŒμ§€ ν™•μΈν•˜λ©° κΈ°λ‹€λ¦°λ‹€.

이 λ•Œ λ§Œμ•½ νŠΉμ •ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ tryLock을 μ„±κ³΅ν–ˆλŠ”λ° λΆˆμš΄ν•˜κ²Œλ„ μ–΄λ–€ 였λ₯˜ λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ˜μ–΄λ²„λ¦¬λ©΄ μ–΄λ–»κ²Œ 될까?

λ‹€λ₯Έ λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜κΉŒμ§€ μ˜μ›νžˆ 락을 νšλ“ν•˜μ§€ λͺ»ν•œ 채 락이 ν•΄μ œλ˜κΈ°λ§Œμ„ κΈ°λ‹€λ¦¬λŠ” λ¬΄ν•œμ • λŒ€κΈ°μƒνƒœκ°€ λ˜μ–΄ 전체 μ„œλΉ„μŠ€μ˜ μž₯μ• κ°€ λ°œμƒν•˜κ²Œ 될 것이닀.

κ·Έλž˜μ„œ 일반적인 둜컬 μŠ€ν•€ λ½κ³ΌλŠ” λ‹€λ₯΄κ²Œ 일정 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ 락이 λ§Œλ£Œλ˜λ„λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

그럴렀면 expire time을 μ„€μ •ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

λ˜ν•œ λ¬΄ν•œμ •μœΌλ‘œ 락의 νšλ“μ„ μ‹œλ„ν•œλ‹€λ©΄ λ¬Έμ œκ°€ 될 수 μžˆλ‹€.

λ§Œμ•½ 연산이 였래 걸릴 경우 λŒ€λΆ€λΆ„μ˜ μŠ€λ ˆλ“œκ°€ 락을 λŒ€κΈ°ν•˜λŠ” μƒνƒœκ°€ λ˜μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ— μ‘λ‹΅ν•˜λŠ” 속도가 λŠ¦μ–΄μ§€κ³ , λ™μ‹œμ— λ ˆλ””μŠ€μ— μ—„μ²­λ‚œ νŠΈλž˜ν”½μ„ 보낼 수 있기 λ•Œλ¬Έμ΄λ‹€.

κ·Έλž˜μ„œ 락을 νšλ“ν•˜λŠ” μ΅œλŒ€ ν—ˆμš©μ‹œκ°„μ„ μ •ν•΄μ£Όκ±°λ‚˜, μ΅œλŒ€ ν—ˆμš© 횟수λ₯Ό μ •ν•΄μ£ΌλŠ” 것이 μ’‹λ‹€.

λ§Œμ•½ 락을 νšλ“ν•˜λŠ”λ°μ— μ‹€νŒ¨ν•œλ‹€λ©΄ 연산을 μˆ˜ν–‰ν•  수 μ—†λŠ” μƒνƒœμ΄κΈ°μ— Exception을 λ˜μ§„λ‹€.

λ ˆλ””μŠ€μ— λ§Žμ€ λΆ€ν•˜

μœ„μ˜ μ½”λ“œλŠ” μŠ€ν•€ 락을 μ‚¬μš©ν–ˆμ§€λ§Œ 사싀 μŠ€ν•€ 락을 μ‚¬μš©ν•˜λ©΄ λ ˆλ””μŠ€μ— μ—„μ²­λ‚œ 뢀담을 μ£Όκ²Œλœλ‹€.

μŠ€ν•€ 락은 μ§€μ†μ μœΌλ‘œ 락의 νšλ“μ„ μ‹œλ„ν•˜λŠ” μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ— λ ˆλ””μŠ€μ— 계속 μš”μ²­μ„ λ³΄λ‚΄κ²Œ 되고 λ ˆλ””μŠ€λŠ” 이런 νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜λŠλΌ 뢀담을 λ°›κ²Œ λœλ‹€.

λ˜ν•œ μΌνšŒμ„±μ΄ μ•„λ‹ˆλΌ λͺ¨λ“  μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ§€μ†μ μœΌλ‘œ λ ˆλ””μŠ€μ— λΆ€ν•˜λ₯Ό κ°€ν•˜κΈ° λ•Œλ¬Έμ— μš”μ²­μ΄ μ§€μ†μ μœΌλ‘œ λ“€μ–΄μ˜€λŠ” ν™˜κ²½μ΄λΌλ©΄ μ΄λŸ¬ν•œ λΉ„νš¨μœ¨μ„±μ€ λ”μš± 컀진닀.

λ§Œμ•½ λ ˆλ””μŠ€μ— 뢀담을 덜 μ£ΌκΈ° μœ„ν•΄ sleep μ‹œκ°„μ„ λŠ˜λ¦°λ‹€λ©΄ 50msκ°€ κ±Έλ¦¬λŠ” μž‘μ—…μ— 이 동기화λ₯Ό μ μš©ν•˜λ©΄ 락을 νšλ“ν•˜μ§€ λͺ»ν•  경우 50ms κ±Έλ¦¬λŠ” μž‘μ—…μ„ ν•˜κΈ° μœ„ν•΄ 300msλ₯Ό λŒ€κΈ°ν•΄μ•Όν•˜λŠ” λ‹€λ₯Έ λΉ„νš¨μœ¨μ μΈ 상황이 μƒκΈ°κ²Œ λœλ‹€.

RedLock

λ ˆλ””μŠ€μ—μ„œλŠ” λΆ„μ‚° 락을 κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œ RedLock μ΄λΌλŠ” κ°œλ…μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•œλ‹€ .

κ΅¬ν˜„μœΌλ‘œ μžλ°”μ—μ„œλŠ” Redission, κ³  μ–Έμ–΄μ—μ„œλŠ” Redsync, Pythonμ—μ„œλŠ” Potteryν˜Ήμ€ Redlock-pyλ₯Ό μ‚¬μš©ν•œλ‹€.

Node ν™˜κ²½μ΄λΌλ©΄ node-redlock을 μ΄μš©ν•˜λ©΄ 될 것이닀.

Last updated