Ответы пользователя по тегу MySQL
  • Как осуществляются личные запросы в БД?

    Tonik
    @Tonik
    В проектирование такой подход называется multi tenant architecture
    смотрите тут https://www.google.co.th/search?q=multi+tenant+arc...

    Для БД, есть разные варианты. Но в целом все сводится:
    1) для каждого юзера (tenant) отдельная БД. Удобно тем что можно балансировать данные по разным серверам, в разрезе юзераю. Часто бывает что 1-2 клиента "пухнут" сильно быстрее чем остальные 100
    2) в каждой таблице есть поле user_id и это условие добавляется в каждый запрос. Тут сложнее вынести данные юзера на отдельные сервера. Зато если вам нужные какие то отчеты по всем юзерам (f.e. средний количество записей за прошлую неделю), то это один запрос по таблице.
    Ответ написан
    Комментировать
  • Распределение запросов MySQL

    Tonik
    @Tonik
    Если вам в целях HA, то есть несколько вариантов. И однозначно хорошего среди них нет — нужно смотреть по обстоятельствам. Опять же много зависит, от того какая нужная надежность.

    Если нужно очень очень надежно и малейшая потеря данных недопустима, то придется платить производительностью в любом случае. Обычная, асинхронная репликация вам не подойдет, так как не будет 100% уверенности, что данные успели уйти на слейв.

    Можно использовать DRDB + Heartbeat
    Надежно, но пенальти на запись. И сеть между серверами должна быть хорошей.
    Для FreeBSD можно нечто подобное соорудить при помощи репликации на уровне ZFS.
    В 5.5 появилась репликация с подтверждением записи данных, хотя бы на один из слейвов.

    Если кратковременный простой и небольшая потеря данных, допустимы (внимание, я не предлагаю плевать на юзерские данные! Но одно дело банк и финансы, другое — потерять два три голоса за авотарочку...), то асинхронная репликация, вполне хорошее решение.
    Однако, что то (например nagios) должен мониторить SHOW SLAVE STATUS, что бы вовремя заметить если репликация слетела.

    Переключаться на слейв можно либо на уровне конфига вашего приложения. Либо используя виртуальный IP, котроый в случаеумирания мастера быстро перекидывается на живой слейв.

    А вот использовать запасную БД для балансировки запросов не всегда хорошая идея. Если упадет мастер, то запросы который раньше обрабатывались двумя серверами придется, придется отрабатывать одному слейву. Код должен быть готов, отрубить ряд ф-ций при таком раскладе.

    Это все мое имхо…
    Ответ написан
    Комментировать
  • Инструментарий для поиска тяжелых php(5.2)-скриптов и ресурсоемких запросов к БД (mysql 5.1) на сервере (freebsd 8.1)

    Tonik
    @Tonik
    Все что описали выше полезно, но я добавлю чем мы пользуемся

    Профайлер — mirror.facebook.net/facebook/xhprof/doc.html Реально класная вещь. Это расширение, которе легко управляет из PHP. Конечно результаты смотряться не так красиво, как xdebug + kcachegrind но есть очень нужная фича для вас. Результаты профилирования разных страниц можно агригировать в один усредненный отчет. То есть можно на продакшене профелировать, скажем 0.01% все запросов, и потом смотреть агригированнй отчет. Сразу будет видно какие ф-ция тормозят. С xdebug можно не угадать и профелировать не те урлы.
    Сразу отвечу на вопросы, да пробовали его включать под нагрузкой и сильного оверхеда не заметил.

    Для SQL люто советую www.maatkit.org/doc/mk-query-digest.html Умет использовать в качестве источника SHOW PROCESSLIST, binlog и даже анализировать сетевой трафик чере tcpdump. Самое полезное — умеет объеденять запросы в логические классы с точностью до параметров.
    Ответ написан
    1 комментарий