86
Суб'єктивні погляди на проблеми масштабування додатків, які побудовані на реляційних базах даних

scalability of databases

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: scalability of databases

Суб'єктивні погляди на проблеми масштабування додатків, які побудовані на

реляційних базах даних

Page 2: scalability of databases

Суб'єктивні погляди на деякі проблеми масштабування додатків, які побудовані на

реляційних базах даних

Page 3: scalability of databases

Суб'єктивні погляди на деякі проблеми масштабування веб додатків

Page 4: scalability of databases

Вху із он дьюті тудей?

Андрій Корнілов

Buzzwords:

Linux, php, python, mysql, postgresql, ip-telephony

Page 5: scalability of databases

1998-2000

Кам'янець-Подільський державний університет,

Кафедра інформатики

Page 6: scalability of databases

2000 - 2009

Bitternet.ua

Програміст, системний адміністратор

Проект CityNet, хостінг, розробка системи документообігу, хелпдеску, систем клієнтської статистики, воіп-телефонії і інтеграція всього

з усім

Page 7: scalability of databases

2008-2009

Stelex.com

Програміст в класичній компанії з Філадельфії

Автоматизація бізнес-процесів, документообігу, підтримка процесів прийняття

рішення

OpenText LiveLink, Oracle, MS-SQL

Page 8: scalability of databases

2009-2011

Marktplaats.nl (лідер Ebay classifieds group)

10M клієнтів, 1M онлайн кожного дня

LAMP на 1К серверів

Програміст

Page 9: scalability of databases

2011 -

Lofty.com

Стартап з NYC

Пошук та бронювання готелів

5M номерів в базі

150М за кілька місяців (якщо вдасться моя задача :-))

DBA експерт, python програміст

Page 10: scalability of databases

Це мало б бути в іншій презентації, але це важливо.

Тому воно тут...

Page 11: scalability of databases

Моніторинг

Ви не можете керувати тим, що ви не можете виміряти

Page 12: scalability of databases

Моніторинг

Важливі конкретні цифри

Page 13: scalability of databases

Моніторинг

Важливіше побачити, що щось змінилося (наприклад після чергового релізу)

Page 14: scalability of databases

Моніторинг

Найважливіше бачити (і розуміти) тенденції

Page 15: scalability of databases

Моніторимо все, що можна

● Системні показники: цпу, меморі, дисковий і мережевий іо● Згадайте про СМО● Бізнес показники: кількість відвідувачів● База даних: повільні запити, конкурентні запити і взаємні блокування● Мемкеш: хіт-місс● Підсистеми додатка: пінба

Page 16: scalability of databases

Моніторинг

Моніторинг додатків і компонент == вимірювання якості архітектури

Page 17: scalability of databases

PINBA: архітектура

Клієнтський модуль для PHP

Для будь-якого запита збираєм запроса збираємо script_name, host, time, rusage

Після завершення відправляємо по UDP

І так з усіх машин веб-кластера

Серверний тред в MySQL (v. 5.1.0+)

SQL-інтерфейс до всіх даних

Page 18: scalability of databases

Нам відомі скрипти, періодичність і більш-менш зрозуміло де копати далі

(c) Alexey Rybak, Badoo

Page 19: scalability of databases

Так «протухає» код

(c) Alexey Rybak, Badoo

Page 20: scalability of databases

Короткий сеанс занудства :-)

Page 21: scalability of databases

Чи є щось спільне?

Телефонні станції, супермаркети, автомагістралі, call-центри, ремонтні підприємства…

Page 22: scalability of databases

Відповідь очевидна

Усі вони задовільняють масовий потік вимог випадкового характеру

Page 23: scalability of databases

Але...

Все це саме справедливо і для інтернет проектів!

Page 24: scalability of databases

Мережі масового обслуговування

Перша робота - А.К.Ерланг, «The Theory of Probabilities and Telephone conversations», 1909

Теорія масового обслуговування (теорія черг) — розділ теорії ймовірностей, метою досліджень якого є раціональний вибір структури

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

неї, тривалості очікування і довжини черг. У теорії масового обслуговування використовуються методи теорії ймовірностей та

математичної статистики. (с) wikipedia

Page 25: scalability of databases

Базова модель

Характеристики:

● Кількість вимог в одиницю часу

