книги хакеры / журнал хакер / 187_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|||||
P |
|
|
|
|
|
NOW! |
o |
|
|
|
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m |
|||||
|
|
ХАКЕР |
08 /187/ 2014 |
|
Что нового в NewSQL? |
|
|
129Click |
|
|
|
|
|
|
|||||||||||||
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
.c |
|
|
|
|
|
w |
|
|
|
|
|
|
|
.c |
|
|||
|
. |
|
|
|
|
g |
|
|
|
|
|
|
. |
|
|
|
|
g |
|
||||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
проса можно посмотреть план выполнения, но там мало ин- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
формации для оптимизации. Это, скорее, декларация реше- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
Management |
Client |
Client |
Client |
ния оптимизатора. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Client |
В отличие от VoltDB, MemSQL не накладывает ограничений |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
на сложность запросов и количество участвующих в них парти- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
цированных таблиц, но все промежуточные результаты хранит |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
Domain |
|
|
|
во временных таблицах на агрегаторе и честно предупреждает |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
о возможности отказа из-за нехватки памяти на больших за- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
ţost A |
|
ţost B |
ţost C |
просах. Для репликации MemSQL умеет создавать только две |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
копии данных: основную и резервную. При этом резервная |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
Broker |
|
Agent |
Agent |
копия не участвует в операциях и должна быть создана на от- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
дельном листе. Если хочешь включить резервирование, тебе |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
нужно в два раза больше листов в кластере. Не очень удобно. |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
Txn Engine |
|
Txn Engine |
Txn Engine |
Никаких хранимых процедур в MemSQL нет: база не под- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
держивает даже триггеры и представления. Ну, если не считать |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
Database A |
|
|
|
скомпилированные запросы за процедуры :). Хотя MemSQL |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
декларирует поддержку ACID-транзакций, фактически каждый |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
Storage |
|
Storage |
Storage |
запрос выполняется в отдельной транзакции. А для некоторых |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
изощренных случаев, таких как ошибка на вставке несколь- |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
Manager |
|
Manager |
Manager |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
ких записей перечислением значений, может закоммититься |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
только часть измененных записей. Вот такая атомарность. |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Уровень изоляции read committed. Но разработчики признают, |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
что при изменении данных на нескольких партициях возможно |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
грязное чтение. Вот такая изолированность. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Надежность фиксации данных, как и в VoltDB, обеспе- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
чивается снапшотами и журналом транзакций. Да вот беда, |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
по умолчанию журнал пишется на диск асинхронно. Недоста- |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
сты (leaf). Агрегаторы принимают запросы от пользователей, |
Распределение ролей |
точно кисло? Несмотря на то что MemSQL заявляется как lock- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
модифицируют и рассылают запросы листам, агрегируют |
в кластере NuoDB |
free база, блокировки используются, и на это явно указывается |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
результаты. Есть главный агрегатор, который отвечает за соз- |
|
в документации, например, удаление индекса блокирует опе- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
дание БД и таблиц и целостность кластера в целом. Листы |
|
рации изменения данных. И да, есть команда для установки |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
непосредственно хранят данные и выполняют (частичные) |
|
явной блокировки на таблицу. Реверансом в сторону класси- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
запросы. При падении мастера-агрегатора кластер остается |
|
ческих баз является разделение прав доступа. База поддер- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
работоспособным, хотя DDL-запросы выполнять уже нельзя. |
|
живает многопользовательскую работу. Набор привилегий |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
Автоматически новый мастер-агрегатор не назначается. |
|
достойный, но выдавать на отдельные объекты базы их нельзя. |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
В отличие от VoltDB, в кластере можно держать несколько |
|
NUODB |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
баз данных. При создании базы сразу создается определен- |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
ное число партишенов (по умолчанию — по восемь на лист). |
|
Создатели NuoDB решили сделать развертывание кластера |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
Любопытно, что партишены на листах представлены отдель- |
|
в облаке приятным и необременительным занятием. Кажется, |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
ными базами данных, только с числовыми суффиксами. На- |
|
удалось это им не очень. Зато уровень рекламного буллшита |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
пример, если ты создал в кластере БД под именем «test», |
|
в документации зашкаливает. Это проприетарная СУБД, на- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
но на листах будут созданы БД-партиции «test_1», «test_2» |
|
писанная преимущественно на Java. Первый релиз состо- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
и так далее. |
|
|
|
ялся в январе 2013-го. Начнем с типов узлов, точнее, типов |
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
В MemSQL, как и в VoltDB, присутствует два типа таблиц: |
|
процессов, которые запускаются в кластере (в терминологии |
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
справочные (reference) таблицы, которые копируются на все |
|
NuoDB — домене). Есть один брокер — основной процесс, |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
узлы кластера (включая агрегаторы), и шардированные |
|
который собирает домен в единое целое. К нему клиент под- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
(sharded) таблицы, которые размазываются по партициям |
|
ключается в первую очередь и узнает о конфигурации домена. |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
по хешу ключа. Ключом шардирования может быть любой |
|
На каждом узле запущены агенты, которые общаются с бро- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
столбец таблицы, только этот столбец должен входить в пер- |
|
кером и докладывают о состоянии узлов. База данных соз- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
вичный ключ этой таблицы. И в уникальный индекс, если та- |
INFO |
дается через брокер, в нее входит один или более движков |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
кой понадобится. И во внешний ключ, конечно, тоже. Так |
транзакций (Transaction Engine) и один или более менеджеров |
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
в MemSQL решили проблему связности данных, на которую |
Фрактальные |
хранения (Storage Manager). К первому подключаются кли- |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
в VoltDB просто закрыли глаза. |
|
енты для выполнения запросов, второй отвечает за хранение |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
MemSQL может определить, что запрос затрагивает только |
индексы прикрутили |
данных. При создании БД задается, сколько именно должно |
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
одну партицию, и оптимизирует его, отсылая только на один |
и к MongoDB — в одном |
быть создано движков и менеджеров и на каких именно узлах |
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
лист. Все запросы на изменение данных могут выполняться |
неофициальном форке. |
домена они должны быть расположены. |
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
только на узлах-агрегаторах, вне зависимости от того, сколь- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
ко партиций затрагивает запрос. Кроме того, явно запрещены |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
любые манипуляции с первичным ключом (для защиты от из- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
менения ключа шардинга). Главной особенностью MemSQL |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
является компиляция запросов. Любой SQL-запрос (все DML |
ųŚřŖŦ ŠŤŚŚ |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
и некоторые DDL) превращается в код на C++ (SELECT * FROM |
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
TEST превращается в две сотни строк чего-то нечитаемого). |
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
Этот код компилируется обычным GCC в разделяемую библи- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
отеку, которая подключается к серверу. |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
Код параметризованный, все значения, встречающиеся |
Британский ученый. Создатель реляцион- |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
в WHERE секции запроса, являются параметрами. В дальней- |
ной модели данных (60–70-е годы ХХ века). |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
шем все подобные запросы (с тем же набором параметров) |
Работал в IBM. В 1985 году опубликовал |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
уже выполняются в нативном коде. Проявляется это в том, |
«12 правил Кодда», которые должны выпол- |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
что первый запрос выполняется десятки секунд, а последую- |
няться в правильной реляционной СУБД. |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
щие — со вполне нормальной скоростью. Пока не изменится |
Ни тогда, ни, как видим, сейчас ни одна су- |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
структура базы. После этого все затронутые изменениями за- |
ществующая СУБД не удовлетворяет всем |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
просы будут перекомпилированы заново. Кеширование пла- |
этим правилам :). |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
нов запросов само по себе неплохо, если при этом следить |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
за актуальностью статистики и структуры данных. Статистика |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
и селективность выборок в MemSQL игнорируются. Для за- |
|
|
|
|
|
|
|
|
|
|
|
|
|