[DATABASE] Control Concurrency in distributed system with Distributed Lock mechanism
๊ฐ์
ํ๋ก์ฐ/์ธํ, ๋ฐ๋ฅ์ผ๋ก ์ธํ ์ค๋ณต๋ฐ์ดํฐ ์์ฑ, ์์ด์ ํฐ์ผ ๊ฒฐ์ ํ๊ธฐ ๋ฑ ๋ฐฑ์๋์์ ๋์์ฑ ๋ฌธ์ ๋ ๊ฐ์ ์์ฒญ์ด ์ฌ๋ฌ๋ฒ ์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋ฌํ ์ผ์ด์ค๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ก์ง ๋ด์์ validation ์ ์ํ์ฌ ์ค๋ณต๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ค๋์ง DB ํ๋์ ์ ๋ํฌ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์ฌ ์ค๋ณต๋ฐ์ดํฐ๋ฅผ DB ์ฟผ๋ฆฌ๋จ์์ ๋ง์์ค๋ค๋์ง๋ก ํด๊ฒฐํ ์๋ ์์ง๋ง, ์๋ฒ ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ๋์ด๊ณ ๋ง์ ์์ฒญ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์๋ฒฝํ๊ฒ ๊ตฌํํ๊ธฐ๋ ์ด๋ ต๋ค. ์ด๋ฌํ ์ผ์ด์ค๋ฅผ ์๋น์ค ๋ก์ง ๋ด์์ ๋ง๊ธฐ์ ์ ๊ทธ ์๋จ์์ ๋ฝ์ ํ๋ํ ์์ฒญ์ ๋ํด์๋ง operation ์ ์ํํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ ์ ํ๋ค.
๊ฐ ์ธ์ด๋ง๋ค ๋ถ์ฐ๋ฝ์ ๊ตฌํํ๋ ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค. ํ์ง๋ง ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง๋ค ์ฌ์ฉํ๋ ๋ถ์ฐ๋ฝ์ ๊ตฌํ์ ์กฐ๊ธ ์ฐจ์ด๊ฐ ์๊ณ , ์ฐ๋ฆฌ ์๋น์ค์ ํ์ฌ๋ก์ ๊ฐ์ฅ ์ ํฉํ ๋ถ์ฐ๋ฝ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค. ๋ชจ๋ trade-off ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ์
๋ถ์ฐ๋ฝ์ ๋ง์กฑํ๋ ์์ฑ
- safety property : 1๊ฐ์ client ๋ง์ด lock์ ํ๋ํ ์ ์์ด์ผํ๋ ์์ฑ์ ์๋ฏธํ๋ค.
- liveness property A : lock์ ํ๋ํ ์์ฒญ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ค๋ฅธ ์์ฒญ์ด lock์ ํ๋ํ ์ ์์ด์ผํ๋ ์์ฑ์ ์๋ฏธํ๋ค.
- liveness property B : ์ฌ๋ฌ๊ฐ์ redis instance๋ฅผ ์ด์ํ๋ ๊ฒฝ์ฐ, ํ๋์ redis instance์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋, ๋๋จธ์ง ์ธ์คํด์ค ์ฌ์ด์์์ ๋ถ์ฐ๋ฝ์ ์ ์์ ์ผ๋ก ์ด์๋์ด์ผ ํจ์ ์๋ฏธํ๋ค. (
Fault tolerance
)
๊ฐ๋จํ ๋ถ์ฐ๋ฝ ๊ตฌํ
- ๋ฝ์ ํ๋ํ๋ค.
- ์์ ์ ์ํํ๋ค.
- ๋ฝ์ ๋ฆด๋ฆฌ์ฆํ๋ค.
๋ถ์ฐ๋ฝ์ ๊ตฌํํ๋ ๊ฐ๋จํ ๊ณผ์ ์ผ๋ก ์์ ๊ฐ๋ค.
๋จผ์ ๋ฝ์ ํ๋ํ๋ ๊ตฌ๊ฐ์์ , SET lockKey my_random_value NX PX 30000
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์, lockKey ๊ฐ ์กด์ฌํ์ง ์๋ค๋ฉด, 30000ms ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ค
์ด๋ ๊ฒ ๋ฝ์ ํ๋ํ๊ณ ๋์๋, ๋์์ฑ์ด ๋ฐ์ํ ๋งํ ์์
์ ์ฒ๋ฆฌํ๊ณ ๋ค์๊ณผ ๊ฐ์ lua script ๋ฅผ ์ฌ์ฉํด์ ๋ฝ์ ํด์ ํ๊ฑฐ๋ ์์ ์ด ์ฌ์ฉํ๊ณ ์๋ redis library api ๋ฅผ ์ด์ฉํด lockKey ๋ฅผ ์ ๊ฑฐํ๋ค.
|
|
์์ ๊ฒฝ์ฐ, ๋ฝ ํ๋์ ์คํจํ๋ฉด ๋ฐ๋ก ์๋ฌ๋ฅผ ํธ๋ค๋งํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ง๋ง, ์คํ๋ฝ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํด์ ๋ฝ์ ํ๋ํ ๋ ๊น์ง ํด๋ผ์ด์ธํธ๊ฐ ๋ฌดํ์ ์๋ํ๊ฒ ํ ์ ๋ ์๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์กด์ฌํ๋ค.
๋ง์ฝ ์คํ๋ฝ์ ์ฌ์ฉํด์, ์ผ์ ๊ฐฏ์๋งํผ ๋ฝ ํ๋์ ์๋ํ๋ค๊ฐ ์คํจํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
๋ก์ง์ ์ํํ๋ ์ฝ๋๊ฐ 1์ด์ ๋ ๊ฑธ๋ฆฌ๊ฒ ๋๊ณ , 100๊ฐ์ ์์ฒญ์ด 50ms ๋ง๋ค lock์ ํ๋ํ๋ ค ํ๋ค๋ฉด, 2000๋ฒ์ ์์ฒญ์ด ๋ ๋์ค ์๋ฒ์ ๋ค์ด์ค๊ฒ ๋๋ค. ์์ฒญ์ ๊ฐฏ์๊ฐ ์ฆ๊ฐํ ์๋ก ์ ํ์ ์ผ๋ก ๋ ๋์ค์ ๋ถํ๋ ์ปค์ง๊ฒ ๋๋ค. (pubsub ๋ฐฉ์์ ์ฌ์ฉํด ๋ฝ์ ํ๋ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์์ฒญ์ ์๋ฆผ์ ์ค์ผ๋ก์จ ๋ถํ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ๋ ์๋ค.)
๋ฐ๋์ ๊ฒฝ์ฐ์๋ ๋จ์ ์ด ์กด์ฌํ๋ค. ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ด๋ฒคํธ์ ์ฐธ์ฌํ๋ ค๋ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ๋ณด๋ธ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ฌ์ฉ์์ ์์ฒญ ์ค ํ๋๋ง ์ฑ๊ณตํ๊ฒ ๋๊ณ ๋๋จธ์ง๋ ์๋ฌ๋ฅผ ๋์ง๊ฒ ๋๋ฏ๋ก ์ด ์๋ฌ๋ฅผ ํธ๋ค๋งํ๋ ํด๋ผ์ด์ธํธ์ ์๋ฌ ํธ๋ค๋ง ์ฝ๋๊ฐ ๋์ด๋๊ฒ ๋๋ค๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
์ถ๊ฐ๋ก ์ ์ฝ๋๋ single instance ์ ๋ํ ๋ถ์ฐ๋ฝ์ ๊ตฌํํ ๊ฒ์ด๋ค. ๋ง์ฝ ๋ ๋์ค ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค๋ฉด ํด๋น api ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌ๋ ์ ์๊ฒ ๋๋ฏ๋ก Fault tolerance๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ค.
๊ทธ๋ ๋ค๋ฉด, single instance์ ๋ํด์ ์์ ๊ฐ์ด exclusive lock ๋๋ barrier๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋ชจ๋ ์ค๋ณต ๋ฐ์ดํฐ ์์ฑ, ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ ์ ์์๊น?? ๊ทธ๊ฑด ์ฅ๋ดํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๊ณ ๋ คํด๋ณด์.
์ ์ผ์ด์ค์์, ์ฒซ๋ฒ์งธ ์์ฒญ์ ๋ํด ํค๊ฐ ์์ผ๋ฉด lockKey์ ๋ํด ๊ฐ์ ์ธํ
ํด์ค ๋ผ๊ณ ๋ ๋์ค ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ ๋ฐ๋ก ์ฆ์ ๋ค์ ์์ฒญ์ด ๊ฐ์ lockKey ์ ๋ํด ์์ฒญ์ด ๋ณด๋ด์ง ์ํ์ด๋ค. safety property ๋ฅผ ๋ง์กฑํ๊ธฐ ์ํด์ , ์ฒซ๋ฒ์งธ ์์ฒญ์ ์๋ต์ด ์ค๊ธฐ ์ ์ ๋ ๋ฒ์งธ ์์ฒญ์ ๋ฝ์ ํ๋ํ๋๋ฐ ์คํจํ์ฌ์ผ ํ์ง๋ง, ์์ฃผ ์์ ํ์ด๋ฐ์ ๊ฐ์ ์์ฒญ์ ๋ ๋ฒ ๋ณด๋ด๊ฒ ๋๊ณ ์ดํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์๋ ๋์ผํ 2๊ฐ์ ๋ฝ์ ์ก๊ณ ํน์ ๋ก์ง์ ์ํํ๊ฒ ๋๋ค.
๋ถ์ฐ๋ฝ์์ ์กฐ์ฌํด์ผ ํ ์ ์, ์ดํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์ ๋์์ฑ์ ๋ง๊ธฐ ์ํด์ ๋ ๋์ค๋ฅผ ์ด์ฉํด ๋ถ์ฐ๋ฝ์ ๊ตฌํํ์ง๋ง, ๋ ๋์ค ๋ถ์ฐ๋ฝ์ ๋์์ฑ๊น์ง ์ก์์ค์ผ ํ๋ค๋ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ํ๋ ๋ ์๊ธฐ๊ฒ ๋๋ค.
๋ํ, ๋ ๋์ค ํด๋ฌ์คํฐ๋ฅผ ์ด์์ค์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
client 1์ด ๋ฝ์ ํ๋ํ๋ค๊ฐ, master node์์ ์ฅ์ ๊ฐ ๋ฐ์ํด slave node ๊ฐ master node ๋ก ์น๊ฒฉ๋๋ ์ํฉ์ ๊ฐ์ ํด๋ณด์. ์ด ์๊ฐ, ๋ฐ์ดํฐ์ ๋ณต์ ๋ ์ง์ฐ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด client2์ ๋ฝ ํ๋ ์์ฒญ์ ๋ํด ์ฑ๊ณต์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ ์ํฉ์ด ๋ฐ์ํ ์ ๋ ์๋ค.
์ 2๊ฐ์ง ์ฌ๋ก์ ๊ฐ์ ๋ฝ ํ๋์ ๋ํ ๋์์ฑ์ ์ก์์ฃผ๊ธฐ ์ํด ๋ ์ ๊ตํ ์๊ณ ๋ฆฌ์ฆ์ธ redlock
์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํ๊ณ ์ ํ๋ค.
multi instance ์์ ๋ถ์ฐ๋ฝ ๊ตฌํ - redlock
๋ถ์ฐํ๊ฒฝ์์ lock์ ํ๋ํ๊ธฐ ์ํด์ ํด๋ผ์ด์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ จ์ ์์ ๋ค์ ์ํํ๋ค.
- ๋ฝ ํ๋์ ์๋ํ๋ ค๊ณ ํ๋ ํ์ฌ ์๊ฐ(now)๋ฅผ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๊ฐ์ ธ์จ๋ค.
- ๋ชจ๋ redis์ ์์ฐจ์ ์ผ๋ก ๋ฝ ํ๋์ ์์ฒญํ๋ค.
- ๊ฐ ๋ ๋์ค์ ๋ฝ ํ๋์์์ ๊ฑธ๋ฆฐ ์๊ฐ์ ๊ตฌํ๋ค.
- client ๊ฐ Redis ๋ ธ๋๋ก๋ถํฐ ์ผ์ ์์น ์ด์์ ์ ๊ธ์ ํ๋ํ๊ณ ((N+1)/2) , ๋ฝ์ ํ๋ํ๊ธฐ๊น์ง์ ์ด ์๊ฐ์ด lock-key ์ ํจ์๊ฐ๋ณด๋ค ์ ์๊ฒฝ์ฐ ๋ฝ์ ํ๋ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
- ๋ง์ฝ client ๊ฐ lock์ ํ๋ํ์ง ๋ชปํ๋ค๋ฉด ๋ชจ๋ ์ธ์คํด์ค์ ์ ๊ธ์ ํด์ ํ๋ค.
์๊ณ๊ฐ ๋์ผํ๊ฒ ์๋ํ๋ ๊ฒ
์ ๊ฐ์ ํ๋ค.์์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ฌด์กฐ๊ฑด safety and liveness property๋ฅผ ๋ง์กฑํ ์ ์๋๊ฐ? ๋ผ๊ณ ์ง๋ฌธํ๋ค๋ฉด ๊ผญ ๊ทธ๋ ์ง๋ ์๋ค. ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์๊ฐํด๋ณด์. client A๊ฐ redis A,B,D ์๊ฒ ๋ฝ์ ํ๋ํ๊ณ , client B๋ redis C,E๋ก ๋ถํฐ ๋ฝ์ ํ๋ํ ์ํฉ์ด๋ค. ์ด ์ํฉ์์ redis D์ ๋ฌธ์ ๊ฐ ์๊ฒจ client A๊ฐ ํ๋ํ lock-key X๊ฐ ํ๋ฐ๋์๊ณ , ์ฅ์ ๊ฐ ๋ณต๊ตฌ๋๋ฉด์ client B๊ฐ redis D๋ก ๋ถํฐ lock-key Y ๋ฅผ ํ๋ํ์๋ค. ์ด๋ฐ ์ํฉ์์ client A, B ๋ชจ๋ ๋ฝ์ ํ๋ํ์๊ณ safety property๊ฐ ๊นจ์ง๋ ์ํฉ์ด๋ค.
์์ ๊ฐ์ ์ํฉ์์๋, fsync=always option์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ธ๋๋ง๋ค ๊ฐ์ ๋ก ํ์ผ ์์คํ ์บ์๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก ๋์คํฌ์ ๋๊ธฐํํ๋๋ก ์๊ตฌํ๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ด ๋์คํฌ์ ์์ ํ ๋๊ธฐํ๋ ๋๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ด ๋ฐํ๋์ง ์๋๋ก ๊ฐ์ ํ์ฌ ๋ฝ์ ๋ํ safety ๋ฅผ ๋ณด์ฅํ ์ ์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ์ผ ์์คํ ์บ์๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ธฐ์์ ์ ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ง๊ณ , ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ด ์ ํ๋๋ฆฌ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๊ฒฐ๋ก
์๋น์ค์ ์๊ตฌ์ฌํญ์ ๋ง๋ lock์ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค. redlock ์๊ณ ๋ฆฌ์ฆ์ด ๋ถ์ฐ๋ฝ์ ๊ตฌํํ๋๋ฐ์ ์์ด์ ๊ฐ์ฅ ๋ณดํธ์ ์ด๊ณ ์์ ํ๋ค ! ๋ผ๋ ๊ด์ ์ผ๋ก ๋น์ฅ ์ฐ๋ฆฌ ์๋น์ค์ ์ ์ฉ์ํค๊ธฐ์ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ๋ ๋์ด๋๋ค๋ ๋จ์ ์ด ์๊ณ ๊ทธ๊ฑธ ๋ฐ์ํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ ๊ตฌ๋ฉ์ด ๋ ์๊ฒจ๋๊ฒ ๋ ์๋ ์๋ค. ๊ฐ์ฅ ์ข์ ๊ฒ์ ์ดํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ validation์ ์์ ํ๊ฒ ์ํ๊ณ ๊ทธ๊ฑธ๋ก๋ ๋์์ฑ์ด์๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ฐ๋ฆฌ ์๋น์ค์ ๋ง๋ ๊ฐ์ฅ ์ข์ ๋ถ์ฐ๋ฝ ๊ตฌํ์ ํ๋ ๊ฒ์ด ์ข๋ค.