Creación de particiones de datos horizontales, verticales y funcionalesHorizontal, vertical, and functional data partitioning

En muchas soluciones a gran escala, los datos se dividen en particiones que se pueden administrar y a las que se puede acceder por separado.In many large-scale solutions, data is divided into partitions that can be managed and accessed separately. La creación de particiones puede mejorar la escalabilidad, reducir la contención y optimizar el rendimiento.Partitioning can improve scalability, reduce contention, and optimize performance. También puede proporcionar un mecanismo para dividir los datos mediante un patrón de uso.It can also provide a mechanism for dividing data by usage pattern. Por ejemplo, puede archivar los datos más antiguos en un nivel de almacenamiento de datos más barato.For example, you can archive older data in cheaper data storage.

Sin embargo, la estrategia de creación de particiones se debe elegir concienzudamente para maximizar los beneficios y minimizar los efectos adversos.However, the partitioning strategy must be chosen carefully to maximize the benefits while minimizing adverse effects.

Nota

En este artículo, el término creación de particiones hace referencia al proceso de dividir físicamente los datos en almacenes de datos independientes.In this article, the term partitioning means the process of physically dividing data into separate data stores. No es lo mismo que la creación de particiones de tabla de SQL Server.It is not the same as SQL Server table partitioning.

¿Por qué es recomendable crear particiones de datos?Why partition data?

  • Mejorar la escalabilidad.Improve scalability. Al escalar verticalmente un sistema de base de datos única, este podría alcanzar un límite de hardware físico.When you scale up a single database system, it will eventually reach a physical hardware limit. Si divide los datos en varias particiones, cada una de ellas hospedada en un servidor independiente, puede escalar horizontalmente el sistema de forma casi indefinida.If you divide data across multiple partitions, each hosted on a separate server, you can scale out the system almost indefinitely.

  • Mejorar el rendimiento.Improve performance. Las operaciones de acceso a datos en cada partición se realizan en un volumen de datos menor.Data access operations on each partition take place over a smaller volume of data. Si se realiza correctamente, la creación de particiones puede aumentar la eficiencia del sistema.Correctly done, partitioning can make your system more efficient. Las operaciones que afectan a más de una partición pueden ejecutarse en paralelo.Operations that affect more than one partition can run in parallel.

  • Mejorar la seguridad.Improve security. En algunos casos, puede separar los datos confidenciales y no confidenciales en particiones distintas y aplicar controles de seguridad distintos a los primeros.In some cases, you can separate sensitive and nonsensitive data into different partitions and apply different security controls to the sensitive data.

  • Proporcionan flexibilidad operativa.Provide operational flexibility. La creación de particiones ofrece muchas oportunidades para ajustar con precisión las operaciones, maximizar la eficacia administrativa y minimizar los costes.Partitioning offers many opportunities for fine-tuning operations, maximizing administrative efficiency, and minimizing cost. Por ejemplo, puede definir diferentes estrategias para la administración, la supervisión, la creación de copias de seguridad y la restauración, así como otras tareas administrativas, en función de la importancia de los datos de cada partición.For example, you can define different strategies for management, monitoring, backup and restore, and other administrative tasks based on the importance of the data in each partition.

  • Adaptación del almacén de datos al patrón de uso.Match the data store to the pattern of use. La creación de particiones permite la implementación de cada partición en un tipo de almacén de datos diferente en función de costo y las características integradas que ofrece el almacén de datos.Partitioning allows each partition to be deployed on a different type of data store, based on cost and the built-in features that data store offers. Por ejemplo, los datos grandes se pueden almacenar en Blob Storage, mientras que los datos más estructurados se pueden conservar en una base de datos de documentos.For example, large binary data can be stored in blob storage, while more structured data can be held in a document database. Consulte Elección del almacén de datos apropiado.See Choose the right data store.

  • Mejorar la disponibilidad.Improve availability. Separar los datos en varios servidores evita un punto único de error.Separating data across multiple servers avoids a single point of failure. Si se produce un error en una instancia, solo dejarán de estar disponibles los datos de esa partición.If one instance fails, only the data in that partition is unavailable. Las operaciones en otras particiones pueden continuar.Operations on other partitions can continue. En el caso de los almacenes de datos PaaS administrados, esta consideración es menos pertinente, ya que estos servicios están diseñados con redundancia integrada.For managed PaaS data stores, this consideration is less relevant, because these services are designed with built-in redundancy.

Diseño de particionesDesigning partitions

Hay tres estrategias típicas para crear particiones de datos:There are three typical strategies for partitioning data:

  • Particiones horizontales (a menudo denominadas particionamiento).Horizontal partitioning (often called sharding). En esta estrategia, cada partición es un almacén de datos independiente, pero todas las particiones tienen el mismo esquema.In this strategy, each partition is a separate data store, but all partitions have the same schema. Cada división se conoce como partición y contiene un subconjunto específico de los datos, como todos los pedidos de un conjunto específico de clientes.Each partition is known as a shard and holds a specific subset of the data, such as all the orders for a specific set of customers.

  • Particiones verticales.Vertical partitioning. En esta estrategia, cada partición contiene un subconjunto de los campos de elementos del almacén de datos.In this strategy, each partition holds a subset of the fields for items in the data store. Los campos se dividen según su patrón de uso.The fields are divided according to their pattern of use. Por ejemplo, los campos a los que se accede con frecuencia pueden colocarse en una partición vertical y los campos que se utilizan más raramente en otra.For example, frequently accessed fields might be placed in one vertical partition and less frequently accessed fields in another.

  • Creación de particiones funcional.Functional partitioning. En esta estrategia, los datos se agregan en función de cómo los usa cada contexto limitado en el sistema.In this strategy, data is aggregated according to how it is used by each bounded context in the system. Por ejemplo, un sistema de comercio electrónico puede almacenar los datos de facturas en una partición y los del inventario de productos en otra.For example, an e-commerce system might store invoice data in one partition and product inventory data in another.

