En esta sesión mostraremos el funcionamiento de la replicación de SQL Server a bajo nivel. Es importante conocer exactamente cómo funcionan los agentes de réplica y que acciones llevan a cabo para replicar nuestros datos. Dicho conocimiento es especialmente valioso cuando tenemos que diagnosticar las causas reales de un error en nuestra arquitectura de réplica.
2. Objetivos de la sesión
α 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
4. 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
5. Replicación en SQL Server
Conceptos clave
α 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
6. Replicación en SQL Server
Tipologías
α 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.
7. Escala de réplicas
Mayor autonomía
Mayor latencia
Mezcla
Instantánea
Transaccional unidireccional
Transaccional bidireccional - P2P
Transaccional actualizable
Transacciones distribuidas
Menor autonomía
Menor latencia
9. La milla extra
Razones para recorrerla
α 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
10. La milla extra
Aplicada a la replicación
α 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
12. Replicación transaccional
Agentes
α Agente de instantáneas (opcional)
α Agente lector del log de transacciones
α Agente de distribución
α Agente de lectura de cola de replicación (obsoleto)
13. Replicación transaccional
Agente de instantánea
α 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
14. 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
15. 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
16. 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
17. Replicación transaccional
Agente lector del log de transacciones
α 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
18. 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:
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)
19. Replicación transaccional
Agente lector del log de transacciones
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
21. Replicación transaccional
Agente de distribución
α 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
22. 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)
23. 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
27. Replicación de mezcla
Agente 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
28. Replicación de mezcla
Detección de cambios
α 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)
29. 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)
30. 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)
33. 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/