sql11: replicación
TRANSCRIPT
AVANZADOS: Replicación
RUBÉN GARRIGÓS
REL-413
Mentor –Área Motor Relacional
MCP – MCAD – MCSD – MCTS – MCT - MCITP
α Rápido vistazo a la replicación en SQL Server
α Razones para ir más allá: La milla extra
α Replicación transaccional β Agente lector del log de transacciones
β Agente de distribución
α Replicación de mezcla β Agente de mezcla
Objetivos de la sesión
Replicación en SQL Server
Replicación en SQL Server Definición
α Es un conjunto de tecnologías que nos permiten distribuir y sincronizar información entre bases de datos
α Modelo de publicaciones
α Artículo: Un artículo es un conjunto de datos, estructuras u operaciones que van a ser replicados
α Publicación: Es un contenedor de un conjunto de artículos a replicar que están lógicamente relacionados entre sí
α Suscripción: Entidad que indica que un suscriptor desea recibir los datos de una publicación, de que forma y con que frecuencia
Replicación en SQL Server Conceptos clave
α Transaccional β Unidireccional «no modificable»
β Actualizable inmediata
β Actualizable con cola
β Doble transaccional
β Peer to peer (SQL 2005+)
α Mezcla
α Instantánea
α Basándonos en nuestra experiencia: β ~60% Transaccional unidireccional
β ~30% Mezcla
β ~5% P2P
β ~5% Instantánea, transaccionales actualizables, etc.
Replicación en SQL Server Tipologías
Escala de réplicas
Transaccional actualizable
Transacciones distribuidas
Transaccional bidireccional - P2P
Transaccional unidireccional
Instantánea
Mezcla
Mayor autonomía
Mayor latencia
Menor autonomía
Menor latencia
La milla extra
α Un mayor conocimiento nos llevará a tomar decisiones más acertadas.
α Una mala decisión en una fase inicial de un proyecto tiene un alto coste a posteriori
α Evitar utilizar un martillo cuando lo que tenemos es un tornillo (o viceversa) Ojo con los “vendemotos”
α No debemos analizar la viabilidad tecnológica de nuestra elección sin tener en cuenta múltiples factores
β Políticas internas
β Mantenibilidad a largo plazo
β Fiabilidad
β Extensibilidad y flexibilidad ante cambios
β Escalabilidad considerando las previsiones a X años vista
β Seguridad
La milla extra Razones para recorrerla
α Conocer a bajo nivel el funcionamiento de los distintos tipos de replicación (o al menos el que implementemos)
β Lógica de funcionamiento de los agentes
β Procedimientos almacenados utilizados
β Permisos necesarios
β Flujo de datos y almacenes de metadatos
α SQL Profiler es nuestro amigo cuando la documentación se queda corta
β La implementación interna de los agentes Debugger
α Cuando tenemos algún error, este conocimiento de bajo nivel es IRREMPLAZABLE para volver a levantar la réplica minimizando el impacto en el negocio.
α La replicación debe considerarse como un factor transversal a nuestra base de datos
β Mantenimiento de base de datos
La milla extra Aplicada a la replicación
Replicación Transaccional
α Agente de instantáneas (opcional)
α Agente lector del log de transacciones
α Agente de distribución
α Agente de lectura de cola de replicación (obsoleto)
Replicación transaccional Agentes
α Se utiliza para inicializar los subscriptores habitualmente β Inicializaciones manuales
β Inicializaciones con backup
β Parámetro @sync_type del procedimiento sp_Addsubscription
α Genera un conjunto de ficheros que contendrán los artículos de la publicación
β Copiamos metadatos + datos (BCP)
α Se ejecuta normalmente en el distribuidor β Puede ser invocado como un job, desde línea de comandos,
mediante RMO, etc.
α Soporta Database Mirroring en el publicador
α Seguridad β Db_owner de la base de datos publicada y de la de distribución
β Escritura en la carpeta de instantáneas
Replicación transaccional Agente de instantánea
α Perfiles de agente β Compartir parametrización entre instancias de un mismo tipo
β No todos los parámetros son configurables desde el perfil
α Parámetros interesantes β BcpBatchSize
β MaxBcpThreads (1)
β DynamicFilterHostName
β DynamicFilterLogin
β OutputVerboseLevel
β HistoryVerboseLevel
β EncryptionLevel
Replicación transaccional Agente de instantánea
α Una instantánea está compuesta de varios tipos de ficheros
α .BCP Datos
α .SCH Esquema β Detecta dependencias
α .IDX Índices
α .PRE Scripts limpieza
α Destino: β PATH
β UNC
β FTP
Replicación transaccional Agente de instantánea
α Los ficheros BCP de la instantánea son ficheros BCP estándar por lo que podemos utilizarlos con otros fines
β Restaurar parte de los datos manualmente con BCP IN:
α > bcp tabla in fichero.bcp -dbasededatos -Sinstancia -T
Replicación transaccional Agente de instantánea
α Se utiliza para extraer del log de transacciones los cambios marcados como pendientes de replicar
α Se ejecuta en el distribuidor β Puede ser invocado como un job o desde línea de comandos
β Una única instancia por base de datos: 1 log 1 agente
β Soporta Database Mirroring en el publicador
α Seguridad β Db_owner de la base de datos publicada y de la de distribución
Replicación transaccional Agente lector del log de transacciones
1. Llama a sp_MSadd_LogReader_History para indicar que arrancamos el agente
2. Obtiene datos para arrancar correctamente el agente para esta publicación específica (sp_MShelp_logreader_agentid )
3. Obtiene los parámetros del perfil asociado (sp_MShelp_profile)
4. Llama a sp_MSadd_logreader_history para indicar que estamos inicializados
5. Obtenemos la última transacción donde nos quedamos leyendo del log (sp_MSget_last_transaction)
Replicación transaccional Agente lector del log de transacciones
α El flujo de trabajo de los agentes se obtiene con la ayuda de SQL Server Profiler:
6. Leemos del log de transacciones (sp_replcmds)
7. Procesamos los registros insertándolos en la base de datos de distribución (sp_MSadd_repl_commands )
8. Marcamos la transacción como confirmada (sp_repldone)
9. Registramos los comandos entregados (sp_MSAdd_logreader_history): “N transactions with M commands were delivered”
10.Esperamos x segundos según la frecuencia configurada
11.GOTO 5 (sp_MSget_last_transaction)
Si ocurre algún error recuperable (timeout de conexión, reinicio del publicador, etc.) la política de reintentos por defecto del job del agente la resolverá Monitorización
Replicación transaccional Agente lector del log de transacciones
α Parámetros interesantes β OutputVerboseLevel
β HistoryVerboseLevel
β PollingInterval (5)
β ReadBatchSize (500 transacciones)
β ReadBatchThreshold (0 comandos)
β Buffers (2)
β MaxCmdsInTran (0 o romper atomicidad)
Replicación transaccional Agente lector del log de transacciones
α Se utiliza para entregar las instantáneas iniciales y para aplicar los cambios pendientes de la base de datos de distribución al subscriptor
α Se ejecuta en el distribuidor/subscriptor (PUSH vs PULL) β Puede ser invocado como un job o desde línea de comandos
β Una instancia por subscripción o compartido entre varias
α Seguridad β Db_owner de la base de datos subscrita y de la de distribución
β Mienbro de la PAL (Publication Access List) correspondiente
β Permisos de lectura sobre la carpeta de instantáneas
Replicación transaccional Agente de distribución
Replicación transaccional Agente de distribución
1. Indicamos que arrancamos el agente (sp_Msadd_distribution_history)
2. Comprobamos el estado de la suscripción (sp_MSSubscription_Status). Si está expirada, no podremos continuar.
3. Obtenemos la información del suscriptor (sp_mshelp_subscriber_info)
4. Obtenemos los datos del agente específico de este suscriptor (sp_mshelp_subscription_agentid)
5. Indicamos que estamos listos para comenzar y conectamos al suscriptor (sp_Msadd_distribution_history)
6. Comprobamos los permisos necesarios en el suscriptor (sp_MScheck_subscribe)
Replicación transaccional Agente de distribución
7. Actualizamos el estado de la suscripción (Sp_MSinit_Subscription_agent)
8. Obtenemos la última transaccion replicada de MSreplication_subscriptions (xact_seqno) Todos los valores por encima de dicho valor, están pendientes de replicar.
9. Obtenemos las transacciones y comandos pendientes de MSReplication_transactions y MSreplication_commands y los aplicamos utilizando sp_MS_get_repl_commands.
10. Actualizamos MSreplication_subscriptions con la última transacción entregada
11. Registramos en el log dicha entrega con sp_MSDistribution_history y el mensaje “n transaction(S) with m command(s) were delivered”
12. GOTO 8
α Parámetros interesantes β BcpBatchSize
β MaxBcpThreads (2xCPU, 8 MAX)
β CommitBatchSize (100 transacciones)
β CommitBatchThreshold (1000 comandos)
β QueryTimeOut (1800)
β MaxDeliveredTransactions (0)
β TransactionPerHistory (100)
β Buffers (2)
β PollingInterval (5)
β SubscriptionStreams (1)
β SkipErrors
Replicación transaccional Agente de distribución
Un largo viaje transaccional
Replicación de Mezcla
α Se utiliza para todo el proceso de mezcla β Gestión de rangos, cambios de esquema, creación de generaciones…
β Proceso de mezclado con resolución de conflictos (fila, columna,…)
α Se ejecuta en el distribuidor o en el subscriptor β Puede ser invocado como un job, desde línea de comandos, RMO,…
β 1 instancia por subscripción
α Seguridad β Db_owner de la base de datos subscrita y de la de distribución
β Tener un login asociado en la base de datos publicada
β Mienbro de la PAL (Publication Access List) correspondiente
β Permisos de lectura sobre la carpeta de instantáneas
α No se respeta el orden original de los cambios β Puede ser necesario NFR en triggers, constraints, etc.
α Se pueden omitir cambios intermedios
Replicación de mezcla Agente de mezcla
α Añade un ROWGUID Lineage
α Triggers β MSmerge_ins_<GUID>
β MSmerge_upd_<GUID>
β MSmerge_del_<GUID
α Algunas tablas importantes β MSmerge_contents 1 fila por inserción o modificación
β MSmerge_tombstone 1 fila por borrado
β MSmerge_genhistory 1 fila por generación de cambios
β Msmerge_conflict_table tabla de conflictos del artículo
α Mantenimiento β Fragmentación
β Tamaño periodo de retención (14 días)
Replicación de mezcla Detección de cambios
Replicación de mezcla Agente de mezcla
El flujo completo es complejo y depende de muchos factores: el filtrado de artículos, la política de resolución de conflictos, el particionado la réplica de mezcla tiene un consumo de CPU apreciable sincronizaciones puntuales con autonomía
1. Indicamos que arrancamos el agente (sp_MSadd_merge_history)
2. Comprobamos que no está el mismo agente ya ejecutando (sp_MSensure_single_instance)
3. Obtenemos información de la publicación (sp_Msgetreplicainfo)
4. Obtenemos cambios de esquema pendientes (sp_Msenumschemachange)
Replicación de mezcla Agente de mezcla
5. Cerramos la generación (sp_Msmakegeneration)
6. Obtenemos la enumeración de cambios (sp_Msenumchanges)
7. Aplicamos los cambios generando el comando DML tras aplicar la resolución de conflictos (sp_Msgetmetadata)
8. Marcamos las últimas generaciones enviadas y recibidas (sp_Mssetlastsentgen, sp_Mssetlastrecgen)
9. Indicamos por donde nos quedamos sincronizando (sp_Msmergeupdatelastsyncinfo)
10.Indicamos que hemos acabado de sincronizar: «Merge completed after processing N data change(s) (N insert(s), N update(s), N delete(s), N conflict(s)).» (sp_MSadd_merge_history)
α Parámetros interesantes β DestThreads (4)
β SrcThreads (3)
β ParallelUploadDownload
β (Download/Upload)GenerationsPerBatch
β (Download/Upload)ReadChangesPerBatch
β (Download/Upload)WriteChangesPerBatch
β MaxDownloadChanges
β MaxUploadChanges
β MakeGenerationInterval
β PollingInterval (60)
β StartQueueTimeout
Replicación de mezcla Agente de mezcla
Mezclando datos
Si quieres disfrutar de las mejores sesiones de
nuestros mentores de España y Latino América,
ésta es tu oportunidad.
http://summit.solidq.com/madrid/