Estas estrategias se pueden combinar y es aconsejable tener todas en cuenta al diseñar un esquema de creación de particiones.These strategies can be combined, and we recommend that you consider them all when you design a partitioning scheme. Por ejemplo, puede dividir los datos en particiones y, a continuación, usar particiones verticales para subdividir todavía más los datos de cada partición.For example, you might divide data into shards and then use vertical partitioning to further subdivide the data in each shard.

Creación de particiones horizontales (particionamiento)Horizontal partitioning (sharding)

En la figura 1 se muestra la creación de particiones horizontales o particionamiento.Figure 1 shows horizontal partitioning or sharding. En este ejemplo, los datos del inventario de productos se dividen en particiones según la clave del producto.In this example, product inventory data is divided into shards based on the product key. Cada partición contiene los datos de un intervalo contiguo de claves de partición (A-G y H-Z), organizadas alfabéticamente.Each shard holds the data for a contiguous range of shard keys (A-G and H-Z), organized alphabetically. El particionamiento distribuye la carga entre más equipos, lo que reduce la contención y mejora el rendimiento.Sharding spreads the load over more computers, which reduces contention and improves performance.

Creación de particiones horizontales de datos basadas en una clave de partición

Ilustración 1: Creación de particiones horizontales de datos basadas en una clave de particiónFigure 1 - Horizontally partitioning (sharding) data based on a partition key.

El factor más importante es la elección de una clave de particionamiento.The most important factor is the choice of a sharding key. Puede resultar difícil cambiar la clave después de que el sistema está en funcionamiento.It can be difficult to change the key after the system is in operation. La clave debe garantizar que se crean particiones de datos para distribuir la carga de trabajo lo más uniforme posible entre las particiones.The key must ensure that data is partitioned to spread the workload as evenly as possible across the shards.

Las particiones no tienen que tener necesariamente el mismo tamaño.The shards don't have to be the same size. Es más importante equilibrar el número de solicitudes.It's more important to balance the number of requests. Algunas particiones pueden ser muy grandes, pero cada elemento tener un número bajo de operaciones de acceso.Some shards might be very large, but each item has a low number of access operations. En el caso opuesto, otras particiones podrían ser más pequeñas pero contener un número de elementos a los que se accede con mayor frecuencia.Other shards might be smaller, but each item is accessed much more frequently. También es importante asegurarse de que una sola partición no supere los límites de escala (en términos de capacidad y recursos de procesamiento) del almacén de datos.It's also important to ensure that a single shard does not exceed the scale limits (in terms of capacity and processing resources) of the data store.

Evite la creación de particiones "calientes" que puedan afectar al rendimiento y a la disponibilidad.Avoid creating "hot" partitions that can affect performance and availability. Por ejemplo, si se usa la primera letra del nombre de un cliente, se produce una distribución desequilibrada, ya que algunas letras son más comunes.For example, using the first letter of a customer's name causes an unbalanced distribution, because some letters are more common. En su lugar, use un hash de un identificador de cliente para distribuir los datos de manera más uniforme entre las particiones.Instead, use a hash of a customer identifier to distribute data more evenly across partitions.

Elija una clave de particionamiento que reduzca al mínimo cualquier necesidad futura de dividir particiones grandes, fusionar particiones pequeñas para formar otras mayores o cambiar el esquema.Choose a sharding key that minimizes any future requirements to split large shards, coalesce small shards into larger partitions, or change the schema. Estas operaciones pueden llevar mucho tiempo y pueden requerir desconectar una o más particiones sin conexión mientras se llevan a cabo.These operations can be very time consuming, and might require taking one or more shards offline while they are performed.

Si se replican las particiones, debería ser posible conservar algunas de las réplicas en línea mientras otras se dividen, se combinan o se vuelven a configurar.If shards are replicated, it might be possible to keep some of the replicas online while others are split, merged, or reconfigured. Sin embargo, el sistema podría requerir que se limitaran las operaciones que se pueden realizar durante la reconfiguración.However, the system might need to limit the operations that can be performed during the reconfiguration. Por ejemplo, los datos de las réplicas podrían marcarse como de solo lectura para evitar incoherencias de datos.For example, the data in the replicas might be marked as read-only to prevent data inconsistences.

Para más información acerca de la creación de particiones horizontales, consulte Patrón de particionamiento.For more information about horizontal partitioning, see sharding pattern.

Particiones verticalesVertical partitioning

