PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Aprofundamento do fornecedor de nuvem:PostgreSQL no Google Cloud Platform (GCP)

Por onde começar?

O melhor lugar que encontrei para começar foi a documentação oficial. Há também um canal do GCP no Youtube para quem prefere multimídia. Depois de me encontrar no terreno da documentação do Cloud SQL, voltei-me para os Conceitos, onde nos prometemos “desenvolver uma compreensão profunda” do produto.

Então vamos começar!

Recursos do PostgreSQL do Google Cloud

O Google Cloud SQL para PostgreSQL oferece todos os recursos padrão que esperamos de uma solução gerenciada:alta disponibilidade com failover automático, backups automáticos, criptografia em repouso e em trânsito, registro e monitoramento avançados e de claro uma API rica para interagir com todos os serviços.

E por um pouco da história, o suporte ao PostgreSQL começou em março de 2017, até então o único mecanismo de banco de dados suportado era o MySQL.

O Cloud SQL executa o PostgreSQL na plataforma de computação de segunda geração do Google. A lista completa de recursos está disponível aqui e também aqui. Revendo o primeiro, fica claro que nunca houve uma plataforma de Primeira Geração para PostgreSQL.

Espera-se que os bancos de dados executados na plataforma de segunda geração funcionem em velocidades 7x mais rápidas e se beneficiem de uma capacidade de armazenamento 20x maior. O blog que anuncia a plataforma Second Generation entra nos detalhes da execução do teste sysbench para comparar o Google Cloud SQL com o então principal concorrente AWS em ambas as encarnações RDS e Aurora. Os resultados me surpreenderam, pois mostram um desempenho melhor do Cloud SQL, enquanto os testes recentes realizados usando o AWS Benchmark lançado cerca de um ano depois concluíram o contrário. Isso é mais ou menos na mesma época em que o suporte ao PostgreSQL estava disponível. Enquanto estou ansioso com a ideia de executar o benchmark sozinho, acho que existem dois fatores potenciais que podem ter influenciado os resultados:o benchmark sysbench do Google usou parâmetros diferentes e a AWS pode ter melhorado seus produtos durante esse período.

Compatibilidade com GCP PostgreSQL

Como esperado, o Google Cloud SQL para PostgreSQL é quase um substituto imediato para a versão da comunidade e é compatível com todas as linguagens procedurais SQL PL/pgSQL.

Alguns recursos não estão disponíveis por motivos de segurança, por exemplo, acesso SUPERUSER. Outros recursos foram removidos devido a riscos potenciais à estabilidade e ao desempenho do produto. Por fim, algumas opções e parâmetros não podem ser alterados, embora as solicitações para alterar esse comportamento possam ser feitas por meio do Grupo de discussão do Cloud SQL.

O Cloud SQL também é compatível com o protocolo PostgreSQL.

Quando se trata de isolamento de transações, o Cloud SQL segue o comportamento padrão do PostgreSQL, adotando como padrão o nível de isolamento Read Committed.

Para alguns dos parâmetros de configuração do servidor, o Cloud SQL implementa diferentes intervalos por motivos não explicados na documentação, mas ainda é importante lembrar.

Rede

Há várias maneiras de se conectar ao banco de dados, dependendo se a instância está em uma rede privada ou em uma rede pública (aplicativos que se conectam de fora do GCP). Comum a ambos os casos é a VPC predefinida gerenciada pelo Google onde residem todas as instâncias de banco de dados do Cloud SQL.

IP privado

Clientes que se conectam a um endereço IP privado são roteados por meio de uma conexão de peering entre as VPCs que hospedam o cliente e, respectivamente, a instância do banco de dados. Embora não seja específico do PostgreSQL, é importante revisar os requisitos de rede, para evitar problemas de conexão. Uma pegadinha:uma vez ativado, o recurso de IP privado não pode ser removido.

Conexão de aplicativos externos

