Чего я хочу для LiveStreet или HighLoad играет значение
Смысл этого топика не в том что бы изменить ход развития LiveStreet или отметить его недостатки — нет. LiveStreet была и будет системой ориентированной на широкие массы, поэтому требовать от нее большего я не в праве, но я могу изменять свои проекты, делать свои решения и предоставлять их на суд.
В данный момент мне бы хотелось поделится своими мыслями по поводу реализации части любимого движка работающей с данными и то как эту часть можно оптимизировать и привести к более производительному и логичному виду.
Всё это подается как новые темы к изучению для разработчиков проектов, которые возможно о них не знаю и как новая информация для пользователей, которые считаю что находятся на гребне технологий.
Тем кто заинтересовался темой будет уютнее почитать подробности тут, чем читать обрывки вырезанных из текста абзацев — Redis.
Подробности в виде презентации — Mongodb.
PS
Я просто показываю вам что вы можете сделать со своим LiveStreet и какой космос открыт перед вами :)
Если вы в этом шарите думаю все будут только рады перенять ваш опыт :)
В данный момент мне бы хотелось поделится своими мыслями по поводу реализации части любимого движка работающей с данными и то как эту часть можно оптимизировать и привести к более производительному и логичному виду.
Всё это подается как новые темы к изучению для разработчиков проектов, которые возможно о них не знаю и как новая информация для пользователей, которые считаю что находятся на гребне технологий.
Redis(а может и Node.js)
Первое изменение которой я бы сделал в своем проекте — использовал Redis для хранения событий пользователей. Использование MySQL для таких вещей не самоубийсво, но все таки очень тормознутое решение нежели Redis, для которой шустрость второе имя. Ко всему прочему можно добавить возможность publish/subscribe, позволяющая в купе с node.js выводить уведомления такие же как в Вконтакте. Размышляя в этом направлении можно расширить границы использования этой БД. Для осуществления работы можно использовать библиотеку Rediska, разработанную с подачи нашего соотечественника.Тем кто заинтересовался темой будет уютнее почитать подробности тут, чем читать обрывки вырезанных из текста абзацев — Redis.
MongoDB
Данных у нас много и все они хранятся в реляционной базе данных. Что если нам координально изменить парадигму хранения данных и использовать MongoDB. Выиграем мы и в скорости запросов и в скорости работы с данными продолжая использовать ORM, потому как в MongoDB оно организованно на уровне C++, а не эмулируются как сделанно в данный момент в LiveStreet. Но за это разработчикам стоит сказать отдельное спасибо, т.к это было действительно ценное решение ускоряющее разработку.Подробности в виде презентации — Mongodb.
PS
Я просто показываю вам что вы можете сделать со своим LiveStreet и какой космос открыт перед вами :)
Если вы в этом шарите думаю все будут только рады перенять ваш опыт :)
36 комментариев
А вот насчет координально изменить парадигму хранения данных и использовать MongoDB — это как-то чрезмерно кардинально и вряд ли оправдано
вобщем не вижу пока проектов, которым это нужно.
4-х процессорный сервер — это 16/24 ядра. 128Gb памяти. Многодисковые рейды. Это всё не особо дорого в наше время. А выжать из SQL сервера на такой машине можно чудовищно много.
мемкешем на отдельном сервере достаточно плохая идея, на самом деле. коммуникации по локальной сети — очень медленное дело. Чтобы было более понятно — вынимание объекта из локальной памяти процесса и вынимание того же объекта из memcached сервера на другой машине: производительность этих операций отличается на два порядка. Учитывая что SQL сервер тоже не дурак и дофига разного кэщирует в памяти (в том числе планы выполнения и результирующие множества) то есть много примеров когда вынесенный на отдельные сервера кэш вообще не приносил никакого эффекта. Вообщем кэгирование тонкая тема. memcached разрабатывался для LiveJournal чёрт знает когда, время много прошло с тех пор и эффективность этих подходов не столь однозначна сейчас.
В случае с мемкешем, сфинсом и т.д — у меня так-же. Есть более сложные вещи, за которые страшно. Например сетевые хранилища данных, подключенные к серверам виртуализации.
Бд разделено в первую очередь потому, что у нас отдельный сервер, с которого происходит резервное копирование и с минимальным расходом ресурсов и помехам в работе самих ресурсов. Ныне я даже представить боюсь, как-бы мне приходилось бэкапить дофига инсталяций отдельно. Всё что я накатываю на вебсервера — snmpd, nginx+php-fpm, bacula-fd. Всё. Больше и не надо зачастую. Насчёт кучи железа — его мало. Для простых вебсерверов, почты и т.д стоят по большей части виртуальные машины. Проигрыш в производительности — он выходит всё-же настолько мал, что просто пофигу, поверьте. :)
конкретика интересует. или вы несколько сайтов на кластере держите?
Разнесено так всё для уменьшения расхода ресурсов, сокращения лишних рабочих процессов на серверах и по соображениям безопасности. Плюс зачем для овер X ресурсов делать столько-же инсталяций дополнительного программного обеспечения. Ведь поддерживать всё это в актуальном виде не особо просто. А кроме поддержки самих инсталяций, ведь ещё надо выпилить мониторинг всех этих вещей. (Мы мониторим на доступность, нагрузку, и т.д всё, что наверно только возможно. Даже мониторинг мониторинга. :)
Благодаря этому практически о любой проблеме, даже мелкой узнаём в течении нескольких минут). На что тоже может уйти дофига времени. Для мускла настроена репликация. Первый сервер используется для работы всех ресурсов с бд, второй используется только для резервного копирования. Так-же мускл стоит не на виртуальных машинах, а на физ. тачках.
Тормоза из-за передачи кучи данных по сети — не особо проблематично, если грамотно спроектировать всю инфраструктуру.
Но у нас даже дошло до того, что сервера виртуализации используют удалённые хранилища данных. А это более серьёзная и тонкая штука.
Благо всё дело происходит в провайдинге, а не фиг знает где.
Ну как-то так. Надеюсь достаточно рассказал. Имхо, но в больших техподробностях не могу, по причине надеюсь сами понимаете, конфиденциальности инфраструктуры. :)
У нас вот в случае отказа например сервера виртуализации, система может перенести виртуальные машины на другой сервер виртуализации.
В случае падения одной виртуальной машины, может отвалится на время часть определённого сервиса, но не весь.
Вообще, в отказоустойчивости я мало разбирался. Да и сам не полностью отвечаю за всю эту инфраструктуру. Времени не хватает вникнуть…
…
<IfModule mpm_prefork_module>
StartServers 64
MinSpareServers 50
MaxSpareServers 50
MaxClients 256
MaxRequestsPerChild 4000
NoSQL решения намного производительнее.
MongoDB позволяет для главной страницы вместо 10 запросов сделать 1-2, отсюда и слова о смене парадигмы.
При использовании ленты(feed) необходимо от 20-30 запросов к бд.
Обобщив все это можно уверенно сказать что лс к highload подготовлен не на 100% и даже не на 50%.
Но как я говорил в сабже это не самоцель лс.
Я не упирался в проблемы с производительностью если не считать что при постоянной работе с летной большого числа пользователей получается не очень шустро. Лс не совсем готова для оптимальной работы с активностью, лентой(а ля новостей вконтакте).
И это просто небольшие эксперименты и ориентация на то что столкнусь в будем с высокими нагрузками. Нужно же развиваться :)
Ну и естественно когда речь идет об обычных блогах далеко идти не надо, в лс все есть из коробки и кроме шаринга ему ничего и не требуется.
Просто как я уже написал выше цели ставятся высокие и готовность к хайлоаду перспективнее закладывается на раннем этапе. Планы до 10кк просмотров и международный уровень. Поживем увидем, но мы в себя верим :)
Но если есть возможности оптимизировать систему на уровне архитектуры это стоит делать, естественно когда это не обходится дороже оптимизации на физическом уровне.
Очень сильно изменили ситуацию массовые 64-bit, дешевая память и некоторые появившиеся бесплатные/дешёвые софтины и сервисы. Такие штуки как NGINX или Amazon CloudFront изменили мир.
Сейчас картина такая, что экстенсивная оптимизация (т.е. наращивание железа) очень часто наиболее дешёвый и эффективный путь. Оптимизация кода это очень дорогое удовольствие из-за стоимости разработчиков.
Если Вы считаете, что использование редиса — это круто, то Вы явно ошибаетесь.
Разве что от себя добавлю, что не обязательно «распыляться» на пару решений. А вот отход от традиционного MySQL и миграция в MongoDB была бы очень кстати.