Fragmentación de base de datos vs particionamiento


166

He estado leyendo sobre arquitecturas escalables recientemente. En ese contexto, dos palabras que siguen apareciendo con respecto a las bases de datos son particiones y particiones . Busqué descripciones pero aún así terminé confundido.

¿Podrían los expertos de stackoverflow ayudarme a entender lo básico?

  • ¿Cuál es la diferencia entre fragmentar y particionar ?
  • ¿Es cierto que 'todas las bases de datos fragmentadas están esencialmente particionadas (en diferentes nodos), pero todas las bases de datos particionadas no están necesariamente fragmentadas' ?

Respuestas:


130

Particionar es más un término genérico para dividir datos entre tablas o bases de datos. El fragmentación es un tipo específico de particionamiento, parte de lo que se denomina particionamiento horizontal.

Aquí puede replicar el esquema en (típicamente) múltiples instancias o servidores, utilizando algún tipo de lógica o identificador para saber qué instancia o servidor buscar los datos. Un identificador de este tipo a menudo se denomina "Clave de fragmento".

Una lógica común sin clave es usar el alfabeto para dividir los datos. AD es la instancia 1, EG es la instancia 2, etc. Los datos del cliente son adecuados para esto, pero se tergiversarán en cierto tamaño en todas las instancias si la partición no tiene en cuenta que algunas letras son más comunes que otras.

Otra técnica común es utilizar un sistema de sincronización de claves o lógica que garantice claves únicas en todas las instancias.

Un ejemplo bien conocido que puede estudiar es cómo Instagram resolvió su partición en los primeros días (vea el enlace a continuación). Comenzaron con particiones en muy pocos servidores, utilizando Postgres para dividir los datos desde el primer momento. Creo que fueron varios miles de fragmentos lógicos en esos pocos fragmentos físicos. Lea su impresionante reseña de 2012 aquí: Ingeniería de Instagram - Sharding & IDs

Ver aquí también: http://www.quora.com/Whats-the-difference-between-sharding-and-partition


16
Sharding es un tipo de HP . No es HP.
NoChance

1
Estoy en lo cierto al pensar que la partición horizontal solo significa dividir las filas de una tabla en varias subtablas (posiblemente dentro del mismo esquema o instancia de la base de datos). , o en instancias de bases de datos separadas en máquinas separadas. ¿O no?
Jonathan Hartley

48

Parece que esto responde a sus dos preguntas:

La partición horizontal divide una o más tablas por fila, generalmente dentro de una sola instancia de un esquema y un servidor de base de datos. Puede ofrecer una ventaja al reducir el tamaño del índice (y, por lo tanto, el esfuerzo de búsqueda) siempre que exista una forma obvia, sólida e implícita de identificar en qué tabla se encontrará una fila en particular, sin necesidad de buscar primero en el índice, por ejemplo, el clásico ejemplo de las tablas 'CustomersEast' y 'CustomersWest', donde su código postal ya indica dónde se encontrarán.

Sharding va más allá de esto: divide las tablas problemáticas de la misma manera, pero lo hace en varias instancias potencialmente múltiples del esquema. La ventaja obvia sería que la carga de búsqueda para la tabla particionada grande ahora se puede dividir en múltiples servidores (lógicos o físicos), no solo en múltiples índices en el mismo servidor lógico.

Fuente: Wiki-Shard .

Sharding es el proceso de almacenar registros de datos en varias máquinas y es el enfoque de MongoDB para satisfacer las demandas del crecimiento de datos. A medida que aumenta el tamaño de los datos, una sola máquina puede no ser suficiente para almacenar los datos ni proporcionar un rendimiento aceptable de lectura y escritura. Sharding resuelve el problema con la escala horizontal. Con sharding, agrega más máquinas para soportar el crecimiento de datos y las demandas de las operaciones de lectura y escritura.

Fuente: MongoDB .


41

También me he sumergido en esto y, aunque soy con mucho la referencia en el tema, hay algunos hechos clave que he reunido y puntos que me gustaría compartir:

Una partición es una división de una base de datos lógica o sus elementos constitutivos en distintas partes independientes. La partición de la base de datos normalmente se realiza por razones de capacidad de administración, rendimiento o disponibilidad, como por ejemplo, el equilibrio de carga.

https://en.wikipedia.org/wiki/Partition_(database)

Sharding es un tipo de particionamiento, como el particionamiento horizontal (HP)

También hay Particionamiento vertical (VP) por el que divide una tabla en partes distintas más pequeñas. La normalización también implica esta división de columnas en las tablas, pero la partición vertical va más allá de eso y divide las columnas incluso cuando ya está normalizado.

https://en.wikipedia.org/wiki/Shard_(database_architecture)

Realmente me gusta la respuesta de Tony Baco sobre Quora, donde te hace pensar en términos de esquema (en lugar de columnas y filas). Él dice que ...

" Particionamiento horizontal ", o fragmentación, es replicar [copiar] el esquema y luego dividir los datos en función de una clave de fragmento.