El uso más común del particionamiento vertical es reducir los costes de E/S y de rendimiento asociados a la recopilación de elementos a los que se accede con más frecuencia.The most common use for vertical partitioning is to reduce the I/O and performance costs associated with fetching items that are frequently accessed. La ilustración 2 muestra un ejemplo de creación de particiones verticales.Figure 2 shows an example of vertical partitioning. En este ejemplo, las diferentes propiedades de un elemento se almacenan en particiones distintas.In this example, different properties of an item are stored in different partitions. Una partición contiene los datos a los que se accede con mayor frecuencia, lo que incluye el nombre, la descripción y el precio de los productos.One partition holds data that is accessed more frequently, including product name, description, and price. Otra contiene los datos de inventario: la cantidad en stock y la fecha del último pedido.Another partition holds inventory data: the stock count and last-ordered date.

Creación de particiones verticales de datos por su patrón de uso

Ilustración 2: Creación de particiones verticales de datos por su patrón de uso.Figure 2 - Vertically partitioning data by its pattern of use.

En este ejemplo, la aplicación consulta periódicamente el nombre del producto, la descripción y el precio al mostrar los detalles de los productos a los clientes.In this example, the application regularly queries the product name, description, and price when displaying the product details to customers. Tanto la cantidad en stock como la fecha del último pedido se almacenan en una partición independiente porque estos dos elementos se suelen utilizar conjuntamente.Stock count and last- ordered date are held in a separate partition because these two items are commonly used together.

Otras ventajas del particionamiento vertical:Other advantages of vertical partitioning:

  • Los datos de movimiento relativamente lento (nombre, descripción y precio del producto) se pueden separar de los datos más dinámicos (nivel de existencias y fecha del último pedido).Relatively slow-moving data (product name, description, and price) can be separated from the more dynamic data (stock level and last ordered date). Los datos de movimiento lento son buenos candidatos para que una aplicación se almacene en la memoria caché.Slow moving data is a good candidate for an application to cache in memory.

  • La información confidencial se puede almacenar en una partición independiente con controles de seguridad adicionales.Sensitive data can be stored in a separate partition with additional security controls.

  • El particionamiento vertical puede reducir la cantidad de acceso simultáneo necesario.Vertical partitioning can reduce the amount of concurrent access that's needed.

La creación de particiones verticales funciona a nivel de entidad dentro de un almacén de datos, normalizando parcialmente una entidad para dividirla de un elemento amplio en un conjunto de elementos reducido.Vertical partitioning operates at the entity level within a data store, partially normalizing an entity to break it down from a wide item to a set of narrow items. Es ideal para almacenes de datos orientados a columnas como HBase y Cassandra.It is ideally suited for column-oriented data stores such as HBase and Cassandra. Si es poco probable que los datos de una colección de columnas cambien, también puede considerar el uso de almacenes de columnas en SQL Server.If the data in a collection of columns is unlikely to change, you can also consider using column stores in SQL Server.

Creación de particiones funcionalFunctional partitioning

Cuando es posible identificar un contexto enlazado para cada área de negocio independiente de una aplicación, la creación de particiones funcional es una forma de mejorar tanto el rendimiento del acceso a los datos como el aislamiento.When it's possible to identify a bounded context for each distinct business area in an application, functional partitioning is a way to improve isolation and data access performance. Otro uso común de la creación de particiones funcional es separar los datos de lectura y escritura de los datos de solo lectura.Another common use for functional partitioning is to separate read-write data from read-only data. En la figura 3 se muestra una visión general de la creación de particiones donde se separan los datos de inventario de los datos del cliente.Figure 3 shows an overview of functional partitioning where inventory data is separated from customer data.

Creación de particiones de datos funcionalmente por contexto o subdominio vinculado

Ilustración 3: Creación de particiones de datos funcionalmente por contexto o subdominio vinculado.Figure 3 - Functionally partitioning data by bounded context or subdomain.

Esta estrategia de creación de particiones puede ayudar a reducir la contención de acceso a datos a través de distintas partes de un sistema.This partitioning strategy can help reduce data access contention across different parts of a system.

Diseño de particiones para obtener escalabilidadDesigning partitions for scalability

Es fundamental considerar el tamaño y la carga de trabajo de cada partición y equilibrarlos para que los datos se distribuyan y logren alcanzar una máxima escalabilidad.It's vital to consider size and workload for each partition and balance them so that data is distributed to achieve maximum scalability. Sin embargo, también debe particionar los datos para que no superen los límites de escala de un almacén de una única partición.However, you must also partition the data so that it does not exceed the scaling limits of a single partition store.