● Пропускна здатність (кількість обслужених вимог)

● Середній час обслуговування

● Розподіл в часі

● Число відмов в одиницю часу

черга

вимоги обслужені вимоги

переповнення: відмови

канал обслуговування

Page 26: scalability of databases

Недоліки

● Швидка деградація пропускної здатності● Великий середній час обслуговування

Page 27: scalability of databases

N-канальна СМО з очікуванням

черга

вимоги

канали (N)

виконані вимогии

Page 28: scalability of databases

Це архітектура вашого додатку

Шукайте подібні моделі в своїх проектах — все інше, в цілому, вторинне.

Використання подібних підходів збільшить ефективність через:

● Збільшення пропускної здатності системи● Зменшення часу очікування

Page 29: scalability of databases

Масштабування і СУБД

Page 30: scalability of databases

Чому ми говоритимемо саме про СУБД?

Типово:

Пам'ять в десять разів повільніша за регістри ЦПУ

Page 31: scalability of databases

Чому ми говоритимемо саме про СУБД?

Типово:

Мережа в десять разів повільніша за пам'ять

Page 32: scalability of databases

Чому ми говоритимемо саме про СУБД?

Типово:

Диск в десять разів повільніший за мережу

Page 33: scalability of databases

Типові цифри

#00 #01

cache

CPU

Memory

cache

>1e-5 s

<1e-9 s< 1e-6 s

>1e-4 s

“HARD” DISK

FS cache

Network

Page 34: scalability of databases

Чому ми говоритимемо саме про СУБД?

СУБД це на 10% про ЦПУ і на 90% про диск

Page 35: scalability of databases

Основні поняття

- в чому вимірюємо? (система координат): транзакції-гроші, транзакції-кількість

обладнання

- типи масштабування(логарифмічне і лінійне)

Page 36: scalability of databases

Вертикальне масштабування

Відмасштабувати систему вертикально означає додати більш потужне обладнання

Page 37: scalability of databases

Переваги вертикального масштабування

Нічого не треба переписувати!!!!

Взагалі

Page 38: scalability of databases

Недоліки вертикального масштабування

- вендор локінг (хардвер, софтвер - ліцензії)- ціна

- масштабується не лінійно (а значить скоро масштабування перетвориться в надзвичайно

дороге задоволення)

Page 39: scalability of databases

Мастер-слейв масштабування

r/w спліт - пишемо на мастер, читаємо зі слейва

Плюс: слейви різного призначення з різними наборами індексів, різним сторадж

енджайнами

Просунутий варіант: кілька слейвів за одним неймом. Днс раундробін

Бонус: прозорий r/w спліт — sql proxy

39 / 86

Page 40: scalability of databases

Проблеми? - Брокнута реплікація

- Лаги реплікації (в критичних підсистемах після невдалого читання зі слейва треба

спробувати зчитати з мастера)

- Бін лог і “програвання команд” (можливі проблеми з таймстемпами)

- Вимагає підтримки на рівні коду (прозоро - SQL proxy - добро і зло одночасно)

Page 41: scalability of databases

Ще проблеми?..

Проблема деградації: логарифмічне падіння продуктивності зі зростанням кількості слейвів

Однопоточна реплікація в mysql (деякі операції виконуються паралельно але в бін

лог потрапляють послідовно)

Не ефективна утилізація ресурсів (копії даних на диску)

Page 42: scalability of databases

Як працює реплікація

Page 43: scalability of databases

G: 1) тим більше чим «важчі записи» 2) більше, чим інтенсивніший запис

Page 44: scalability of databases

Головна проблема...

Ми змасштабували читання, але запис лишився не

змасштабованим

__autoload__autoload

Page 45: scalability of databases

Масштабування запису

Це основна і найдорожча (у вирішенні) проблема

Page 46: scalability of databases

Розбиття за функціональністю

Єдине, що вам потрібно зробити — знайти кілька дуже завантажених таблиць і

перемістити їх на окремий MySQL server.

Таке розбиття все ще дозволяє зберегти архітектуру простою і працюватиме у

більшості випадків

Page 47: scalability of databases

Що виокремлюємо?

- Логінг і пошук — досить накладні і незалежні операції.

- Система коментарів може бути легко виділена в окрему базу

