Хранение большого объема данных

12
Lord Maverik
На сайте с 15.04.2003
Offline
471
2448

Используется API для получения данных (товаров), API платный, поэтому необходимо минимизировать обращения. Для этого используется свой собственный кеш данных.

Также появилась задача на основе своего кеша показывать выборки, которые не может предоставить API.

Данные приходят в XML или JSON, я сам указываю в каком формате, поддерживаются оба варианта. JSON по идее удобнее.

Сейчас все хранится в файлах. Миллионы файлы, много, очень много. Стараюсь разбивать по разным папкам. По размеру ну гигов 500 наверное уже.

Каждый запрос просто полностью кладется в файл. В нем очень полей и значений. И потом смотрю есть данные в кеше, просто читаю файлы и выдаю вместе реального запроса.

Проблем несколько. Чистить кеш очень тяжело, сервак по сути умирает на это время.

Делать выборки по кешу нереально.

Сейчас хочу перенести все это на базу данных.

Прочитал в Mysql 5.7.6+ есть поддержка полей JSON и генерируемые поля.

Полей будет с десяток наверное.

Что хочу хранить.

1. Запросы на поиск. Разные варианты поиска. Т.е. просто нужно сохранить, строку идентификатор поиска, и результат - данные (json).

2. Сами товары. Идентификатор, данные (json), набор полей. Ну например Бренд и тому подобное.

Как лучше всего такое делать такое? Нормально ли запихнуть это все в MYSQL будет? Не сдохнет ли мускуль от таблиц таких размеров?

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
lutskboy
На сайте с 22.11.2013
Offline
178
#1

не сдохнет. если выборку по айди делать

U
На сайте с 20.04.2017
Offline
16
#2

Clickhouse может подойти. 1Тб там это нормальное количество. Если кеш нужно чистить по дням, например удалить все старше 30 дней то тут подойдут подневные партиции (по умолчанию там месяц кажется).

Lord Maverik
На сайте с 15.04.2003
Offline
471
#3
urite:
Clickhouse может подойти. 1Тб там это нормальное количество. Если кеш нужно чистить по дням, например удалить все старше 30 дней то тут подойдут подневные партиции (по умолчанию там месяц кажется).

Немного не то. За совет спасибо.

danforth
На сайте с 18.12.2015
Offline
153
#4
urite:
Clickhouse может подойти. 1Тб там это нормальное количество. Если кеш нужно чистить по дням, например удалить все старше 30 дней то тут подойдут подневные партиции (по умолчанию там месяц кажется).

Clickhouse не про это, она коллоночная база данных, она скорее про аггрегацию значений и постоянную запись, и про всякие паттерны 3д кубов и прочего. Это OLAP, автору на сколько я понял нужно OLTP.

Зачем вам JSON тип? Вы по нему искать собираетесь? Если да, то лучше PostgreSQL, или на крайняк Mongo. Если искать по JSON нет нужды - берите любую СУБД, поиску присваиваете идентификатор, JSON не храните в типе JSON, т.к. там валидация происходит. Просто берите BLOB и храните массив байт.

На счет справится/не справится, справится и с бОльшим количеством. Делаете партиции и все будет работать вполне себе.

А вообще, структура ваших данных и необходимые выборки до конца не ясны.

Junior Web Developer
edogs software
На сайте с 15.12.2005
Offline
775
#5
Lord Maverik:
Используется API для получения данных (товаров), API платный, поэтому необходимо минимизировать обращения. Для этого используется свой собственный кеш данных.
Также появилась задача на основе своего кеша показывать выборки, которые не может предоставить API.
Данные приходят в XML или JSON, я сам указываю в каком формате, поддерживаются оба варианта. JSON по идее удобнее.
Сейчас все хранится в файлах. Миллионы файлы, много, очень много. Стараюсь разбивать по разным папкам. По размеру ну гигов 500 наверное уже.
Каждый запрос просто полностью кладется в файл. В нем очень полей и значений. И потом смотрю есть данные в кеше, просто читаю файлы и выдаю вместе реального запроса.
Проблем несколько. Чистить кеш очень тяжело, сервак по сути умирает на это время.
Делать выборки по кешу нереально.
Сейчас хочу перенести все это на базу данных.
Прочитал в Mysql 5.7.6+ есть поддержка полей JSON и генерируемые поля.
Полей будет с десяток наверное.
Что хочу хранить.
1. Запросы на поиск. Разные варианты поиска. Т.е. просто нужно сохранить, строку идентификатор поиска, и результат - данные (json).
2. Сами товары. Идентификатор, данные (json), набор полей. Ну например Бренд и тому подобное.

