Autor: Francisco

  • Notas técnicas de Vertica: balanceo de carga, nodos y hardware

    Notas técnicas variadas sobre Vertica: cómo consultar la configuración de balanceo de carga entre nodos, cómo listar los nodos del clúster, y recomendaciones actualizadas de hardware para dimensionar un clúster nuevo.

    1. Ver el tipo de balanceo de carga configurado

    SELECT currentclientbalancingpolicy FROM vs_global_settings;

    Vertica, al ser un motor distribuido (MPP), puede repartir las conexiones de clientes entre los distintos nodos del clúster de varias formas. Las políticas típicas que puede devolver esta consulta son:

    • NONE — sin balanceo; el cliente siempre se conecta al nodo especificado explícitamente en la cadena de conexión.
    • ROUNDROBIN — reparte las conexiones entrantes de forma secuencial entre todos los nodos disponibles, en turnos.
    • RANDOM — asigna cada conexión nueva a un nodo elegido al azar entre los disponibles.

    El balanceo de carga a nivel de conexión evita que todos los clientes se concentren en un solo nodo (normalmente el nodo inicial/coordinador), distribuyendo la carga de sesiones activas de forma más pareja entre todo el clúster.

    2. Ver los nodos del clúster

    SELECT node_name, node_address FROM nodes;

    La tabla de catálogo nodes es la referencia base para saber qué nodos componen el clúster y su dirección de red asociada. Para un diagnóstico más completo del estado de cada nodo (no solo su existencia), conviene ampliar la consulta:

    SELECT node_name, node_address, node_state, node_type
    FROM nodes;

    node_state revela si el nodo está UP, DOWN, o en otro estado de transición — información crítica antes de asumir que el clúster completo está sano solo porque la consulta a nodes devolvió resultados (un nodo puede seguir apareciendo en el catálogo aunque esté caído).

    Recomendaciones de hardware para Vertica

    Memoria RAM

    EscenarioRecomendación
    Mínimo por núcleo físico8 GB de RAM
    Aplicaciones de alto rendimiento12–16 GB de RAM por núcleo físico
    Rendimiento máximo (regla general)256 GB de RAM por nodo

    Referencia oficial: Vertica Generic Hardware Guide.

    Alta disponibilidad: mínimo de nodos

    Para tolerar la falla de un solo nodo sin que la base de datos completa quede inaccesible, la recomendación oficial es un mínimo de 3 nodos en el clúster — con menos de eso, la pérdida de un nodo puede dejar el clúster sin quórum suficiente para seguir operando.

    Ejemplo en AWS EC2

    Para una instancia c3.4xlarge (8 vCPUs), se recomiendan al menos 64–96 GB de RAM, siguiendo la misma proporción de GB por núcleo. Referencia: AWS EC2 Virtual Cores.

    Consideraciones adicionales de CPU

    Vertica es un motor particularmente sensible a la velocidad de reloj del procesador (CPU-bound), más que a la cantidad bruta de núcleos. Cuando se debe elegir entre un procesador más rápido con menos núcleos, o uno más lento con más núcleos, generalmente conviene priorizar la velocidad de reloj — más núcleos ayudan principalmente a que el clúster procese varias consultas y cargas de datos en paralelo, pero no aceleran una consulta individual tanto como un reloj más rápido.

    Homogeneidad del hardware entre nodos

    Se recomienda que todos los nodos del clúster tengan una configuración de hardware similar (CPU, velocidad de reloj, núcleos, memoria, versión de sistema operativo). Vertica no está probado oficialmente sobre clústeres con hardware heterogéneo — funcionalmente puede operar así, pero el rendimiento general del clúster queda limitado al del nodo más lento.

    Resumen práctico

    • Antes de dar por sano un clúster, verificar tanto la existencia de los nodos (SELECT * FROM nodes) como su estado real (node_state = 'UP').
    • Al dimensionar hardware nuevo, partir de la regla de 8–12 GB de RAM por núcleo físico como mínimo razonable, ajustando hacia arriba según la intensidad de la carga analítica esperada.
    • Mantener el hardware homogéneo entre todos los nodos del mismo clúster para evitar cuellos de botella causados por el nodo más débil.
    • Nunca desplegar un clúster productivo con menos de 3 nodos si la alta disponibilidad es un requisito.
  • Tipos de datos SSIS vs SQL Server: tabla de equivalencias y errores comunes

    SSIS (SQL Server Integration Services) maneja su propio sistema de tipos de datos internamente, distinto al de SQL Server — cuando un paquete SSIS lee o escribe datos de una tabla, el motor de flujo de datos convierte automáticamente entre ambos sistemas. Conocer esta tabla de equivalencias es clave para evitar truncamientos silenciosos, pérdida de precisión, o errores de conversión que aparecen solo en tiempo de ejecución.

    Tabla de equivalencias

    Tipo SSISExpresión SSISEquivalente en SQL Server
    Entero con signo de 1 byte(DT_I1)— (sin equivalente directo)
    Entero con signo de 2 bytes(DT_I2)smallint
    Entero con signo de 4 bytes(DT_I4)int
    Entero con signo de 8 bytes(DT_I8)bigint
    Entero sin signo de 1 byte(DT_UI1)tinyint
    Entero sin signo de 2 bytes(DT_UI2)— (sin equivalente directo)
    Entero sin signo de 4 bytes(DT_UI4)— (sin equivalente directo)
    Entero sin signo de 8 bytes(DT_UI8)— (sin equivalente directo)
    Flotante(DT_R4)real
    Flotante de doble precisión(DT_R8)float
    Cadena de texto(DT_STR, «longitud», «code_page»)char, varchar
    Texto Unicode(DT_WSTR, «longitud»)nchar, nvarchar, sql_variant, xml
    Fecha(DT_DATE)date
    Booleano(DT_BOOL)bit
    Numérico(DT_NUMERIC, «precisión», «escala»)decimal, numeric
    Decimal(DT_DECIMAL, «escala»)decimal
    Moneda(DT_CY)smallmoney, money
    Identificador único(DT_GUID)uniqueidentifier
    Flujo de bytes(DT_BYTES, «longitud»)binary, varbinary, timestamp
    Fecha de base de datos(DT_DBDATE)date
    Hora de base de datos(DT_DBTIME)— (sin equivalente directo)
    Hora de base de datos con precisión(DT_DBTIME2, «escala»)time(p)
    Timestamp de base de datos(DT_DBTIMESTAMP)datetime, smalldatetime
    Timestamp con precisión(DT_DBTIMESTAMP2, «escala»)datetime2
    Timestamp con zona horaria(DT_DBTIMESTAMPOFFSET, «escala»)datetimeoffset(p)
    Timestamp de archivo(DT_FILETIME)— (sin equivalente directo)
    Imagen(DT_IMAGE)image
    Flujo de texto(DT_TEXT, «code_page»)text
    Cadena Unicode larga(DT_NTEXT)ntext

    Cómo usar estas expresiones en un Derived Column

    Estas notaciones ((DT_WSTR, 50), (DT_I4), etc.) se usan directamente como operadores de conversión (cast) dentro de expresiones de SSIS — típicamente en un componente Derived Column del Data Flow:

    (DT_WSTR, 50) [NombreColumna]
    (DT_I4) [CodigoTexto]
    (DT_NUMERIC, 18, 2) [MontoTexto]

    El operador se coloca entre paréntesis, antepuesto a la columna o expresión a convertir — funciona de forma similar a un CAST() en T-SQL, pero con la sintaxis propia del lenguaje de expresiones de SSIS.

    Errores comunes al trabajar con estos tipos

    1. Truncamiento silencioso de strings

    (DT_WSTR, «longitud») y (DT_STR, «longitud») requieren especificar una longitud fija. Si el dato origen es más largo que la longitud declarada, SSIS trunca el valor sin lanzar error por defecto — a menos que se configure explícitamente el comportamiento de «truncation» del componente como Fail Component en vez de Ignore Failure. Es una causa muy común de datos incompletos en destino que pasan desapercibidos durante meses.

    2. DT_STR vs DT_WSTR: ANSI vs Unicode

    DT_STR corresponde a cadenas ANSI (require especificar code_page, la página de códigos) y se destina a columnas char/varchar. DT_WSTR es Unicode (UTF-16 interno) y corresponde a nchar/nvarchar. Usar el tipo equivocado entre estos dos es una fuente frecuente de errores de conversión o de caracteres especiales (acentos, ñ) que se corrompen al pasar de un sistema a otro.

    3. Precisión y escala en DT_NUMERIC / DT_DECIMAL

    Al convertir hacia (DT_NUMERIC, «precisión», «escala»), ambos parámetros son obligatorios y deben coincidir (o ser compatibles) con la columna destino en SQL Server. Una precisión insuficiente trunca los decimales o genera un error de overflow si el valor origen excede el rango declarado.

    4. DT_DBTIMESTAMP vs DT_DBTIMESTAMP2: rango y precisión

    datetime (mapeado desde DT_DBTIMESTAMP) tiene menor precisión de fracciones de segundo y un rango de fechas más limitado que datetime2 (mapeado desde DT_DBTIMESTAMP2). Si el origen de datos maneja fechas fuera del rango de datetime (años anteriores a 1753) o requiere mayor precisión de milisegundos, es necesario usar explícitamente DT_DBTIMESTAMP2 y una columna destino datetime2.

    5. Tipos sin equivalente directo

    Varios tipos SSIS (DT_I1, DT_UI2, DT_UI4, DT_UI8, DT_DBTIME, DT_FILETIME) no tienen un tipo equivalente exacto en SQL Server. Al mapear estas columnas hacia una tabla destino, es necesario elegir el tipo SQL Server más cercano que pueda contener el rango completo de valores sin pérdida — por ejemplo, un DT_UI4 (entero sin signo de 4 bytes, rango 0 a ~4.29 mil millones) requiere un bigint en SQL Server, ya que int es signado y no cubre ese rango completo.

    Buena práctica: validar el mapeo antes de ejecutar en producción

    Antes de dar por válido un flujo de datos SSIS con conversiones de tipo, conviene ejecutar el paquete contra un subconjunto de datos «límite» (valores máximos de longitud, fechas extremas, números con la mayor cantidad de decimales esperada) para confirmar que ninguna conversión trunca o falla silenciosamente antes de correrlo contra la carga completa en producción.