- В соціальних проектах зв'язки між учасниками можуть бути виділені в окрему

базу.Інші приклади: користувачі, продукти,

транзакції

Page 48: scalability of databases

Обмеження

Нема можливості зробити sql join за межами функціональної області, розміщеної в окрему

базу (в межах бази така можливість зберігається)

Нема можливості підтримувати зсилочну цілісність засобами бази. З'являється необхідність якось опрацьовувати цю

ситуацію — кронджоб або забути про це :-)

Page 49: scalability of databases

Шардінг за ключем або хешем

Вибираємо колонку (наприклад сурогатний праймарі кей) і ділимо дані на n серверів

shard = key % 4

Головна проблема — ви практично фіксуєте кількість серверів, бо вона є частиною хешуючої функції. Добавляння нового

сервера без даунтайму практично не можливе :(

Page 50: scalability of databases

Шардінг за діапазонами значеньМожна поділити дані за діапазонами значень

ключа. Наприклад користувачі з id від 1 до 10000, з 10001 до 20000 і тд. Транзакції за

2008, 2009, 2010 роки. Міста або перші цифри зіп кодів.

Головні проблеми — треба добре вгадати розмір діапазонів, інакше можна отримати

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

значно навантаженішим за позаминулорічний

Page 51: scalability of databases

Шардінг через Lookup Service

Таке розбиття працює використовуючи певний тип сервісу, який ви попередньо маєте

запитати “на якому шарді знаходяться ці дані?”. Це надзвичайно масштабована

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

використовувати обладнання ефективно. Єдина проблема — це складно :-)

Page 52: scalability of databases

● WebApp Координатор

де?

Node # 1234

data

Storage nodes

Page 53: scalability of databases

Чому це складно?

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

2. Операції над даними стають складнішими (резервне копіювання, додавання індексів,

зміна схеми даних)

Перший пункт важливий, але реальною проблемою може стати пункт два. Якщо не використовувати скріптів автоматизації, ви

досить швидко “доживетеся” до повного бардаку, наприклад, із версіями схеми даних

на різних шардах

Page 54: scalability of databases

Також

Центральний довідник може стати єдиною точкою відмови

Page 55: scalability of databases

Приклади

Старий підхід

$connection = new_db_connection("host", port, "dbname");

$statement = $connection->prepare($sql_statement, $params);

$result = $statement->execute();

Page 56: scalability of databases

Приклади

Локатор, базований на URL

$connection = new_db_connection("customer://1234");

$statement = $connection->prepare($sql_statement, $params);

$result = $statement->execute();

Customer — сутність, 1234 — айді сутності

Page 57: scalability of databases

Приклади

Локатор, базований на URL (варіант 2)

/*entity customer://1234 */ SELECT name FROM customer WHERE id = 1234

Page 58: scalability of databases

Приклади

customer://1234 (id)

forums://master (r/w split)

log://January/2008 (date)

Page 59: scalability of databases

Спільні проблеми для всіх схем розбиття

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

чином ці обмеження пов'язані з тим, що запити, які включають кілька таблиць або

велику кількість даних, не можуть бути виконані в межах одного сервера

Page 60: scalability of databases

Join-ни та денормалізація

Вирішення проблеми об'єднання кількох таблиць є денормалізація.

Приклади:- в табличці списку форумів зберігати

загальну кількість постів, тему, дату та автора останнього посту.

- в табличці користувачів записувати час останнього входу в систему

Page 61: scalability of databases

Зсилочна цілісність