As conexões de aplicativos hospedados fora do GCP podem e devem ser criptografadas. Além disso, para evitar os vários ataques, as conexões de cliente e o aplicativo devem instalar o certificado de cliente fornecido. O procedimento de geração e configuração dos certificados é um pouco complicado, exigindo ferramentas personalizadas para garantir que os certificados sejam renovados periodicamente. Esse pode ser um dos motivos pelos quais o Google oferece a opção de usar o Cloud SQL Proxy.

Conectando-se usando o Cloud SQL Proxy

A configuração é bastante simples, o que, na verdade, é o caso de todas as instruções na documentação do Google Cloud SQL. Em uma nota relacionada, enviar feedback de documentação é muito simples, e o recurso de captura de tela foi o primeiro para mim.

Há várias maneiras de autorizar conexões de proxy e optei por configurar uma conta de serviço, conforme descrito na documentação do Cloud SQL Proxy.

Depois que tudo estiver no lugar, é hora de iniciar o proxy:

~/usr/local/google $ ./cloud_sql_proxy -instances=omiday:us-west1:s9s201907141919=tcp:5432 -credential_file=omiday-427c34fce588.json

2019/07/14 21:22:43 failed to setup file descriptor limits: failed to set rlimit {&{8500 4096}} for max file descriptors: invalid argument

2019/07/14 21:22:43 using credential file for authentication; [email protected]

2019/07/14 21:22:43 Listening on 127.0.0.1:5432 for omiday:us-west1:s9s201907141919

2019/07/14 21:22:43 Ready for new connections

Para se conectar à instância remota, agora estamos usando o proxy especificando localhost em vez do endereço IP público da instância:

~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1"

Pager usage is off.

psql (11.4, server 9.6.11)

Type "help" for help.

Observe que não há criptografia, pois estamos nos conectando localmente e o proxy se encarrega de criptografar o tráfego que flui para a nuvem.

Uma tarefa comum de DBA é visualizar as conexões com o banco de dados consultando pg_stat_activity. A documentação afirma que as conexões de proxy serão exibidas como cloudsqlproxy~1.2.3.4, então eu queria verificar essa afirmação. Eu abri duas sessões como postgres, uma via proxy e outra do meu endereço residencial, então a seguinte consulta fará:

[email protected]:5432 postgres> select * from pg_stat_activity where usename = 'postgres';

-[ RECORD 1 ]----+-----------------------------------------------------------

datid            | 12996

datname          | postgres

pid              | 924

usesysid         | 16389

usename          | postgres

application_name | psql

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 2019-07-15 04:25:37.614205+00

xact_start       | 2019-07-15 04:28:43.477681+00

query_start      | 2019-07-15 04:28:43.477681+00

state_change     | 2019-07-15 04:28:43.477684+00

wait_event_type  |

wait_event       |

state            | active

backend_xid      |

backend_xmin     | 8229

query            | select * from pg_stat_activity where usename = 'postgres';

-[ RECORD 2 ]----+-----------------------------------------------------------

datid            | 12996

datname          | postgres

pid              | 946

usesysid         | 16389

usename          | postgres

application_name | psql

client_addr      | <MY_HOME_IP_ADDRESS>

client_hostname  |

client_port      | 60796

backend_start    | 2019-07-15 04:27:50.378282+00

xact_start       |

query_start      |

state_change     | 2019-07-15 04:27:50.45613+00

wait_event_type  |

wait_event       |

state            | idle

backend_xid      |

backend_xmin     |

query            |

Parece que as conexões proxy são identificadas como client_port ==-1 e um client_addr vazio. Isso também pode ser confirmado comparando os timestamps para backend_start e log de proxy abaixo:

2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"

Alta disponibilidade do PostgreSQL no Google Cloud

O Google Cloud SQL para PostgreSQL garante alta disponibilidade usando sincronização de dados de armazenamento de baixo nível por meio de discos permanentes regionais. O failover é automático, com um intervalo de verificação de pulsação de um segundo e um failover acionado após cerca de 60 segundos.

Desempenho e monitoramento

