Mysql: Робота зі записами 192 трлн… (Так, 192 трлн.)


39

Ось питання ...

Зважаючи на 192 трлн записів, якими мають бути мої міркування?

Моя головна турбота - швидкість.

Ось стіл ...

    CREATE TABLE `ref` (
  `id` INTEGER(13) AUTO_INCREMENT DEFAULT NOT NULL,
  `rel_id` INTEGER(13) NOT NULL,
  `p1` INTEGER(13) NOT NULL,
  `p2` INTEGER(13) DEFAULT NULL,
  `p3` INTEGER(13) DEFAULT NULL,
  `s` INTEGER(13) NOT NULL,
  `p4` INTEGER(13) DEFAULT NULL,
  `p5` INTEGER(13) DEFAULT NULL,
  `p6` INTEGER(13) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY (`s`),
  KEY (`rel_id`),
  KEY (`p3`),
  KEY (`p4`)
    );

Ось запити ...

SELECT id, s FROM ref WHERE red_id="$rel_id" AND p3="$p3" AND p4="$p4"

SELECT rel_id, p1, p2, p3, p4, p5, p6 FROM ref WHERE id="$id"

INSERT INTO rel (rel_id, p1, p2, p3, s, p4, p5, p6)
VALUES ("$rel_id", "$p1", "$p2", "$p3", "$s", "$p4", "$p5", "$p6")

Ось кілька приміток ...

  • SELECT буде робитися набагато частіше, ніж ВСТУП. Однак час від часу я хочу додати кілька сотень записів одночасно.
  • По мірі завантаження, годинами нічого не буде, можливо, кілька тисяч запитів відразу.
  • Не думаю, що я більше не можу нормалізувати (потрібні значення p у комбінації)
  • База даних в цілому дуже реляційна.
  • Це буде найбільша таблиця на сьогоднішній день (наступна найбільша - близько 900 к)

ОНОВЛЕННЯ (11.11.2010)

Цікаво, що мені дали другий варіант ...

Замість 192 трлн я міг би зберігати 2,6 * 10 ^ 16 (15 нулів, тобто 26 квадрильйонів) ...

Але в цьому другому варіанті мені потрібно буде зберегти лише один bigint (18) як індекс у таблиці. Це все - лише одна колонка. Тож я би просто перевіряв наявність цінності. Іноді додаючи записи, ніколи не видаляючи їх.

Тож я змушує думати, що повинно бути краще рішення, ніж mysql для простого зберігання номерів ...

З огляду на цей другий варіант, чи варто його взяти чи дотримуватися першого ...

[редагувати] Щойно отримали новини про тестування, яке було зроблено - 100 мільйонів рядків із цією установкою повертає запит за 0,0004 секунди [/ редагувати]


7
Який набір ви використовуєте для цього MySQL? Чи можете ви переконатись перейти на інші dbms, якщо хтось наводить вагомі аргументи для цього?
WheresAlice

3
Трильйон, як у 10 ^ 12 або як у 10 ^ 18?
andol

15
На 192 трлн записів у вас повинен бути бюджет, який дозволяє задавати питання комітентам MySQL, а не деяким дискусійним форумам.
Рем Русану

5
Що стосується такої великої (і, очевидно, пристойного бюджету) бази даних, чому б не піти з рішенням oracle або sql serer, яким було доведено, що легко обробляти великі БД?
Джим Б

5
Не забудьте постійно інформувати нас, коли ви впроваджуєте це. Мені, звичайно, було б цікаво. Ви також можете написати це для highscalability.com
Том О'Коннор

Відповіді:


30

Оцінка pQd 7PB здається розумною, і це дуже багато даних для RDBMS. Я не впевнений, що коли-небудь чув, щоб хтось робив 7PB з будь-якою спільною дисковою системою, не кажучи вже про MySQL. Запит цього обсягу даних у будь-якій спільній дисковій системі буде незвично повільним. Найшвидший апарат SAN забезпечує максимальну швидкість 20 Гб / с навіть під час налаштування на великі потокові запити. Якщо ви можете дозволити собі апаратну техніку SAN цієї специфікації, ви можете дозволити використовувати щось краще для роботи, ніж MySQL.

