• 14003
  • 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
929

Загрузка...

Комментарии

Если вы повысили производительность переходом от 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

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

Мысли вслух. Почему казахи перестали общаться с родственниками и ходить в гости?

Мысли вслух. Почему казахи перестали общаться с родственниками и ходить в гости?

Дастархан в те времена был скромен. Не было понятия «сынау» - осуждения кто как живет, какой в доме ремонт и т.д. Пока взрослые обсуждали задержку заработной платы, мы играли в армию, жмурки, строили городки...
socium_kzo
5 дек. 2016 / 15:19
  • 33430
  • 31
Верховный Суд презентовал комментарий к Гражданскому процессуальному кодексу

Верховный Суд презентовал комментарий к Гражданскому процессуальному кодексу

ГПК содержит 505 статей, многие из которых написаны несколько сложным юридическим языком. Однако теперь понять их можно проще и без обращения к юристу.
RuSnake
6 дек. 2016 / 10:31
  • 11211
  • 0
Цены Шымбулака – не для казахстанцев? Но вы не нойте. Держитесь и всего вам хорошего

Цены Шымбулака – не для казахстанцев? Но вы не нойте. Держитесь и всего вам хорошего

Знаменитый алматинский горнолыжный курорт «Шымбулак», которым мы все привыкли гордиться, с 10 декабря поднимает цены на свои услуги. Например, дневной абонемент на катание на склонах Шымбулака...
pacifist
9 дек. 2016 / 12:13
  • 12109
  • 31
Невозвращенцы-болашаковцы должны государству почти 2 млрд тенге. Кто их теперь вернет?

Невозвращенцы-болашаковцы должны государству почти 2 млрд тенге. Кто их теперь вернет?

Как сообщают новостные порталы, в Нью-Йорке нашёлся бывший болашаковец Ержан Еликов, исчезнувший пять лет назад и всё это время не выходивший на связь с родителями. Да-да, это именно он, «тот самый».
openqazaqstan
9 дек. 2016 / 14:31
  • 12419
  • 67
Японец о Казахстане: «Ваши девушки уж сильно себе набивают цену...»

Японец о Казахстане: «Ваши девушки уж сильно себе набивают цену...»

"Мужчины должны у вас тут права качать, ибо их процент в вашей численности населения уступает проценту женщин". Я машинально начала уверять, что у нас в стране таковых не имеется...
Sapientia
5 дек. 2016 / 10:52
  • 11307
  • 71
Известный европейский фотограф показал истинную красоту казашек

Известный европейский фотограф показал истинную красоту казашек

С 26 по 30 ноября в Алматы гостил известный европейский фотограф Ян Маклайн в рамках реализации совместного проекта с Казахстаном. Подробности не уточняются, однако ходят слухи о том, что этот...
Muchacho55
7 дек. 2016 / 18:29
  • 10102
  • 8
Распил 1 млрд долларов или спасение для Алматы? В 2017-м начнётся строительство БАКАД

Распил 1 млрд долларов или спасение для Алматы? В 2017-м начнётся строительство БАКАД

Конечно, Алматы заслужил эту дорогу. Невзирая на все издержки, которые могут возникнуть. Заслужил и как крупнейший город Казахстана, и как субъект, формирующий своими налогами около четверти всех...
merurg
7 дек. 2016 / 12:35
  • 7743
  • 20
«Лицо дьявола»? Страшный силуэт на стекле – не оправдание водительской безответственности

«Лицо дьявола»? Страшный силуэт на стекле – не оправдание водительской безответственности

Казнет уже которые сутки подряд обсуждает страшную аварию на трассе Астана – Боровое, где сошлись страшные мистические знаки и где из-за банальной человеческой безответственности гибли люди..
openqazaqstan
8 дек. 2016 / 13:14
  • 7257
  • 7
10 причин, по которым я не смогла работать учителем. Не только в зарплате дело, ребята

10 причин, по которым я не смогла работать учителем. Не только в зарплате дело, ребята

Я почти год проработала в школе, и когда уходила оттуда, была самым счастливым человеком в мире. Тот год, честно говоря, я и сейчас вспоминаю с ужасом.
demonica
6 дек. 2016 / 17:21
  • 6993
  • 79