A seção Desempenho da documentação indica as regras gerais da nuvem:mantenha o banco de dados (tanto as réplicas de gravação quanto de leitura) próximo ao aplicativo e dimensione verticalmente a instância. O que se destaca é a recomendação de provisionar uma instância com pelo menos 60 GB de RAM quando o desempenho for importante.

O Stackdriver fornece monitoramento e registro, além de acesso aos registros do PostgreSQL:

Controle de acesso

Isto é implementado em nível de projeto, instância e banco de dados.

Controle de acesso do projeto

O controle de acesso do projeto é o controle de acesso específico da nuvem — ele usa o conceito de papéis do IAM para permitir que os membros do projeto (usuários, grupos ou contas de serviço) acessem vários recursos do Cloud SQL. A lista de funções é um pouco autoexplicativa, para obter uma descrição detalhada de cada função e permissões associadas, consulte o APIs Explorer ou a API Cloud SQL Admin para uma das linguagens de programação compatíveis.

Para demonstrar como as funções do IAM funcionam, vamos criar uma conta de serviço somente leitura (visualizador):

Inicie uma nova instância de proxy na porta 5433 usando a conta de serviço associada ao papel do espectador:

~/usr/local/google $ ./cloud_sql_proxy -instances=omiday:us-west1:s9s201907141919=tcp:5433 -credential_file=omiday-4508243deca9.json

2019/07/14 21:49:56 failed to setup file descriptor limits: failed to set rlimit {&{8500 4096}} for max file descriptors: invalid argument

2019/07/14 21:49:56 using credential file for authentication; [email protected]

2019/07/14 21:49:56 Listening on 127.0.0.1:5433 for omiday:us-west1:s9s201907141919

2019/07/14 21:49:56 Ready for new connections

Abra uma conexão psql para 127.0.0.1:5433:

~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"

O comando sai com:

psql: server closed the connection unexpectedly

      This probably means the server terminated abnormally

      before or while processing the request.

Ops! Vamos verificar os logs de proxy:

2019/07/14 21:50:33 New connection for "omiday:us-west1:s9s201907141919"

2019/07/14 21:50:33 couldn't connect to "omiday:us-west1:s9s201907141919": ensure that the account has access to "omiday:us-west1:s9s201907141919" (and make sure there's no typo in that name). Error during createEphemeral for omiday:us-west1:s9s201907141919: googleapi: Error 403: The client is not authorized to make this request., notAuthorized

Controle de acesso à instância

O acesso no nível da instância depende da fonte de conexão:

A combinação de métodos de autorização substitui o onipresente pg_hba.conf.

Backup e recuperação

Por padrão, os backups automatizados são ativados:

Embora os backups não afetem as operações de leitura e gravação do banco de dados, eles afetam o desempenho e, portanto, é recomendável que os backups sejam agendados durante os períodos de menor atividade.

Para redundância, os backups podem ser armazenados em duas regiões (aplicam-se custos adicionais) com a opção de selecionar locais personalizados.

Para economizar espaço de armazenamento, use compactação. Os arquivos compactados .gz são restaurados de forma transparente.

O Cloud SQL também oferece suporte à clonagem de instância. Para o menor conjunto de dados, a operação levou cerca de 3 minutos:

Hora de início da clonagem 10:07:10:

Os logs do PostgreSQL mostram que o PostgreSQL ficou disponível na instância clonada em 10:10:47:

Essa ainda é uma maneira mais fácil do que fazer backup e restaurar, para criar uma cópia de uma instância para fins de teste, desenvolvimento ou solução de problemas.

