mcrouter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ memcached๋ฅผ ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅ

mcrouter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ memcached๋ฅผ ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅ

์–ด๋–ค ์–ธ์–ด๋กœ๋“  ๋ถ€ํ•˜๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ ค๋ฉด ํŠน๋ณ„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํŠน์ˆ˜ ๋„๊ตฌ ์‚ฌ์šฉ์ด ํ•„์š”ํ•˜์ง€๋งŒ PHP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์ƒํ™ฉ์ด ๋„ˆ๋ฌด ์•…ํ™”๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„. ์ด ๊ธ€์—์„œ๋Š” memcached์—์„œ ๋ถ„์‚ฐ ์„ธ์…˜ ์ €์žฅ๊ณผ ๋ฐ์ดํ„ฐ ์บ์‹ฑ์„ ํ•  ๋•Œ ํ”ํžˆ ๊ฒช๋Š” ์–ด๋ ค์›€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜์˜ "ward" ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ–‰์‚ฌ์˜ ์ฃผ์ธ๊ณต์€ Symfony 2.3 ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ PHP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ๋ฐ, ํšŒ์‚ฌ๋Š” ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค. ์„ธ์…˜์˜ ์™„์ „ํ•œ ํ‘œ์ค€ ์ €์žฅ ์™ธ์—๋„ ์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹ค์Œ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. "๋ชจ๋“  ๊ฒƒ์„ ์บ์‹œ" ์ •์ฑ… memcached์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต, ๋‹ค์–‘ํ•œ ํ”Œ๋ž˜๊ทธ, ์ฝ”๋“œ ์‹คํ–‰์„ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ž ๊ธˆ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” memcached ์˜ค๋ฅ˜๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘๋™์— ์น˜๋ช…์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์บ์‹œ ์†์‹ค์€ ์‹ฌ๊ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. DBMS๊ฐ€ ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ๊ฐ€ ๋˜๊ณ , API ์„œ๋น„์Šค๊ฐ€ ์š”์ฒญ์„ ์ฐจ๋‹จํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ์•ˆ์ •๋˜๋ ค๋ฉด ์ˆ˜์‹ญ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์‹œ๊ฐ„ ๋™์•ˆ ์„œ๋น„์Šค ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์ „ํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ œ๊ณตํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ฆ‰, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ๋ณด์กดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ๋‚ด๊ฒฐํ•จ์„ฑ๋งŒ ๋†’์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์บ์‹œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๋„๋ก ํ•˜์„ธ์š”.

Memcached ์ž์ฒด์—๋Š” ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋‚˜์š”?

์ผ๋ฐ˜์ ์œผ๋กœ PHP์šฉ memcached ํ™•์žฅ ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์™€ ์„ธ์…˜์˜ ๋ถ„์‚ฐ ์ €์žฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ํ‚ค ํ•ด์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐํ•˜์—ฌ ๊ฐ ํŠน์ • ํ‚ค๋ฅผ ๊ทธ๋ฃน์˜ ํŠน์ • ์„œ๋ฒ„๋กœ ๊ณ ์œ ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚ด์žฅ๋œ ์žฅ์•  ์กฐ์น˜ ๋„๊ตฌ๋Š” ์บ์‹ฑ ์„œ๋น„์Šค์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋ฐ์ดํ„ฐ ์—†์Œ).

