• 14100
  • 181
  • 10
Нравится блог?
Подписывайтесь!

Архитектура и история i-News.kz

Всем привет! Я долго собирался с мыслями и в итоге решился описать архитектуру своего сайта - i-news.kz. Но для начала немного истории.

В далёком 2008 году я, вместе с товарищем Сашей Малым (Prankster) делал многообещающий (и ныне покойный) проект - uno.kz и в его рамках нам очень хотелось запустить новостной сайт. Останавливал нас тот факт, что новости эти кто-то должен размещать на сайте. Т.е. нужен человек, который будет заниматься скучной монотонной работой (примерно так, как сделано на www.zakon.kz).

Внезапно в одной из бесед мой хороший друг Никита Вершинин (endeveit) упомянул, что собирается делать свой агрегатор новостей. Тогда я понял, что скучную монотонную работу можно здорово переложить на плечи программы. Так появился новостной раздел на uno.kz.

Прошло время и наши с Сашей пути разошлись не самым добрым образом, а чуть позже uno.kz умер. Я взял тот движок и развернул под именем i-news.kz на дешёвом shared-хостинге, где i-news.kz проживал до декабря 2010 года. За это время в базе скопилось более 300 тыс. новостей.

Изначально все новости целиком хранились в базе MySQL и для поиска использовался полнотекстовый индекс. Пока новостей и посетителей было мало всё было супер. Потом в один из выходных мой аккаунт отключили за большую нагрузку на процессор.

Здесь появилась первая оптимизация - тексты новостей я перелил в файлы, а для поиска стал использовать xml.yandex.ru. Из базы были удалены тексты и полнотекстовый индекс, таблица с новостями похудела с 2Гб до 800Мб, сайт задышал свободнее. Плюс кеши и прочие мелочи - можно жить.

Однако через примерно полгода хостер опять взбунтовался, заявив, что мой сайт тормозит весь сервер - ведь "в линуксе начинает тормозить файловая система, когда количество файлов в одном каталоге превышает 50 тыс., а у вас их 300 тыс.". И плевать, что файлы разложены по директориям - "мы сказали много, значит много". В этот момент тексты переехали из файлов в SQLite-базы, разбитые по файлам понедельно и по годам. Хранилище новостей и по сей день организовано в виде структуры DataStorage/2011/12.db - данные за 12-ю неделю 2011 года. К слову, это решение также подсказал Никита (правда, предложив за имя файла брать первые/последние 2 символа из md5($news_id)). За что ему низкий поклон.

В конце-концов, в ноябре 2010 года хостер безапелляционно попросил меня уйти, сославшись на высокие нагрузки. Всё, что мне оставалось - арендовать выделенный реальный сервер и разместиться там. Пока суть да дело проект несколько недель жил на моём компьютере, постоянно включенном и подключенном через 512кб/с канал Алма-ТВ. Потом он переехал на довольно слабую машинку с двухъядерным Athlon'ом и 2 Гб памяти.

Поскольку на своём сервере я сам себе хозяин, я смог использовать PHP 5.3 (на хостинге была версия 5.2), заменить MySQL на Percona Server, для поиска использовать Sphinx. Неизменным осталось лишь хранилище - это SQLite, разбитый по неделям.

Я долго искал, как же мне хранить шинглы для определения нечётких дубликатов, пока в один день меня не осенило, что шинглы ВСЕХ новостей мне совсем не нужны. Достаточно хранить их за определённый период, скажем, за две недели.

Последней оптимизацией, резко повысившей скорость работы сайта в целом и практически каждой страницы в отдельности стал практически полный уход от MySQL (Percona Server) в пользу моего хранилища на SQLite и Sphinx'а. Теперь все [служебные] данные новостей лежат в SQLite и поэтому мне не нужно вытаскивать их из MySQL'я, а вместо индексов используются атрибуты Sphinx'а. Т.е. чтобы выбрать первые 30 новостей в определённой категории я раньше делал как-то так:

  1. $news = $db->findAll(array("cat_id" => 1));
  2. $news = $dataStorage->load_multi($news);

а теперь делаю как-то так:

  1. $sphinxClient->setFilter("cat_id", 1);
  2. $result = $sphinxClient->query("", "*");
  3. $news = $dataStorage->load_from_sphinx_result($result);

