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.