Насправді я намагаюся уявити сценарій, коли ви могли б мати бюджет для дискової підсистеми цієї специфікації, але не для кращої платформи СУБД. Навіть використовуючи диски 600 Гб (найбільший 15-кілограмовий накопичувач на ринку на даний момент на ринку), ви готові на щось на зразок 12 000 фізичних дискових накопичувачів, щоб зберігати 7PB. SATA-диски були б дешевшими (а з 2 ТБ-дисками вам знадобиться приблизно 1/3 від кількості), але зовсім трохи повільніше.

SAN з цієї специфікації від такого великого постачальника, як EMC або Hitachi, обійдеться до багатьох мільйонів доларів. Минулого разу, коли я працював із обладнанням SAN від великого постачальника, вартість передачі місця на IBM DS8000 становила понад 10 000 фунтів / ТБ, не враховуючи жодної надбавки до капіталу для контролерів.

Вам дуже потрібна загальнодоступна система нічого, як Терадата або Нетеца, для цих даних. Розгортання бази даних MySQL може спрацювати, але я рекомендую цільову платформу VLDB. Система загального користування також дозволяє використовувати набагато дешевший диск із прямим приєднанням на вузлах - погляньте на платформу Sun X4550 (thumper) для однієї можливості.

Вам також потрібно продумати свої вимоги до продуктивності.

  • Який прийнятний час виконання запиту?
  • Як часто ви будете запитувати свій набір даних?
  • Чи можна вирішити більшість запитів за допомогою індексу (тобто вони будуть шукати невелику частку - скажімо: менше 1% - даних), чи потрібно провести повну перевірку таблиці?
  • Як швидко дані будуть завантажуватися в базу даних?
  • Чи потрібні ваші запити оновленими даними чи ви можете користуватися періодично оновленою таблицею звітів?

Коротше кажучи, найсильніший аргумент проти MySQL полягає в тому, що ви б робили зворотні фліпсини, щоб отримати гідну ефективність запитів над 7PB даних, якщо це взагалі можливо. Цей об'єм даних насправді переносить вас на територію загального користування, щоб зробити щось, що запитує його досить швидко, і вам, ймовірно, потрібна буде платформа, яка була створена для роботи в режимі загального користування з самого початку. Самі диски збираються зменшити вартість будь-якої розумної платформи СУБД.

Примітка. Якщо ви розділяєте операційні бази та бази даних звітів, вам не обов’язково використовувати однакову платформу СУБД для обох. Отримати швидкі вставки та доповіді на другу секунду з тієї ж таблиці 7PB, принаймні, буде технічним завданням.

З огляду на ваші коментарі, що ви можете жити з певною затримкою у поданні звітів, ви можете розглянути окремі системи захоплення та звітності, і вам може не потрібно зберігати всі 7PB даних у вашій операційній системі захоплення. Розгляньте таку операційну платформу, як Oracle (MySQL може це зробити з InnoDB) для збору даних (знову ж таки, вартість самих дисків призведе до зменшення вартості СУБД, якщо у вас багато користувачів) та платформи VLDB на зразок Teradata, Sybase IQ, RedBrick, Netezza (примітка: власницьке обладнання) або Greenplum для звітності


1
@ConcernedOfTunbridgeW - вони завжди можуть піти так: blog.backblaze.com/2009/09/01/… - набагато веселіше, ніж SAN, потрібно лише ~ 120-130 4U коробки ... але я не впевнений, чи ' бізнес 'був би радий ....
pQd

По суті, Sun Thumper про бюджет і справді приклад варіанту для вузла в системі, що ділиться нічим. Я впевнений, що бачив і інші варіанти для цього, але не можу придумати, де. Питання не стільки в тому, яке обладнання, а в якій платформі бази даних.
Занепокоєний

Однак завзяті спостерігачі зауважать, що будь-який тип прямого прикріпленого вікна, подібний до цього, набагато дешевше за туберкульоз, ніж усе, що базується на SAN, що є принаймні одним вагомим аргументом на користь чогось, призначеного для роботи на платформі, що ділиться нічим .
ЗанепокоєнийOfTunbridgeWells

@ConcernedOfTunbridgeWells і ви можете запускати всі ці запити / технічне обслуговування та будь-що інше паралельно у кількох вікнах [інакше голодний від влади].
pQd