Siga estos pasos durante el diseño de particiones para obtener escalabilidad:Follow these steps when designing partitions for scalability:

  1. Analice la aplicación para comprender los patrones de acceso a datos, como el tamaño del conjunto de resultados devuelto por cada consulta, la frecuencia de acceso, la latencia inherente y los requisitos de procesamiento del lado del servidor.Analyze the application to understand the data access patterns, such as the size of the result set returned by each query, the frequency of access, the inherent latency, and the server-side compute processing requirements. En muchos casos, unas cuantas entidades principales exigirán la mayoría de los recursos de procesamiento.In many cases, a few major entities will demand most of the processing resources.
  2. Utilice este análisis para determinar los objetivos de escalabilidad actuales y futuros, como el tamaño de los datos y la carga de trabajo.Use this analysis to determine the current and future scalability targets, such as data size and workload. A continuación, distribuya los datos entre las particiones para cumplir el objetivo de escalabilidad.Then distribute the data across the partitions to meet the scalability target. En el caso de la creación de particiones horizontal, es importante elegir la partición correcta para asegurarse de que la distribución es homogénea.For horizontal partitioning, choosing the right shard key is important to make sure distribution is even. Para más información, consulte Patrón de particionamiento.For more information, see the sharding pattern.
  3. Asegúrese de que todas las particiones tienen suficientes recursos para controlar los requisitos de escalabilidad en términos de rendimiento y tamaño de datos.Make sure each partition has enough resources to handle the scalability requirements, in terms of data size and throughput. En función del almacén de datos, puede haber un límite en la cantidad de espacio de almacenamiento, la potencia de procesamiento o el ancho de banda de red por partición.Depending on the data store, there might be a limit on the amount of storage space, processing power, or network bandwidth per partition. Si existe la posibilidad de que los requisitos superen estos límites, es posible que tenga que refinar la estrategia de creación de particiones o dividir aún más los datos, con la posibilidad de combinar dos o más estrategias.If the requirements are likely to exceed these limits, you may need to refine your partitioning strategy or split data out further, possibly combining two or more strategies.
  4. Supervise el sistema para comprobar que los datos se distribuyen según lo previsto y que las particiones pueden controlar la carga.Monitor the system to verify that data is distributed as expected and that the partitions can handle the load. El uso real no siempre coincide con lo que predice un análisis.Actual usage does not always match what an analysis predicts. En ese caso, se pueden volver a equilibrar las particiones, o bien rediseñar algunas partes del sistema para obtener el equilibrio necesario.If so, it might be possible to rebalance the partitions, or else redesign some parts of the system to gain the required balance.

Algunos entornos en la nube asignan recursos en términos de límites de infraestructura.Some cloud environments allocate resources in terms of infrastructure boundaries. Asegúrese de que los límites seleccionados proporcionen suficiente espacio para cualquier crecimiento previsto en el volumen de datos, en términos de ancho de banda, potencia de procesamiento y almacenamiento de datos.Ensure that the limits of your selected boundary provide enough room for any anticipated growth in the volume of data, in terms of data storage, processing power, and bandwidth.

Por ejemplo, si usa una tabla de almacenamiento de Azure, existe un límite en el volumen de solicitudes que puede controlar una sola partición en un período de tiempo concretoFor example, if you use Azure table storage, there is a limit to the volume of requests that can be handled by a single partition in a particular period of time. (Para más información, consulte Objetivos de escalabilidad y rendimiento de Azure Storage). Una partición ocupada puede requerir más recursos de los que una sola partición puede controlar.(For more information, see Azure storage scalability and performance targets.) A busy shard might require more resources than a single partition can handle. En ese caso, es posible que haya que cambiar las particiones para distribuir la carga.If so, the shard might need to be repartitioned to spread the load. Si el tamaño total o el rendimiento de estas tablas supera la capacidad de una cuenta de almacenamiento, es posible que haya que crear más cuentas de almacenamiento y distribuir las tablas entre ellas.If the total size or throughput of these tables exceeds the capacity of a storage account, you might need to create additional storage accounts and spread the tables across these accounts.

Diseño de particiones para aumentar el rendimiento de las consultasDesigning partitions for query performance

El rendimiento de las consultas a menudo puede ampliarse mediante el uso de conjuntos de datos más pequeños y la ejecución de consultas en paralelo.Query performance can often be boosted by using smaller data sets and by running parallel queries. Cada partición debe contener una pequeña proporción de todo el conjunto de datos.Each partition should contain a small proportion of the entire data set. Esta reducción en el volumen puede mejorar el rendimiento de las consultas.This reduction in volume can improve the performance of queries. Sin embargo, la partición no es una alternativa para diseñar y configurar una base de datos de forma adecuada.However, partitioning is not an alternative for designing and configuring a database appropriately. Por ejemplo, asegúrese de que tiene los índices necesarios establecidos.For example, make sure that you have the necessary indexes in place.