Как лучше всего такое делать такое? Нормально ли запихнуть это все в MYSQL будет? Не сдохнет ли мускуль от таблиц таких размеров?

1) Без проблем, хотя nosql база данных при таком объеме будет лучше.

2) Плохая идея. json / генерируемые столбцы хранятся виртуально, а не реально физически. И несмотря на возможность индексации - поиск по ним будет достаточно тормозным. Делайте таблицу с реальными полями по которым будет поиск (только с ними), полные json данные храните в отдельной таблице вообще (например в таблице из пункта 1). Если сможете нормализовать данные - будет вообще шикарно, но это как бы и так очевидно.

а) mysql такой объем вполне готов переваривать, но обратите внимание на myisam вариант. innodb неплох, но в сравнении с myisam может быть тормознее на относительно простых запросах.

б) если это хоть как-то возможно, используйте не утф8, а однобайтовую кодировку. Эта статейка до сих пор актуальна и такой вариант может сэкономить Вам реально много ресурсов.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
Mik Foxi
На сайте с 02.03.2011
Offline
1120
#6
edogs:
1) Без проблем, хотя nosql база данных при таком объеме будет лучше.
2) Плохая идея. json / генерируемые столбцы хранятся виртуально, а не реально физически. И несмотря на возможность индексации - поиск по ним будет достаточно тормозным. Делайте таблицу с реальными полями по которым будет поиск (только с ними), полные json данные храните в отдельной таблице вообще (например в таблице из пункта 1). Если сможете нормализовать данные - будет вообще шикарно, но это как бы и так очевидно.

а) mysql такой объем вполне готов переваривать, но обратите внимание на myisam вариант. innodb неплох, но в сравнении с myisam может быть тормознее на относительно простых запросах.
б) если это хоть как-то возможно, используйте не утф8, а однобайтовую кодировку. Эта статейка до сих пор актуальна и такой вариант может сэкономить Вам реально много ресурсов.

1) nosql и прочие монги шмонги не будут лучше.

2) просто json можно хранить в текстовом поле и нормально по нему искать при этом, лишнего кода и объема это не добавляет.

P.S. я помню так в sqlite хранил кеш запросов к апи партнерки где слон. 50 гб файл нормально жил :D хотя это было не самое умное решение.

---------- Добавлено 28.04.2019 в 10:28 ----------

А по поводу объема, если поиск по этим текстам не нужен и все запросы по id , то текст (json) должен отлично сжиматься через gzdeflate, если текста в каждой ячейке много.

Универсальный антибот, антиспам, веб файрвол, защита от накрутки поведенческих № 1 в рунете: https://antibot.cloud/
danforth
На сайте с 18.12.2015
Offline
153
#7
edogs:
Без проблем, хотя nosql база данных при таком объеме будет лучше.

Когда пишете NoSQL, пишите какая именно. Бывают варианты для полностью противоположных задач.

edogs:
2) Плохая идея. json / генерируемые столбцы хранятся виртуально, а не реально физически. И несмотря на возможность индексации - поиск по ним будет достаточно тормозным.

На самом деле, в некоторых случаях поиск по JSON даже быстрее, чем по реляционной модели.

edogs:
Если сможете нормализовать данные - будет вообще шикарно, но это как бы и так очевидно.

Я так понял, там особо нечего нормализовать. Есть какой-то идентификатор, и куча байт которые нужно вернуть.

edogs:
но обратите внимание на myisam вариант. innodb неплох, но в сравнении с myisam может быть тормознее на относительно простых запросах.

Да, действительно, обратите внимание на движок, который при малейшем сбои может покорраптить все таблицы. Приведите примеры, на каких запросах может быть тормознее (кроме COUNT(*))

foxi:
А по поводу объема, если поиск по этим текстам не нужен и все запросы по id , то текст (json) должен отлично сжиматься через gzdeflate, если текста в каждой ячейке много.

Кстати, да. Но если нужно сжатие, я бы взял MyRocks, мы так одну базу до 400Гб ужали (с 1Тб)