Для главной страницы такой подход позволил избавиться от N запросов в базу (где N - количество источников новостей, поскольку на главной отображается последняя новость каждого источника) и сделать всё одной сфинксовой группировкой с обратной сотрировкой по времени создания.

Таким образом, ныне зоопарк используемых технологий выглядит следующим образом:
- MySQL (Percona Server) для хранения информации про источники новостей, для ведения auto_increment и хранения дат новостей (для нахождения новости в DataStorage нужны id и дата, поскольку новости разбиты по неделям), для хранения очереди отправки почты и очереди публикации новостей (это была вынужденная мера, поскольку писать в SQLite можно только в один поток), для хранения комментариев
- PHP 5.3, никакие специфичные фичи не используются, не 5.2 исключительно из-за нового сборщика мусора и умения лучше разруливать цикличные ссылки
- SQLite для хранения основного - текстов новостей, id их категорий, id фидов и всей прочей информации
- Sphinx для поиска, сортировки, группировки и т.д.
- MongoDB для хранения количества просмотров новостей и их рейтингов
- memcached для кеширования редко изменяющихся данных (на длинное время до 10 мину)
- xcache для оптимизации и кеширования кода, а также для кеширования оперативных данных (на короткое время до 1 минуты)
- lighttpd в качестве веб-сервера (никаких апачей я на своём сервере не терплю)
- Ubuntu Server в качестве ОС

Стоит отметить, что на этом же сервере располагается мой проект internets.kz, в состав которого входит счётчик посещений, генерирующий в сутки порядка 100К хитов (отдельно от самого сайта internets.kz и сайта i-news.kz). Загрузка сервера по графикам Munin не превышает 3.5%

В плане кода i-news.kz содержит под капотом самопальный каркас (фреймворком это назвать нельзя) для разделения кода и представления. Для отправки почты используется Zend_Mail, а для кеширования Zend_Cache. Для общения с MySQL используется PDO, для разбора HTML - DomDocument+DomXPath.

В целом, я очень благодарен всем, кто [не всегда] по своей воле помогал мне с проектом. Я очень многому научился и, уверен, ещё научусь.

Если у кого-то остались вопросы - буду рад ответить в комментариях.

27 июля 2011, 12:37
934

Загрузка...

Комментарии

Если вы повысили производительность переходом от Percona Server(!) на SQLite, у вас там совершенно ненормально было все, и подкручиванием нужных индексов в перконе вы бы вообще в космос улетели.
А можно такой же пост про вашу архитектуру?
Очень интересно, как вы все это храните.
Нагрузки как таковой у нас нету, чтобы хвастаться архитектурой. Она у нас самая обычная.
Хотелось бы узнать подробнее.
Потому что для меня "обычная" - это MySQL+Apache+PHP)))
Это уже олдскул, я такого уже сто лет не видел. =))
Блин, ну ты как будто с луны свалился!.. )
Полуркай "Архитектура Twitter || Facebook || anything_else" в сети..
На Хабре 100% эта инфа есть..
Ты думаешь, здесь что-то новое изобретено что ли?.. ))
А можете сделать подобный пост с архитектурой, используемой вами? Право очень интересно почитать будет.
У нас зоопарков нет, mojolicious => apache + fcgid, данные лежат в postgresql, которые сложными запросами берутся, те кешируются в memcached. Вся сложность работы заключается в тех скриптах, что лежат вне веба и подготавливают нужные данные в нужное время, те бегут по крону.
Главна, организовать правильно структуру данных, тогда никаких зоопарков и не надо ;-)
Вся проблема в том, что с создателями фБ и Тви я попиздеть в бложиках не могу и посоветоваться))
Здесь-то местные, подскажут если чо.
Ну и мало ли, вдруг, что новое изобрели.
И все же у Ювижна, Твиттера и ФБ мало общего в архитектуре =) Три асболютно разных подхода, на мой взгляд (из того, что знаю).
Ну, если уж придираться к словам, то я FB и Twttr написал для точности. Потому как твердо помню, что инфа о них в сети есть и не люблю дезинформировать юзеров.. И я спецом оставил там 'anything_else', куда можно подставить любой другой известный проект. О них, в большинстве своем, инфа тоже найдется.. Например: LinkedIn, eBay.. И более мелкие российские проекты, вроде: eventr.com, fermer.mobi and etc. Архитектура Хабра тож, по-моему, где-то валялась.. Это вот то, что с утречка вспомнилось.. Их много ж вообще!.. ))
Основной мой мессадж был LURK MOAR!.. Кароче, ищи больше и не задавай глупых вопросов!.. В сети информации полно..