Al diseñar las particiones para aumentar el rendimiento de las consultas, siga estos pasos:Follow these steps when designing partitions for query performance:

  1. Examine los requisitos de la aplicación y el rendimiento:Examine the application requirements and performance:

    • Use requisitos empresariales para determinar las consultas más importantes que siempre deben ejecutarse rápidamente.Use business requirements to determine the critical queries that must always perform quickly.
    • Supervise el sistema para identificar las consultas que se ejecutan lentamente.Monitor the system to identify any queries that perform slowly.
    • Busque las consultas que se realizan con mayor frecuencia.Find which queries are performed most frequently. Aunque una sola consulta tenga un costo mínimo, el consumo acumulado de recursos puede llegar a ser significativo.Even if a single query has a minimal cost, the cumulative resource consumption could be significant.
  2. Para crear una partición en los datos que están provocando un rendimiento lento, haga lo siguiente:Partition the data that is causing slow performance:

    • Limitar el tamaño de cada partición para que el tiempo de respuesta de la consulta se encuentre dentro del objetivo.Limit the size of each partition so that the query response time is within target.
    • Si usa la creación de particiones horizontales, diseñe la clave de partición de manera que la aplicación pueda seleccionar fácilmente la partición correcta.If you use horizontal partitioning, design the shard key so that the application can easily select the right partition. Esto evita que la consulta tenga que examinar cada partición.This prevents the query from having to scan through every partition.
    • Considerar la ubicación de una partición.Consider the location of a partition. Si es posible, intente mantener los datos en particiones que estén geográficamente cerca de las aplicaciones y los usuarios que acceden a ellos.If possible, try to keep data in partitions that are geographically close to the applications and users that access it.
  3. Si una entidad tiene requisitos de rendimiento y de rendimiento de consultas, use la creación de particiones funcional basada en esa entidad.If an entity has throughput and query performance requirements, use functional partitioning based on that entity. Si esto todavía no logra satisfacer los requisitos, aplique también la creación de particiones horizontal.If this still doesn't satisfy the requirements, apply horizontal partitioning as well. En la mayoría de los casos bastará una estrategia de partición única, pero en algunos casos, resulta más eficaz combinar ambas estrategias.In most cases, a single partitioning strategy will suffice, but in some cases it is more efficient to combine both strategies.

  4. Considere la posibilidad de ejecutar consultas en paralelo entre las particiones para mejorar el rendimiento.Consider running queries in parallel across partitions to improve performance.

Diseño de particiones para obtener disponibilidadDesigning partitions for availability

Crear particiones de datos puede mejorar la disponibilidad de aplicaciones asegurándose de que todo el conjunto de datos no constituye un punto de error único y que subconjuntos individuales del conjunto de datos pueden administrarse de forma independiente.Partitioning data can improve the availability of applications by ensuring that the entire dataset does not constitute a single point of failure and that individual subsets of the dataset can be managed independently.

Tenga en cuenta los siguientes factores que afectan a la disponibilidad:Consider the following factors that affect availability:

Lo importante que son los datos para las operaciones empresariales.How critical the data is to business operations. Identifique qué datos son información empresarial crítica, como las transacciones, y cuáles son datos operativos menos importantes, como los archivos de registro.Identify which data is critical business information, such as transactions, and which data is less critical operational data, such as log files.

  • Considere la posibilidad de almacenar los datos críticos en particiones de alta disponibilidad con un plan de copia de seguridad adecuado.Consider storing critical data in highly available partitions with an appropriate backup plan.

  • Establezca procedimientos de supervisión y administración separados para los diferentes conjuntos de datos.Establish separate management and monitoring procedures for the different datasets.

  • Coloque los datos con el mismo nivel de importancia en la misma partición para que pueda efectuar una copia de seguridad de estos conjuntamente con una frecuencia adecuada.Place data that has the same level of criticality in the same partition so that it can be backed up together at an appropriate frequency. Por ejemplo, es posible que las particiones que contienen datos de transacciones bancarias necesiten copias de seguridad con más frecuencia que las que contienen información de seguimiento o de registro.For example, partitions that hold transaction data might need to be backed up more frequently than partitions that hold logging or trace information.

La manera de administrar particiones individuales.How individual partitions can be managed. Diseñar particiones para admitir el mantenimiento y administración independientes ofrece varias ventajas.Designing partitions to support independent management and maintenance provides several advantages. Por ejemplo:For example:

  • Si se produce un error en una partición, puede recuperarse de forma independiente sin aplicaciones que accedan a los datos de otras particiones.If a partition fails, it can be recovered independently without applications that access data in other partitions.

  • Es posible que la creación de particiones de datos por área geográfica permita la realización de tareas de mantenimiento programadas en horas de poco tráfico para cada ubicación.Partitioning data by geographical area allows scheduled maintenance tasks to occur at off-peak hours for each location. Asegúrese de que las particiones no sean demasiado grandes para evitar que se complete cualquier tarea de mantenimiento planeada durante este período.Ensure that partitions are not too large to prevent any planned maintenance from being completed during this period.

Si va a replicar datos críticos en particiones.Whether to replicate critical data across partitions. Esta estrategia puede mejorar la disponibilidad y el rendimiento, pero también puede originar problemas de coherencia.This strategy can improve availability and performance, but can also introduce consistency issues. Se tarda un tiempo en sincronizar los cambios con cada réplica.It takes time to synchronize changes with every replica. Durante este período, diferentes particiones contendrán diferentes valores de datos.During this period, different partitions will contain different data values.

Consideraciones sobre el diseño de aplicacionesApplication design considerations

La creación de particiones agrega complejidad al diseño y desarrollo del sistema.Partitioning adds complexity to the design and development of your system. Considere la creación de particiones como una parte fundamental del diseño del sistema, incluso si el sistema contiene una única partición inicialmente.Consider partitioning as a fundamental part of system design even if the system initially only contains a single partition. Si realiza la creación de particiones a posteriori, será más difícil porque ya tiene un sistema activo que mantener:If you address partitioning as an afterthought, it will be more challenging because you already have a live system to maintain:

  • La lógica de acceso a los datos tendrá que modificarse.Data access logic will need to be modified.
  • Es posible que deban migrarse grandes cantidades de datos para distribuirlas entre las particiones.Large quantities of existing data may need to be migrated, to distribute it across partitions.
  • Los usuarios esperan poder seguir usando el sistema durante la migración.Users expect to be able to continue using the system during the migration.

