Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ mcrouter для Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ memcached

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ mcrouter для Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ memcached

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° высоконагруТСнных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° любом языкС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ особого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΈ примСнСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ прилоТСниях Π½Π° PHP, ситуация ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΡΡ‚Ρ€ΠΈΡ‚ΡŒΡΡ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ приходится Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, собствСнный сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡƒΡŽ всСм боль с распрСдСлСнным Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ сСссий ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² memcached ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π»ΠΈ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ Β«ΠΏΠΎΠ΄ΠΎΠΏΠ΅Ρ‡Π½ΠΎΠΌΒ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π’ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊ торТСства β€” ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° PHP, Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ΡΡ Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ symfony 2.3, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΏΠ»Π°Π½Ρ‹ бизнСса совсСм Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚. Помимо Π²ΠΏΠΎΠ»Π½Π΅ стандартного хранСния сСссий Π² этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ вовсю использовалась ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Β«ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ всСго» Π² memcached: ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° запросы ΠΊ Π‘Π” ΠΈ API-сСрвСрам, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ², Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ для синхронизации выполнСния ΠΊΠΎΠ΄Π° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π’ Ρ‚Π°ΠΊΠΎΠΉ ситуации ΠΏΠΎΠ»ΠΎΠΌΠΊΠ° memcached становится Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, потСря кэша Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ послСдствиям: Π‘Π£Π‘Π” Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Ρ‰Π°Ρ‚ΡŒ ΠΏΠΎ швам, API-сСрвисы β€” Π±Π°Π½ΠΈΡ‚ΡŒ запросы ΠΈ Ρ‚.Π΄. Бтабилизация ситуации ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ дСсятки ΠΌΠΈΠ½ΡƒΡ‚, Π° Π² это врСмя сСрвис Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΡƒΡ‚ΠΊΠΎ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ вовсС станСт нСдоступным.

Нам ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ прилоТСния ΠΌΠ°Π»ΠΎΠΉ ΠΊΡ€ΠΎΠ²ΡŒΡŽ, Ρ‚.Π΅. с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ измСнСниями исходного ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΌ сохранСниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ кэш Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ устойчивым ΠΊ ΠΎΡ‚ΠΊΠ°Π·Π°ΠΌ, Π½ΠΎ ΠΈ ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π½Π΅Π³ΠΎ.

Π§Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ с самим memcached?

Π’ΠΎΠΎΠ±Ρ‰Π΅, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ memcached для PHP Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ распрСдСлСнноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ сСссий. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ консистСнтного Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ позволяСт Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… сСрвСрах, ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ адрСсуя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ сСрвСру ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹, Π° встроСнныС срСдства failover’Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ сСрвиса ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ (Π½ΠΎ, ΠΊ соТалСнию, Π½Π΅ Π΄Π°Π½Π½Ρ‹Ρ…).

Π‘ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ сСссий Π΄Π΅Π»Π° обстоят Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅: ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ memcached.sess_number_of_replicas, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ сразу Π½Π° нСсколько сСрвСров, Π° Π² случаС ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ экзСмпляра memcached Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΡ…. Однако, Ссли сСрвСр вСрнСтся Π² строй Π±Π΅Π· Π΄Π°Π½Π½Ρ‹Ρ… (ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ послС рСстарта), Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ пСрСраспрСдСлСна Π² Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·Ρƒ. ЀактичСски это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ Π΄Π°Π½Π½Ρ‹Ρ… сСссии, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ‚ возмоТности Β«ΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒΒ» Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Π² случаС ΠΏΡ€ΠΎΠΌΠ°Ρ…Π°.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ срСдства Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹, Π² основном, ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ кэш Π΄ΠΎ гигантских Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π½Π΅ΠΌΡƒ ΠΈΠ· ΠΊΠΎΠ΄Π°, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… сСрвСрах. Однако Π² нашСй ситуации объСм Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚, Π΄Π° ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ-Π΄Π²ΡƒΡ… ΡƒΠ·Π»ΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚. БоотвСтствСнно, ΠΈΠ· ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ срСдства ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ лишь ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ memcached ΠΏΡ€ΠΈ сохранСнии хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ экзСмпляра кэша Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ состоянии. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π΄Π°ΠΆΠ΅ этой Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒβ€¦ Π—Π΄Π΅ΡΡŒ слСдуСт Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎ Π΄Ρ€Π΅Π²Π½ΠΎΡΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, использованного Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΡƒΠ»ΠΎΠΌ сСрвСров Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡƒΠ΄Π°Π²Π°Π»ΠΎΡΡŒ. НС Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ потСрях Π΄Π°Π½Π½Ρ‹Ρ… сСссий: ΠΎΡ‚ массового разлогинивания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Ρƒ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° дСргался Π³Π»Π°Π·.

Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ рСпликация записи Π² memcached ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄ Ρ€Π΅ΠΏΠ»ΠΈΠΊ Π² случаС ΠΏΡ€ΠΎΠΌΠ°Ρ…Π° ΠΈΠ»ΠΈ ошибки. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³ mcrouter.

mcrouter

Π­Ρ‚ΠΎ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ для memcached, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Facebook с Ρ†Π΅Π»ΡŒΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΅Ρ‘ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ тСкстовый ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» memcached, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ инсталляции memcached Π΄ΠΎ Π±Π΅Π·ΡƒΠΌΠ½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС mcrouter ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² этом анонсС. Помимо ΠΏΡ€ΠΎΡ‡Π΅ΠΉ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΌ:

  • Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запись;
  • Π΄Π΅Π»Π°Ρ‚ΡŒ fallback Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сСрвСра Π³Ρ€ΡƒΠΏΠΏΡ‹ Π² случаС возникновСния ошибки.