Насчет разницы с yv можно поспорить, но долго писать мне свою позицию.. А от многабукаф у меня закипает верхний клапан.. (

ada9b16d593b4b7ece6037fc1bdf56af.jpg

ЗЫЖ Что-то после того, как я что-то там написал в вашем топике с прощанием и уходом с юви, чувствуется ваше повышенное внимание к моей скромной персоне.. ) Я так скоро совсем на программерские темы комментить перестану.. =/ Уже немного боязно..
Можно на ты. Я тогда у себя в топике просто забыл ответить на твой вопрос утвердительно (ты спрашивал можно ли на "ты") =)

Да что ж ты так близко к сердцу принял? ))) Я просто недавно как раз читал, как работает Твиттер, ФБ и кое-что про YV было рассказано Quessir'ом, поэтому и сравнил =)

1) FB: PHP (HipHop), Cassandra (column-oriented, денормализованное хранение данных), node.js (не уверен, возможно, другая технология с keep alive и event'ами), MySQL (я был удивлен, давно на хабре была статья, что ФБ его использует).

2) Twitter: Rails, Scala, FlockDB (graph db), что-то с keep alive

3) Yvi: ZF (PHP), MongoDB (document store), PostgreSQL
Никакого повышенного внимания нет, просто попадаются твои комментарии =)
>>Да что ж ты так близко к сердцу принял? )))

))

>>Никакого повышенного внимания нет, просто попадаются твои комментарии =)

Да раньше просто пересекались частенько в комментах, но что-то ноль внимания.. ))
Я то помню, потому что я любого ИТ-профи на платформе быстро замечаю и затем посматриваю кто что пишет.. ) Ну да ладно..
Спасибо, конечно, но я еще молодой и слишком неопытный, чтобы называться IT-профи ;)
Вероятнее всего, если бы я добавил памяти перконе она была бы быстрее SQLite. Но у меня её всего 2 Гб и если отнять всё, что занимает система остаётся порядка 1 Гб на всякие php-cgi и lighttpd. Пока использовался MySQL он не вылезал из свопа. Сейчас своп не используется вовсе.
И потом, SQLite - это в большей степени Legacy. Полностью перенести тексты в MongoDB у меня не получилось, поскольку ОС 32-битная и на ней монго не умеет работать с >2Гб данных. А тащить всё обратно в мускуль не захотелось.
Подозреваю, что sqlite справляется с «нагрузкой» потому, что запросов не так много и он напрямую работает с файлами. Когда/если запросов и данных станет больше, вы даже по ssh зайти не сможете на свой сервер из-за загрузки io. :)
Не верю я, что MySQL сможет сделать что-то быстро в пределах 512 Мб оперативки, имея в базе 5-6Гб данных, разложенных по 2 млн. строк. Опять же, для меня важно не столько чтение, сколько запись, потому что данные пребывают с очень большой скоростью. И в этом случае каждый индекс бьёт по производительности. Если использовать MySQL чисто как тупой "ящик", откуда данные выбираются исключительно по первичному ключу - он может быть и покажет производительность... Но зачем что-то делать, когда и так всё прекрасно работает? ;)

ЗЫ: Когда/если сайт наберёт посещаемость хотя бы в районе YV, естественно, нужно будет делить функциональность между несколькими серверами - выносить отдельно СУБД, причём желательно настроить master-slave репликацию, чтобы можно было читать с одного, а писать на другой. Но это же всё не про нас :) Когда я заработаю хоть один цент на этом сайте, тогда я подумаю над дальнейшим его техническим совершенствованием. А пока это лишь игрушка в моих шаловливых руках :)
>>Не верю я, что...