En algunos casos, la creación de particiones no se considera importante porque el conjunto de datos inicial es pequeño y puede controlarse fácilmente mediante un solo servidor.In some cases, partitioning is not considered important because the initial dataset is small and can be easily handled by a single server. Esto puede suceder en algunas cargas de trabajo, pero muchos sistemas comerciales necesitan expandirse a medida que aumenta el número de usuarios.This might be true for some workloads, but many commercial systems need to expand as the number of users increases.

Además, los almacenes de datos grandes no son los únicos que se benefician de la creación de particiones.Moreover, it's not only large data stores that benefit from partitioning. Por ejemplo, es posible que cientos de clientes accedan de manera intensa a un almacén de datos pequeño a la vez.For example, a small data store might be heavily accessed by hundreds of concurrent clients. Crear particiones de los datos en esta situación puede ayudar a reducir la contención y a mejorar el rendimiento.Partitioning the data in this situation can help to reduce contention and improve throughput.

Tenga en cuenta los siguientes puntos cuando se diseña un esquema de partición de datos:Consider the following points when you design a data partitioning scheme:

Minimice las operaciones de acceso de datos entre particiones.Minimize cross-partition data access operations. Siempre que sea posible, conserve los datos de las operaciones de base de datos más habituales juntos en cada partición para minimizar las operaciones de acceso a datos entre particiones.Where possible, keep data for the most common database operations together in each partition to minimize cross-partition data access operations. La realización de consultas en varias particiones puede ser un proceso más largo que hacerlo en una sola partición, pero la optimización de particiones para un conjunto de consultas puede afectar negativamente a otros conjuntos.Querying across partitions can be more time-consuming than querying within a single partition, but optimizing partitions for one set of queries might adversely affect other sets of queries. Si debe realizar consultas en varias particiones, reduzca el tiempo de consulta mediante la ejecución de consultas en paralelo y la adición de los resultados en la aplicación.If you must query across partitions, minimize query time by running parallel queries and aggregating the results within the application. (puede que este enfoque podría no sea posible en algunos casos, como cuando el resultado de una consulta se usa en la siguiente).(This approach might not be possible in some cases, such as when the result from one query is used in the next query.)

Considere la posibilidad de replicar los datos de referencia estáticos.Consider replicating static reference data. Si las consultas usan datos de referencia relativamente estáticos, como tablas de códigos postales o listas de productos, considere la posibilidad de replicarlos en todas las particiones para reducir la realización de diferentes operaciones de búsqueda en las distintas particiones.If queries use relatively static reference data, such as postal code tables or product lists, consider replicating this data in all of the partitions to reduce separate lookup operations in different partitions. Este enfoque también puede reducir la probabilidad de que los datos de referencia se conviertan en un conjunto de datos excesivamente activo con un tráfico intenso desde las diferentes partes del sistema.This approach can also reduce the likelihood of the reference data becoming a "hot" dataset, with heavy traffic from across the entire system. Sin embargo, la sincronización de cualquier cambio en los datos de referencia supone un costo adicional.However, there is an additional cost associated with synchronizing any changes to the reference data.

Minimice las combinaciones entre particiones.Minimize cross-partition joins. Siempre que sea posible, minimice los requisitos de integridad referencial en las particiones verticales y funcionales.Where possible, minimize requirements for referential integrity across vertical and functional partitions. En estos esquemas, la aplicación es responsable de mantener la integridad referencial entre las particiones.In these schemes, the application is responsible for maintaining referential integrity across partitions. Las consultas que combinan no son eficaces, ya que la aplicación normalmente necesita realizar consultas consecutivas basadas en una clave y, luego, en una clave externa.Queries that join data across multiple partitions are inefficient because the application typically needs to perform consecutive queries based on a key and then a foreign key. En su lugar, considere la posibilidad de replicar o anular la normalización de los datos pertinentes.Instead, consider replicating or de-normalizing the relevant data. Si las combinaciones entre particiones son necesarias, ejecute consultas en paralelo en las particiones y combine los datos dentro de la aplicación.If cross-partition joins are necessary, run parallel queries over the partitions and join the data within the application.

Adoptar coherencia definitivaEmbrace eventual consistency. Evalúe si realmente es necesaria una alta coherencia.Evaluate whether strong consistency is actually a requirement. Un enfoque común en los sistemas distribuidos es implementar la coherencia eventual.A common approach in distributed systems is to implement eventual consistency. Los datos de cada partición se actualizan por separado, y la lógica de aplicación garantiza que todas las actualizaciones se completen correctamente.The data in each partition is updated separately, and the application logic ensures that the updates are all completed successfully. También controla las incoherencias que pueden surgir de la consulta de datos mientras se esté ejecutando una operación finalmente coherente.It also handles the inconsistencies that can arise from querying data while an eventually consistent operation is running.