La " partición vertical " implica dividir el esquema (y los datos van a lo largo del recorrido).

https://www.quora.com/Whats-the-difference-between-sharding-DB-tables-and-partition-them

La Guía de particionamiento de bases de datos de Oracle tiene algunas buenas figuras. He copiado algunos extractos del artículo.

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

Cuándo dividir una tabla

Aquí hay algunas sugerencias sobre cuándo particionar una tabla:

  • Las tablas de más de 2 GB siempre deben considerarse candidatos para la partición.
  • Tablas que contienen datos históricos, en los que se agregan nuevos datos a la partición más nueva. Un ejemplo típico es una tabla histórica donde solo los datos del mes actual son actualizables y los otros 11 meses son de solo lectura.
  • Cuando el contenido de una tabla debe distribuirse entre diferentes tipos de dispositivos de almacenamiento.

Poda de partición

La poda de partición es el medio más simple y también el más sustancial para mejorar el rendimiento mediante la partición. La poda de partición a menudo puede mejorar el rendimiento de la consulta en varios órdenes de magnitud. Por ejemplo, suponga que una aplicación contiene una tabla de pedidos que contiene un registro histórico de pedidos, y que esta tabla se ha dividido por semana. Una consulta que solicita pedidos para una sola semana solo accedería a una única partición de la tabla Pedidos. Si la tabla de pedidos tuviera 2 años de datos históricos, entonces esta consulta accedería a una partición en lugar de 104 particiones. Esta consulta podría ejecutarse 100 veces más rápido simplemente debido a la poda de partición.

Estrategias de partición

  • Rango
  • Picadillo
  • Lista

Puede leer su texto y visualizar sus imágenes que explican todo bastante bien.

Y, por último, es importante comprender que las bases de datos son extremadamente intensivas en recursos:

  • UPC
  • Disco
  • I / O
  • Memoria

Muchos DBA se dividirán en la misma máquina, donde las particiones compartirán todos los recursos pero proporcionarán una mejora en el disco y la E / S al dividir los datos y / o el índice.

Mientras que otras estrategias emplearán una arquitectura de "nada compartido" donde los fragmentos residirán en unidades de cómputo separadas y distintas (nodos), teniendo el 100% de la CPU, disco, E / S y memoria para sí mismo. Proporcionando su propio conjunto de ventajas y complejidades.

https://en.wikipedia.org/wiki/Shared_nothing_architecture


"" Particionamiento horizontal ", o fragmentación, es replicar [copiar] el esquema y luego dividir los datos en función de una clave de fragmento". Esto es tautológico.
8bitjunkie

Entonces hay un espejo, y está fragmentado, de ahí la etimología.
mckenzm

5

Considere una tabla en la base de datos con 1 millón de filas y 100 columnas. En Particionamiento puede dividir la tabla en 2 o más tablas con propiedades como:

  1. 0.4 millones de filas (tabla1), 0.6 millones de filas (tabla2)

  2. 1 millón de filas y 60 columnas (tabla1) y 1 millón de filas y 40 columnas (tabla2)

    Podría haber múltiples casos como ese

Esta es una partición general

Pero Sharding se refiere al primer caso solo donde estamos dividiendo los datos en base a filas. Si estamos dividiendo la tabla en varias tablas, necesitamos mantener múltiples copias similares de esquemas, ya que ahora tenemos varias tablas.


1

Fragmentación en un caso especial de particionamiento horizontal , cuando las particiones se extienden a través de múltiples instancias de bases de datos. Si una base de datos está fragmentada, significa que está particionada por definición.


1

Cuando se habla de particionamiento, no utilice el término replicar o replicación. La replicación es un concepto diferente y está fuera del alcance de esta página. Cuando hablamos de particionar, mejor palabra se divide y cuando hablamos de fragmentación, mejor palabra se distribuye. En la partición (normalmente y en la comprensión común, no siempre), las filas de la tabla de conjunto de datos grandes se dividen en dos o más grupos disjuntos (sin compartir ninguna fila). Puede llamar a cada grupo una partición. Estos grupos o todas las particiones permanecen bajo el control de una vez una instancia de RDMB y todo esto es lógico. La base de cada grupo puede ser un hash o rango, etc. Si tiene datos de diez años en una tabla, puede almacenar cada uno de los datos del año en una partición separada y esto se puede lograr estableciendo límites de partición en función de un columna no nula CREATE_DATE. Una vez que consulte la base de datos, si especifica una fecha de creación entre el 01-01-1999 y el 31-12-2000, solo se ejecutarán dos particiones y será secuencial. Hice lo mismo en DB para más de mil millones de registros y el tiempo de sql llegó a 50 milis desde 30 segundos usando índices, etc. Sharding es que aloja cada partición en un nodo / máquina diferente. Ahora buscar dentro de las particiones / fragmentos puede ocurrir en paralelo.


0

La partición horizontal cuando se mueve a otra instancia de base de datos * se convierte en un fragmento de base de datos .

La instancia de la base de datos puede estar en la misma máquina o en otra máquina.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.