pconnect: граната в руках обезьяны

31
Pconnect: граната в руках обезьяны Сергей Аверин

Upload: sergey-xek

Post on 16-Jun-2015

1.172 views

Category:

Technology


1 download

DESCRIPTION

Pconnect: граната в руках обезьяны. Сергей Аверин, Badoo. Persistent connect. Это всегда преподносится как plug'n'play. В учебниках информации очень мало. Но все всегда думают, что это «просто работает». - Что это, вообще, такое, зачем было придумано и какие задачи призвано решать. - О том, как этим всем пользуются, и что получается в итоге. - О том, как, на самом деле, это работает. Про что не пишут в учебниках. - Stateful-протоколы, пример с проблемами в mysql. - В stateless-мире все не так уж солнечно. - Большинство протоколов просто не рассчитано на pconnect. Баги в C++ софте (которые есть всегда) + pconnect + простоватый протокол = адская смесь. Каким должен быть протокол. - Мелкие нюансы, из-за которых возникают проблемы. - Connection pooling — что это и с чем его едят. - Как со всем этим жить.

TRANSCRIPT

Page 1: Pconnect: граната в руках обезьяны

Pconnect:  граната  в  руках  обезьяны

Сергей  Аверин

Page 2: Pconnect: граната в руках обезьяны

Социальная  сеть  для  знакомств  с  новыми  людьмиВ  Top-­‐200  Alexa  c  2007  года127  миллионов  зарегистрированных  пользователей10  миллионов  пользователей  в  день2  миллиона  фотографий  загружаются  ежедневно

                         —  это:

Page 3: Pconnect: граната в руках обезьяны

30  тыс.  запросов/сек  к  PHP  backendsMySQL,  PHP,  C/C++,  Linux,  nginx,  PHP-­‐FPM,  memcachedМного  своего

                         —  это:

Page 4: Pconnect: граната в руках обезьяны

Pconnect  —  что  это?Persistent  connecmon/keep-­‐alive/connecmon  reuse  —  по  сути  одно  и  то  жеPconnect  в  мире  FastCGI-­‐демоновПлюсы:

• Экономия  ресурсов  сервера• Меньшая  нагрузка  на  сеть• Экономия  времени  и  ускорение  отклика

Page 5: Pconnect: граната в руках обезьяны

Действительно  Plug’n’Play?hvp://www.php.net/manual/en/features.persistent-­‐connecmons.php:

“Persistent  connec,ons  were  designed  to  have  one-­‐to-­‐one  mapping  to  regular  connec,ons.  That  means  that  you  should  always  be  able  to  replace  persistent  connec,ons  with  non-­‐persistent  connec,ons,  and  it  won't  change  the  way  your  script  behaves.”

Это  маркетинг.  И  не  более  того.

Page 6: Pconnect: граната в руках обезьяны

В  реальностиЧаще  всего  не  Plug’n’PlayДолжны  быть  рассчитаны  на  pconnect:

• протокол• клиентская  библиотека• серверное  ПО

Не  «серебряная  пуля»В  больших/highload  системах  более  ощутимо

Page 7: Pconnect: граната в руках обезьяны

ПроблемыСофт  не  рассчитан  на  большое  кол-­‐во  открытых  соединенийСколько  памяти  съедает  инициализированный  коннект?Выделяется  ли  в  софте  по  треду/процессу  на  коннект?Есть  ли  ограничение  на  кол-­‐во  коннектов  с  одного  адреса?Ограничения  сетевой  подсистемы  Linux

Page 8: Pconnect: граната в руках обезьяны

ПроблемыРазберитесь  в  кодеНе  закрывайте  хорошие  соединения  функцией  fcloseПроверьте,  как  работает  ваш  extension,  особенно  все  его  warning’и  и  error’ы

• hvp://www.php.net/manual/en/memcached.addservers.php

В  php  вам  поможет  ftell($socket)

Page 9: Pconnect: граната в руках обезьяны

ПроблемыКогда  нужно  закрывать  соединенияПри  синтаксических  ошибкахПри  тайм-­‐аутахЕсли  вы  не  дочитали  ответ  до  конца

Page 10: Pconnect: граната в руках обезьяны

ПроблемыStateful  протоколыВы  всегда  знаете  состояние  полученного  соединения?Транзакции/переменные/авторизацияРеинициализация  соединения

Page 11: Pconnect: граната в руках обезьяны

ПроблемыАсинхронная  природа  сокетовДолжна  быть  возможность  сопоставления  запросов  и  ответов

• Единственное,  где  я  это  нашел,  это  в  mongoDB  и  MessagePack-­‐RPChvp://www.mongodb.org/display/DOCS/Mongo+Wire+Protocolhvp://wiki.msgpack.org/display/MSGPACK/Design+of+RPC

Способ,  которым  мы  пользуемся  (не  дает  гарантии)

Page 12: Pconnect: граната в руках обезьяны

Проблемыset_Ome_limitЕсть,  было  и  будет  в  FastCGI-­‐демонахТерминация  запроса  пользователемShutdown  обработчик

Page 13: Pconnect: граната в руках обезьяны

ПроблемыОграниченный  функционал  FastCGI-­‐демоновКлиентские  библиотеки  зачастую  бездумно  написаныНе  всегда  можно  понять  новое  ли  это  соединениеНет  полноценных  connecmon  pool’ов

Page 14: Pconnect: граната в руках обезьяны

От  теории  к  практике

Page 15: Pconnect: граната в руках обезьяны

Badoo  Desktop• Бесплатная  Win/Mac  программа

• Поддерживает  ваш  онлайн-­‐статус  на  сайте  

