• 14311
  • 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
951

Загрузка...
Loading...

Комментарии

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

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

Школа High Tech High – дети здесь самостоятельны так же, как и профессионалы в офисах

Школа High Tech High – дети здесь самостоятельны так же, как и профессионалы в офисах

Известный казахстанский бизнесмен становится первопроходцем и создает школу, о которой можно только мечтать. То, что мы, как взрослые, делаем в бизнесе, дети будут делать в этой школе.
Zhumanova
24 апр. 2017 / 16:29
  • 16730
  • 3
Как выбрать новостройку в Алматы: инсайты, критерии и личный опыт

Как выбрать новостройку в Алматы: инсайты, критерии и личный опыт

Я прекрасно понимаю тех, кто долго ищет подходящую квартиру - сама искала, потратила на поиск 1,5 года. Что, прежде всего, повлияло на мой выбор при покупке квартиры в новостройке Алматы?
Zhumanova
21 апр. 2017 / 10:04
  • 3575
  • 12
«Третья мировая война начнётся в мае 2017 года» – провидец из Португалии

«Третья мировая война начнётся в мае 2017 года» – провидец из Португалии

Провидец из Португалии по имени Горацио Вильегас считает, что новая мировая война состоится уже в текущем году. Считается, что португалец два года назад объявил, что Трамп станет президентом.
Seattle
21 апр. 2017 / 15:33
  • 3294
  • 12
«А ты покушала?» или Как завоевать сердце женщины простой заботой

«А ты покушала?» или Как завоевать сердце женщины простой заботой

Так как опыт хождения по свиданиям у меня немаленький, да и с интуицией давно дружу, я быстро отсеиваю тех, с кем будут проблемы. Как я это определяю? Очень просто.
Bonittta
22 апр. 2017 / 14:10
Кому в Казахстане жить хорошо? Почему мы остаёмся в топ-5 стран мира по числу самоубийств

Кому в Казахстане жить хорошо? Почему мы остаёмся в топ-5 стран мира по числу самоубийств

Всё ли так хорошо у жителей Казахстана? Почему-то наша страна сохраняет твёрдые позиции в первых строчках мировых рейтингов по числу самоубийств.
openqazaqstan
24 апр. 2017 / 16:54
  • 2917
  • 16
Депутат сената Айтимова: «Не нужно критиковать депутатов, так как вы сами их избирали»

Депутат сената Айтимова: «Не нужно критиковать депутатов, так как вы сами их избирали»

Наши депутаты известны не достижениями и работой, а своими высказываниями. Сегодня в СМИ вышла новость, где депутат сената Бырганым Айтимова ответила на критику народа.
tala03
20 апр. 2017 / 13:44
  • 2520
  • 20
Стихия всё спишет. Почему дамба за 200 миллионов никого не спасла?

Стихия всё спишет. Почему дамба за 200 миллионов никого не спасла?

Наводнение в Атбасаре, размытые дороги, подтопленные сёла по всему Центральному и Северному Казахстану... Что происходит?
openqazaqstan
19 апр. 2017 / 15:20
  • 2497
  • 14
Каждую ночь я жду его. Почти каждую ночь он оправдывает мои ожидания

Каждую ночь я жду его. Почти каждую ночь он оправдывает мои ожидания

Каждую ночь я жду его. Такая уж у него работа, он приходит поздно. Но почти каждую ночь он оправдывает мои ожидания. Когда его долго нет, признаюсь, я начинаю нервничать. Названивать и писать смс-ки...
DominaOmnium
21 апр. 2017 / 2:25
  • 2260
  • 11
Атбасарская дамба: кто так красиво сэкономил 137 миллионов?

Атбасарская дамба: кто так красиво сэкономил 137 миллионов?

История с разрушенной атбасарской плотиной получила интригующее продолжение. На официальном уровне говорят о 200 млн тенге, в то время как районный аким сообщил, что дамбу строили совсем за другие деньги.
openqazaqstan
20 апр. 2017 / 15:10
  • 2094
  • 14