1
@ConcernedOfTunbridgeWells - щоб відповісти на ваші запитання ... Мені потрібно близько 500 запитів, щоб повернутися за секунду, якщо це можливо. Я буду робити це лише кілька сотень разів на день. Якщо запит працює, повну таблицю потрібно сканувати. Крім того, INSERT є нижчим пріоритетом, ніж SELECT, так що це не повинно бути десь поруч. Я можу почекати кілька годин, щоб "нові" дані потрапляли в базу даних.
Сара

16

відшаровувати. при такому розмірі, коли один великий екземпляр - це самогубство - подумайте про можливе відновлення резервного копіювання, пошкодження простору таблиці, додавання нових стовпців або будь-які інші процеси "зберігання будинків" - все це неможливо зробити в розумний час в таких масштабах.

проста зворотна частина обчислення конверта - припускаючи 32-бітні цілі числа для всіх стовпців, крім 64-бітного ідентифікатора; відсутні індекси:

8 * 4B + 8B = 40B на рядок [і це дуже оптимістично]

192 трильйони рядків 40B кожен дає нам майже 7 PB

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

питання для відповіді:

  • який допустимий час простою у випадку збоїв / перезавантаження системи?
  • який доступний час простою, коли вам потрібно відновити резервне копіювання або витягнути сервер з виробництва для планового обслуговування.
  • як часто і де робити резервну копію?

випадкові посилання - швидкість вставок:


Я згоден - 7PB досить важкий. Мені б хотілося переосмислити це і знайти більш легке рішення, але мені потрібно знайти існування (або відсутність) певної комбінації полів p. Розбиття таблиць перехрестило мою думку - це розумніше, але тоді це просто означає, що я отримав запит до кожної таблиці по черзі. Не цікаво, скільки таблиць ви б рекомендували розділити тут?
Сара

5
@Sarah - я б не рекомендував розділяти на таблиці, але й машини. ви можете запускати запити паралельно, щоб отримати продуктивність [я це роблю в меншому масштабі]. що з пошкодженнями файлової системи або навіть звичайною перевіркою після перезавантаження сервера? я не впевнений, що ви маєте на увазі під пошуком конкретної комбінації ... можливо, простий магазин ключових значень допоможе? розмір столу - не більше кількох десятків ГБ; дані на одному сервері - не більше ніж кілька ТБ. подивіться на stackoverflow.com/questions/654594, щоб знати, який головний біль очікувати в набагато менших масштабах; використовувати innodb_file_per_table
pQd


2

Можливо, є й інший спосіб, а не зберігання чотирикутників чисел, якщо все, що ви хочете зробити, це побачити, чи є вони у наборі. Блум-фільтри - це ймовірнісний метод шляхом хешування кількома способами. Також можливі помилкові позитиви, але помилкові негативи - ні. (Так, це може сказати, що число є в наборі - і помиляється, але воно не скаже, що його немає, якщо це було насправді). Ще існує проблема величезної кількості предметів для зберігання, але принаймні це може дещо зменшити розмір робочого набору даних.


Звучить цікаво, хоча я можу жити з помилковими негативами - але не з помилковими позитивами :)
Сара

2

Редагувати: насправді, якщо це лише існування "запису" у розташуванні X у діапазоні цілих чисел, ви можете усунути сховище даних і просто використовувати растрову карту ... Отже, 10 або більше машин зі 100 ТБ дискового простору (тож у вас є 10 копій вашої растрової карти для продуктивності та резервного копіювання), і якщо ви зробили 128 Гб оперативної пам’яті на сервері, ви можете встановити індекс блоку групи верхнього рівня високої роздільної здатності в пам’яті, щоб зробити першу перевірку, перш ніж потрапити на диск для біта X 26 квадратних мільйонів .

Я б пішов на варіант №2. Якщо ви візьмете:

