Tecnologias/02 - Bancos de Dados/01 - Relacionais/03 - Oracle7 min
RAC, Data Guard e Alta Disponibilidade
Conceito
Aqui está a razão técnica pela qual instituições continuam pagando por Oracle. As duas tecnologias resolvem problemas diferentes, e confundi-las é o erro mais comum:
| RAC | Data Guard | |
|---|---|---|
| Protege contra | falha de servidor | falha de site / storage / corrupção |
| Quantos databases | um (compartilhado) | dois ou mais (cópias) |
| Distância | mesmo datacenter (baixa latência) | outra cidade/região |
| Modo | ativo-ativo | ativo-passivo (leitura com Active DG) |
| Perda de dado no failover | zero | zero (MAX PROTECTION/AVAILABILITY) ou pouca (MAX PERFORMANCE) |
RAC não é backup. Data Guard não é escala. Um
DROP TABLEacontece nos dois nós do RAC instantaneamente; e o standby do Data Guard não divide a carga de escrita. Ambiente crítico usa os dois — mais backup. Ver Estratégias de Disaster Recovery.
RAC: várias instances, um database
nó 1 (instance 1) nó 2 (instance 2) nó 3 (instance 3)
SGA + procs SGA + procs SGA + procs
│ │ │
└───── interconnect privado (RDMA/Ethernet dedicada) ─────┘
│
┌──────────┴──────────┐
│ STORAGE COMPARTILHADO (ASM) │
│ datafiles, redo, control │
└─────────────────────────────────┘
Isto é shared disk — a abordagem oposta ao shared nothing de sharding/federação que MySQL, Postgres e MongoDB usam. Não existe equivalente mainstream, e o motivo é o problema difícil que ele precisa resolver.
Cache Fusion: o coração do RAC
Se três nós têm buffer cache próprio e todos podem escrever no mesmo bloco, quem tem a versão correta?
nó 2 quer o bloco X, que o nó 1 tem sujo em cache
↓
GCS (Global Cache Service) sabe quem é o "master" do bloco X
↓
o nó 1 envia o bloco PELA REDE (interconnect), não pelo disco
↓
nó 2 recebe a versão atual — sem escrever/ler disco
A transferência memória-a-memória pela rede é o que torna o RAC viável. E é também o que define seu limite: o interconnect é o gargalo, e a latência dele entra no caminho de cada bloco disputado.
Onde o RAC ganha e onde ele decepciona
| Ganha | Decepciona |
|---|---|
| Failover de nó sem perder transação (com FAN/Application Continuity) | hot block disputado: gc buffer busy domina as esperas |
| Escala de leitura e de sessões | escala de escrita concorrente na mesma tabela/bloco |
| Manutenção com rolling patch (um nó por vez) | complexidade operacional e custo de licença por nó |
A regra prática que separa sucesso de fracasso em RAC: particione a carga por
serviço/afinidade para que nós diferentes toquem blocos diferentes. Se todos os nós
disputam as mesmas linhas quentes (um contador, uma sequência sem CACHE), o RAC fica
mais lento que um nó único.
-- sequência em RAC: sem CACHE, cada NEXTVAL é uma disputa global
CREATE SEQUENCE seq_pedido START WITH 1 CACHE 1000 NOORDER;
-- NOORDER + CACHE grande = cada nó pega uma faixa e não conversa com os outros
Data Guard: cópia sincronizada de outro site
PRIMARY ──[redo pela rede]──> STANDBY (aplica o redo continuamente)
Três modos de proteção, que são o mesmo trade-off de Availability vs Consistency:
| Modo | O COMMIT espera |
RPO | Se o standby cair |
|---|---|---|---|
MAX PROTECTION |
standby gravou o redo | zero | o primário para |
MAX AVAILABILITY |
standby gravou, com timeout | zero (normalmente) | degrada para performance |
MAX PERFORMANCE |
nada (assíncrono) | segundos | nada acontece |
Tipos de standby:
- Physical — cópia byte a byte via redo apply. O padrão para DR.
- Active Data Guard (opção paga) — o physical standby fica aberto para leitura enquanto aplica. Transforma DR parado em réplica de leitura útil.
- Logical — aplica SQL reconstruído; permite estrutura diferente e escrita local (nichado).
- Snapshot standby — abre o standby para escrita temporariamente (teste em dados reais) e depois descarta as mudanças e volta a sincronizar. Recurso muito prático que não tem equivalente simples.
E o Data Guard Broker (dgmgrl) automatiza monitoramento, switchover e failover:
dgmgrl sys/senha@prod
DGMGRL> show configuration;
DGMGRL> validate database standby_db; # verifica se está apto ANTES de precisar
DGMGRL> switchover to standby_db; # planejado, sem perda
DGMGRL> failover to standby_db; # desastre, com o RPO do modo configurado
ASM e o resto da pilha
| Componente | Função |
|---|---|
| ASM (Automatic Storage Management) | volume manager + filesystem próprios do Oracle: striping e mirroring por disk group, rebalanceamento online |
| Clusterware (Grid Infrastructure) | detecta falha de nó, gerencia VIPs, faz fencing (evita split brain) |
| SCAN (Single Client Access Name) | um nome DNS que resolve para todos os nós: o cliente não precisa saber a topologia |
| True Cache (26ai) | cache consistente e somente leitura na frente do banco — descarrega leitura sem app precisar tratar staleness |
| Globally Distributed DB (26ai) | sharding nativo com replicação RAFT |
Trade-offs
RAC custa licença por nó e complexidade real. Dois nós de RAC não são "dois servidores de banco": são duas licenças de Enterprise Edition + a opção RAC + storage compartilhado + interconnect dedicado + conhecimento de Clusterware. Muitos ambientes teriam melhor retorno com um nó forte + Data Guard.
RAC protege contra falha de nó, não contra erro humano nem corrupção lógica. Aliás, uma corrupção de bloco no storage compartilhado afeta todos os nós — porque é o mesmo bloco.
MAX PROTECTION com um único standby é um ponto único de falha invertido. Se o
standby ficar inacessível, o primário para de aceitar escrita. Configure dois standbys
ou use MAX AVAILABILITY. É exatamente a mesma armadilha da réplica síncrona única no
Postgres.
Active Data Guard é opção paga; ler no standby sem ela não é permitido. Um standby "aberto para leitura" sem a licença é uso indevido. Vale checar o contrato antes de desenhar a arquitetura em cima disso.
O trade-off central: o Oracle oferece a pilha de HA mais completa do mercado, e cada camada dela é uma linha de licença. A pergunta não é "o Oracle consegue?" — quase sempre consegue — mas "quanto custa e o que eu perco de simplicidade?". Onde uma hora parada custa mais que a licença anual, o cálculo fecha; fora disso, raramente fecha.
Exemplo prático
Monitorar o que importa em RAC
-- as esperas de cluster: se dominarem, você tem hot block
SELECT event, total_waits, ROUND(time_waited/100) AS segundos
FROM v$system_event
WHERE event LIKE 'gc%' ORDER BY time_waited DESC FETCH FIRST 10 ROWS ONLY;
-- gc cr block 2-way / gc current block 2-way → normal (transferência)
-- gc buffer busy acquire/release → CONTENÇÃO: bloco disputado
-- gc cr block lost → problema no INTERCONNECT (grave)
-- distribuição de carga por instance: desequilíbrio indica serviço mal configurado
SELECT inst_id, COUNT(*) AS sessoes FROM gv$session
WHERE type = 'USER' GROUP BY inst_id;
-- os objetos mais disputados entre nós
SELECT object_name, statistic_name, value
FROM v$segment_statistics
WHERE statistic_name LIKE 'gc%' AND value > 0
ORDER BY value DESC FETCH FIRST 10 ROWS ONLY;
GV$ em vez de V$Em RAC, V$ mostra só a instance local. As views GV$ (global) agregam todos os
nós e têm a coluna INST_ID. Diagnosticar RAC olhando V$ é ver um terço do problema.
Serviços com afinidade: como se usa RAC de verdade
# serviço OLTP preferindo os nós 1 e 2; relatórios isolados no nó 3
srvctl add service -db prod -service oltp -preferred inst1,inst2 -available inst3
srvctl add service -db prod -service relatorio -preferred inst3 -available inst1
srvctl start service -db prod
A aplicação conecta em //scan-prod:1521/oltp, e o relatório pesado em
//scan-prod:1521/relatorio. Nós diferentes tocam blocos diferentes → menos cache fusion
→ o RAC entrega o que promete. Sem isso, RAC é só custo.
Verificar Data Guard
-- lag de aplicação e de transporte
SELECT name, value, time_computed FROM v$dataguard_stats
WHERE name IN ('transport lag', 'apply lag', 'apply finish time');
-- o standby está realmente aplicando?
SELECT process, status, thread#, sequence#, block# FROM v$managed_standby;
-- gaps de arquivo: o silencioso que quebra o DR
SELECT * FROM v$archive_gap;
Como isso falha em produção
| Sintoma | Causa |
|---|---|
gc buffer busy dominando |
hot block: sequência sem CACHE, tabela de contador, ausência de afinidade de serviço |
| RAC mais lento que nó único | toda a carga disputando os mesmos blocos |
gc cr block lost |
perda de pacote no interconnect — investigue rede, não banco |
| Nó ejetado do cluster | voting disk inacessível ou latência de interconnect; o Clusterware faz fencing |
| Primário parou de aceitar escrita | MAX PROTECTION com o único standby fora |
| Standby "sincronizado" mas com gap | v$archive_gap não monitorado; DR inútil na hora H |
| Failover funcionou e o app não reconectou | falta FAN/Application Continuity, ou driver sem retry (Fail-Over) |
Aprofundamento aplicado
Desenhar a falha que se quer tolerar
RAC e Data Guard atuam sobre arranjos diferentes. O projeto deve nomear a falha: processo, instância, host, armazenamento ou site. Sobreviver à perda de uma instância não demonstra que o mesmo conjunto sobreviverá à perda de todos os arquivos compartilhados.
Cenário: duas instâncias de RAC atualizam constantemente a mesma pequena coleção de blocos. A coordenação entre caches pode virar parte relevante do custo. Distribuir serviços e reduzir disputa por dados podem ser mais úteis que acrescentar instâncias.
O cliente participa da recuperação
O teste de disponibilidade precisa incluir descoberta do serviço, conexão, transação interrompida e resultado incerto. Reconectar não torna automaticamente seguro repetir uma operação que pode ter confirmado antes da falha.
Exercício: crie uma matriz com perda de instância e perda de site, registrando o componente responsável pela recuperação e o dado potencialmente perdido conforme o modo de proteção. Resultado esperado: separar disponibilidade do serviço, proteção dos dados e comportamento do cliente.
Referências: RAC e Data Guard.
Relacionado
- 2. Instance, SGA e Processos
- 3. Redo, Undo e Consistência de Leitura
- 1. Oracle Database
- 5. Replicação e Alta Disponibilidade
- 3. WAL, Checkpoint e Replicação
- Estratégias de Disaster Recovery
- High Availability
- Fail-Over
Parte de MOC Oracle · RAC Admin Guide (docs)