• Уведомления  о  новых  событиях

• Дает  нам  местоположение  пользователя

• Удобный  доступ  к  разделам  badoo.com

Page 16: Pconnect: граната в руках обезьяны

Badoo  Desktop• 3  млн.  пользователей  в  месяц  

• 1  млн.  подключенных  программ  в  пике

• 20  тыс.  запросов/сек  к  PHP  backends

Page 17: Pconnect: граната в руках обезьяны

Наш  setup

persistent

Page 18: Pconnect: граната в руках обезьяны

Программы  —>  FrontendЕсть  способ  сделать,  чтобы  «просто  работало»:

• Гарантии  доставки  нет• Ответы  являются  отдельными  командами• Одна  программа  —  одно  соединение• Есть  сохранение  порядка• Нарезкой  байт  на  отдельные  команды  занимается  демон,  держащий  соединения

Page 19: Pconnect: граната в руках обезьяны

Frontend  —>  BackendОтдельный  hvp-­‐запрос  на  каждую  входящую  командуPconnect  пока  нет,  но  планируем  через  HTTP  Keep-­‐Alivehvp://en.wikipedia.org/wiki/HTTP_persistent_connecmon

Page 20: Pconnect: граната в руках обезьяны

Backend  —>  MySQLПротокол  на  pconnect  полностью  не  рассчитанЕсть  packet  number,  но  оно  обнуляется  с  каждым  новым  запросом

Есть  реинициализация  соединения,  используйте  mysqli_connectТред  на  коннектДля  нас  малоинтересно,  баз  много,  php-­‐серверов  много,  запросы  редкиhvp://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol

Page 21: Pconnect: граната в руках обезьяны

Backend  —>  HandlerSocketПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectНаписали  свою  библиотеку  на  phpПроверяем,  что  получили  ключ,  который  просилиПолучили  прирост  в  3—5  разhvp://mnyurl.com/64vwn52

Page 22: Pconnect: граната в руках обезьяны

Backend  —>  MemcachedПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectExtension  нормально  работать  не  смог,  написали  свою  библиотеку  на  phpТщательно  ловим  все  ошибкиПроверяем,  что  получили  ключ,  который  просилиПолучили  прирост  в  2  разаhvps://github.com/memcached/memcached/blob/master/doc/protocol.txthvp://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol

Page 23: Pconnect: граната в руках обезьяны

Backend  —>  своя  in-­‐memory  DBПротокол  на  pconnect  не  рассчитанИспользуем  pconnect

Только  команды  на  запись,  ответ  только  либо  OK  либо  ERRORГарантии  записи  нет  и  мы  к  этому  готовыКаждая  отдельная  ошибка  нам  не  важна,  они  всегда  идут  только  пачками

Page 24: Pconnect: граната в руках обезьяны

Продвинутые  подходы

Page 25: Pconnect: граната в руках обезьяны

Ленивая  инициализацияВ  handlersocket-­‐протоколе  есть  открытие  индекса  таблицыБез  pconnect  открывали  каждый  раз  после  коннектаС  pconnect  ловим  ошибку  про  неизвестный  индексТеперь  мы  можем  открывать  его  только  если  это  нужно

Page 26: Pconnect: граната в руках обезьяны

PipeliningЕсли  в  протоколе  есть  уникальный  request-­‐response  id  на  каждый  запрос,  то  будет  надежно  работать

Page 27: Pconnect: граната в руках обезьяны

Connecmon  poolingПлюсы:

• Уменьшение  времени  получения  коннекта• Упрощает  код• Дает  контроль  над  использованием  ресурсов

Бывает  внутри  процесса  и  в  виде  отдельного  демона• Внутри  FastCGI  —  пишите  сами,  плюс  у  некоторых  extension’ов  есть  свои  пулы.  В  мире  Python  —  SQLAlchemy

• Вне  процесса  сложнее  и  функциональнее,  обычно  есть  доп.  логика

Page 28: Pconnect: граната в руках обезьяны

Connecmon  poolingpgpool  —  PostgreSQL  connecmon  pool  daemon

• hvp://pgpool.projects.postgresql.org/• В  Postgres  процесс  на  коннект

MySQL  Proxy  —  швейцарский  нож• hvp://forge.mysql.com/wiki/MySQL_Proxy_FAQ• load  balancing,  failover,  query  analysis/modificamon,  R/W  spli�ng

SQL  Relay  —  ODBC,  Oracle,  MySQL,  PostgreSQL,  Sybase,  MS  SQL  Server,  IBM  DB2,  Firebird,  SQLite  and  MS  Access

• hvp://sqlrelay.sourceforge.net/sqlrelay/faq.html

Page 29: Pconnect: граната в руках обезьяны

Чеклист1)  Что  конкретно  вы  экономите  и  с  какими  последствиями?2)  Потянет  ли  это  все  ваша  система?3)  Вы  разобрались  с  кодом,  ошибками,  закрываете  коннект  когда  нужно?4)  Рассчитан  ли  протокол  на  pconnect?5)  Если  нет,  вы  подстелили  себе  соломы?6)  Вы  правильно  работаете  со  stateful  протоколом?7)  Вы  используете  connecmon  pool  для  экономии  ресурсов?8)  Вы  готовы  писать  свои  велосипеды?

Page 31: Pconnect: граната в руках обезьяны

Badoo  ищет  классных  людей!Нам  нужны:

• умный  и  вменяемый  PHP/MySQL  программист

• релиз-­‐менеджер• QA  специалисты

Что  даём:• интересную  работу• 2000  евро  за  успешную  рекомендацию