DG Broker – Selecting the Apply Instance

Cuando trabajamos en un ambiente de alta disponibilidad como es el RAC de Oracle, podemos tener varias instancias de una misma base standby.

Podemos poner de Ejemplo un sitio primario como TEST y otro secundario como TESTDG.

La instalacion cuenta con tres nodos para cada sitio.

Entonces podemos decir que contamos con el siguinete escenario:

  • Tenemos tres NODOS en el sitio primario con una base TEST en RAC.
  • Tenemos tres NODOS en el sitio de contingencia para la base TESTDG, tambien en RAC.
  • El sitio primario esta configuracon con DG_BROKER.
  • El sitio secundario esta configurado con con DG_BROKER.

Cuando trabajamos con el DG BROKER, y perdemos la instancia dataguard TESTDG2 que esta aplicando, automaticamente el broker switchea al primer nodo ( o al que se encuentre disponible en caso de tener mas nodos ) y comienza aplicar en la instancia TESTDG1.

En en las infraestructuras de alta disponibilidad donde se trabaja con mas de tres nodos, generalmente se configura diferentes servicios en diferentes nodos para balancear la carga:

En el sitio primario
  • Un service de aplicacion en un nodo en particular, ejemplo NODO1.
  • Un service para batch, NODO2.
  • En el NODO3 lo dejamos libre pero disponible para un relocate del servicio ante cualquier problema.
En el sitio secundario
  • Una instancia de applied, puede estar en el NODO1 por default.

Que sucede si se cae la instancia applied ? Salta a cualquier nodo, entonces es donde nosotros debemos intervenir para que el balanceo sea efectivo.

Si tenemos dos bases primarias ( TEST / ORCL ), dos scundarias ( TESTDG / ORCLDG ), la distribucion de los servicios sera acorde a la carga en el sitio primario y la instancia de applied en el sitio secundario estara dividido en dos nodos distindos, un applied en el NODO1 para TESTDG (TESTDG1) y un applied en el NODO2 para ORCLDG. (ORCLDG2)

Trabajando con el broker tenemos un parametro, el PreferredApplyInstance. Y lo podemos setear y emplear segun los dos siguinetes puntos:

  1. a) Cuando nunca estuvo seteado este parametro, como esta en nuestra standby, que seria como elegir la primera vez la instancia de aplicado o si el apply instance acaba de fallar y estas por hacer un failover o si vas hacer un siwcht over y queres elegir el nodo.
    Una vez que la instancia de aplicación está seleccionada para hacer el switch o fail siempre y cuando el apply instance sigue en funcionamiento, el broker no tiene en cuenta el valor de la propiedad PreferredApplyInstance incluso si lo cambiamos.(operacion en curso)
  2. Cuando ya esta elegida la instancia de aplicacion y queremos cambiarla a otro nodo. (nuestro caso.) Hay que usar los SET STATE correspondientes.

Compruebo si existe la configuracion y en que instancia esta aplicando

DGMGRL> show database 'test' 'PreferredApplyInstance';
PreferredApplyInstance = ''

Veo la configuracion del broker para la instancia TEST.

DGMGRL> show database verbose 'test';

Database
Name:            test
OEM Name:        test.danahomelinux.com
Role:            PHYSICAL STANDBY
Enabled:         YES
Intended State:  ONLINE
Instance(s):
test1
test2 (apply instance)
test3

Properties:
InitialConnectIdentifier        = 'test.danahomelinux.com'
ObserverConnectIdentifier       = ''
LogXptMode                      = 'SYNC'
Dependency                      = ''
DelayMins                       = '0'
Binding                         = 'OPTIONAL'
MaxFailure                      = '0'
MaxConnections                  = '1'
ReopenSecs                      = '300'
NetTimeout                      = '180'
LogShipping                     = 'ON'
PreferredApplyInstance          = ''
ApplyInstanceTimeout            = '0'
ApplyParallel                   = 'AUTO'
StandbyFileManagement           = 'AUTO'
ArchiveLagTarget                = '0'
LogArchiveMaxProcesses          = '3'
LogArchiveMinSucceedDest        = '1'
DbFileNameConvert               = '+DATA, +DATA'
LogFileNameConvert              = '+DATA, +DATA'
FastStartFailoverTarget         = ''
StatusReport                    = '(monitor)'
InconsistentProperties          = '(monitor)'
InconsistentLogXptProps         = '(monitor)'
SendQEntries                    = '(monitor)'
LogXptStatus                    = '(monitor)'
RecvQEntries                    = '(monitor)'
HostName(*)
SidName(*)
LocalListenerAddress(*)
StandbyArchiveLocation(*)
AlternateLocation(*)
LogArchiveTrace(*)
LogArchiveFormat(*)
LatestLog(*)
TopWaitEvents(*)
(*) - Please check specific instance for the property value

Current status for "test":
SUCCESS

Seteo para que aplique en la instancia del NODO1

DGMGRL> EDIT DATABASE 'test' SET STATE='ONLINE' WITH APPLY INSTANCE='test1';
Succeeded.

Reviso en el alert y en el DG_BROKER sie esos cambios se efectuaron.

DGMGRL> show database 'test';

Database
Name:            test
OEM Name:        test.danahomelinux.com
Role:            PHYSICAL STANDBY
Enabled:         YES
Intended State:  ONLINE
Instance(s):
test1 (apply instance)
test2
test3

Current status for "test":
SUCCESS

En el caso de no querer tener el parametro seteado limpio la configuracion y compruebo que haya quedado seteado en la configuracion del broker.

DGMGRL> EDIT DATABASE 'test' set property 'PreferredApplyInstance'='';
Property "PreferredApplyInstance" updated

DGMGRL> show database verbose 'test';

Database
Name:            test
OEM Name:        test.danahomelinux.com
Role:            PHYSICAL STANDBY
Enabled:         YES
Intended State:  ONLINE
Instance(s):
test1 (apply instance)
test2
test3

Properties:
InitialConnectIdentifier        = 'test.danahomelinux.com'
ObserverConnectIdentifier       = ''
LogXptMode                      = 'SYNC'
Dependency                      = ''
DelayMins                       = '0'
Binding                         = 'OPTIONAL'
MaxFailure                      = '0'
MaxConnections                  = '1'
ReopenSecs                      = '300'
NetTimeout                      = '180'
LogShipping                     = 'ON'
PreferredApplyInstance          = ''
ApplyInstanceTimeout            = '0'
ApplyParallel                   = 'AUTO'
StandbyFileManagement           = 'AUTO'
ArchiveLagTarget                = '0'
LogArchiveMaxProcesses          = '3'
LogArchiveMinSucceedDest        = '1'
DbFileNameConvert               = '+DATA, +DATA'
LogFileNameConvert              = '+DATA, +DATA'
FastStartFailoverTarget         = ''
StatusReport                    = '(monitor)'
InconsistentProperties          = '(monitor)'
InconsistentLogXptProps         = '(monitor)'
SendQEntries                    = '(monitor)'
LogXptStatus                    = '(monitor)'
RecvQEntries                    = '(monitor)'
HostName(*)
SidName(*)
LocalListenerAddress(*)
StandbyArchiveLocation(*)
AlternateLocation(*)
LogArchiveTrace(*)
LogArchiveFormat(*)
LatestLog(*)
TopWaitEvents(*)
(*) - Please check specific instance for the property value

Current status for "test":
SUCCESS