|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Задача такая. Надо сделать ньюсфид для проекта, в с ежедневной посещаемостью в несколько миллионов юзеров. То есть для каждого пользователя логируются события, которые происходят с ним либо с его друзьями при взаимодействии с различными сущностями проекта, внешними приложениями итд. Примерно то же, что сделано vkontakte.ru, если посмотреть "новости друзей". Сейчас реализация такая. Все события для каждого id хранятся в памяти, группировка и фильтарция делается вручную при отдаче (все это на С++). Вся база дампится на диск при выключении демона, загружается при старте. Проблема в том, что сейчас в день набегает несколько Гб данных, и хранить дальше все в памяти уже невозможно. Можно сделать шардинг на несколько серверов, но это сопряжено с проблемами ("новости друзей"). Хочеться попробовать выжать еще из одного сервера. Собсно, идея такая - в памяти держать тока активный контент (сделать какой-то lru-кеш по обращениям), а то, что вытеснятется - дампить в какое-то хранилище. Собсно - вопрос, что лучше использовать в качестве него? Начал писать собственный движок, но все время гложет мысль, не изобретаю ли я велосипед:) Что думаете начет libmysqld или sqlite ? Опыта работы ни с тем, ни с другим у меня нет. Насколько хорошо работают эти штуки на объемах в пару сотен гигов при простых insert и select по числовому id? Что еще посоветуете? В первую очередь интересует мнение уважаемого MGB:) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2010, 21:27 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Это просто не для эскулайта задача. Потому что серверов-генераторов станет несколько. Нужен сервер, а не либа. Скорее mysql, и транзакции вам не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2010, 22:20 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
pavlikkkНасколько хорошо работают эти штуки на объемах в пару сотен гигов при простых insert и select по числовому id? Что еще посоветуете? Зависит от структуры данных. Если говорить "в общем", то сотни миллионов записей эскулайт в одной таблице обрабатывает хорошо: Тестирование SQLite 3.6.17-mobigroup.2 на больших таблицах Это при индексах на числовые поля; при использовании строковых индексов возникнут проблемы: Degradation of indexing speed in SQLite 3.6.20 Имхо в описанной задаче стоит обращаться к БД напрямую на чтение (распараллеливая операции чтения на множество потоков выполнения), а запись выполнять из одного потока пакетно, например, раз в 5 секунд. В памяти можно вообще ничего не хранить, кроме не сброшенных на диск данных (хинт: используя in-memory SQLite базу можно с удобствами с ними работать). Размер БД обязательно зафиксировать "сверху"- например, разделяя данные по дням. Это и удобно (например, для бэкапа), и обеспечит стабильное время выполнения выборок. P.S. Сам я только в линуксе работаю, и ядро отлично кэширует часто запрашиваемые страницы БД. Под виндоус, возможно, все будет далеко не столь радужно. P.P.S. Стоит подумать о хранении сериализованных структур данных - они и сами по себе здорово уменьшают объем БД, и сжатие использовать можно (zlib-сжатие особенно - скорость распаковки настолько велика, что эффективнее читать/писать на диск именно сжатый контент, распаковывая "на лету"). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2010, 23:09 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Структура данных у нас простая - грубо говоря, одно событие - это struct event { int user_id; int delete_id; /*уникальный id, назначемый клиентом и используемый им для удаления*/ std::string attachment; /*строка произвольной длины, содержащая доп.инфу про событие.*/ /*... набор id для фильтрации и группировки*/ }; Надо выбирать по большому набору id (все друзья юзера). Еще события нужно уметь удалять уникальному id(например, юзер добавил фотку, потом удалил). События происходят в произвольном порядке, соответственно база как я понимаю будет не только большая, но и очень фрагментированая. MBGимхо в описанной задаче стоит обращаться к БД напрямую на чтение (распараллеливая операции чтения на множество потоков выполнения), а запись выполнять из одного потока пакетно, например, раз в 5 секунд. В памяти можно вообще ничего не хранить, кроме не сброшенных на диск данных Я так понимаю что SQLite полностью лочит базу при вставке, соответственно все читающие треды в этот момент будут ждать, и сервер будет лагать с какой-то периодичностью. Для этого собственно я и собирался использовать свой кеш, чтоб большинство чтений происходило прямо из него, а с базой работал отдельный тред или группа тредов(один на запись и несколько на чтение). По крайней мере кеш ОС(FreeBSD 7.3) в таком случае нас не выручал, и когда начинал сбрасываться буфер на диск, чтение начинало жутко тормозить(на SATA винтах). Про zlib-сжатие хорошая идея, я тоже думал его использовать:) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 13:05 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Да, при вставке база блокируется. Но пакетная вставка тысячи записей это время порядка 50 миллисекунд, вас это не должно волновать. А вставка 1000 записей раз в 5 секунд это под 100 миллионов записей в сутки, что превосходит на порядок указанные вами требования. Если же это делать раз в секунду, получается под миллиард записей в сутки без заметной блокировки базы - на таких масштабах скорее кластер оракл загнется, нежели эскулайт замедлится :-) Кстати, вот еще цифры - открытие БД требует примерно 500 микросекунд, на десктопном кореквадро можно около 4000 http-запросов с обращением к БД выполнить, притом селектов может быть десятки и сотни для каждого HTTP-запроса, т.к. они выполняются чрезвычайно быстро (порядка миллиона средней сложности селектов из view в минуту). Вот практический пример - одну бизнес-систему переносил с постгреса на эскулайт. Дело давно было, ОЗУ на сервере имелось 1 Гб, а база постгреса была более 20 Гб и жутко тормозила на построении квартальных отчетов по выборкам в 3-5 Гб, а при запуске двух отчетов параллельно сервер насмерть свопился. БД на эскулайте получилась 5 Гб и работала в 60 раз быстрее, причем легко обрабатывала несколько параллельных запросов. Вся хитрость в том, что постгрес не умеет с дисковыми данными работать и все тянет в кэш в ОЗУ, отсюда и уходит в своп. Скулайт же работает с данными на диске, считывая их постранично и не требуя большого количества ОЗУ (только на хранение результата, по большому счету). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 13:27 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Звучит очень убедительно, уже почти начал делать на SQLite, как вы сказали:) Еще одно небольшое сомнение - сейчас появляются системы, использующие для хранения данных просто кучу маленьких файлов(например, фейсбуковская cassandra). Мнение у людей такое: 'Если вы используете доп. прослойку для работы с данными, то у вас просто плохая файловая система (Ганс Райзер)' Может, действительно поставить линукс с той же ReiserFS и обойтись вообще без БД? Типа, БД это пережиток времени, когда файловые системы были еще плохими типа виндовых нынешних:) По идее, ReiserFS - тоже использует B+ дерево для индексов, компрессию поддерживает..А сложные запросы и прочие фичи БД мне и не нужны, сам сделаю если надо, нам не сложные отчеты делать, а просто хренову тучу однотипных выборок/вставок. Что скажете? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 13:46 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
pavlikkk, Я как раз подобную идею проверяю , только на NTFS. В Вашем контексте производительность будет не супер =( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 14:16 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Скажу, что Ганс и многие другие несут чушь :-) Контрпример словам Ганса - оцените эффективность хранения в файлах записей длиной 1 байт. Чувствуете? Будет занято безумно много дискового пространства, кэш ФС "захлебнется", таблица размещения файлов в ФС - "взорвется". Потому утверждения, не учитывающие параметров задачи, есть злостный популизм. И более того - зачастую ФС raiser3/4 работает поверх софтового рэйда и lvm, что, если следовать логике Ганса, есть результат его собственного быдлокода, поскольку его ФС не поддерживает партишионирование и проч. :-) Оценить, когда стоит хранить данные на диске, несложно. Размер блока ФС обычно 4-8 килобайт. Если запись данных занимает в разы больше места, ей самое место именно на диске. Иначе - используйте базы данных, ведь они умеют эффективно хранить именно небольшие записи, где небольшие - меньше или равно по размеру странице БД (те же 4-8 килобайт). Следующий момент - СУБД предоставляют множество разных структур хранения и индексов. Например, в эскулайт есть b-tree индекс, r-tree, полнотекстовый. И вот тут-то обнаруживается серьезное различие с ФС. Обычно используют БД для хранения больших блобов ради встроенной поддержки транзакционности. Скажем так - это безусловно удобно, но может быть весьма непрактично. Заметьте - выши ни слова не сказано о возможностях SQL, речь шла только о форматах хранения как таковых. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 14:20 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
MBGСкажу, что Ганс и многие другие несут чушь :-) Контрпример словам Ганса - оцените эффективность хранения в файлах записей длиной 1 байт. Чувствуете? Будет занято безумно много дискового пространства, кэш ФС "захлебнется", таблица размещения файлов в ФС - "взорвется". Потому утверждения, не учитывающие параметров задачи, есть злостный популизм. И более того - зачастую ФС raiser3/4 работает поверх софтового рэйда и lvm, что, если следовать логике Ганса, есть результат его собственного быдлокода, поскольку его ФС не поддерживает партишионирование и проч. :-) Это все элементарно обходится и решается. MBG Оценить, когда стоит хранить данные на диске, несложно. Размер блока ФС обычно 4-8 килобайт. Если запись данных занимает в разы больше места, ей самое место именно на диске. Иначе - используйте базы данных, ведь они умеют эффективно хранить именно небольшие записи, где небольшие - меньше или равно по размеру странице БД (те же 4-8 килобайт). Есть достаточно эффективные приемы хранения мелких объектов в памяти. Это на два порядка быстрее СУБД. А старые архивные группировать и сбрасывать или в файл или в СУБД. MBG Следующий момент - СУБД предоставляют множество разных структур хранения и индексов. Например, в эскулайт есть b-tree индекс, r-tree, полнотекстовый. И вот тут-то обнаруживается серьезное различие с ФС. Тут да. Если нужно поддерживать несколько индексов поверх ФС, то это уже не так удобно. В памяти - boost::hash_mulitindex. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 14:34 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Siemargl Есть достаточно эффективные приемы хранения мелких объектов в памяти. Это на два порядка быстрее СУБД. А старые архивные группировать и сбрасывать или в файл или в СУБД. Не надо советовать другим то, что вы сами не пробовали. Ваш "рецепт" совершенно нежизнеспособен. Во-первых, два порядка взяты "с потолка". Защита от одновременной модификации данных разными потоками для многих миллионов записей с помощью мьютексов приведет к низкой производительности из-за постоянных блокировок, для решения проблемы придется делать множество наборов данных с отдельным мьютексом для каждого и управлять ими. И производительность будет отнюдь не такая же, как для примера из учебника с 1000-й элементов и без конкурентного доступа. И попробуйте сравнить с prepared запросом к эскулайт БД. При условии нормальной ОС и ФС - к примеру, linux kernel 2.6.32 + ext3. Во-вторых, нет способов, и тем более эффективных, хранить в ОЗУ много данных, т.к. объем ОЗУ сильно ограничен и много данных туда физически не помещается. А если вам все равно придется часть данных поднимать с диска, то все преимущества своих самопальных структур данных вы потеряете, да еще огребете кучу проблем с кодом синхронизации и проч. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 15:06 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
MBG, Давайте постановку задачи (с достаточным упрощением) и проверим порядок. Блокироваться в памяти быстрее, чем блокироваться в кэше БД и в блоках на диске. Только реализации задачи на SQL с Вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 15:39 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
SiemarglMBG, Давайте постановку задачи (с достаточным упрощением) и проверим порядок. Блокироваться в памяти быстрее, чем блокироваться в кэше БД и в блоках на диске. Только реализации задачи на SQL с Вас. Например, вот такой тест: Тестирование SQLite 3.6.17-mobigroup.2 на больших таблицах У вас - с многопоточной модификацией in-memory структуры при добавлении по одной записи, с частотой 1000 записей в секунду, с поддержкой индексов по полям и композитного (как описано в статье). У меня - добавление записей пакетное ежесекундно, число записей в "пакете" - 1000. Для измерения скорости запросов скриптик напишу и статью дополню. Измеряем: 1. Коэффициент доступности в процентах. Например, 80% означает, что 80% времени данные доступны для выборки или что данные блокируются на 0,2 секунды ежесекундно. 2. Скорость выборки набора записей, удовлетворяющих условию (запрос по одному индексу и по композитному, как в статье). В SQL делаю count(*), чтобы избежать затрат времени на передачу извлеченных данных - т.е. измеряется только время непосредственно выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 16:19 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
У меня все готово. 1000 записей в секунду даже несерьезно как-то =) И вставка и поиск занимает 5-10мс. И крохи памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 21:13 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
SiemarglУ меня все готово. 1000 записей в секунду даже несерьезно как-то =) И вставка и поиск занимает 5-10мс. И крохи памяти. Показывайте код и результаты тестов. Интересно мне, как вы b-tree с композитным индексом реализовали для многопоточного окружения. 10 мс - это какая выборка? Сколько времени занимают выборки вида: Код: plaintext
с простым и композитным индексами? Насчет крох памяти - по какому алгоритму выполняете перестройку индексного дерева? Далее, если вставка записи занимает 5 миллисекунд, то в секунду удастся вставить лишь 200 записей. Про какое время вы говорите? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 21:49 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
MBGSiemarglУ меня все готово. 1000 записей в секунду даже несерьезно как-то =) И вставка и поиск занимает 5-10мс. И крохи памяти. Показывайте код и результаты тестов. Интересно мне, как вы b-tree с композитным индексом реализовали для многопоточного окружения. 10 мс - это какая выборка? Сколько времени занимают выборки вида: Код: plaintext
с простым и композитным индексами? Насчет крох памяти - по какому алгоритму выполняете перестройку индексного дерева? Далее, если вставка записи занимает 5 миллисекунд, то в секунду удастся вставить лишь 200 записей. Про какое время вы говорите? Как и говорил, boost::multi_index_contaiter<>. Лочим перед вставкой. 6-10мс выполняются суммарно два запроса Код: plaintext
Вставка 1000 записей (само собой с индексами) занимает 3-5мс. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:32 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Как будете готовы, пришлю .exe - 15кБайт - покрутите на своей машине. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:33 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
SiemarglКак будете готовы, пришлю .exe - 15кБайт - покрутите на своей машине. На кой мне .exe? Я виндоус видел последний раз пару лет назад и то в офисе у заказчика :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:34 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Siemargl Как и говорил, boost::multi_index_contaiter<>. Лочим перед вставкой. 6-10мс выполняются суммарно два запроса Код: plaintext
Вставка 1000 записей (само собой с индексами) занимает 3-5мс. Так, вопрос по тестовому окружению. Сколько памяти у вас на машине? Сколько памяти занимают 100 миллионов записей с индексами? Плюс какой процессор. Насчет ОС уже все понятно - виндоус. По этим двум запросам, пожалуйста, по отдельности время назовите, я их не зря в своих тестах разделил. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:46 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Ну дык засунете в Wine - всего пяток функций из WinAPI - потянет. ( Жаль только пароли стырить не удастся Ж-< ) Кстати как на энтом форуме сворачивать код в + ?? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:46 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Памяти 1М объектов занял 100Мб. Core t7200 2GHz. 10М лень создавать - долго секунд ждать по вашему алгоритму ) А 6мс поиска на 2 делить? И так точности нету. На наносекунды тоже не перейдешь - контекст свитчи больше займут. Надо больше объемов итд. Как определитесь с базовой скоростью на эскулайте - привяжемся к новым количествам. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 22:54 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
SiemarglКстати как на энтом форуме сворачивать код в + ?? Нажми чтобы узнать...волшебное слово spoiler ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 23:00 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
White Owl, спс. Куски кода, о чем речь. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
Еще надо на утечку памяти проверить, только заметил =) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 23:11 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
SiemarglПамяти 1М объектов занял 100Мб. Core t7200 2GHz. 10М лень создавать - долго секунд ждать по вашему алгоритму ) Алгоритм дает очень удобное распределение. И 10М - тоже мало, берите 100М. Siemargl А 6мс поиска на 2 делить? И так точности нету. На наносекунды тоже не перейдешь - контекст свитчи больше займут. Вы б еще на 1 записи тестировали :-) У вас мс - это миллисекунды?.. Siemargl Надо больше объемов итд. Как определитесь с базовой скоростью на эскулайте - привяжемся к новым количествам. Вы о чем? Я тестирую на базе 100М записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 23:15 |
|
Ньюсфид для крупной соцсети. SQLite?
|
|||
---|---|---|---|
#18+
Siemargl, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Нужны 64-бит числа. Иначе нам светит напороться на лимит при активной работе с базой, да и с переносимостью есть проблемы. У эскулайт именно 64 бит int, так что переполнение не грозит. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2010, 23:30 |
|
|
start [/forum/moderation_log.php?user_name=sms_sarov]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 729ms |
total: | 907ms |
0 / 0 |