Kde začít?
Nejlepší místo, kde jsem mohl začít, nebylo nic jiného než oficiální dokumentace. Pro ty, kteří preferují multimédia, existuje také kanál GCP Youtube. Jakmile jsem se ocitl v zemi dokumentace Cloud SQL, obrátil jsem se na Concepts, kde nám bylo slíbeno „rozvinout hluboké porozumění“ produktu.
Takže můžeme začít!
Funkce Google Cloud PostgreSQL
Google Cloud SQL pro PostgreSQL nabízí všechny standardní funkce, které bychom očekávali od spravovaného řešení:vysokou dostupnost s automatickým převzetím služeb při selhání, automatické zálohování, šifrování v klidu a při přenosu, pokročilé protokolování a monitorování a samozřejmě bohaté API pro interakci se všemi službami.
A trochu historie, podpora PostgreSQL začala v březnu 2017, do té doby byl jediným podporovaným databázovým strojem MySQL.
Cloud SQL spouští PostgreSQL na počítačové platformě druhé generace společnosti Google. Úplný seznam funkcí je k dispozici zde a také zde. Z přezkoumání prvního je zřejmé, že platforma první generace pro PostgreSQL nikdy neexistovala.
Očekává se, že databáze běžící na platformě druhé generace poběží rychlostí 7x rychleji a těží z 20x větší úložné kapacity. Blog oznamující platformu Second Generation se zabývá podrobnostmi spuštění testu sysbench, aby porovnal Google Cloud SQL s tehdejším hlavním konkurentem AWS v obou inkarnacích RDS a Aurora. Výsledky mě překvapily, protože ukazují, že Cloud SQL funguje lépe, zatímco nedávné testy provedené pomocí AWS Benchmark vydaného o rok později dospěly k opačnému závěru. To je přibližně ve stejnou dobu, kdy byla k dispozici podpora PostgreSQL. I když mě svrbí představa, že bych si spustil benchmark sám, hádám, že existují dva potenciální faktory, které mohly ovlivnit výsledky:benchmark sysbench společnosti Google používal jiné parametry a AWS možná za tu dobu zlepšila své produkty.
Kompatibilita GCP PostgreSQL
Jak se očekávalo, Google Cloud SQL pro PostgreSQL je téměř náhradní náhradou za komunitní verzi a podporuje všechny procedurální jazyky PL/pgSQL SQL.
Některé funkce nejsou z bezpečnostních důvodů dostupné, například přístup SUPERUSER. Ostatní funkce byly odstraněny kvůli potenciálním rizikům pro stabilitu a výkon produktu. A konečně, některé možnosti a parametry nelze změnit, ačkoli požadavky na změnu tohoto chování lze podat prostřednictvím diskusní skupiny Cloud SQL.
Cloud SQL je také drátově kompatibilní s protokolem PostgreSQL.
Pokud jde o izolaci transakcí, Cloud SQL se řídí výchozím chováním PostgreSQL, přičemž výchozí je úroveň izolace Read Committed.
U některých konfiguračních parametrů serveru Cloud SQL implementuje různé rozsahy z důvodů nevysvětlených v dokumentaci, což je stále důležité si pamatovat.
Sítě
Existuje několik způsobů připojení k databázi v závislosti na tom, zda je instance v privátní síti nebo ve veřejné síti (aplikace připojující se mimo GCP). Pro oba případy je společné předdefinované VPC spravované společností Google, kde jsou umístěny všechny instance databáze Cloud SQL.
Soukromá IP
Klienti připojující se k soukromé IP adrese jsou směrováni prostřednictvím peeringového připojení mezi virtuálními počítači hostujícími klienta a instancí databáze. Ačkoli to není specifické pro PostgreSQL, je důležité zkontrolovat síťové požadavky, abyste se vyhnuli problémům s připojením. One gotcha:jakmile je povolena, schopnost privátní IP nemůže být odstraněna.
Připojování z externích aplikací
Spojení z aplikací hostovaných mimo GCP mohou a měla by být šifrována. Navíc, aby se zabránilo různým útokům, klientská připojení a aplikace musí nainstalovat poskytnutý klientský certifikát. Postup pro generování a konfiguraci certifikátů je poněkud komplikovaný a vyžaduje vlastní nástroje, které zajistí, že certifikáty budou pravidelně obnovovány. To může být jeden z důvodů, proč Google nabízí možnost použití Cloud SQL Proxy.
Připojení pomocí Cloud SQL Proxy
Nastavení je poměrně přímočaré, což jsem ve skutečnosti zjistil u všech pokynů v dokumentaci Google Cloud SQL. V souvislosti s tím je odesílání zpětné vazby k dokumentaci smrtelně jednoduché a funkce snímku obrazovky byla pro mě první.
Existuje několik způsobů, jak autorizovat připojení proxy, a já jsem se rozhodl nakonfigurovat účet služby, jak je uvedeno v dokumentaci Cloud SQL Proxy.
Jakmile je vše na svém místě, je čas spustit 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
Pro připojení ke vzdálené instanci nyní používáme proxy se zadáním localhost namísto veřejné IP adresy instance:
~ $ 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.
Upozorňujeme, že neexistuje žádné šifrování, protože se připojujeme místně a server proxy se stará o šifrování provozu proudícího do cloudu.
Běžným úkolem DBA je prohlížení připojení k databázi dotazem na pg_stat_activity. Dokumentace uvádí, že připojení proxy budou zobrazena jako cloudsqlproxy~1.2.3.4, takže jsem chtěl toto tvrzení ověřit. Otevřel jsem dvě relace jako postgres, jednu přes proxy a druhou z mé domácí adresy, takže postačí následující dotaz:
[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 |
Zdá se, že připojení proxy jsou místo toho identifikována jako client_port ==-1 a prázdné client_addr. To lze dodatečně potvrdit porovnáním časových razítek pro backend_start a protokol proxy níže:
2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"
Vysoká dostupnost PostgreSQL na Google Cloud
Google Cloud SQL pro PostgreSQL zajišťuje vysokou dostupnost pomocí nízkoúrovňové synchronizace dat úložiště pomocí regionálních trvalých disků. Přepnutí při selhání je automatické, s intervalem kontroly srdečního tepu jedna sekunda a přepnutí při selhání se spustí přibližně po 60 sekundách.
Výkon a sledování
Oddíl Výkon v dokumentaci poukazuje na obecná pravidla cloudu:databázi (zapisovací i čtené repliky) ponechejte blízko aplikace a vertikálně škálujte instanci. Co vyniká, je doporučení zřídit instanci s alespoň 60 GB RAM, když je důležitý výkon.
Stackdriver poskytuje monitorování a protokolování a také přístup k protokolům PostgreSQL:
Řízení přístupu
Toto je implementováno na úrovni projektu, instance a databáze.
Řízení přístupu k projektu
Řízení přístupu k projektu je řízení přístupu specifické pro cloud – využívá koncept rolí IAM, aby umožnil členům projektu (uživatelům, skupinám nebo servisním účtům) přístup k různým zdrojům Cloud SQL. Seznam rolí je poněkud samovysvětlující, podrobný popis každé role a souvisejících oprávnění naleznete v Průzkumníkovi rozhraní API nebo v rozhraní Cloud SQL Admin API pro jeden z podporovaných programovacích jazyků.
Chceme-li předvést, jak fungují role IAM, vytvořte servisní účet pouze pro čtení (prohlížeč):
Spusťte novou instanci proxy na portu 5433 pomocí účtu služby spojeného s role diváka:
~/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
Otevřete připojení psql k 127.0.0.1:5433:
~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"
Příkaz se ukončí s:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Jejda! Podívejme se na protokoly 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
Řízení přístupu k instancím
Přístup na úrovni instance závisí na zdroji připojení:
Kombinace metod autorizace nahrazuje všudypřítomný pg_hba.conf.
Zálohování a obnovení
Ve výchozím nastavení jsou automatické zálohy povoleny:
Zálohy sice neovlivňují operace čtení a zápisu databáze, ale ovlivňují výkon a proto se doporučuje naplánovat zálohování na období nižší aktivity.
Z důvodu redundance lze zálohy ukládat ve dvou oblastech (za příplatek) s možností výběru vlastních umístění.
Chcete-li ušetřit místo v úložišti, použijte kompresi. Komprimované soubory .gz jsou transparentně obnoveny.
Cloud SQL také podporuje klonování instancí. U nejmenší datové sady trvala operace asi 3 minuty:
Čas zahájení klonování 10:07:10:
Protokoly PostgreSQL ukazují, že PostgreSQL byl dostupný na klonované instanci v 10:10:47:
To je stále snazší způsob vytvoření kopie než zálohování a obnovení instance pro účely testování, vývoje nebo odstraňování problémů.
Doporučené postupy Google Cloud pro PostgreSQL
- Nakonfigurujte zásady aktivace pro instance, které nemusí být spuštěny 24/7.
- Umístěte instanci databáze do stejné zóny nebo oblasti s instancemi výpočetního stroje a aplikacemi App Engine, abyste se vyhnuli latenci sítě.
- Vytvořte instanci databáze ve stejné zóně jako výpočetní stroj. Pokud používáte jakýkoli jiný typ připojení, přijměte výchozí zónu.
- Uživatelé vytvoření pomocí Cloud SQL jsou ve výchozím nastavení superuživatelé cloudu. K úpravě jejich oprávnění použijte PostgreSQL ALTER ROLE.
- Používejte nejnovější verzi Cloud SQL Proxy.
- Názvy instancí by měly obsahovat časové razítko, aby bylo možné název znovu použít při mazání a opětovném vytváření instancí.
- Výchozí nastavení pg_dump zahrnuje velké objekty. Pokud databáze obsahuje objekty BLOB, proveďte výpis během období nízké aktivity, abyste zabránili tomu, aby instance přestala reagovat.
- Pomocí gcloud sql connect se můžete rychle připojit z externího klienta, aniž byste museli zadávat IP adresu klienta na seznam povolených.
- Přihlaste se k odběru oznamovací skupiny, abyste mohli dostávat upozornění na aktualizace produktu a upozornění, jako jsou problémy při vytváření instancí:
- Zajistěte, aby aplikace implementovaly techniky správy připojení k databázi.
- Instance zastavené na více než 90 dní budou smazány, pokud nejsou v pozastaveném stavu.
- Proveďte ruční převzetí služeb při selhání, abyste otestovali chování aplikace a délku výpadku.
- Použijte výchozí verzi motoru.
- Úložný prostor pro instance nakonfigurované k automatickému navyšování úložiště se bude zvětšovat po 25 GB. Vzhledem k tomu, že úložný prostor nelze získat zpět, nastavte limit navýšení odhadované velikosti databáze během příštího rozpočtového cyklu a sledujte nekontrolovatelné dotazy,
- Pro testovací instance použijte „dřívější“ načasování údržby:
- Aplikace by měly používat aktivní připojení a exponenciální stahování, aby se po restartu instance rychle obnovily.
- Aplikace spoléhající na repliky pro čtení by měla zvážit použití 3 replik, aby se předešlo problémům způsobeným selháním regionálních perzistentních disků vedoucích k nedostupnosti obou replik.
- Nakonfigurujte repliky čtení, abyste zlepšili výkon čtení.
- Restart instance je vyžadován při aktualizaci seznamu IP adres s povoleným přístupem k veřejné instanci za účelem odpojení stávajících připojení.
- Další informace naleznete ve vyhrazené skupině StackOverflow Cloud SQL.
Spustit kontrolní seznam pro Cloud SQL
Část kontrolního seznamu v dokumentaci poskytuje přehled doporučených činností při nastavování cloud SQL pro instanci PostgreSQL připravené k produkci. Zejména aplikace musí být navrženy tak, aby zvládly restartování Cloud SQL. I když neexistují žádné limity dotazů za sekundu, existují limity připojení.
Podpora rozšíření GCP pro PostgreSQL
Cloud SQL podporuje většinu rozšíření PostgreSQL. V době psaní tohoto článku z 52 komunitních rozšíření existuje 22 nepodporovaných rozšíření a 2 nepodporovaná rozšíření PostGIS.
postgis_raster
postgis_sfcgal
Pro rozšíření PostgreSQL můžeme buď zkontrolovat repozitář příspěvků PostgreSQL, nebo lépe porovnat výstup pg_available_extensions:
Odchozí:
~ $ 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)
Nepodporovaná rozšíření v 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
Protokolování
Operace prováděné v rámci Cloud SQL jsou protokolovány na kartě Aktivita spolu se všemi podrobnostmi. Příklad z vytvoření instance se zobrazením všech podrobností o instanci:
Migrace PostgreSQL na GCP
K zajištění migrace místních instalací PostgreSQL využívá Google výhod pgBouncer.
Všimněte si, že pro migrace PostgreSQL neexistuje žádný průvodce konzolí GCP.
DBA Pozor!
Vysoká dostupnost a replikace
Hlavní uzel nemůže přejít při selhání do repliky pro čtení. Stejná část nastiňuje další důležité aspekty čtení replik:
- lze kdykoli přepnout do režimu offline za účelem opravy
- nesledujte hlavní uzel v jiné zóně po převzetí služeb při selhání – protože replikace je synchronní, může to ovlivnit zpoždění replikace
- mezi replikami neexistuje žádné vyrovnávání zátěže, jinými slovy, nelze odkazovat na žádné aplikace s jedním koncovým bodem
- velikost instance repliky musí být alespoň velikost hlavního uzlu
- žádná replikace napříč oblastmi
- repliky nelze zálohovat
- před obnovením nebo odstraněním hlavní instance ze zálohy je nutné odstranit všechny repliky
- kaskádová replikace není k dispozici
Uživatelé
Ve výchozím nastavení je „superuživatel cloudu“ postgres, který je členem role cloudsqlsuperuser. Cloudsqlsuperuser zase zdědí výchozí role 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} |
Upozorňujeme, že role SUPERUSER a REPLICATION nejsou dostupné.
Zálohování a obnovení
Zálohy nelze exportovat.
Zálohy nelze použít k upgradu instance, tj. k obnovení do jiného enginu PostgreSQL.
Funkce jako PITR, logická replikace a kompilace JIT nejsou dostupné. Žádosti o funkce lze podat v nástroji Google's Issue Tracker.
Šifrování
Při vytváření instance je SSL/TLS povoleno, ale není vynuceno:
V tomto režimu lze požadovat šifrování, ale ověření certifikátu není k dispozici.
~ $ 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.
Pokus o připojení pomocí psql k instanci vynucené SSL vrátí samovysvětlující chybu:
~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"
psql: FATAL: connection requires a valid client certificate
Úložiště
- Úložiště lze po vytvoření instance zvětšit, ale nikdy jej nesnížit, takže dávejte pozor na náklady spojené s rostoucím úložným prostorem nebo nakonfigurujte limit navýšení.
- Úložiště je omezeno na 30 TB.
CPU
Instance lze vytvořit s méně než jedním jádrem, tato možnost však není v Cloud SQL Console k dispozici, protože instance musí být vytvořena zadáním jednoho ze vzorových typů počítačů, v tomto případě – úroveň:
Příklad vytvoření instance sdíleného kódu pomocí gcloud v Cloud Shell:
Počet CPU je omezen na 64, což je relativně nízký limit pro velké instalace, vezmeme-li v úvahu, že v době, kdy se testovala verze 9.2, začínaly špičkové servery na 32 jádrech.
Umístění instancí
Multiregionální umístění je k dispozici pouze pro zálohy.
Přístup přes veřejnou IP
Průvodce konzolou GCP ve výchozím nastavení povoluje pouze přístup k veřejné IP adrese, přístup je však odepřen, dokud není nakonfigurována síť klienta:
Údržba
Aktualizace mohou přesáhnout dobu údržby a přečtené repliky jsou aktualizovány kdykoli.
Dokumentace neuvádí, jak dlouhé je období údržby. Informace jsou poskytovány při vytváření instance:
Změny počtu CPU, velikosti paměti nebo zóny, kde je instance location vyžaduje, aby byla databáze několik minut offline.
Uživatelé
Cloud SQL používá termíny „role“ a „uživatel“ zaměnitelně.
Vysoká dostupnost
Cena ve vysoce dostupné konfiguraci je dvojnásobná než u samostatné instance, a to včetně úložiště.
Automatické převzetí služeb při selhání je zahájeno přibližně 60 sekund poté, co se primární uzel stane nedostupným. Podle zprávy Oracle MAA to znamená ztrátu 5 800 $ za minutu. Vzhledem k tomu, že trvá 2 až 3 minuty, než se aplikace znovu připojí, výpadek se zdvojnásobí až ztrojnásobí. Navíc se nezdá, že by interval 60 sekund prezenčního signálu byl konfigurovatelnou možností.
Replikace
Read replicas cannot be accessed using a single endpoint, each receiving a new IP address:
Regional persistent disks provide data redundancy at the cost of write performance.
Cloud SQL will not failover to read replicas, hence readers cannot be considered a high availability solution
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.
Závěr
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.