Π—Π° Π΄Π΅Π»ΠΎ!

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ 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 с ΠΏΡƒΠ»ΠΎΠΌ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… сСрвСров, Ρ‚ΠΎ всС запросы ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΈ Π±Ρ‹ спСрва Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр memcached, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ Π±Ρ‹ запросы ΠΏΠΎ остаточному ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π» Π±Ρ‹ ΠΊ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π² спискС сСрвСра, поэтому ΠΈ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΡƒΠ»Π° с адрСсами Π² Ρ€Π°Π·Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΡ… случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.
  • ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ запросы (Π° это запись) ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ AllMajorityRoute. Π”Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ отправляСт запросы Π½Π° всС сСрвСры ΠΏΡƒΠ»Π° ΠΈ ΠΆΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, ΠΎΡ‚ N/2 + 1 ΠΈΠ· Π½ΠΈΡ…. ΠžΡ‚ использования AllSyncRoute для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ записи ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ всСх сСрвСров Π³Ρ€ΡƒΠΏΠΏΡ‹ β€” Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ SERVER_ERROR. Π₯ΠΎΡ‚ΡŒ ΠΏΡ€ΠΈ этом mcrouter ΠΈ слоТит Π΄Π°Π½Π½Ρ‹Π΅ Π² доступныС кэши, Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ функция PHP Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ сгСнСрируСт notice. AllMajorityRoute Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ строг ΠΈ позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ ΡƒΠ·Π»ΠΎΠ² ΠΈΠ· эксплуатации Π±Π΅Π· Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Основной минус этой схСмы Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π΄Π°Π½Π½Ρ‹Ρ… Π² кэшС Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚, Ρ‚ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° фактичСски Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ N запросов ΠΊ memcached β€” ΠΊΠΎ всСм сСрвСрам Π² ΠΏΡƒΠ»Π΅. МоТно ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ количСство сСрвСров Π² ΠΏΡƒΠ»Π°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ Π΄Π²ΡƒΡ…: ТСртвуя Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ хранСния, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΎΡ‚ запросов ΠΊ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠ»ΡŽΡ‡Π°ΠΌ.

NB: ΠŸΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ссылками для изучСния mcrouter ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ докумСнтация Π² wiki ΠΈ issues ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Π² Ρ‚ΠΎΠΌ числС ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ†Π΅Π»Ρ‹ΠΉ кладСзь Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ.

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΈ запуск mcrouter

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΠΈ сам memcached) Ρƒ нас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Kubernetes β€” соотвСтствСнно, Ρ‚Π°ΠΌ ΠΆΠ΅ мСсто ΠΈ mcrouter. Для сборки ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ werf, ΠΊΠΎΠ½Ρ„ΠΈΠ³ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

NB: Листинги, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ‹ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ flant/mcrouter.

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)

… ΠΈ набрасываСм Helm-Ρ‡Π°Ρ€Ρ‚. Из интСрСсного β€” здСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΎΡ‚ количСства Ρ€Π΅ΠΏΠ»ΠΈΠΊ (Ссли Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈ элСгантный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” Π΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ Π² коммСнтариях):

{{- $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 >

Поиск ΠΏΠΎ тСксту ошибки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π΅ Π΄Π°Π», ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ запросу Β«mcrouter phpΒ» Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… рядах Π·Π½Π°Ρ‡ΠΈΠ»Π°ΡΡŒ ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ°Ρ нСзакрытая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” отсутствиС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° memcached.

NB: ASCII-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π² memcached ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ срСдства консистСнтного Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ. Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ случая это Π½Π΅ создаёт.

Π”Π΅Π»ΠΎ Π² шляпС: ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ лишь ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ASCII-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ всё заработаСт…. Однако Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠ° ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° php.net сыграла Π·Π»ΡƒΡŽ ΡˆΡƒΡ‚ΠΊΡƒ. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° Π²Ρ‹ Ρ‚Π°ΠΌ Π½Π΅ найдСтС… Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ долистаСтС Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, Π³Π΄Π΅ Π² сСкции Β«User contributed notesΒ» Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΈ нСзаслуТСнно заминусованный ΠΎΡ‚Π²Π΅Ρ‚.

Π”Π°, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ β€” memcached.sess_binary_protocol. Π•Ρ‘ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, послС Ρ‡Π΅Π³ΠΎ сСссии Π½Π°Ρ‡Π½ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ лишь ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с mcrouter Π² pod с PHP!

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄Π½ΠΈΠΌΠΈ лишь инфраструктурными измСнСниями Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ: вопрос с ΠΎΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒΡŽ memcached Ρ€Π΅ΡˆΠ΅Π½, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ хранСния кэша ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π°. Помимо ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… плюсов для прилоТСния это Π΄Π°Π»ΠΎ пространство для ΠΌΠ°Π½Π΅Π²Ρ€Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚ Π½Π°Π΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ: ΠΊΠΎΠ³Π΄Π° всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π΅Π·Π΅Ρ€Π², Тизнь администратора сильно упрощаСтся. Π”Π°, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ свои нСдостатки, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ «костылСм», Π½ΠΎ Ссли ΠΎΠ½ экономит дСньги, Ρ…ΠΎΡ€ΠΎΠ½ΠΈΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Ρ… β€” ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ ΠΈ Π½Π΅Ρ‚?

P.S.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com