์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํ™ฉ์ด ์กฐ๊ธˆ ๋” ์ข‹์•„์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. memcached.sess_number_of_replicas๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋™์‹œ์— ์ €์žฅ๋˜๊ณ , ํ•˜๋‚˜์˜ memcached ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ ์—†์ด ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด(์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ์‹œ์ž‘ ํ›„ ๋ฐœ์ƒํ•จ) ์ผ๋ถ€ ํ‚ค๊ฐ€ ์„œ๋ฒ„์— ์œ ๋ฆฌํ•˜๊ฒŒ ์žฌ๋ถ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๋ฐ์ดํ„ฐ ์†์‹ค์‹คํŒจํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ์œผ๋กœ "์ด๋™"ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„๊ตฌ๋Š” ์ฃผ๋กœ ๋‹ค์Œ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ‰ ํ™•์žฅ์„ฑ: ์บ์‹œ๋ฅผ ๊ฑฐ๋Œ€ํ•œ ํฌ๊ธฐ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์„œ๋ฒ„์— ํ˜ธ์ŠคํŒ…๋œ ์ฝ”๋“œ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ์ƒํ™ฉ์—์„œ๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ˆ˜ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ๋ฅผ ๋„˜์ง€ ์•Š์œผ๋ฉฐ, 1~2๊ฐœ ๋…ธ๋“œ์˜ ์„ฑ๋Šฅ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‘œ์ค€ ๋„๊ตฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์œ ์šฉํ•œ ์ผ์€ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์บ์‹œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ž‘๋™ ์ˆœ์„œ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ memcached์˜ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ธฐํšŒ์กฐ์ฐจ ํ™œ์šฉ๋˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์–ด ์„œ๋ฒ„ ํ’€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ์ ์„ ์ƒ๊ธฐํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ์‚ฌ์šฉ์ž์˜ ๋Œ€๋Ÿ‰ ๋กœ๊ทธ์•„์›ƒ์œผ๋กœ ์ธํ•ด ๊ณ ๊ฐ์˜ ๋ˆˆ์ด ์”ฐ๋ฃฉ๊ฑฐ๋ ธ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค memcached ์“ฐ๊ธฐ ๋ณต์ œ ๋ฐ ๋ณต์ œ๋ณธ ์ˆœํšŒ ์‹ค์ˆ˜๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์˜ ๋„์›€์œผ๋กœ ์ด ์ „๋žต์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งฅ๋ผ์šฐํ„ฐ.

๋งฅ๋ผ์šฐํ„ฐ

์ด๋Š” Facebook์ด ์ž์‚ฌ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœํ•œ memcached ๋ผ์šฐํ„ฐ์ž…๋‹ˆ๋‹ค. memcached ํ…์ŠคํŠธ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜์—ฌ ๋‹ค์Œ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. Memcached ์„ค์น˜ ํ™•์žฅ ์—„์ฒญ๋‚œ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. mcrouter์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐœํ‘œ์—์„œ. ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์ค‘ ํญ๋„“์€ ๊ธฐ๋Šฅ ๊ทธ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ก ๋ณต์ œ
  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๊ทธ๋ฃน์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

์›์ธ์„ ์œ„ํ•ด!

mcrouter ๊ตฌ์„ฑ

๋ฐ”๋กœ ์„ค์ •์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