Práticas recomendadas do Google Cloud para PostgreSQL

  • Configure uma política de ativação para instâncias que não precisam funcionar 24 horas por dia, 7 dias por semana.
  • Coloque a instância de banco de dados na mesma zona ou região com as instâncias do Compute Engine e os aplicativos do App Engine para evitar a latência da rede.
  • Crie a instância do banco de dados na mesma zona do Compute Engine. Se estiver usando qualquer outro tipo de conexão, aceite a zona padrão.
  • Os usuários criados usando o Cloud SQL são, por padrão, superusuários da nuvem. Use PostgreSQL ALTER ROLE para modificar suas permissões.
  • Use a versão mais recente do Cloud SQL Proxy.
  • Os nomes das instâncias devem incluir um carimbo de data/hora para poder reutilizar o nome ao excluir e recriar instâncias.
  • pg_dump tem como padrão incluir objetos grandes. Se o banco de dados contiver BLOB-s, execute o dump durante períodos de baixa atividade para evitar que a instância pare de responder.
  • Use gcloud sql connect para conectar-se rapidamente a partir de um cliente externo sem a necessidade de colocar o endereço IP do cliente na lista de permissões.
  • Inscreva-se no grupo de anúncios para receber notificações sobre atualizações de produtos e alertas, como problemas ao criar instâncias:
  • Certifique-se de que os aplicativos implementem técnicas de gerenciamento de conexão de banco de dados.
  • As instâncias interrompidas por mais de 90 dias serão excluídas, a menos que não estejam em estado suspenso.
  • Faça um failover manual para testar o comportamento do aplicativo e a duração do tempo de inatividade.
  • Use a versão padrão do mecanismo.
  • O espaço de armazenamento para instâncias configuradas para aumentar automaticamente o armazenamento aumentará em incrementos de 25 GB. Como o espaço de armazenamento não pode ser recuperado, defina um limite de aumento para o tamanho estimado do banco de dados no próximo ciclo orçamentário e monitore as consultas descontroladas,
  • Use o tempo de manutenção "anterior" para instâncias de teste:
  • Os aplicativos devem usar conexões ativas e backoff exponencial para se recuperar rapidamente após a reinicialização de uma instância.
  • O aplicativo que depende de réplicas de leitura deve considerar o uso de 3 réplicas para evitar problemas causados ​​por falhas nos discos permanentes regionais que fazem com que ambas as réplicas fiquem indisponíveis.
  • Configure réplicas de leitura para melhorar o desempenho de leitura.
  • A reinicialização da instância é necessária ao atualizar a lista de endereços IP com permissão para acessar uma instância pública para desconectar as conexões existentes.
  • Revise o grupo dedicado do Cloud SQL do StackOverflow para obter informações adicionais.

Lista de verificação de lançamento para Cloud SQL

A seção de lista de verificação na documentação fornece uma visão geral das atividades recomendadas ao configurar uma instância do Cloud SQL para PostgreSQL pronta para produção. Em particular, os aplicativos devem ser projetados para lidar com reinicializações do Cloud SQL. Além disso, embora não haja limites de consultas por segundo, há limites de conexão.

Suporte a extensões PostgreSQL GCP

O Cloud SQL é compatível com a maioria das extensões do PostgreSQL. No momento da redação deste artigo, das 52 extensões da comunidade, existem 22 extensões não suportadas e 2 extensões PostGIS não suportadas.

postgis_raster

postgis_sfcgal

Para extensões do PostgreSQL, podemos revisar o repositório de contribuição do PostgreSQL ou, melhor, diferenciar a saída de pg_available_extensions:

A montante:

~ $ psql -U postgres -p 54396

Pager usage is off.

psql (11.4, server 9.6.14)

Type "help" for help.

[email protected][local]:54396 postgres# select * from pg_available_extensions order by name;

      name        | default_version | installed_version |                               comment

--------------------+-----------------+-------------------+----------------------------------------------------------------------

adminpack          | 1.1 |                   | administrative functions for PostgreSQL

autoinc            | 1.0 |                   | functions for autoincrementing fields

bloom              | 1.0 |                   | bloom access method - signature file based index

btree_gin          | 1.0 |                   | support for indexing common datatypes in GIN

btree_gist         | 1.2 |                   | support for indexing common datatypes in GiST

chkpass            | 1.0 |                   | data type for auto-encrypted passwords

citext             | 1.3 |                   | data type for case-insensitive character strings

cube               | 1.2 |                   | data type for multidimensional cubes

dblink             | 1.2 |                   | connect to other PostgreSQL databases from within a database

dict_int           | 1.0 |                   | text search dictionary template for integers

dict_xsyn          | 1.0 |                   | text search dictionary template for extended synonym processing

earthdistance      | 1.1 |                   | calculate great-circle distances on the surface of the Earth

file_fdw           | 1.0 |                   | foreign-data wrapper for flat file access

fuzzystrmatch      | 1.1 |                   | determine similarities and distance between strings

hstore             | 1.4 |                   | data type for storing sets of (key, value) pairs

hstore_plperl      | 1.0 |                   | transform between hstore and plperl

hstore_plperlu     | 1.0 |                   | transform between hstore and plperlu

hstore_plpython2u  | 1.0 |                   | transform between hstore and plpython2u

hstore_plpythonu   | 1.0 |                   | transform between hstore and plpythonu

insert_username    | 1.0 |                   | functions for tracking who changed a table

intagg             | 1.1 |                   | integer aggregator and enumerator (obsolete)

intarray           | 1.2 |                   | functions, operators, and index support for 1-D arrays of integers

isn                | 1.1 |                   | data types for international product numbering standards

lo                 | 1.1 |                   | Large Object maintenance

ltree              | 1.1 |                   | data type for hierarchical tree-like structures

ltree_plpython2u   | 1.0 |                   | transform between ltree and plpython2u

ltree_plpythonu    | 1.0 |                   | transform between ltree and plpythonu

moddatetime        | 1.0 |                   | functions for tracking last modification time

pageinspect        | 1.5 |                   | inspect the contents of database pages at a low level

pg_buffercache     | 1.2 |                   | examine the shared buffer cache

pg_freespacemap    | 1.1 |                   | examine the free space map (FSM)

pg_prewarm         | 1.1 |                   | prewarm relation data

pg_stat_statements | 1.4             | | track execution statistics of all SQL statements executed

pg_trgm            | 1.3 |                   | text similarity measurement and index searching based on trigrams

pg_visibility      | 1.1 |                   | examine the visibility map (VM) and page-level visibility info

pgcrypto           | 1.3 |                   | cryptographic functions

pgrowlocks         | 1.2 |                   | show row-level locking information

pgstattuple        | 1.4 |                   | show tuple-level statistics

plpgsql            | 1.0 | 1.0               | PL/pgSQL procedural language

postgres_fdw       | 1.0 |                   | foreign-data wrapper for remote PostgreSQL servers

refint             | 1.0 |                   | functions for implementing referential integrity (obsolete)

seg                | 1.1 |                   | data type for representing line segments or floating-point intervals

sslinfo            | 1.2 |                   | information about SSL certificates

tablefunc          | 1.0 |                   | functions that manipulate whole tables, including crosstab

tcn                | 1.0 |                   | Triggered change notifications

timetravel         | 1.0 |                   | functions for implementing time travel

tsearch2           | 1.0 |                   | compatibility package for pre-8.3 text search functions

tsm_system_rows    | 1.0 |                   | TABLESAMPLE method which accepts number of rows as a limit

tsm_system_time    | 1.0 |                   | TABLESAMPLE method which accepts time in milliseconds as a limit

unaccent           | 1.1 |                   | text search dictionary that removes accents

uuid-ossp          | 1.1 |                   | generate universally unique identifiers (UUIDs)

xml2               | 1.1 |                   | XPath querying and XSLT

Cloud SQL:

[email protected]:5432 postgres> select * from pg_available_extensions where name !~ '^postgis' order by name;

      name        | default_version | installed_version |                              comment

--------------------+-----------------+-------------------+--------------------------------------------------------------------

bloom              | 1.0 |                   | bloom access method - signature file based index

btree_gin          | 1.0 |                   | support for indexing common datatypes in GIN

btree_gist         | 1.2 |                   | support for indexing common datatypes in GiST

chkpass            | 1.0 |                   | data type for auto-encrypted passwords

citext             | 1.3 |                   | data type for case-insensitive character strings

