Откъде да започна?
Най-доброто място, което можех да намеря да започна, беше не друго, а официалната документация. Има и GCP Youtube канал за тези, които предпочитат мултимедия. След като се озовах в Cloud SQL документацията, се обърнах към Concepts, където ни е обещано да „развием дълбоко разбиране“ на продукта.
И така, нека да започнем!
Функции на PostgreSQL на Google Cloud
Google Cloud SQL за PostgreSQL предлага всички стандартни функции, които бихме очаквали от управлявано решение:висока наличност с автоматично превключване при отказ, автоматично архивиране, криптиране в състояние на покой и по време на пренос, разширено регистриране и наблюдение и на разбира се богат API за взаимодействие с всички услуги.
И за малко история поддръжката на PostgreSQL стартира през март 2017 г., дотогава единствената поддържана машина за база данни беше MySQL.
Cloud SQL изпълнява PostgreSQL на второ поколение компютърна платформа на Google. Пълният списък с функции е достъпен тук и също тук. При преглед на първото става ясно, че никога не е имало платформа от първо поколение за PostgreSQL.
Базите данни, работещи на платформата от второ поколение, се очаква да работят със скорости 7 пъти по-бързи и да се възползват от 20 пъти повече капацитет за съхранение. Блогът, обявяващ платформата от второ поколение, разглежда подробностите за провеждането на теста на sysbench, за да сравни Google Cloud SQL с тогавашния основен конкурент AWS в двете въплъщения RDS и Aurora. Резултатите ме изненадаха, тъй като показват, че Cloud SQL се представя по-добре, докато последните тестове, извършени с помощта на AWS Benchmark, публикуван около година по-късно, заключиха обратното. Това е приблизително по същото време, когато поддръжката на PostgreSQL беше налична. Макар че ме сърби идеята сам да стартирам бенчмарка, предполагам, че има два потенциални фактора, които биха могли да повлияят на резултатите:бенчмаркът на Google за sysbench използва различни параметри и AWS може да са подобрили продуктите си през това време.
Съвместимост с GCP PostgreSQL
Както се очаква Google Cloud SQL за PostgreSQL е почти добавен заместител на общностната версия и поддържа всички процедурни езици на PL/pgSQL SQL.
Някои функции не са достъпни поради съображения за сигурност, например достъп на SUPERUSER. Други функции бяха премахнати поради потенциални рискове за стабилността и производителността на продукта. И накрая, някои опции и параметри не могат да бъдат променяни, въпреки че заявките за промяна на това поведение могат да бъдат направени чрез дискусионната група в Cloud SQL.
Cloud SQL е съвместим и с протокола PostgreSQL.
Когато става въпрос за изолация на транзакциите, Cloud SQL следва поведението по подразбиране на PostgreSQL, като по подразбиране се задава ниво на изолация Read Committed.
За някои от конфигурационните параметри на сървъра Cloud SQL внедрява различни диапазони по причини, необясними в документацията, което все пак е важно нещо, което трябва да запомните.
Мрежа
Има множество начини за свързване към базата данни, в зависимост от това дали екземплярът е в частна мрежа или публична мрежа (приложения, свързващи се извън GCP). Общото и за двата случая е предварително дефинираният VPC, управляван от Google, където се намират всички екземпляри на Cloud SQL база данни.
Частен IP адрес
Клиентите, свързващи се към частен IP адрес, се насочват чрез пирингова връзка между VPC, хостващи клиента, и съответно екземпляра на базата данни. Въпреки че не е специфично за PostgreSQL, важно е да прегледате мрежовите изисквания, за да избегнете проблеми с връзката. Една грешка:веднъж активирана, възможността за частен IP не може да бъде премахната.
Свързване от външни приложения
Връзките от приложения, хоствани извън GCP, могат и трябва да бъдат криптирани. Освен това, за да се избегнат различните атаки, клиентските връзки и приложението трябва да инсталират предоставения клиентски сертификат. Процедурата за генериране и конфигуриране на сертификатите е малко сложна, изискващи персонализирани инструменти, за да се гарантира, че сертификатите се подновяват периодично. Това може да е една от причините Google да предлага опцията за използване на Cloud SQL прокси.
Свързване чрез Cloud SQL прокси
Настройката е доста проста, което всъщност, установих, че е така за всички инструкции в документацията на Google Cloud SQL. Във връзка с това, изпращането на обратна връзка с документацията е много лесно и функцията за екранна снимка беше първа за мен.
Има няколко начина за упълномощаване на прокси връзки и аз избрах да конфигурирам акаунт за услуга, точно както е посочено в документацията за Cloud SQL 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
За да се свържем с отдалечения екземпляр, сега използваме прокси сървъра, като посочим localhost вместо публичния IP адрес на екземпляра:
~ $ 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.
Обърнете внимание, че няма криптиране, тъй като ние се свързваме локално и проксито се грижи за криптирането на трафика, преминаващ в облака.
Честа задача на DBA е да преглеждате връзките към базата данни чрез заявка pg_stat_activity. Документацията гласи, че прокси връзките ще се показват като cloudsqlproxy~1.2.3.4, така че исках да проверя това твърдение. Отворих две сесии като postgres, едната чрез прокси, а другата от домашния ми адрес, така че следната заявка ще свърши работа:
[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 |
Изглежда, че вместо това прокси връзките са идентифицирани като client_port ==-1 и празен client_addr. Това може да се потвърди допълнително чрез сравняване на времевите марки за backend_start и прокси регистрационния файл по-долу:
2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"
Висока наличност на PostgreSQL в Google Cloud
Google Cloud SQL за PostgreSQL гарантира висока наличност, използвайки синхронизация на данни за съхранение на ниско ниво посредством регионални постоянни дискове. Преминаването при отказ е автоматично, с интервал за проверка на сърдечния ритъм от една секунда и превключването при отказ се задейства след около 60 секунди.
Ефективност и наблюдение
Разделът за производителност в документацията посочва общи правила за облак:поддържайте базата данни (както реплики за запис, така и реплики за четене) близо до приложението и вертикално мащабирайте екземпляра. Това, което се откроява, е препоръката за осигуряване на инстанция с поне 60 GB RAM, когато производителността е важна.
Stackdriver осигурява наблюдение и регистриране, както и достъп до регистрационни файлове на PostgreSQL:
Контрол на достъпа
Това се реализира на ниво проект, екземпляр и база данни.
Контрол на достъпа до проекти
Контролът на достъпа до проекти е специфичен за облака контрол на достъпа — той използва концепцията за IAM роли, за да позволи на членовете на проекта (потребители, групи или акаунти за услуги) достъп до различни Cloud SQL ресурси. Списъкът с роли е донякъде разбираем, за подробно описание на всяка роля и свързаните разрешения се обърнете към APIs Explorer или Cloud SQL Admin API за един от поддържаните езици за програмиране.
За да демонстрираме как работят ролите на IAM, нека създадем акаунт за услуга само за четене (преглед):
Стартирайте нов прокси екземпляр на порт 5433, като използвате акаунта на услугата, свързан с роля на зрител:
~/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
Отворете psql връзка към 127.0.0.1:5433:
~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"
Командата излиза с:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Ами сега! Нека проверим регистрационните файлове на прокси сървъра:
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
Контрол на достъпа до инстанция
Достъпът на ниво екземпляр зависи от източника на връзката:
Комбинацията от методи за оторизация заменя вездесъщия pg_hba.conf.
Архивиране и възстановяване
По подразбиране автоматичното архивиране е активирано:
Докато архивирането не влияе на операциите за четене и запис в базата данни, те оказват влияние върху производителността и затова се препоръчва архивирането да се планира по време на периоди на по-ниска активност.
За съкращаване резервните копия могат да се съхраняват в два региона (прилагат се допълнителни такси) с опция за избор на персонализирани местоположения.
За да спестите място за съхранение, използвайте компресия. .gz компресираните файлове се възстановяват прозрачно.
Cloud SQL също поддържа клониране на екземпляри. За най-малкия набор от данни операцията отне около 3 минути:
Начален час на клонирането 10:07:10:
Регистратурите на PostgreSQL показват, че PostgreSQL е станал достъпен в клонирания екземпляр в 10:10:47:
Това все още е по-лесен начин от архивиране и възстановяване, за създаване на копие на екземпляр за целите на тестване, разработка или отстраняване на неизправности.
Най-добри практики в Google Cloud за PostgreSQL
- Конфигурирайте политика за активиране за екземпляри, които не се изисква да работят 24/7.
- Поставете екземпляра на базата данни в същата зона или регион с екземплярите на изчислителната машина и приложенията на App Engine, за да избегнете забавяне на мрежата.
- Създайте екземпляр на базата данни в същата зона като Compute Engine. Ако използвате друг тип връзка, приемете зоната по подразбиране.
- Потребителите, създадени с помощта на Cloud SQL, по подразбиране са суперпотребители в облака. Използвайте PostgreSQL ALTER ROLE, за да промените техните разрешения.
- Използвайте най-новата версия на Cloud SQL Proxy.
- Имената на екземпляри трябва да включват времева марка, за да можете да използвате повторно името при изтриване и повторно създаване на екземпляри.
- pg_dump по подразбиране включва големи обекти. Ако базата данни съдържа BLOB-и, изпълнете изхвърлянето по време на периоди на ниска активност, за да предотвратите отказ на екземпляра.
- Използвайте gcloud sql connect за бързо свързване от външен клиент, без да е необходимо да добавяте IP адреса на клиента в белия списък.
- Абонирайте се за група за обявяване, за да получавате известия за актуализации на продукти и сигнали, като проблеми при създаване на екземпляри:
- Уверете се, че приложенията прилагат техники за управление на връзката с база данни.
- Екземпляри, спрени за повече от 90 дни, ще бъдат изтрити, освен ако не са в спряно състояние.
- Извършете ръчно преминаване при отказ, за да тествате поведението на приложението и продължителността на престоя.
- Използвайте версията на двигателя по подразбиране.
- Пространството за съхранение за екземпляри, конфигурирани да увеличават автоматично хранилището, ще нараства на стъпки от 25 GB. Тъй като пространството за съхранение не може да бъде възстановено, задайте лимит за увеличаване на прогнозния размер на базата данни през следващия бюджетен цикъл и наблюдавайте неизбежните заявки,
- Използвайте „по-ранното“ време за поддръжка за тестови екземпляри:
- Приложенията трябва да използват активни връзки и експоненциално спиране, за да се възстановят бързо след рестартиране на екземпляр.
- Приложение, разчитащо на реплики за четене, трябва да обмисли използването на 3 реплики, за да се избегнат проблеми, причинени от неизправност на регионални постоянни дискове, водещи до недостъпност и на двете реплики.
- Конфигурирайте репликите за четене, за да подобрите производителността на четене.
- Рестартирането на екземпляра се изисква при актуализиране на списъка с IP адреси, разрешени за достъп до публичен екземпляр, за да се прекъснат съществуващите връзки.
- Прегледайте специалната група StackOverflow Cloud SQL за допълнителна информация.
Стартиране на контролен списък за Cloud SQL
Разделът с контролен списък в документацията предоставя преглед на препоръчаните дейности при настройка на готов за производство Cloud SQL за екземпляр на PostgreSQL. По-специално, приложенията трябва да бъдат проектирани да обработват рестартиране на Cloud SQL. Освен това, докато няма ограничения за заявки в секунда, има ограничения за свързване.
Поддръжка на PostgreSQL GCP разширения
Cloud SQL поддържа повечето от разширенията на PostgreSQL. Към момента на написването на тази статия от 52 разширения на общността има 22 неподдържани разширения и 2 неподдържани разширения на PostGIS.
postgis_raster
postgis_sfcgal
За разширенията на PostgreSQL можем или да прегледаме хранилището за PostgreSQL contrib, или по-добре да различим изхода на pg_available_extensions:
Нагоре:
~ $ 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)
Неподдържани разширения в 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
Регистриране
Операциите, извършени в Cloud SQL, се записват в раздела Активност заедно с всички подробности. Пример от създаване на екземпляр, показващ всички подробности за екземпляра:
Миграция на PostgreSQL към GCP
За да осигури миграция на локални PostgreSQL инсталации, Google се възползва от pgBouncer.
Обърнете внимание, че няма GCP конзолен съветник за миграции на PostgreSQL.
DBA Внимание!
Висока наличност и репликация
Главният възел не може да премине при отказ към реплика за четене. Същият раздел очертава други важни аспекти на репликите за четене:
- може да бъде офлайн по всяко време за корекция
- не следвайте главния възел в друга зона след отказ – тъй като репликацията е синхронна, това може да повлияе на забавянето на репликацията
- няма балансиране на натоварването между репликите, с други думи, не могат да бъдат насочени приложения с отделна крайна точка
- размерът на екземпляра на репликата трябва да бъде най-малко размера на главния възел
- няма репликация между региони
- репликата не могат да бъдат архивирани
- всички реплики трябва да бъдат изтрити, преди главен екземпляр да може да бъде възстановен от архивиране или изтрит
- каскадната репликация не е налична
Потребители
По подразбиране „облачният суперпотребител“ е postgres, който е член на ролята на cloudsqlsuperuser. От своя страна cloudsqlsuperuser наследява ролите по подразбиране на 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} |
Обърнете внимание, че ролите SUPERUSER и REPLICATION не са налични.
Архивиране и възстановяване
Резервните копия не могат да бъдат експортирани.
Архивните копия не могат да се използват за надграждане на екземпляр, т.е. възстановяване в различен PostgreSQL механизъм.
Функции като PITR, логическа репликация и JIT компилация не са налични. Заявките за функции могат да се подават в инструмента за проследяване на проблеми на Google.
Шифроване
При създаването на екземпляр SSL/TLS е активиран, но не се прилага:
В този режим може да бъде поискано криптиране, но проверката на сертификата не е налична.
~ $ 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.
Опитът за свързване с помощта на psql към наложен екземпляр на SSL ще върне грешка, която се обяснява сама:
~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"
psql: FATAL: connection requires a valid client certificate
Съхранение
- Съхранението може да се увеличи след създаването на екземпляр, но никога да не се намалява, така че внимавайте за разходите, свързани с нарастващото пространство за съхранение, или конфигурирайте лимита за увеличаване.
- Съхранението е ограничено до 30 TB.
ЦП
Екземплярите могат да бъдат създадени с по-малко от едно ядро, но опцията не е налична в Cloud SQL Console, тъй като екземплярът трябва да бъде създаден чрез посочване на един от примерните типове машини, в този случай – ниво:
Пример за създаване на екземпляр на споделен код с помощта на gcloud в Cloud Shell:
Броят на процесорите е ограничен до 64, относително ниска граница за големи инсталации, като се има предвид, че когато 9.2 беше сравнителен, сървърите от висок клас стартираха с 32 ядра.
Местоположения на екземпляра
Многорегионалното местоположение е достъпно само за архивиране.
Достъп чрез публичен IP
По подразбиране съветникът за конзолата на GCP позволява само достъп до публичен IP адрес, но достъпът е отказан, докато мрежата на клиента не бъде конфигурирана:
Поддръжка
Актуализациите може да надхвърлят прозореца за поддръжка и репликите за четене се актуализират по всяко време.
Документацията не посочва колко дълъг е периодът за поддръжка. Информацията се предоставя при създаване на екземпляр:
Промени в броя на процесора, размера на паметта или зоната, където е екземплярът местоположението изисква базата данни да бъде офлайн за няколко минути.
Потребители
Cloud SQL използва термините „роля“ и „потребител“ взаимозаменяемо.
Висока наличност
Цената в конфигурация с висока достъпност е двойно по-висока от самостоятелния екземпляр и това включва съхранение.
Автоматичното преминаване при отказ се стартира след около 60 секунди след като основният възел стане недостъпен. Според доклада на Oracle MAA това се изразява в загуба от 5800 долара на минута. Като се има предвид, че отнема 2 до 3 минути, докато приложенията могат да се свържат отново, прекъсването се удвоява до тройно. Освен това 60-секундният интервал на сърдечен ритъм изглежда не е конфигурируема опция.
Репликация
Прочетените реплики не могат да бъдат достъпни с помощта на една крайна точка, всяка от които получава нов IP адрес:
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.
Заключение
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.