{
 "pools": {
   "pool00": {
     "servers": [
       "mc-0.mc:11211",
       "mc-1.mc:11211",
       "mc-2.mc:11211"
   },
   "pool01": {
     "servers": [
       "mc-1.mc:11211",
       "mc-2.mc:11211",
       "mc-0.mc:11211"
   },
   "pool02": {
     "servers": [
       "mc-2.mc:11211",
       "mc-0.mc:11211",
       "mc-1.mc:11211"
 },
 "route": {
   "type": "OperationSelectorRoute",
   "default_policy": "AllMajorityRoute|Pool|pool00",
   "operation_policies": {
     "get": {
       "type": "RandomRoute",
       "children": [
         "MissFailoverRoute|Pool|pool02",
         "MissFailoverRoute|Pool|pool00",
         "MissFailoverRoute|Pool|pool01"
       ]
     }
   }
 }
}

์™œ ์ˆ˜์˜์žฅ์ด ์„ธ ๊ฐœ์ผ๊นŒ? ์„œ๋ฒ„๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ด ๊ตฌ์„ฑ์—์„œ mcrouter๋Š” ์š”์ฒญ ๋ช…๋ น์— ๋”ฐ๋ผ ์š”์ฒญ์ด ์ „์†ก๋  ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‚จ์ž๊ฐ€ ๊ทธ์—๊ฒŒ ์ด ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค OperationSelectorRoute.
  • GET ์š”์ฒญ์€ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. RandomRoute๋ฐฐ์—ด์˜ ๊ฐ์ฒด ์ค‘์—์„œ ๋ฌด์ž‘์œ„๋กœ ํ’€์ด๋‚˜ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” children. ์ด ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋Š” ์ฐจ๋ก€๋กœ ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. MissFailoverRoute๊ฐ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ ํ’€์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑฐ์ณ์„œ ์‘๋‹ต์„ ๋ฐ›์€ ํ›„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด MissFailoverRoute 3๊ฐœ์˜ ์„œ๋ฒ„ ํ’€์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์š”์ฒญ์€ ๋จผ์ € ์ฒซ ๋ฒˆ์งธ memcached ์ธ์Šคํ„ด์Šค์— ๋“ค์–ด์˜ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ์ž”์—ฌ ๊ธฐ์ค€์œผ๋กœ ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ ์„œ๋ฒ„์— ๊ณผ๋„ํ•œ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•จ๊ทธ๋ž˜์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š” ์„ธ ๊ฐœ์˜ ํ’€์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋ชจ๋“  ์š”์ฒญ(๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค)์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. AllMajorityRoute. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” ํ’€์— ์žˆ๋Š” ๋ชจ๋“  ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ทธ ์ค‘ ์ตœ์†Œ N/2 + 1๊ฐœ์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์œผ๋กœ๋ถ€ํ„ฐ AllSyncRoute ์“ฐ๊ธฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ด ๋ฐฉ๋ฒ•์€ ๊ธ์ •์ ์ธ ์‘๋‹ต์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํฌ๊ธฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ทธ๋ฃน ์„œ๋ฒ„ - ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. SERVER_ERROR. mcrouter๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€๋งŒ ํ˜ธ์ถœํ•˜๋Š” PHP ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. AllMajorityRoute ๊ทธ๋ ‡๊ฒŒ ์—„๊ฒฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ œ ์—†์ด ์ตœ๋Œ€ ์ ˆ๋ฐ˜์˜ ์œ ๋‹›์„ ํ•ด์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ธ ๋งˆ์ด๋„ˆ์Šค ์ด ๊ณ„ํš์€ ์บ์‹œ์— ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ memcached์— ๋Œ€ํ•œ N๊ฐœ์˜ ์š”์ฒญ์ด ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘ ํ’€ ๋‚ด์˜ ์„œ๋ฒ„. ์˜ˆ๋ฅผ ๋“ค์–ด ํ’€์˜ ์„œ๋ฒ„ ์ˆ˜๋ฅผ 2๊ฐœ๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ์•ˆ์ •์„ฑ์„ ํฌ์ƒํ•จ์œผ๋กœ์จ b๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.ะพ์—ด์‡  ๋ถ„์‹ค ์š”์ฒญ์œผ๋กœ ์ธํ•œ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

NB: mcrouter ํ•™์Šต์— ์œ ์šฉํ•œ ๋งํฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ‚ค ๋ฌธ์„œ ะธ ํ”„๋กœ์ ํŠธ ๋ฌธ์ œ (ํ์‡„ํ˜•๋„ ํฌํ•จ) ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ์˜ ๊ท€์ค‘ํ•œ ๋ณด๋ฌผ ์ฐฝ๊ณ ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

mcrouter ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

์ €ํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๊ทธ๋ฆฌ๊ณ  memcached ์ž์ฒด)์€ Kubernetes์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ mcrouter๋„ ๊ฑฐ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ์กฐ๋ฆฝ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ ์›Œํ”„, ์ด์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

NB: ๊ธฐ์‚ฌ์— ์ œ๊ณต๋œ ๋ชฉ๋ก์€ ์ €์žฅ์†Œ์— ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋žœํŠธ/๋งˆ์ดํฌ๋กœํ„ฐ.

configVersion: 1
project: mcrouter
deploy:
 namespace: '[[ env ]]'
 helmRelease: '[[ project ]]-[[ env ]]'
---
image: mcrouter
from: ubuntu:16.04
mount:
- from: tmp_dir
 to: /var/lib/apt/lists
- from: build_dir
 to: /var/cache/apt
ansible:
 beforeInstall:
 - name: Install prerequisites
   apt:
     name: [ 'apt-transport-https', 'tzdata', 'locales' ]
     update_cache: yes
 - name: Add mcrouter APT key
   apt_key:
     url: https://facebook.github.io/mcrouter/debrepo/xenial/PUBLIC.KEY
 - name: Add mcrouter Repo
   apt_repository:
     repo: deb https://facebook.github.io/mcrouter/debrepo/xenial xenial contrib
     filename: mcrouter
     update_cache: yes
 - name: Set timezone
   timezone:
     name: "Europe/Moscow"
 - name: Ensure a locale exists
   locale_gen:
     name: en_US.UTF-8
     state: present
 install:
 - name: Install mcrouter
   apt:
     name: [ 'mcrouter' ]

(werf.yaml)

โ€ฆ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์Šค์ผ€์น˜๋ฅผ ํ•ฉ๋‹ˆ๋‹ค ํˆฌ๊ตฌ ์ฐจํŠธ. ํฅ๋ฏธ๋กœ์šด ์ ์€ ์—ฌ๊ธฐ์—๋Š” ๋ณต์ œ๋ณธ ์ˆ˜์— ๋”ฐ๋ฅธ ๊ตฌ์„ฑ ์ƒ์„ฑ๊ธฐ๋งŒ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์šฐ์•„ํ•œ ์˜ต์…˜์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๊ณต์œ ํ•ด์ฃผ์„ธ์š”):

{{- $count := (pluck .Values.global.env .Values.memcached.replicas | first | default .Values.memcached.replicas._default | int) -}}
{{- $pools := dict -}}
{{- $servers := list -}}
{{- /* ะ—ะฐะฟะพะปะฝัะตะผ  ะผะฐััะธะฒ ะดะฒัƒะผั ะบะพะฟะธัะผะธ ัะตั€ะฒะตั€ะพะฒ: "0 1 2 0 1 2" */ -}}
{{- range until 2 -}}
 {{- range $i, $_ := until $count -}}
   {{- $servers = append $servers (printf "mc-%d.mc:11211" $i) -}}
 {{- end -}}
{{- end -}}
{{- /* ะกะผะตั‰ะฐัััŒ ะฟะพ ะผะฐััะธะฒัƒ, ะฟะพะปัƒั‡ะฐะตะผ N ัั€ะตะทะพะฒ: "[0 1 2] [1 2 0] [2 0 1]" */ -}}
{{- range $i, $_ := until $count -}}
 {{- $pool := dict "servers" (slice $servers $i (add $i $count)) -}}
 {{- $_ := set $pools (printf "MissFailoverRoute|Pool|pool%02d" $i) $pool -}}
{{- end -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
 name: mcrouter
data:
 config.json: |
   {
     "pools": {{- $pools | toJson | replace "MissFailoverRoute|Pool|" "" -}},
     "route": {
       "type": "OperationSelectorRoute",
       "default_policy": "AllMajorityRoute|Pool|pool00",
       "operation_policies": {
         "get": {
           "type": "RandomRoute",
           "children": {{- keys $pools | toJson }}
         }
       }
     }
   }

(10-mcrouter.yaml)

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— ์ ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

# php -a
Interactive mode enabled

php > # ะŸั€ะพะฒะตั€ัะตะผ ะทะฐะฟะธััŒ ะธ ั‡ั‚ะตะฝะธะต
php > $m = new Memcached();
php > $m->addServer('mcrouter', 11211);
php > var_dump($m->set('test', 'value'));
bool(true)
php > var_dump($m->get('test'));
string(5) "value"
php > # ะ ะฐะฑะพั‚ะฐะตั‚! ะขะตัั‚ะธั€ัƒะตะผ ั€ะฐะฑะพั‚ัƒ ัะตััะธะน:
php > ini_set('session.save_handler', 'memcached');
php > ini_set('session.save_path', 'mcrouter:11211');
php > var_dump(session_start());
PHP Warning:  Uncaught Error: Failed to create session ID: memcached (path: mcrouter:11211) in php shell code:1
Stack trace:
#0 php shell code(1): session_start()
#1 {main}
  thrown in php shell code on line 1
php > # ะะต ะทะฐะฒะพะดะธั‚ััโ€ฆ ะŸะพะฟั€ะพะฑัƒะตะผ ะทะฐะดะฐั‚ัŒ session_id:
php > session_id("zzz");
php > var_dump(session_start());
PHP Warning:  session_start(): Cannot send session cookie - headers already sent by (output started at php shell code:1) in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Unable to clear session lock record in php shell code on line 1
PHP Warning:  session_start(): Failed to read session data: memcached (path: mcrouter:11211) in php shell code on line 1
bool(false)
php >

์˜ค๋ฅ˜ ํ…์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•˜์ง€๋งŒ "๋งฅ๋ผ์šฐํ„ฐ PHP"ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๋Š” ์ตœ์ „์„ ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€์› ๋ถ€์กฑ memcached ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ.

NB: memcached์˜ ASCII ํ”„๋กœํ† ์ฝœ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ๋ณด๋‹ค ๋А๋ฆฌ๊ณ , ์ผ๊ด€๋œ ํ‚ค ํ•ด์‹ฑ์˜ ํ‘œ์ค€ ๋ฐฉ๋ฒ•์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ํŠน์ •ํ•œ ์‚ฌ๋ก€์—์„œ๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”๋ น์€ ์ด๋ฏธ ๋‹ค ์•Œ๋ ค๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ASCII ํ”„๋กœํ† ์ฝœ๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์—๋Š” ๋‹ต์„ ์ฐพ๋Š” ์Šต๊ด€์ด php.net์— ๋Œ€ํ•œ ๋ฌธ์„œ ์ž”์ธํ•œ ๋†๋‹ด์„ ํ–ˆ๋‹ค. ๋ฌผ๋ก , ์„น์…˜์˜ ๋๊นŒ์ง€ ์Šคํฌ๋กคํ•˜์ง€ ์•Š๋Š” ํ•œ, ๊ฑฐ๊ธฐ์—์„œ ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์—ฌํ•œ ๋ฉ”๋ชจ" ์ถฉ์‹คํ•  ๊ฒƒ์ด๋‹ค ๋ถ€๋‹นํ•˜๊ฒŒ ์‹ซ์–ด์š”๋ฅผ ๋ฐ›์€ ๋‹ต๋ณ€.

๋„ค, ์˜ต์…˜์˜ ์ •ํ™•ํ•œ ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. memcached.sess_binary_protocol. ์„ธ์…˜์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚จ์€ ๊ฑด mcrouter๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ PHP๊ฐ€ ์žˆ๋Š” ํฌ๋“œ์— ๋„ฃ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค!

๊ฒฐ๋ก 

๋”ฐ๋ผ์„œ ์ธํ”„๋ผ ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Memcached ์žฅ์•  ํ—ˆ์šฉ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๊ณ  ์บ์‹œ ์ €์žฅ์†Œ์˜ ์•ˆ์ •์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ด์  ์™ธ์—๋„ ์ด๋Š” ํ”Œ๋žซํผ์—์„œ ์ž‘์—…ํ•  ๋•Œ ๊ธฐ๋™์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ˆ๋น„๊ฐ€ ์žˆ์œผ๋ฉด ๊ด€๋ฆฌ์ž์˜ ์—…๋ฌด๊ฐ€ ํฌ๊ฒŒ ๊ฐ„์†Œํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์—๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. "์ง€ํŒก์ด"์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ๋ฌป์–ด๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์™œ ์•ˆ ํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster