SQL11: Replicación

Preview:

Citation preview

AVANZADOS: Replicación

RUBÉN GARRIGÓS

REL-413

Mentor –Área Motor Relacional

MCP – MCAD – MCSD – MCTS – MCT - MCITP

rgarrigos@solidq.com

α 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/