cube               | 1.2 |                   | data type for multidimensional cubes

dict_int           | 1.0 |                   | text search dictionary template for integers

dict_xsyn          | 1.0 |                   | text search dictionary template for extended synonym processing

earthdistance      | 1.1 |                   | calculate great-circle distances on the surface of the Earth

fuzzystrmatch      | 1.1 |                   | determine similarities and distance between strings

hstore             | 1.4 |                   | data type for storing sets of (key, value) pairs

intagg             | 1.1 |                   | integer aggregator and enumerator (obsolete)

intarray           | 1.2 |                   | functions, operators, and index support for 1-D arrays of integers

isn                | 1.1 |                   | data types for international product numbering standards

lo                 | 1.1 |                   | Large Object maintenance

ltree              | 1.1 |                   | data type for hierarchical tree-like structures

pg_buffercache     | 1.2 |                   | examine the shared buffer cache

pg_prewarm         | 1.1 |                   | prewarm relation data

pg_stat_statements | 1.4             | | track execution statistics of all SQL statements executed

pg_trgm            | 1.3 |                   | text similarity measurement and index searching based on trigrams

pgcrypto           | 1.3 |                   | cryptographic functions

pgrowlocks         | 1.2 |                   | show row-level locking information

pgstattuple        | 1.4 |                   | show tuple-level statistics

plpgsql            | 1.0 | 1.0               | PL/pgSQL procedural language

sslinfo            | 1.2 |                   | information about SSL certificates

tablefunc          | 1.0 |                   | functions that manipulate whole tables, including crosstab

tsm_system_rows    | 1.0 |                   | TABLESAMPLE method which accepts number of rows as a limit

tsm_system_time    | 1.0 |                   | TABLESAMPLE method which accepts time in milliseconds as a limit

unaccent           | 1.1 |                   | text search dictionary that removes accents

uuid-ossp          | 1.1 |                   | generate universally unique identifiers (UUIDs)

Extensões incompatíveis no Cloud SQL:

adminpack          1.1 administrative functions for PostgreSQL

autoinc            1.0 functions for autoincrementing fields

dblink             1.2 connect to other PostgreSQL databases from within a database

file_fdw           1.0 foreign-data wrapper for flat file access

hstore_plperl      1.0 transform between hstore and plperl

hstore_plperlu     1.0 transform between hstore and plperlu

hstore_plpython2u  1.0 transform between hstore and plpython2u

hstore_plpythonu   1.0 transform between hstore and plpythonu

insert_username    1.0 functions for tracking who changed a table

ltree_plpython2u   1.0 transform between ltree and plpython2u

ltree_plpythonu    1.0 transform between ltree and plpythonu

moddatetime        1.0 functions for tracking last modification time

pageinspect        1.5 inspect the contents of database pages at a low level

pg_freespacemap    1.1 examine the free space map (FSM)

pg_visibility      1.1 examine the visibility map (VM) and page-level visibility info

postgres_fdw       1.0 foreign-data wrapper for remote PostgreSQL servers

refint             1.0 functions for implementing referential integrity (obsolete)

seg                1.1 data type for representing line segments or floating-point intervals

tcn                1.0 Triggered change notifications

timetravel         1.0 functions for implementing time travel

tsearch2           1.0 compatibility package for pre-8.3 text search functions

xml2               1.1 XPath querying and XSLT

Registro

As operações realizadas no Cloud SQL são registradas na guia Atividade junto com todos os detalhes. Exemplo da criação de uma instância, mostrando todos os detalhes da instância:

Migração do PostgreSQL para o GCP

Para fornecer migração de instalações locais do PostgreSQL, o Google aproveita o pgBouncer.

Observe que não há assistente do console do GCP para migrações do PostgreSQL.

DBA Cuidado!

Alta disponibilidade e replicação