Форін кеї не працюють :-(

Для підтримки цілісності даних потрібно створити інфраструктуру крондожобів, для

очистки даних

Також потрібно уважно слідкувати за станом системи, яка реалізує денормалізацію даних

Page 62: scalability of databases

Ребалансінг

Що робити, коли схема розбиття вибрана не правильно?

У випадку розбиття за ключем чи діапазоном значень, вирішення цієї проблеми може бути

дуже болючим і дорогим.

Використання розбиття з використанням сервіс локатора дозволяє зробити простіший

ребалансінг за рахунок вищої складності системи і створення single point of failure

Page 63: scalability of databases

Висновки

Якщо ви підтримуєте розбиття на рівні аплікації питання масштабування для вас

більше не існує

Page 64: scalability of databases

Shared all

Page 65: scalability of databases

Shared nothing

Page 66: scalability of databases

Висновки

Але з'являється комплекс інших питань.Менш критичних для вашого бізнесу.

Ви позбуваєтесь технічних проблем ціною дорожчої розробки

Page 67: scalability of databases

Інші питання

Page 68: scalability of databases

SQL паттерни і антипаттерни

Вибірка за первинним ключемЗабуваємо про джоіни

Заміняємо (де можливо) складні запити на вьюви

Вибираємо рекордсет а не рекордВикористовуємо функції

Page 69: scalability of databases

Зміна схеми

Таличка Юзерс (часто апдейтиться) і табличка Профайл (рідко апдейтиться)

Менші таблички — більше даних вміщається в сторінку даних файлової системи — менше операцій зчитування, щоб отримати ту саму

кількість данихРідко потрібні дані не займають місце в кеші

Page 70: scalability of databases

Count таблички

Page 71: scalability of databases

Count таблички

Page 72: scalability of databases

Асинхронні черги

Якщо шардінг – це розподілення в просторі, то черга – розподілення в часі

Якщо щось можна зробити потім – нехай клієнт не чекає (це часто можна бачити в твітері і фейсбуці)

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

Або використати готовий

Page 73: scalability of databases

Асинхронні черги

● Дозволяють Вам легше масштабуватися● Не кожна дія вимагає негайного виконання

- відсилка пошти, твітів- логування, нотіси- вставка даних в базу, індексування

● Деякі дії можна оптимізовувати для batch виконання

Page 74: scalability of databases

Gearman

● Message Queue● A job coordinator

Ефективний елемент в розподіленій архітектурі

Page 75: scalability of databases

Gearman

<?php

$worker= new GearmanWorker();

$worker->addServer();

$worker->addFunction("reverse", "my_reverse_function");

while ($worker->work());

function my_reverse_function($job)

{

return strrev($job->workload());

}

?>

Page 76: scalability of databases

Gearman

<?php

$client= new GearmanClient();

$client->addServer();

print $client->do("reverse", "Hello World!");

?>

Page 77: scalability of databases

Атомарність і локінг ресурсів

Рейс кондішен при доступі до ресурсів в багатопоточному середовищі

● begin;select * from table where flag = 0 for update;do workCommit;

● exclusive file lock

● update events set status = 'processing', worker_id = 11111 where worker_id is null limit 30;select * from events where status = 'processing' and worker_id = 1111;

● Open tcp port

Не забудьте розлокати :-)

Page 78: scalability of databases

Автолоад

Звичайний __autoload() з php

Page 79: scalability of databases

АІО

Не використовуємо апач

Page 80: scalability of databases

memcache

- libketama

- prolongate patch

- add vs set

- increment vs get, +1, set

- cas - "check and set", значення буде збережене в кеші тільки у випадку, якщо інший клієнт не модифікував його значення з часу, коли цей клієнт його отримав з кешу.

- getmulti/setmulti

Page 81: scalability of databases

Clouds

Повільні... ну те, що там називають “дисками” :-)

Мережа єдина як для надання сервісу так і для доступу до мережевих дисків

Рішенням може бути software raid поверх кількох таких дисків

Page 82: scalability of databases

Екзотика!

Матеріалізовані вьюви: http://code.google.com/p/flexviews/

Матеріалізовані вьюви подібні до звичайних вьювів, за виключенням того, що вони зберігаються в реальних табличках

Паралельне виконання запитів:http://code.google.com/p/shard-query/

Page 83: scalability of databases

Колонкові бази даних

Проблема збереження великих масивів даних

Проблема аналітичних запитів

Page 84: scalability of databases

RTFM

Слайди з конференцій – mysql, velocity, osconn.

Блоги - http://www.mysqlperformanceblog.com/, http://www.planetmysql.com

Книг надзвичайно мало:● High Performance MySQL (2nd ed. Shwartz, Zaitsev & co)● Building Scalable Web Sites (Henderson)● Scalable Internet Architectures (Schlossnagle)● Настройка производительности UNIX-систем (Мусумеси,

Лукидес)

Page 85: scalability of databases

Тут могла бути ваша реклама...

???

Page 86: scalability of databases

Подяки

В презентації використані деякі матеріали Олексія Рибака, представлені ним на конференції Хайлоад 2011