375 машин з 64 ТБ (32 дисками 2 ТБ) кожна (реально 400 машин для відмов), а потім просто зіставити записи на ZVOL, які по 2 ТБ кожен. Потім на одному або декількох серверах індексів збережіть у масиві Джуді чи критичному масиві або просто звичайну растрову карту - відображення, якщо ви додали запис до цього 1 із 26 квадратних мільйонів. Індекс складе від 50 до 100 ТБ, і ви навіть можете мати індекс другого рівня, який би вказував, якби були записані записи до певного блоку 64k адрес, який міг би менше 64 ГБ оперативної пам’яті і забезпечив би швидкий рівень початкової перевірки якщо певне «сусідство» було порожнім чи ні.

Потім, щоб прочитати цей запис, ви спершу перевірте, чи є запис, щоб знайти, переглянувши індекс. Якщо є, то перейдіть до машини # (X) / ZOL # (Y) на цій машині / записуйте місце розташування # (Z) в межах цього блоку 2 ТБ на основі простого обчислення індексу. Одиночні перегляди записів були б надзвичайно швидкими, і ви можете перевірити завантаження деяких частин сховища даних у різні dbs (у той час як ви використовуєте сховище даних для реальної роботи) і зробите тестування продуктивності, щоб побачити, чи змогли вони підтримувати всю вашу базу даних - чи ні, просто використовуйте сховище даних таким чином.

ZOL - це річ ZFS, яку можна думати про розріджений файл в інших файлових системах, тому подібні речі застосовуються. Або ви можете просто проіндексувати певне число байтів на диску, але це стає складним, якщо диски різного розміру, якщо ви не обмежуєте кількість байтів, що використовуються на диску, на рівні, який працює для всіх дисків - тобто 1,75 ТБ на диск 2 ТБ . Або створити метапристрої фіксованого розміру тощо.


Привіт Сара - не впевнений, чи ти все ще працюєш над цим, але якщо тобі потрібна допомога, я міг би прообразувати свою ідею для тебе на 100ТБ-машині, а також хотів би прийняти (у великому центрі обробки даних США) та керувати повним кластером виробництва 400-500 машин за потребою. До речі, ви коли-небудь працювали в CNET в SF?

1

Окрім налаштування ваших параметрів БД, як божевільних (використовуйте mysqltuner для допомоги), щоб спробувати зберегти ваші SELECTs кешовані настільки, наскільки це можливо, по-людськи, одна річ, яку ви можете дослідити, - НАЧАЛЬНА ТРАНЗАЦІЯ / CoMMIT (припускаючи InnoDB), вставляючи кілька сотень записів, щоб уникнути рядок за рядком блокуючи накладні і зменшуйте час вставки величезним фактором. Я також створив би таблицю як MyISAM, так і InnoDB і запустив би тести на ній, щоб побачити, що справді швидше, коли ви кешируєте кешування - не завжди MyISAM буде швидшим для читання - перевірте це:

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

Під час вашого тестування кількість одночасних потоків також слід змінювати вгору і вниз, поки ви не знайдете йому приємне місце, скільки оперативної пам’яті ви можете собі дозволити на сервері, щоб присвятити налаштування кешів; Ви можете виявити, що, хоча ви можете підтримувати більше потоків математикою, сам БД може насправді працювати гірше, якщо кількість потоків буде занадто високою.

Крім того, якщо ви використовуєте файл MyISAM та / або файл InnoDB за таблицею, ви можете дослідити створення іншої точки монтажу файлової системи для / var / lib / mysql, яка була налаштована на менший розмір блоку та налаштована на параметри типу fs - тобто ext3 / ext4 / resiserfs ви можете використовувати data = writeback для журналу та відключити оновлення часу доступу у файловій системі для швидкості вводу / виводу.


1
мійсам, здається, не виникає сумніву через вимоги до транзакцій.
pQd

0

Для другого варіанту, скільки цифр, ймовірно, буде розміщено фактично?

Якщо буде лише одна з тисячі, або 10 К, 100 К тощо, то зберігання діапазонів використаних (або невикористаних) номерів може зберегти трильйони записів. наприклад: зберігання ("вільний", 0,100000), ("взято", 100000,100003), ("вільний", 100004,584234) - розділення рядків на два або три ряди, як потрібно, та індексація на перше число, шукаючи x <= {needle}, щоб дізнатися, чи прийнятий діапазон, що містить шуканий номер, чи вільний.

Можливо, вам навіть не потрібні обидва статуси. Просто зберігайте той стан, який є найменш вірогідним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.