Сейчас вот как раз есть одна толстая таблица на почти 3 млрд строк:

SELECT table_rows FROM information_schema.tables WHERE table_name = 'my_table_name';

+------------+
| table_rows |
+------------+
| 2795222610 |

А вот время выборки по PK:

379 rows in set (0.017 sec)

Таблица без партиций, кстати. Можно сделать PARTITION BY HASH(col) PARTITIONS 20; и будет все ещё быстрее работать

T7
На сайте с 19.09.2018
Offline
63
#8
foxi:
1) nosql и прочие монги шмонги не будут лучше.

Наверное все таки зависит от того что надо, а в данном случае это не до конца ясно. С учетом того, что

XML или JSON, я сам указываю в каком формате, поддерживаются оба варианта. JSON по идее удобнее

я бы монгу-шмонгу и пр. носкуэл не исключал. Например, каждая категория - отдельная коллекция (таблица в терминах скуэл бд), их, категорий,например, в Я-маркете, если не изменяет память что то между 2000-3000. Порядок цифр примерно ясен, явно меньше 24000 .

A 16 megabyte namespace file can support approximately 24,000 namespaces. Each collection and index is a namespace.

А дальше дело техники

db.fotoapparaty.find( { optzoom: { $gte: 40, $lte: 80 } } );

db.planshety.remove( { addtime : { $lt : new Date(2018, 12, 31) } })

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

foxi:
2) просто json можно хранить в текстовом поле и нормально по нему искать при этом, лишнего кода и объема это не добавляет.

И диапазоны? Ну типа "Оптический Zoom от 40 до 80"

edogs software
На сайте с 15.12.2005
Offline
775
#9
danforth:
Когда пишете NoSQL, пишите какая именно. Бывают варианты для полностью противоположных задач.

Для задач ТС - по фиг.

danforth:
На самом деле, в некоторых случаях поиск по JSON даже быстрее, чем по реляционной модели.

Нет.

danforth:
Я так понял, там особо нечего нормализовать. Есть какой-то идентификатор, и куча байт которые нужно вернуть.

Возможно, но в пункте 2 есть "набор полей", а не просто "ид и дсон".

danforth:
Да, действительно, обратите внимание на движок, который при малейшем сбои может покорраптить все таблицы.

Холивары на эту тему отгремели лет 5 назад уже, мы не будем это начинать тут и сейчас, но просто отвечая на вопрос - при небольшом сбое ничего не будет, при среднем - майисаму понадобится репаир тейбл и все на этом, при крупном - иннобд умрет а майисам потеряет часть данных. И не забывайте какой размер логов бинарных транзакций будет на базе размером в 500гб.

danforth:
Приведите примеры, на каких запросах может быть тормознее (кроме COUNT(*))

https://www.percona.com/blog/2009/01/12/should-you-move-from-myisam-to-innodb/ до сих пор актуальная статья.

danforth
На сайте с 18.12.2015
Offline
153
#10
edogs:
Для задач ТС - по фиг.

Бггг, ну и бред. Т.е., берем любую TSDB и пишем туда. Отличный совет. Уже на этом можно прекращать дискуссию, но ладно.

edogs:
Нет.

Да.

edogs:
при небольшом сбое ничего не будет, при среднем - майисаму понадобится репаир тейбл и все на этом, при крупном - иннобд умрет а майисам потеряет часть данных.

Это прямо из документации вырезка.

edogs:
И не забывайте какой размер логов бинарных транзакций будет на базе размером в 500гб.

Какой, если я их отключу, а буду использовать redo log из InnoDB?

  • Table level locking
  • Не ACID compliant
  • Не умеет самовосстанавливаться, если упадет ночью - будет простой
  • Глобальный лок при бекапе (логическом и физическом), когда будете делать бекап - позовите меня, посмотрю как все ждут когда бекап базы на 500 гб закончится.
edogs:
https://www.percona.com/blog/2009/01...sam-to-innodb/ до сих пор актуальная статья.

Да, как и все другие статьи вышедшие 10 лет назад.

Я бы ещё понял если бы вы посоветовали использовать MyISAM под табличку которая никогда не изменяется, используется под read-only, и в ней 500 не важных строк.

Ладно, не хочу время тратить на этот бессмысленный спор. Используйте и дальше MyISAM, пока его не выкинут из MySQL.

12

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