O blue-green deployment atualiza a versão principal do mecanismo do ApsaraDB RDS for PostgreSQL ao restaurar a instância de origem em uma nova instância e executar o pg_upgrade para levar a nova instância à versão de destino. Se você realizar um cutover, o endpoint da instância de origem alternará automaticamente para a nova instância, sem necessidade de alterar a string de conexão na aplicação.
Para comparar todos os modos de atualização disponíveis, consulte Introdução às soluções de atualização de versão principal.
Pré-requisitos
Antes de começar, verifique se:
A instância executa o ApsaraDB RDS for PostgreSQL 16 ou versão anterior
A instância não é uma instância somente leitura nem uma instância de cluster dedicado
O Babelfish não está ativado na instância (o número da versão secundária do mecanismo não termina com
babelfish)
Faturamento
Ao iniciar uma atualização com blue-green deployment, o sistema cria uma nova instância baseada na instância de origem. Ambas as instâncias são faturadas separadamente até que você libere a instância de origem.
|
Método de faturamento da instância de origem |
Método de faturamento da nova instância |
|
Assinatura ou pagamento conforme o uso |
Pagamento conforme o uso |
|
Serverless |
Serverless |
Após confirmar a estabilidade dos serviços na nova instância, converta o faturamento dela para assinatura e libere ou cancele a assinatura da instância de origem.
Observe os pontos abaixo antes de liberar a instância de origem:
Se a instância de origem for uma instância por assinatura ainda não expirada, a nova instância não herdará o tempo restante da assinatura. Liberar a instância de origem antecipadamente pode resultar em perda financeira. Para mais informações sobre as regras de reembolso, consulte Política de reembolso.
A nova instância não herda descontos aplicados à instância de origem. Verifique o valor específico do reembolso na página de cancelamento da instância antes de prosseguir.
Reembolsos para instâncias por assinatura não são processados em tempo real. O valor e o prazo do reembolso dependem da fatura real de cancelamento da assinatura.
Impactos potenciais
Analise os itens a seguir antes de iniciar a atualização.
Interrupção de serviço
Ao executar um blue-green deployment com cutover, a instância de origem torna-se somente leitura durante o processo, causando uma interrupção transitória de conexão. Realize a atualização fora dos horários de pico. Caso opte por não fazer o cutover, seus serviços não serão afetados.
Duração do modo somente leitura: Depende da quantidade de objetos no banco de dados. Execute
SELECT count(1) FROM pg_class;para verificar essa contagem. Com milhões de objetos, o período somente leitura pode durar dezenas de minutos ou mais.Duração da interrupção de conexão: Determinada pelo tempo de atualização do cache DNS no lado do cliente. Utilize a alternância de vSwitch para estimar esse valor antecipadamente.
Duração total da atualização: Varia conforme o número de objetos no banco de dados. Acompanhe o progresso no Task Hub.
Após o cutover, a instância de origem permanece somente leitura por padrão. Para permitir gravações novamente nela, defina o parâmetro rds_force_trans_ro_non_sup como off. Consulte Definir parâmetros da instância.
Caminho de atualização entre versões
Instâncias PostgreSQL 9.4 e 10 que utilizam discos locais de alto desempenho só podem ser atualizadas para discos em nuvem, tendo o PostgreSQL 14 como versão máxima direta. Para alcançar o PostgreSQL 15 ou superior, atualize primeiro para uma versão intermediária:
PostgreSQL 9.4: permite atualização para 10, 11, 12, 13 ou 14 como etapa intermediária
PostgreSQL 10: permite atualização para 11, 12, 13 ou 14 como etapa intermediária
Slots de replicação
Caso a instância de origem seja um publicador com slots de replicação, esses slots serão perdidos após a atualização.
Se a instância de origem for um assinante de slot de replicação, a atualização poderá causar problemas de sincronização de dados devido à preempção do slot. Consulte as Perguntas frequentes para saber como evitar isso.
Alterações de IP virtual
Depois de um cutover, o endereço IP virtual da nova instância muda. Verifique as configurações de firewall e quaisquer configurações de aplicação que referenciem diretamente o IP virtual. Para evitar essa complexidade, configure sua aplicação usando o endereço de conexão da instância em vez do IP virtual.
Alterações de parâmetros
Parâmetros incompatíveis com a versão de destino são excluídos automaticamente.
Parâmetros com valores fora do intervalo válido para a versão de destino são redefinidos para os valores padrão do modelo dessa versão.
Durante a atualização, o
statement_timeouté temporariamente definido como0e restaurado ao valor original após a conclusão do processo.
Tarefas do DTS
Se a instância for origem ou destino do Data Transmission Service (DTS), recrie a tarefa do DTS após a atualização.
Compatibilidade de plugins
A atualização leva a instância automaticamente para a versão secundária mais recente do mecanismo. Verifique a compatibilidade dos plugins antes e depois da atualização.
Configurações não herdadas pela nova instância
A nova instância não herda o nome da instância de origem, as tags, as regras de alerta do CloudMonitor nem os dados de backup.
Etapa 1: Executar a verificação pré-atualização
Faça login no console do ApsaraDB RDS. Na barra de navegação superior, selecione a região onde a instância está localizada. Encontre a instância e clique em seu ID.
-
(Opcional) Se existirem instâncias somente leitura associadas à instância de origem, altere o endpoint da instância somente leitura na aplicação para o endpoint da instância primária durante o horário de menor movimento e, em seguida, exclua a instância somente leitura.
Excluir as instâncias somente leitura antes da atualização é necessário porque nós somente leitura e slots de replicação não são transferidos automaticamente para a nova instância. Após a atualização, crie novas instâncias somente leitura na nova instância.
-
No painel de navegação à esquerda, clique em Major Version Upgrade.
Se Major Version Upgrade não estiver visível, verifique se sua instância atende aos pré-requisitos listados acima.
Na aba Upgrade Check, clique em Create upgrade check report.
Selecione a versão de destino, defina o Upgrade Mode como Blue-green Deployment e clique em OK. O status da instância mudará para Maintaining Instance. Após a conclusão da verificação, o status retornará para Running.
-
Analise o resultado do relatório de verificação:
Success ou Warning: prossiga para a Etapa 2.
Failed: clique em View Information, corrija os problemas identificados e execute a verificação novamente.
ImportantePara um resultado Warning, corrija todos os itens sinalizados e execute a verificação novamente até obter Success.
Se você criar um plugin na instância primária após uma verificação bem-sucedida, execute a verificação novamente antes de prosseguir.
Próximos passos
-
Se você atualizou usando o método blue-green deployment (cutover), após confirmar a estabilidade dos serviços na nova instância, libere a instância de origem. Converta o método de faturamento da nova instância para assinatura para reduzir custos.
Liberar uma instância por assinatura antes do vencimento pode resultar em perda financeira. A nova instância não herda descontos da instância de origem. Os reembolsos estão sujeitos à fatura real de cancelamento da assinatura e não são processados em tempo real.
-
(Opcional) Se você excluiu uma instância somente leitura antes da atualização, recrie-a na nova instância:
Criar uma instância somente leitura do PostgreSQL na nova instância.
Na aplicação, atualize o endpoint para apontar para a nova instância somente leitura.
Referência de API
|
Operação de API |
Descrição |
|
Executa uma verificação pré-atualização para uma atualização de versão principal |
|
|
Consulta o relatório de verificação pré-atualização |
|
|
Atualiza a versão principal do mecanismo |
|
|
Consulta o histórico de tarefas de atualização de versão principal |
Referências
Perguntas frequentes
Posso modificar a instância durante uma atualização de versão principal?
Não. A instância não pode ser modificada enquanto uma atualização está em andamento. Modificações só estão disponíveis após a conclusão da atualização.
Atualizações automáticas de versão principal são suportadas?
Não. As atualizações de versão principal devem ser acionadas manualmente.
Downgrades de versão principal são suportados?
Não. Não há suporte para downgrade após uma atualização de versão principal. Para executar uma versão inferior, adquira uma nova instância nessa versão e use o Data Transmission Service (DTS) para migrar seus dados.
Após uma atualização de versão principal, recebo um conflito raster_overviews ao criar uma view na nova instância. Como resolvo isso?
Esse problema ocorre quando a versão do PostGIS é anterior a 2.5.2 e você está atualizando do PostgreSQL 10 ou 11 para o PostgreSQL 12 sem antes atualizar o plugin PostGIS.
Etapa 1: Atualize o plugin PostGIS na instância de origem.
Execute o comando a seguir duas vezes para garantir que a atualização seja concluída com êxito:
SELECT PostGIS_Extensions_Upgrade();
SELECT PostGIS_Extensions_Upgrade();
Etapa 2: Escolha a correção com base no uso do plugin PostGIS Raster.
Se o plugin PostGIS Raster estiver em uso:
-
Na instância de origem, desanexe a view
raster_overviewsda extensão e substitua-a por um placeholder:ALTER EXTENSION PostGIS_Raster DROP VIEW raster_overviews; CREATE OR REPLACE VIEW raster_overviews AS SELECT 1; Atualize a instância PostgreSQL para pelo menos o PostgreSQL 12.
-
Após a atualização, recrie a view na nova instância:
CREATE OR REPLACE VIEW raster_overviews AS SELECT current_database() AS o_table_catalog, n.nspname AS o_table_schema, c.relname AS o_table_name, a.attname AS o_raster_column, current_database() AS r_table_catalog, split_part( split_part(s.consrc, '''::name', 1), '''', 2 )::name AS r_table_schema, split_part( split_part(s.consrc, '''::name', 2), '''', 2 )::name AS r_table_name, split_part( split_part(s.consrc, '''::name', 3), '''', 2 )::name AS r_raster_column, trim( both from split_part(s.consrc, ',', 2) )::integer AS overview_factor FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n, ( SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc FROM pg_constraint ) AS s WHERE t.typname = 'raster'::name AND a.attisdropped = false AND a.atttypid = t.oid AND a.attrelid = c.oid AND c.relnamespace = n.oid AND c.relkind = ANY( ARRAY[ 'r'::char, 'v'::char, 'm'::char, 'f'::char ] ) AND s.connamespace = n.oid AND s.conrelid = c.oid AND s.consrc LIKE '%_overview_constraint(%' AND NOT pg_is_other_temp_schema(c.relnamespace) AND has_table_privilege(c.oid, 'SELECT'::text); ALTER EXTENSION PostGIS_Raster ADD VIEW raster_overviews;
Se o plugin PostGIS Raster não estiver em uso:
-
Remova o plugin na instância de origem:
DROP EXTENSION PostGIS_Raster; Atualize a instância PostgreSQL para pelo menos o PostgreSQL 12.
Como evito inconsistência de dados causada por preempção de slot de replicação durante uma atualização?
Se a instância de origem for um assinante de slot de replicação, o slot poderá ser preemptado pela nova instância durante a atualização, o que pode causar inconsistência de dados.
Para manter os dados de assinatura na instância de origem (versão inferior): garanta que a instância de origem não falhe devido a carga excessiva durante a atualização, evitando que o slot de replicação seja preemptado. Após a conclusão da atualização, desative a assinatura na nova instância:
\c your_database
ALTER SUBSCRIPTION your_subscription_name DISABLE;
Para preservar os dados de assinatura na nova instância (versão superior): desative a assinatura na instância de origem antes de iniciar a atualização e, em seguida, ative-a na nova instância após a conclusão da atualização.
Desative na instância de origem:
\c your_database
ALTER SUBSCRIPTION your_subscription_name DISABLE;
Ative na nova instância:
\c your_database
ALTER SUBSCRIPTION your_subscription_name ENABLE;
Para mais informações, consulte Assinatura Lógica e Change Tracking.
Como trato a inconsistência de dados de assinatura após uma atualização?
Se a inconsistência já tiver ocorrido, use a seguinte abordagem para reconciliação:
Na nova instância, exclua os dados da tabela afetada e recrie a assinatura com
copy_data=true. Para detalhes, consulte ALTER SUBSCRIPTION.-
Use
ON CONFLICTpara importar dados da instância de origem. O exemplo a seguir mostra como lidar com diferentes cenários de conflito:CREATE TABLE my_tbl(id INT PRIMARY KEY, t TIMESTAMP, val TEXT); INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'a'); INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP, 'b'); INSERT INTO my_tbl VALUES (3, CURRENT_TIMESTAMP, 'c'); -- Newer timestamp: update the existing row INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'd') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t; -- Older timestamp: keep the existing row INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP - '10 hours'::interval, 'e') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t; -- New row: insert directly INSERT INTO my_tbl VALUES (5, CURRENT_TIMESTAMP - '10 hours'::interval, 'f') ON CONFLICT(id) DO UPDATE SET t = excluded.t, val = excluded.val WHERE my_tbl.t < excluded.t;
Por que preciso excluir instâncias somente leitura antes da atualização?
Nós somente leitura e slots de replicação na instância de origem não são transferidos automaticamente para a nova instância após a atualização. Excluir a instância somente leitura antes da atualização evita conflitos de endpoint e garante um cutover limpo. Após a atualização, crie uma nova instância somente leitura na nova instância e atualize o endpoint da aplicação adequadamente.