Um nó mestre não pode fazer failover para uma réplica de leitura. A mesma seção descreve outros aspectos importantes das réplicas de leitura:

  • pode ser colocado off-line a qualquer momento para aplicação de patches
  • não siga o nó mestre em outra zona após um failover — como a replicação é síncrona, isso pode afetar o atraso da replicação
  • não há balanceamento de carga entre as réplicas, ou seja, nenhum aplicativo de endpoint único pode ser apontado
  • o tamanho da instância da réplica deve ser pelo menos o tamanho do nó mestre
  • sem replicação entre regiões
  • não é possível fazer backup das réplicas
  • todas as réplicas devem ser excluídas antes que uma instância mestre possa ser restaurada do backup ou excluída
  • a replicação em cascata não está disponível

Usuários

Por padrão, o “superusuário da nuvem” é postgres, que é um membro da função cloudsqlsuperuser. Por sua vez, cloudsqlsuperuser herda as funções padrão do PostgreSQL:

[email protected]:5432 postgres> \du+ postgres

                           List of roles

Role name  | Attributes       | Member of | Description

-----------+------------------------+---------------------+-------------

postgres   | Create role, Create DB | {cloudsqlsuperuser} |



[email protected]:5432 postgres> \du+ cloudsqlsuperuser

                              List of roles

   Role name       | Attributes       | Member of | Description

-------------------+------------------------+--------------+-------------

cloudsqlsuperuser  | Create role, Create DB | {pg_monitor} |

Observe que as funções SUPERUSER e REPLICATION não estão disponíveis.

Backup e recuperação

Os backups não podem ser exportados.

Os backups não podem ser usados ​​para atualizar uma instância, ou seja, restaurar em um mecanismo PostgreSQL diferente.

Recursos como PITR, Replicação Lógica e Compilação JIT não estão disponíveis. As solicitações de recursos podem ser arquivadas no Issue Tracker do Google.

Criptografia

Na criação da instância, o SSL/TLS é ativado, mas não aplicado:

Neste modo, a criptografia pode ser solicitada, mas a validação do certificado não está disponível.

~ $ psql "sslmode=verify-ca user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"

psql: root certificate file "/home/lelu/.postgresql/root.crt" does not exist

Either provide the file or change sslmode to disable server certificate verification.

~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"

Pager usage is off.

psql (11.4, server 9.6.11)

SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)

Type "help" for help.

A tentativa de conectar usando o psql a uma instância com SSL aplicado retornará um erro autoexplicativo:

~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"

psql: FATAL:  connection requires a valid client certificate

Armazenamento

  • O armazenamento pode ser aumentado após a criação da instância, mas nunca diminuído, portanto, fique atento aos custos associados ao crescente espaço de armazenamento ou configure o limite de aumento.
  • O armazenamento é limitado a 30 TB.

CPU

As instâncias podem ser criadas com menos de um núcleo, no entanto, a opção não está disponível no Console do Cloud SQL, pois a instância deve ser criada especificando um dos tipos de máquina de amostra, neste caso – nível:

Exemplo de criação de uma instância de código compartilhado usando gcloud dentro do Cloud Shell:

O número de CPUs é limitado a 64, um limite relativamente baixo para grandes instalações, considerando que quando o 9.2 foi testado, os servidores high-end começaram com 32 núcleos.

Locais de instância

A localização multirregional está disponível apenas para backups.

Acesso via IP público

Por padrão, o assistente do console do GCP permite apenas o acesso ao endereço IP público, mas o acesso é negado até que a rede do cliente seja configurada:

Manutenção

As atualizações podem exceder a janela de manutenção e as réplicas de leitura são atualizadas a qualquer momento.

A documentação não especifica a duração da janela de manutenção. As informações são fornecidas ao criar a instância:

Alterações na contagem de CPU, tamanho da memória ou na zona onde a instância está localizado exige que o banco de dados fique off-line por vários minutos.

Usuários

O Cloud SQL usa os termos "função" e "usuário" alternadamente.

Alta disponibilidade

O custo em uma configuração altamente disponível é o dobro da instância autônoma, e isso inclui armazenamento.