Tenga en cuenta cómo buscan las consultas la partición correcta.Consider how queries locate the correct partition. Si una consulta debe analizar todas las particiones para localizar los datos necesarios, habrá un impacto significativo en el rendimiento, incluso cuando se ejecuten varias consultas en paralelo.If a query must scan all partitions to locate the required data, there is a significant impact on performance, even when multiple parallel queries are running. Con la creación de particiones verticales y funcionales, las consultas pueden especificar la partición de manera natural.With vertical and functional partitioning, queries can naturally specify the partition. Por otra parte, la creación de partición horizontal puede dificultar la búsqueda de elementos, ya que todas las particiones tienen el mismo esquema.Horizontal partitioning, on the other hand, can make locating an item difficult, because every shard has the same schema. Una solución típica para mantener una asignación que se usa para buscar la ubicación de la partición para elementos concretos.A typical solution to maintain a map that is used to look up the shard location for specific items. Esta asignación puede implementarse en la lógica de particionamiento de la aplicación o mantenerse por el almacén de datos si admite el particionamiento transparente.This map can be implemented in the sharding logic of the application, or maintained by the data store if it supports transparent sharding.

Considere la posibilidad de reequilibrar periódicamente las particiones.Consider periodically rebalancing shards. Con la creación de particiones horizontales, el reequilibrado de particiones puede ayudar a distribuir los datos uniformemente por tamaño y por carga de trabajo para minimizar las zonas excesivamente activas, maximizar el rendimiento de las consultas y evitar las limitaciones de almacenamiento físico.With horizontal partitioning, rebalancing shards can help distribute the data evenly by size and by workload to minimize hotspots, maximize query performance, and work around physical storage limitations. Sin embargo, esta es una tarea compleja que requiere a menudo el uso de una herramienta personalizada o un proceso.However, this is a complex task that often requires the use of a custom tool or process.

Replique las particiones.Replicate partitions. Si replica todas las particiones, se proporciona protección adicional frente a errores.If you replicate each partition, it provides additional protection against failure. Si se produce un error en una única réplica, las consultas se pueden dirigir hacia una copia de trabajo.If a single replica fails, queries can be directed toward a working copy.

Si se alcanzan los límites físicos de una estrategia de creación de particiones, es posible que necesite ampliar la escalabilidad a un nivel diferente.If you reach the physical limits of a partitioning strategy, you might need to extend the scalability to a different level. Por ejemplo, si la creación de particiones se produce en el nivel de base de datos, puede que tenga que buscar o replicar las particiones en varias bases de datos.For example, if partitioning is at the database level, you might need to locate or replicate partitions in multiple databases. Si la creación de particiones ya está al nivel de la base de datos y las limitaciones físicas son un problema, quizá tenga que ubicar o replicar particiones en varias cuentas de hospedaje.If partitioning is already at the database level, and physical limitations are an issue, it might mean that you need to locate or replicate partitions in multiple hosting accounts.

Evite las transacciones que accedan a datos en varias particiones.Avoid transactions that access data in multiple partitions. Algunos almacenes de datos implementan la coherencia transaccional y la integridad de las operaciones que modifican datos, pero solo cuando los datos se encuentran en una sola partición.Some data stores implement transactional consistency and integrity for operations that modify data, but only when the data is located in a single partition. Si necesita compatibilidad transaccional en varias particiones, probablemente necesitará implementar esto como parte de la lógica de la aplicación, porque la mayoría de los sistemas de creación de particiones no proporcionan compatibilidad nativa.If you need transactional support across multiple partitions, you will probably need to implement this as part of your application logic because most partitioning systems do not provide native support.

Todos los almacenes de datos requieren algunas operaciones de administración operativa y de supervisión de las actividades.All data stores require some operational management and monitoring activity. Las tareas pueden oscilar entre la carga de datos, la realización de copias de seguridad y la restauración de datos, la reorganización de datos y asegurarse de que el sistema funciona de manera correcta y eficaz.The tasks can range from loading data, backing up and restoring data, reorganizing data, and ensuring that the system is performing correctly and efficiently.

Tenga en cuenta los siguientes factores que afectan a la administración operativa:Consider the following factors that affect operational management:

  • Cómo implementar las tareas operativas y de administración adecuadas cuando se crean particiones en los datos.How to implement appropriate management and operational tasks when the data is partitioned. Estas tareas pueden incluir la realización de copias de seguridad y su restauración, el archivado de datos, la supervisión del sistema y otras tareas administrativas.These tasks might include backup and restore, archiving data, monitoring the system, and other administrative tasks. Por ejemplo, mantener la coherencia lógica durante las operaciones de copia de seguridad y restauración puede ser un desafío.For example, maintaining logical consistency during backup and restore operations can be a challenge.

  • Cómo cargar los datos en varias particiones y agregar datos nuevos que llegan desde otros orígenes.How to load the data into multiple partitions and add new data that's arriving from other sources. Algunas herramientas y utilidades podrían no admitir operaciones de datos con particiones, como la carga de datos en la partición correcta.Some tools and utilities might not support sharded data operations such as loading data into the correct partition.

  • Cómo archivar y eliminar los datos de forma periódica.How to archive and delete the data on a regular basis. Para evitar un aumento excesivo de las particiones, debe archivar y eliminar datos de forma regular (por ejemplo, mensualmente).To prevent the excessive growth of partitions, you need to archive and delete data on a regular basis (such as monthly). Puede ser necesario transformar los datos para que se adapten a un esquema de almacenamiento diferente.It might be necessary to transform the data to match a different archive schema.

  • Cómo localizar problemas de integridad de datos.How to locate data integrity issues. Considere la posibilidad de ejecutar un proceso periódico para localizar cualquier problema de integridad de datos; por ejemplo, la existencia de datos en una partición que hacen referencia a una información que falta en otra.Consider running a periodic process to locate any data integrity issues, such as data in one partition that references missing information in another. El proceso puede intentar corregir estos problemas automáticamente o generar un informe para su revisión manual.The process can either attempt to fix these issues automatically or generate a report for manual review.