Это несерьезно!!!.. ))
Технари так не говорят.. )
Я прошёл много разного и делал всякое и поэтому могу так говорить :)
OhShi
0
0
2 Гб - это не "всего", это "целых".
Вот таких вот постов здесь не хватает.
Спасибо
Ничего особенного, все тупенько и странненько, но раз работает, то и хуй с ним. =)
Rus_As
0
0
побольше бы таких постов! Спасибо автору! Конечно ничего нового, но все же просто интересно почитать как сделали другие)

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Я был удивлён, что в Азербайджане есть Казахский район

Я был удивлён, что в Азербайджане есть Казахский район

Мне как казаху по национальности очень хотелось туда попасть. Оказалось, что климат там намного суровей и люди, говорят, суровые и воинственные. Казах – город на западе Азербайджана...
alidimash
18 янв. 2017 / 21:50
  • 31018
  • 18
Астана глазами алматинских девушек. Как при таких погодных условиях можно выжить?

Астана глазами алматинских девушек. Как при таких погодных условиях можно выжить?

В спальных районах, и в высотных домах сквозь стены слышно завывание ветра. В особенности ночью. Такие звуки, я слышала, пожалуй, только по телевизору, в фильмах про метель.
Naomi_K
20 янв. 2017 / 12:36
Сильное ДТП произошло в Алматы на Тимирязева-Байзакова

Сильное ДТП произошло в Алматы на Тимирязева-Байзакова

NoComment (c) Официальный слоган EuroNews. Катастрофа на алматинской утренней трассе началась с того, что водители «Ниссана» и микровена ожидали сигнала светофора на запад по Тимирязева...
ibestreporter
17 янв. 2017 / 22:52
  • 3985
  • 5
Это поколение просрет страну. 20-летняя молодежь представляет из себя сказочных эльфов

Это поколение просрет страну. 20-летняя молодежь представляет из себя сказочных эльфов

Смотря в очередные пустые глаза вчерашнего студента, приходящего устраиваться на первую работу страшно становится. Потому что сравниваю с теми же китайскими студентами, которые готовы выгрызать себе мечту.
mbaitykov
18 янв. 2017 / 11:34
Разрубить сирийский узел. Казахстан как миротворец сделает невозможное?

Разрубить сирийский узел. Казахстан как миротворец сделает невозможное?

Только что в Астане начались межсирийские переговоры. Событие это примечательно не столько содержанием и ожидаемыми результатами, а самим фактом.
openqazaqstan
вчера / 13:35
  • 3512
  • 15
Становится хуже, но как-то постепенно. Беднеем, но тоже как-то не разом

Становится хуже, но как-то постепенно. Беднеем, но тоже как-то не разом

Помню, когда я уезжал и Казахстана, тут было довольно прилично, даже не смотря на то, что жить было невыносимо. Но прилично так. Мусора было меньше. Дороги чистили, вони почти не было. Да и в остальном тоже норм.
shootnix
18 янв. 2017 / 12:49
  • 3907
  • 36
Поправки в стиле «1937» не прошли. МИК отказалось от запрета анонимных комментариев

Поправки в стиле «1937» не прошли. МИК отказалось от запрета анонимных комментариев

Сегодня Министерство информации и коммуникаций исключило из законопроекта предложенные ранее нормы, предполагавшие «деанонимизацию» комментаторов и регистрацию блогеров.
openqazaqstan
20 янв. 2017 / 12:12
  • 2515
  • 22
Почему мужчины используют некоторых женщин? Случай из жизни

Почему мужчины используют некоторых женщин? Случай из жизни

Однажды мне довелось приеxать к своей сестре в другой город с ночевкой. Она живет одна и ей почти 33 и она не замужем. Лично я считаю, что её старой девой называть рано, она все еще открыта для...
Roza_pvl
19 янв. 2017 / 15:32
  • 2894
  • 94
Пожив в Китае, привыкаешь к вопросам типа «Ты что, не китаянка?»

Пожив в Китае, привыкаешь к вопросам типа «Ты что, не китаянка?»

Привет всем) Сегодня хотелось бы поделиться ощущениями, какого это быть "чужой" среди "своих" Около одного года проживаю в Китае, и уже сама начинаю верить, а иногда даже задумываться о вероятности...
asemik07
20 янв. 2017 / 18:52
  • 2310
  • 19