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

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

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

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

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

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

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

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

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

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

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

์ด๊ฒƒ์€ Facebook์ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœํ•œ Memcached ๋ผ์šฐํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” memcached ํ…์ŠคํŠธ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. memcached ์„ค์น˜ ํ™•์žฅ ๋ฏธ์นœ ๋น„์œจ๋กœ. 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"
       ]
     }
   }
 }
}

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

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

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

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

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

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

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€