8 основных тем, которые должен знать каждый практикующий специалист по базам данных
В этой статье мы попробуем разобраться, чем должен владеть любой кандидат на должность, касающуюся работы с техническими базами данных.
Вот наиболее важные темы, с которыми следует ознакомиться такому специалисту в качестве основы:
- Модели базы данных
- Транзакционные концепции
- Структуры данных
- Консенсусные алгоритмы
- Основы разработки и автоматизации
- Основы аппаратного обеспечения
- Основы операционной системы
- Оптимизация производительности
Модели базы данных
Вы должны начать с самого начала, а когда дело доходит до баз данных, то сначала нужно научиться различать модели баз данных. Модель базы данных можно считать спецификацией того, как данные будут выглядеть для пользователей базы данных, включая поддерживаемые типы данных и операции. Если вы не разрабатываете систему баз данных с нуля, вы никогда не выберете модель напрямую; вместо этого вы выбираете его по доверенности, когда решаете, какую систему базы данных использовать.
По этой причине, если в ваши обязанности входит выбор базы данных на основе набора требований, единственный способ сделать осознанный выбор - узнать, какие модели доступны и какие реализации у них есть.
При изучении моделей всегда имейте в виду, что практики делают выбор, основываясь не только на идеальных моделях, но и на реальных ограничениях (например, бюджетных ограничениях), поэтому чаще всего приходится нарушать правила. Как и в случае принятия обоснованных решений, единственный способ правильно изменить (или нарушить) правила - это, для начала, хорошо их знать.
Абсолютным минимумом здесь является знакомство с реляционной моделью, поскольку она вдохновила многие используемые в настоящее время системы баз данных. Возможно, вы слышали такие комментарии, как «когда вы достигаете определенного размера, реляционная модель не масштабируется». (Ошибочное утверждение, поскольку реляционная модель представляет собой логическую модель данных, и ей нечего сказать о физическом представлении, поэтому, если что-то и не масштабируется, так это конкретная реализация реляционной модели. Это утверждение имеет такой же смысл, как и утверждение о том, что арифметика не масштабируется, потому что ваш карманный калькулятор переполнен сравнительно небольшими цифрами),но факт заключается в том, что для людей, поддерживающих операции с базами данных для среднего бизнеса, все еще существует огромный рынок вакансий, где реляционная база данных отлично подходит.
Следующими в очереди будут самые популярные современные нереляционные модели. Это, в частности, мир баз данных объектов, документов, графиков и временных рядов.
Наконец, хотя и не стоит тратить много времени (кроме как на то, чтобы удовлетворить свое историческое любопытство), стоит просмотреть предварительные реляционные модели, в основном, чтобы вы осознали: 1) почему реляционная модель стала настолько популярной, и 2) какие предреляционные ошибки могут допускать другие современные продукты. Это будут сетевые и иерархические модели.
В этом могут помочь несколько учебников, но наша базовая рекомендация - прочитать «Database in Depth», написанная C.J.Date.
Транзакционные концепции
Другая важная концепция в системах баз данных - поддержка транзакций. Вы должны быть знакомы с аббревиатурой ACID и уметь оценивать транзакционные гарантии системы базы данных, а также транзакционные требования системы, которую вы можете спроектировать или построить.
При использовании системы на основе SQL важно понимать уровни изоляции транзакций, предоставляемые ею. Убедитесь, что вы переходите к соответствующей документации, а не полагаетесь только на имена уровней, поскольку не все базы данных реализуют данный уровень одинаково.
Как уже упоминалось, первым ресурсом, который узнает об этом, должна стать официальная документация по продукту, который вы используете или оцениваете. Если вы хотите углубиться в тему, «Transactional Information Systems» (Gerhard Weikum, Gottfried Vossen) - это отличный ресурс.
Для распределенных систем обязательно нужно прочитать о моделях согласованности.
Структуры данных
Структуры данных определяют организацию данных как в памяти, так и в постоянном хранилище. Основные структуры, с которыми нужно ознакомиться для работы с базами данных - это B-деревья, LSM-деревья и хэши.
Другие структуры, с которыми вам может потребоваться ознакомиться в зависимости от используемых вами продуктов, - это растровые индексы, фильтры Блума и разреженные индексы.
Наконец, если вы хотите принять участие в разработке или настройке систем баз данных (например, исправления MySQL, PostgreSQL и т. д.), вы также должны быть знакомы с более фундаментальными структурами данных, такими как списки, стеки и очереди, среди других.
Есть много источников информации об этом, но мы посоветуем 3:
- Какой-либо учебник об основах. Можно взять Кнута (тома 1 и 3 - по структурам данных), но есть и другие отличные тексты. Просто посмотрите несколько примеров в Интернете, чтобы найти тот, который подходит вам по стилю, и сделайте это. Онлайновые заметки об университетских курсах и библиография являются отличным ресурсом для того, чтобы выяснить, «где я могу узнать больше?».
- Документ, представляющий конкретную структуру данных или хорошее ее описание. Например, вот один для LSM Trees (мы рекомендуем The Morning Paper в качестве дружественного способа не отставать от нашей области).
- Соответствующий исходный код, если имеется.
Наконец, если вы хотите разработать собственную структуру данных, я рекомендую «Периодическую таблицу структур данных», чтобы получить представление о том, что вы можете попробовать.
Консенсусные алгоритмы
Как только в наших базах данных задействовано более одной системы, им необходим протокол для согласования того, каким должно быть состояние глобальной системы.
Консенсусные алгоритмы являются теоретической основой для этого, и если вы планируете работать с распределенными базами данных, вам следует ознакомиться с некоторыми(это означает «может понять, как это работает и какие гарантии предоставляются», а не «может реализовать»). Выбор будет зависеть от системы, которую вы используете, но если вы хотите изучить это перед использованием системы, или, как в случае изучения моделей баз данных, вы будете лучше осведомлены, когда вам придется выбирать, какую распределенную систему использовать. Стоит познакомиться с Raft как отправной точкой. Paxos может быть отличным вторым шагом, но имейте в виду, что одна из ключевых причин, по которой Raft был разработан, заключалась в том, чтобы предоставить согласованный алгоритм, который был более понятным, чем Paxos, поэтому будьте готовы потратить некоторое время, если хотите пойти по этому пути.
Еще один хороший совет, который можно дать здесь, как практики, мы должны относиться к согласованным алгоритмам так же, как мы (надеемся) относимся к криптографическим алгоритмам: вы не создаете свои собственные. Не поймите неправильно: совершенно нормально пытаться создать что-то новое (на самом деле, лучше создать собственную структуру данных всего несколькими параграфами выше), но это не то, что вы «изучаете, делая», а тем более написание производственного программного обеспечения.
Основы разработки и автоматизации
Первое, что вам нужно для освоения - это язык базы данных, с которой вы работаете. Единственное предостережение заключается в том, что, даже если вы в настоящее время не используете базу данных на основе SQL, на наш взгляд, вам все равно следует ознакомиться с ней, поскольку она поддерживается (в той или иной форме, с несколькими несоответствиями между системами) большинством систем баз данных, используемых в настоящее время. Как и в случае уровней изоляции транзакций должна быть прочитана официальная документация по продукту. Однако это может быть дополнено более общей ссылкой на SQL. Моя рекомендация была бы «Теория SQL и реляционная теория», написанная C.J.Date.
Вы также должны быть уверены в сценарии. Любой язык сценариев, доступный на платформе (платформах), с которой вы работаете, должен быть хорош здесь. В наши дни многие люди идут используют непосредственно Python для этого. Если должность, на которую вы претендуете, не содержит конкретных требований, подойдет любой язык, поскольку в будущем вы сможете при необходимости применять эти концепции на других языках сценариев.
Поскольку работа с базами данных в настоящее время требует значительной автоматизации, важно ознакомиться с некоторыми концепциями и инструментами DevOps. По крайней мере, вы хотите знать основы автоматического обеспечения с помощью Ansible, Chef или какого-либо другого подобного инструмента.
Если вы хотите работать с базой данных с открытым исходным кодом и вам нравится программировать, это отличная идея, чтобы ознакомиться с ее исходным кодом и, в свою очередь, с языком программирования, на котором он написан. Сначала это может показаться излишним, но это бесценно, когда вам нужно устранять сложные проблемы или понимать трассировки стека и другие сообщения об ошибках.
Основы аппаратного обеспечения
Вы должны быть знакомы с общей архитектурой реальных компьютеров, на которых работает программное обеспечение базы данных.
Базы данных предназначены (среди прочего) для обеспечения надежной и удобной абстракции для хранения данных, так что пользователи могут просто беспокоиться о своей логике, а не заботиться о том, как все это делается под капотом. Тем не менее, как люди, поддерживающие (в широком смысле слова), базы данных, мы проводим значительную часть нашего времени под этим капотом.
Помимо прочего, это означает, что вы должны быть в состоянии выяснить и правильно интерпретировать спецификации оборудования, такие как IOPS устройства хранения данных, понять, что такое гиперпоточность и т. д .Все это связано друг с другом, и, например, имеющиеся у вас диски могут в конечном итоге указывать, какую структуру данных вы будете использовать (например, некоторые лучше справляются с уменьшением износа твердотельных накопителей или имеют дело с более медленным хранилищем).
Есть несколько замечательных книг по компьютерной архитектуре, одна из них - «Производительность систем: предприятие и облако» Брендана Грегга.
Основы операционной системы
Это очень сильно связано с аппаратным обеспечением и включает в себя знание о попеременной загрузке/разбиении по страницам, что такое виртуальная память, как работает подсистема ввода-вывода (включая как убедиться, что запись осуществлена в постоянное хранилище, или какие у вас есть планировщики).
Также очень важно знать, какие инструменты отслеживания и мониторинга доступны в вашей ОС, чтобы вы могли глубже копаться, когда этого требует проблема производительности, и понимать, например, какой ресурс является узким местом.
Оптимизация производительности
Наконец, вы должны уметь подходящие методы для анализа производительности и оптимизации. Здесь снова рекомендуется книга Грегга, поскольку в ней представлен метод USE, который удобно использовать при диагностике проблем с производительностью.
Также рекомендуется книга «Оптимизация производительности Oracle» Кэри Миллсап. Даже если вы не планируете работать с Oracle, мы все равно советуем прочитать ее. Около 2/3 книги являются общими и применимы к любой системе баз данных, с которой вы работаете, поскольку она состоит из презентации «Метод R» для оптимизации производительности.
В качестве окончательной рекомендации по планированию мощностей я рекомендую прочитать «Партизанское планирование мощностей» Нила Гюнтера. Эта книга знакомит с универсальным законом о масштабируемости и включает в себя тяжелый теоретический материал, а также хорошие практические примеры того, как его использовать для оценки масштабируемости оборудования и программного обеспечения.