Reequilibrio de particionesRebalancing partitions

Cuando un sistema madure es posible que tenga que ajustar el esquema de partición.As a system matures, you might have to adjust the partitioning scheme. Por ejemplo, las particiones individuales pueden empezar a recibir un volumen de tráfico desproporcionado y ser demasiado activas, lo que provocaría una contención excesiva.For example, individual partitions might start getting a disproportionate volume of traffic and become hot, leading to excessive contention. O bien, es posible que haya subestimado el volumen de datos de algunas particiones, lo que provoca que varias se aproximen a su límite de capacidad.Or you might have underestimated the volume of data in some partitions, causing some partitions to approach capacity limits.

Algunos almacenes de datos, como Cosmos DB, pueden reequilibrar automáticamente las particiones.Some data stores, such as Cosmos DB, can automatically rebalance partitions. En otros casos, el reequilibrio es una tarea administrativa que consta de dos fases:In other cases, rebalancing is an administrative task that consists of two stages:

  1. Determine una nueva estrategia de creación de particiones.Determine a new partitioning strategy.

    • ¿Qué particiones se deben dividir (o posiblemente combinar)?Which partitions need to be split (or possibly combined)?
    • ¿Cuál es la nueva clave de partición?What is the new partition key?
  2. Migre los datos del esquema de partición antiguo al nuevo conjunto de particiones.Migrate data from the old partitioning scheme to the new set of partitions.

En función del almacén de datos, puede migrar datos entre particiones mientras estén en uso.Depending on the data store, you might be able to migrate data between partitions while they are in use. Esto se denomina migración en línea.This is called online migration. Si esto no es posible, es posible que tenga que anular la disponibilidad de las particiones mientras se cambia la ubicación de los datos (migración sin conexión).If that's not possible, you might need to make partitions unavailable while the data is relocated (offline migration).

Migración sin conexiónOffline migration

La migración sin conexión suele ser más sencilla, ya que reduce las posibilidades de que se produzca contención.Offline migration is typically simpler because it reduces the chances of contention occurring. Conceptualmente, la migración sin conexión funciona del siguiente modo:Conceptually, offline migration works as follows:

  1. Marcar la partición sin conexión.Mark the partition offline.
  2. Dividir, combinar y mover los datos a las nuevas particiones.Split-merge and move the data to the new partitions.
  3. Comprobar los datos.Verify the data.
  4. Conectar las nuevas particiones.Bring the new partitions online.
  5. Quitar la partición antigua.Remove the old partition.

Si lo desea, puede marcar una partición como de solo lectura en el paso 1, para que las aplicaciones pueden leer los datos mientras se mueven.Optionally, you can mark a partition as read-only in step 1, so that applications can still read the data while it is being moved.

Migración en líneaOnline migration

La migración en línea es más difícil de realizar, pero menos problemática.Online migration is more complex to perform but less disruptive. El proceso es similar a la migración sin conexión, salvo que la partición original no se marca como sin conexión.The process is similar to offline migration, except the original partition is not marked offline. En función de la granularidad del proceso de migración (por ejemplo, elemento por elemento frente a partición por partición), es posible que el código de acceso a datos de las aplicaciones cliente tenga que controlar la lectura y escritura de los datos que se encuentran en dos ubicaciones, la partición original y la nueva partición.Depending on the granularity of the migration process (for example, item by item versus shard by shard), the data access code in the client applications might have to handle reading and writing data that's held in two locations, the original partition and the new partition.

Los siguientes patrones de diseño pueden ser importantes para su escenario:The following design patterns might be relevant to your scenario:

  • El patrón de particionamiento describe algunas estrategias comunes para los datos de particionamiento.The sharding pattern describes some common strategies for sharding data.

  • El patrón de tabla de índice muestra cómo crear índices secundarios de los datos.The index table pattern shows how to create secondary indexes over data. Con este enfoque, una aplicación puede recuperar rápidamente los datos mediante el uso de consultas que no hacen referencia a la clave principal de una colección.An application can quickly retrieve data with this approach, by using queries that do not reference the primary key of a collection.

  • El patrón de vista materializada describe cómo generar vistas rellenadas previamente que resuman los datos para dar soporte a las operaciones de consulta rápida.The materialized view pattern describes how to generate prepopulated views that summarize data to support fast query operations. Este enfoque puede ser útil en un almacén de datos con particiones si las particiones que contienen los datos que se resumen se distribuyen entre varios sitios.This approach can be useful in a partitioned data store if the partitions that contain the data being summarized are distributed across multiple sites.

Pasos siguientesNext steps