Стратегии секционирования данных (создание облачных приложений в реальном мире с помощью Azure)Data Partitioning Strategies (Building Real-World Cloud Apps with Azure)

Майк Уоссон, Рик Андерсон (, том Dykstra)by Mike Wasson, Rick Anderson, Tom Dykstra

Скачивание решения ИТ-проекта или Загрузка электронной книгиDownload Fix It Project or Download E-book

Создание реальных облачных приложений с помощью электронной книги Azure основано на презентации, разработанной Скотт Гатри (.The Building Real World Cloud Apps with Azure e-book is based on a presentation developed by Scott Guthrie. В нем объясняются 13 шаблонов и методик, которые могут помочь в успешной разработке веб-приложений для облака.It explains 13 patterns and practices that can help you be successful developing web apps for the cloud. Дополнительные сведения о ряде см. в первой главе.For information about the series, see the first chapter.

Ранее мы увидели, насколько просто масштабировать веб-уровень облачного приложения, добавляя и удаляя веб-серверы.Earlier we saw how easy it is to scale the web tier of a cloud application, by adding and removing web servers. Но если все они используют одно и то же хранилище данных, то узкое место вашего приложения перемещается из внешнего интерфейса в серверную часть, а уровень данных является самым сложным для масштабирования.But if they're all hitting the same data store, your application's bottleneck moves from the front-end to the back-end, and the data tier is the hardest to scale. В этой главе мы рассмотрим, как можно сделать масштабируемый уровень данных путем секционирования данных в несколько реляционных баз данных или путем объединения хранилища реляционной базы с другими вариантами хранения данных.In this chapter we look at how you can make your data tier scalable by partitioning data into multiple relational databases, or by combining relational database storage with other data storage options.

Настройка схемы секционирования лучше всего выполняется заранее по той же причине, о которой упоминалось ранее: в рабочей среде очень сложно изменить стратегию хранения данных.Setting up a partitioning scheme is best done up front for the same reason mentioned earlier: it's very difficult to change your data storage strategy after an app is in production. Если вы думаете о различных подходах, вы можете избежать возникновения проблем с "Twitter", когда приложение аварийно завершает работу или выходит из строя в течение длительного времени, одновременно реорганизуя данные приложения и код доступа к данным.If you think hard up front about different approaches, you can avoid having a "Twitter moment" when your app crashes or goes down for a long time while you reorganize your app's data and data access code.

Три и более хранилища данныхThe three Vs of data storage

Чтобы определить, нужна ли вам стратегия секционирования и что она должна быть, рассмотрите три вопроса о данных:In order to determine whether you need a partitioning strategy and what it should be, consider three questions about your data:

  • Volume — какой объем данных будет храниться в конечном итоге?Volume – How much data will you ultimately store? Несколько гигабайт?A couple gigabytes? Пару сотен гигабайт?A couple hundred gigabytes? Терабайт?Terabytes? Петабайтов?Petabytes?
  • Скорость — какова скорость роста данных?Velocity – What is the rate at which your data will grow? Это внутреннее приложение, которое не создает много данных?Is it an internal app that isn't generating a lot of data? Внешнее приложение, в которое пользователи будут отправлять изображения и видео?An external app that customers will be uploading images and videos into?
  • Различные типы данных, которые будут храниться?Variety – What type of data will you store? Реляционные, изображения, пары "ключ-значение", социальные графики?Relational, images, key-value pairs, social graphs?

Если вы считаете, что собираетесь иметь большое количество громкости, скорости или множества, необходимо тщательно продумать, какой тип схемы секционирования наилучшим образом позволит вашему приложению масштабироваться эффективно и эффективно по мере роста, а также для того, чтобы не выполнять никаких узких мест.If you think you're going to have a lot of volume, velocity, or variety, you have to carefully consider what kind of partitioning scheme will best enable your app to scale efficiently and effectively as it grows, and to ensure you don't run into any bottlenecks.

Существует три основных подхода к секционированию:There are basically three approaches to partitioning:

  • Вертикальное секционированиеVertical partitioning
  • Горизонтальное секционированиеHorizontal partitioning
  • Гибридное секционированиеHybrid partitioning

Вертикальное секционированиеVertical partitioning

Вертикальная часть представляет собой разделение таблицы по столбцам: один набор столбцов переходит в одно хранилище данных, а другой набор столбцов переходит в другое хранилище данных.Vertical portioning is like splitting up a table by columns: one set of columns goes into one data store, and another set of columns goes into a different data store.

Например, пусть мое приложение хранит данные о людях, включая изображения:For example, suppose my app stores data about people, including images:

Таблица данных

Если данные представлены в виде таблицы и рассматривает различные данные, можно увидеть, что три столбца слева содержат строковые данные, которые могут быть эффективно сохранены реляционной базой данных, а два столбца справа — байтовые массивы в c OMe из файлов изображений.When you represent this data as a table and look at the different varieties of data, you can see that the three columns on the left have string data that can be efficiently stored by a relational database, while the two columns on the right are essentially byte arrays that come from image files. Вы можете хранить данные файла изображения в реляционной базе данных, и многие пользователи делают это, так как они не сохраняют данные в файловой системе.It's possible to store image file data in a relational database, and a lot of people do that because they don't want to save the data to the file system. У них может не быть файловая система, способная хранить необходимые объемы данных, или может не потребоваться управлять отдельной системой резервного копирования и восстановления.They might not have a file system capable of storing the required volumes of data or they might not want to manage a separate back-up and restore system. Этот подход хорошо подходит для локальных баз данных и для небольших объемов данных в облачных базах данных.This approach works well for on-premises databases and for small amounts of data in cloud databases. В локальной среде администратор базы данных может позаботиться обо всем.In the on-premises environment, it might be easier to just let the DBA take care of everything.

Но в облачной базе данных хранилище является относительно дорогостоящим, и большое количество образов может привести к тому, что размер базы данных превысит пределы, с которой она может эффективно работать.But in a cloud database, storage is relatively expensive, and a high volume of images could make the size of the database grow beyond the limits at which it can operate efficiently. Эти проблемы можно решить, разбейте данные по вертикали, что означает выбор наиболее подходящего хранилища данных для каждого столбца в таблице данных.You can address these problems by partitioning the data vertically, which means you choose the most appropriate data store for each column in your table of data. Для этого примера лучше подходит разместить строковые данные в реляционной базе данных и изображениях в хранилище BLOB-объектов.What might work best for this example is to put the string data in a relational database and the images in Blob storage.

Таблица данных вертикально секционирована

Хранение образов в хранилище BLOB-объектов вместо базы данных является более практичным в облаке, чем в локальной среде, поскольку вам не нужно беспокоиться о настройке файловых серверов или управлении резервным копированием и восстановлению данных, хранящихся за пределами реляционной базы данных: все Это автоматически обрабатывается службой хранилища BLOB-объектов.Storing images in Blob storage instead of a database is more practical in the cloud than in an on-premises environment because you don't have to worry about setting up file servers or managing back-up and restore of data stored outside of the relational database: all that is handled for you automatically by the Blob storage service.

Это подход к секционированию, реализованный в приложении Fix ИТ, и мы рассмотрим код для этого в главе хранилище BLOB-объектов.This is the partitioning approach we implemented in the Fix It app, and we'll look at the code for that in the Blob storage chapter. Без этой схемы секционирования и при условии, что средний размер изображения равен 3 мегабайтам, приложение для устранения проблем сможет хранить около 40 000 задач до достижения максимального размера базы данных 150 гигабайт.Without this partitioning scheme, and assuming an average image size of 3 megabytes, the Fix It app would only be able to store about 40,000 tasks before hitting the maximum database size of 150 gigabytes. После удаления образов база данных может хранить в 10 раз столько задач, сколько. до того, как придется думать о реализации горизонтальной схемы секционирования, можно пойти намного дольше.After removing the images, the database can store 10 times as many tasks; you can go much longer before you have to think about implementing a horizontal partitioning scheme. При масштабировании приложения ваши расходы увеличиваются более медленно, так как основная часть потребностей в хранении в хранилище больших двоичных объектов будет очень недорогой.And as the app scales, your expenses grow more slowly because the bulk of your storage needs are going into very inexpensive Blob storage.

Горизонтальное секционирование (сегментирование)Horizontal partitioning (sharding)

Горизонтальное разделение аналогично разделению строк на строки: один набор строк переходит в одно хранилище данных, а другой набор строк переходит в другое хранилище данных.Horizontal portioning is like splitting up a table by rows: one set of rows goes into one data store, and another set of rows goes into a different data store.

При наличии одного и того же набора данных другой вариант заключается в хранении различных диапазонов имен клиентов в разных базах данных.Given the same set of data, another option would be to store different ranges of customer names in different databases.

Таблица данных по горизонтали секционирована

Вы должны быть очень осторожными со схемой сегментирования, чтобы обеспечить равномерное распределение данных, чтобы избежать горячего расположения.You want to be very careful about your sharding scheme to make sure that data is evenly distributed in order to avoid hot spots. Этот простой пример, использующий первую букву фамилии, не соответствует этому требованию, так как многие люди имеют фамилии, начинающиеся с некоторых часто встречающихся букв.This simple example using the first letter of the last name doesn't meet that requirement, because a lot of people have last names that start with certain common letters. Вы можете столкнуться с ограничениями размера таблицы раньше, чем можно ожидать, так как некоторые базы данных будут очень большими, хотя большинство из них останется небольшими.You'd hit table size limitations earlier than you might expect because some databases would get very large while most would remain small.

Некоторая сторона горизонтального секционирования заключается в том, что может быть трудно выполнять запросы по всем данным.A down side of horizontal partitioning is that it might be hard to do queries across all of the data. В этом примере запрос должен нарисоваться от до 26 разных баз данных, чтобы получить все данные, хранящиеся в приложении.In this example, a query would have to draw from up to 26 different databases to get all of the data stored by the app.

Гибридное секционированиеHybrid partitioning

Можно сочетать вертикальное и горизонтальное секционирование.You can combine vertical and horizontal partitioning. Например, в примерах данных можно хранить изображения в хранилище BLOB-объектов и горизонтально секционировать строковые данные.For example, in the example data you could store the images in Blob storage and horizontally partition the string data.

Гибридная секционированная таблица данных

Секционирование рабочего приложенияPartitioning a production application

По сути, проще понять, как работает схема секционирования, но любая схема секционирования увеличивает сложность кода и предоставляет множество новых осложнений, с которыми необходимо работать.Conceptually it's easy to see how a partitioning scheme would work, but any partitioning scheme does increase code complexity and introduces many new complications that you have to deal with. Если вы перемещаете образы в хранилище BLOB-объектов, что делать, если служба хранилища не работает?If you're moving images to blob storage, what do you do when the storage service is down? Как вы управляете безопасностью BLOB-объектов?How do you handle blob security? Что произойдет, если база данных и хранилище BLOB-объектов не синхронизированы?What happens if the database and blob storage get out of sync? Если вы создаете сегментирование, как будет работать запрос для всех баз данных?If you're sharding, how will you handle querying across all of the databases?

Сложности могут быть управляемыми до тех пор, пока вы планируете их перед переходом к рабочей среде.The complications are manageable so long as you're planning for them before you go to production. Многие люди, которые не сделали этого, потребовались позже.Many people who didn't do that wish they had later. В среднем группа специалистов по консультированию клиентов получает паниккед телефонные звонки примерно раз в месяц от клиентов, чьи приложения отключаются на самом деле, и они не выполнили это планирование.On average our Customer Advisory Team (CAT) team gets panicked phone calls about once a month from customers whose apps are taking off in a really big way, and they didn't do this planning. И говорят примерно так: «Help!And they say something like: "Help! Я помещаю все в одно хранилище данных, и в течение 45 дней я запусту место на диске! "I put everything in a single data store, and in 45 days I'm going to run out of space on it!" Если у вас есть много бизнес-логики, которая встроена в доступ к хранилищу данных и у вас есть клиенты, использующие ваше приложение, нет хорошего времени для перехода на несколько дней.And if you have a lot of business logic built into how you access your data store and you have customers who are using your app, there's no good time to go down for a day while you migrate. В итоге мы что усилия, чтобы помочь клиенту секционировать свои данные на лету без простоев.We end up going through herculean efforts to help the customer partition their data on the fly with no down time. Это очень интересная и очень страшное, но не то, что вы хотите, если можете избежать этого!It's very exciting and very scary, and not something you want to be involved in if you can avoid it! Подумаем об этом на передний план и интегрируя его в ваше приложение, вы сделаете свою жизнь гораздо проще, если приложение растет позже.Thinking about this up front and integrating it into your app will make your life a lot easier if the app grows later.

СводкаSummary

Эффективная схема секционирования может позволить облачному приложению масштабироваться до петабайтов данных в облаке без узких мест.An effective partitioning scheme can enable your cloud app to scale to petabytes of data in the cloud without bottlenecks. И вам не нужно платить за большие компьютеры или обширную инфраструктуру, как если бы вы работали с приложением в локальном центре обработки данных.And you don't have to pay up front for massive machines or extensive infrastructure as you might if you were running the app in an on-premises data center. В облаке можно постепенно добавить необходимую емкость, и вы платите только за те ресурсы, которые вы используете при ее использовании.In the cloud you can incrementally add capacity as you need it, and you're only paying for as much as you're using when you use it.

В следующей главе мы посмотрим, как приложение Fix ИТ реализует вертикальное секционирование путем хранения образов в хранилище BLOB-объектов.In the next chapter we'll see how the Fix It app implements vertical partitioning by storing images in Blob storage.

РесурсыResources

Дополнительные сведения о стратегиях секционирования см. в следующих ресурсах.For more information about partitioning strategies, see the following resources.

Документация.Documentation:

Видеоролики:Videos:

Пример кода:Sample code: