¿Patrones para configurar sharding para SQL Server 2008 R2, para manejar grandes conjuntos de datos?


14

Quiero manejar un gran conjunto de datos (> 1 billón de filas) en SQL Server 2008 R2. Escuché que si configura "fragmentación" o "particionamiento horizontal", es más rápido manejar grandes conjuntos de datos, ya que divide las tablas en varios archivos.

¿Has usado fragmentos o particiones horizontales antes? Si es así, ¿podría sugerir algún patrón que, en su experiencia, logre mejores resultados en comparación con una sola tabla masiva?

Respuestas:


23

Primero, tenga en cuenta que mil millones de filas se pueden manejar de manera efectiva con una arquitectura particionada en el hardware del servidor común. Las arquitecturas exóticas de nada compartido no serán necesarias para este volumen de datos, sin embargo, probablemente obtendrá importantes beneficios de la partición de tablas.

El fragmentación es algo diferente de la partición horizontal e implica una arquitectura de 'nada compartido', que no es compatible con la mayoría de las versiones de SQL Server 1

SQL Server puede admitir particiones horizontales, y una arquitectura de disco compartida será adecuada para ~ 1 billón de filas.

En SQL Server, crea una función de partición que selecciona una partición basada en valores o rangos de valores en una columna de una tabla, p. Ej.

create partition function F_AccPrdPart (int)
    as range left for values (
    180001                         -- Dummy value
   ,199012 ,199112 ,199212 ,199312, 199412 ,199512
   ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
   ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
   ,200812
   ,200901, 200902, 200903, 200904, 200905, 200906
   ,200907, 200908, 200909, 200910, 200911, 200912
   ,201001, 201002, 201003, 201004, 201005, 201006
   ,201007, 201008, 201009, 201010, 201011, 201012
   ,201101, 201102, 201103, 201104, 201105, 201106
   ,201107, 201108, 201109, 201110, 201111, 201112
   ,202012
   ,939999                         -- Dummy value
)
go

Luego cree uno o más grupos de archivos para asignar las particiones. Para un conjunto de datos grande, estos grupos de archivos podrían configurarse en diferentes volúmenes físicos. Tenga en cuenta que el almacenamiento de conexión directa será mucho más rápido que una SAN para esto en casi todos los casos. En el siguiente ejemplo, habríamos creado 6 grupos de archivos llamados PartVol1-PartVol6.

Se pueden crear uno o más esquemas de partición para asignar particiones de tabla a grupos de archivos en función del valor de la función de partición, p. Ej.

create partition S_AccPrdPart as partition F_AccPrdPart
    TO ([PRIMARY]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6] 
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2]
      ,[PRIMARY]
      ,[PRIMARY])
go

Este esquema está diseñado para particionar en un período contable. Las fechas también se usan con frecuencia para esto, aunque podría usarse cualquier clave.

Puede crear una tabla en el esquema de partición como si fuera un grupo de archivos, p. Ej.

Create table FooTrans (
       FooTransID        int identity (1,1) not null
      ,AccPeriod         int not null
      ,[...]
) on S_AccPrdPart (AccPeriod)
go

Tenga en cuenta que la tabla se crea en el esquema de partición en lugar de un grupo de archivos especificado, y la cláusula especifica la columna que se utilizará como clave de partición. Según la clave de partición, las filas de la tabla se asignarán a uno de los grupos de archivos en el esquema de partición.

Nota: Una regla general para diseñar un esquema de particionamiento es que cada partición debe tener un recuento de filas en los 10 bajos de millones, digamos entre 10 y 50 millones, dependiendo del ancho de las filas. El volumen del disco en el que se encuentra la partición debe ser lo suficientemente rápido como para escanear al menos una partición en unos segundos.

Sistemas de particionamiento, fragmentación y nada compartido

Aquí parece un poco de terminología para desambiguar parte de la discusión sobre este tema.

  • Un sistema de 'nada compartido' es un sistema paralelo en el que los nodos no tienen almacenamiento SAN compartido, pero usan almacenamiento local para el nodo. El ejemplo clásico de este tipo de arquitectura es Teradata. Los sistemas Nothing compartidos se adaptan bien a conjuntos de datos muy grandes, ya que no tienen cuellos de botella centrales de E / S. El rendimiento de E / S se escala con el número de nodos en el sistema.

  • Un sistema de 'disco compartido' es aquel en el que uno o más servidores de bases de datos comparten un único subsistema de almacenamiento en disco. La base de datos puede ser un único servidor con almacenamiento local o conectado a una SAN, o un grupo de servidores conectados a una SAN compartida. Los sistemas de este tipo están limitados por el rendimiento disponible del subsistema de almacenamiento.

  • 'Sharding' es un término utilizado para describir la división de una base de datos entre múltiples servidores físicos en una arquitectura de nada compartido. Varias plataformas tendrán mayor o menor soporte para bases de datos fragmentadas. En los círculos de Teradata, el término no se usa porque Teradata presenta una imagen de sistema único transparente a los clientes, a pesar de que la arquitectura física es un tipo de nada compartido.

    Las versiones anteriores de SQL Server tienen compatibilidad limitada para fragmentar a través de vistas particionadas distribuidas. Microsoft ahora crea una versión de SQL Server 2008 R2 que admite una arquitectura de nada compartido con una sola imagen del sistema, pero esta versión solo está disponible para OEM y solo se puede comprar en un paquete de hardware.

Por mil millones de filas

Para mil millones de filas (a menos que las filas individuales sean extremadamente anchas), una nada compartida o arquitectura fragmentada se encuentra cómodamente en los reinos de la exageración. Este tipo de volumen puede manejarse en un único servidor de especificaciones razonables si tiene un subsistema de disco suficientemente rápido.

El disco de conexión directa local es, con mucho, el más rentable en términos de precio por rendimiento. Un solo controlador RAID SAS puede tomar varias matrices, y se pueden instalar varios controladores en un servidor. Dependiendo de la configuración, una moderna matriz SAS de 24-25 ranuras puede ofrecer miles de IOPS o 1GB + / seg en rendimiento de transmisión; un servidor con múltiples buses PCI-e y múltiples controladores teóricamente puede manejar más.

El tipo de rendimiento necesario para trabajar con una base de datos de mil millones de filas se puede lograr de manera bastante fácil y económica con hardware de servidor básico y almacenamiento de conexión directa de este tipo. También se podría usar una SAN, pero es posible que necesite varios controladores SAN para obtener un rendimiento equivalente, y es probable que el hardware sea un orden de magnitud más costoso.

Como recomendación general, use el almacenamiento de conexión directa para aplicaciones con requisitos de E / S pesados ​​a menos que necesite un tiempo de actividad realmente bueno. Los errores de configuración y control de cambios son una fuente mucho mayor de tiempo de inactividad no programado que la falla de hardware en las operaciones modernas del centro de datos.

Las SAN pueden brindarle una plataforma de almacenamiento más manejable si tiene una gran cartera de aplicaciones, ya que le brindan una variedad de instalaciones de administración de almacenamiento centralizadas. Sin embargo, esto tiene un alto precio y obtener un alto rendimiento de la infraestructura basada en SAN es difícil y costoso.

1 Microsoft crea una versión paralela de SQL Server, pero solo está disponible a través de canales OEM incluidos con hardware. Las versiones disponibles en el mercado no son compatibles con esta capacidad.


3
Wow: respuesta increíble, creo que esas son todas las pistas que necesito para que este proyecto funcione bien.
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.