O failover automático é iniciado após cerca de 60 segundos após o nó primário ficar indisponível. De acordo com o relatório da Oracle MAA, isso se traduz em perda de US$ 5.800 por minuto. Considerando que leva de 2 a 3 minutos até que os aplicativos possam reconectar, a interrupção dobra a tripla. Além disso, o intervalo de pulsação de 60 segundos não parece ser uma opção configurável.

Replicação

As réplicas de leitura não podem ser acessadas usando um único endpoint, cada uma recebendo um novo endereço IP:

Os discos permanentes regionais fornecem redundância de dados ao custo do desempenho de gravação.

O Cloud SQL não fará failover para ler réplicas, portanto, os leitores não podem ser considerados uma solução de alta disponibilidade

External replicas and external masters are currently not supported.

Connecting to Instance

Google does not automatically renew the instance SSL certificates, however, both the initiation and rotation procedures can be automated.

If the application is built on the App Engine platform additional limits apply, such as 60 seconds for a database request to complete, 60 concurrent connections for PHP applications. The “App Engine Limits” section in Quotas and limits provides more details:

IP addresses in the range 172.17.0.0/16 are reserved.

Administration

Once started, operations cannot be canceled. Runaway queries can still be stopped by using the pg_terminate_backend and pg_cancel_backend PostgreSQL built-in functions.

A short demonstration using two psql sessions and starting a long running query in the second session:

[email protected]:5432 postgres> select now(); select pg_sleep(3600); select now();

            now

-------------------------------

2019-07-16 02:08:18.739177+00

(1 row)

In the first session, cancel the long running query:

[email protected]:5432 postgres> select pid, client_addr, client_port, query, backend_start from pg_stat_activity where usename = 'postgres';

-[ RECORD 1 ]-+-------------------------------------------------------------------------------------------------------------

pid           | 2182

client_addr   | 173.180.222.170

client_port   | 56208

query         | select pid, client_addr, client_port, query, backend_start from pg_stat_activity where usename = 'postgres';

backend_start | 2019-07-16 01:57:34.99011+00

-[ RECORD 2 ]-+-------------------------------------------------------------------------------------------------------------

pid           | 2263

client_addr   | 173.180.222.170

client_port   | 56276

query         | select pg_sleep(3600);

backend_start | 2019-07-16 02:07:43.860829+00



[email protected]:5432 postgres> select pg_cancel_backend(2263); select now();

-[ RECORD 1 ]-----+--

pg_cancel_backend | t



-[ RECORD 1 ]----------------------

now | 2019-07-16 02:09:09.600399+00

Comparing the timestamps between the two sessions:

ERROR:  canceling statement due to user request

            now

-------------------------------

2019-07-16 02:09:09.602573+00

(1 row)

It’s a match!

While restarting an instance is a recommended method when attempting to resolve database instance issues, avoid restarting before the first restart completed.

Data Import and Export

CSV import/export is limited to one database.

Exporting data as an SQL dump that can be imported later, requires a custom pg_dump command.

To quote from the documentation:

pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \

    | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql

Pricing

Charge Type

Instance ON

Instance OFF

Storage

Yes

Yes

Instance

No

Yes

Troubleshooting

Logging

All actions are recorded and can be viewed under the Activity tab.

Resources

Review the Diagnosing Issues with Cloud SQL instances and Known issues sections in the documentation.

Conclusão

Although missing some important features the PostgreSQL DBA is used to, namely PITR and Logical Replication, Google Cloud SQL provides out of the box high-availability, replication, encryption, and automatic storage increase, just to name a few, making manage PostgreSQL an appealing solution for organizations looking to quickly deploy their PostgreSQL workloads or even migrating from Oracle.

Developers can take advantage of cheap instances such as shared CPU (less than one CPU).

Google approaches the PostgreSQL engine adoption in a conservative manner, the stable offering lagging behind current upstream by 3 versions.

Just as with any solution provider consider getting support which can come in handy during edge scenarios such as when instances are suspended.

For professional support, Google maintains a list of partners which currently includes one of the PostgreSQL professional services , namely EDB.