Mulai dari mana?
Tempat terbaik yang bisa saya temukan untuk memulai tidak lain adalah dokumentasi resmi. Ada juga saluran Youtube GCP bagi mereka yang lebih menyukai multimedia. Setelah menemukan diri saya di lahan dokumentasi Cloud SQL, saya beralih ke Konsep di mana kita dijanjikan untuk "mengembangkan pemahaman yang mendalam" tentang produk.
Jadi, mari kita mulai!
Fitur Google Cloud PostgreSQL
Google Cloud SQL untuk PostgreSQL menawarkan semua fitur standar yang kami harapkan dari solusi terkelola:ketersediaan tinggi dengan failover otomatis, pencadangan otomatis, enkripsi saat istirahat dan dalam perjalanan, pencatatan dan pemantauan lanjutan, dan tentu saja API yang kaya untuk berinteraksi dengan semua layanan.
Dan untuk sedikit sejarah, dukungan PostgreSQL dimulai pada Maret 2017, hingga saat itu satu-satunya mesin database yang didukung adalah MySQL.
Cloud SQL menjalankan PostgreSQL di platform komputasi Generasi Kedua Google. Daftar lengkap fitur tersedia di sini dan juga di sini. Meninjau yang pertama, jelas bahwa tidak pernah ada platform Generasi Pertama untuk PostgreSQL.
Basis data yang berjalan pada platform Generasi Kedua diharapkan berjalan dengan kecepatan 7x lebih cepat dan memanfaatkan kapasitas penyimpanan 20x lebih banyak. Blog yang mengumumkan platform Generasi Kedua membahas detail menjalankan pengujian sysbench untuk membandingkan Google Cloud SQL dengan pesaing utama saat itu AWS di kedua inkarnasi RDS, dan Aurora. Hasilnya memang mengejutkan saya karena menunjukkan Cloud SQL berkinerja lebih baik sedangkan pengujian terbaru yang dilakukan menggunakan AWS Benchmark yang dirilis sekitar setahun kemudian menyimpulkan sebaliknya. Itu sekitar waktu yang sama dukungan PostgreSQL tersedia. Meskipun saya sendiri sudah penasaran dengan ide menjalankan tolok ukur, saya menduga ada dua faktor potensial yang dapat memengaruhi hasil:tolok ukur sysbench Google menggunakan parameter yang berbeda dan AWS mungkin telah meningkatkan produk mereka selama waktu itu.
Kompatibilitas PostgreSQL GCP
Seperti yang diharapkan Google Cloud SQL untuk PostgreSQL hampir merupakan pengganti drop-in untuk versi komunitas dan mendukung semua bahasa prosedural SQL PL/pgSQL.
Beberapa fitur tidak tersedia karena alasan keamanan, misalnya akses SUPERUSER. Fitur lain telah dihapus karena potensi risiko yang ditimbulkan pada stabilitas dan kinerja produk. Terakhir, beberapa opsi dan parameter tidak dapat diubah, meskipun permintaan untuk mengubah perilaku tersebut dapat dilakukan melalui Grup Diskusi Cloud SQL.
Cloud SQL juga kompatibel dengan protokol PostgreSQL.
Dalam hal isolasi transaksi, Cloud SQL mengikuti perilaku default PostgreSQL, secara default ke tingkat isolasi Read Committed.
Untuk beberapa parameter konfigurasi server, Cloud SQL mengimplementasikan rentang yang berbeda untuk alasan yang tidak dapat dijelaskan dalam dokumentasi, masih merupakan hal yang penting untuk diingat.
Jaringan
Ada beberapa cara untuk terhubung ke database, bergantung pada apakah instance berada di jaringan pribadi atau jaringan publik (aplikasi terhubung dari luar GCP). Umum untuk kedua kasus tersebut adalah VPC standar yang dikelola oleh Google tempat semua instance database Cloud SQL berada.
IP Pribadi
Klien yang terhubung ke alamat IP pribadi dirutekan melalui koneksi peering antara VPC yang menghosting klien dan masing-masing instance database. Meskipun tidak spesifik untuk PostgreSQL, penting untuk meninjau persyaratan jaringan, untuk menghindari masalah koneksi. Satu gotcha:setelah diaktifkan, kemampuan IP pribadi tidak dapat dihapus.
Menghubungkan dari Aplikasi Eksternal
Sambungan dari aplikasi yang dihosting di luar GCP, dapat, dan harus dienkripsi. Selain itu, untuk menghindari berbagai serangan, koneksi klien dan aplikasi harus menginstal sertifikat klien yang disediakan. Prosedur untuk membuat dan mengonfigurasi sertifikat itu agak rumit, membutuhkan alat khusus untuk memastikan bahwa sertifikat diperbarui secara berkala. Itu mungkin salah satu alasan mengapa Google menawarkan opsi untuk menggunakan Proxy Cloud SQL.
Menghubungkan Menggunakan Proxy Cloud SQL
Penyiapannya cukup mudah, yang sebenarnya, saya temukan sebagai kasus untuk semua petunjuk dalam dokumentasi Google Cloud SQL. Pada catatan terkait, mengirimkan umpan balik dokumentasi sangat sederhana, dan fitur tangkapan layar adalah yang pertama bagi saya.
Ada beberapa cara untuk mengotorisasi koneksi proxy dan saya memilih untuk mengonfigurasi akun layanan, seperti yang dijelaskan dalam dokumentasi Cloud SQL Proxy.
Setelah semuanya siap, saatnya memulai 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
Untuk terhubung ke instance jarak jauh, kita sekarang menggunakan proxy dengan menentukan localhost alih-alih alamat IP publik 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.
Perhatikan bahwa tidak ada enkripsi karena kami terhubung secara lokal dan proxy menangani enkripsi lalu lintas yang mengalir ke awan.
Tugas DBA yang umum adalah melihat koneksi ke database dengan menanyakan pg_stat_activity. Dokumentasi menyatakan bahwa koneksi proxy akan ditampilkan sebagai cloudsqlproxy~1.2.3.4 jadi saya ingin memverifikasi klaim itu. Saya telah membuka dua sesi sebagai postgres, satu melalui proxy dan yang lainnya dari alamat rumah saya, jadi kueri berikut akan dilakukan:
[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 |
Tampaknya koneksi proxy diidentifikasi sebagai client_port ==-1 dan client_addr kosong. Ini juga dapat dikonfirmasi dengan membandingkan cap waktu untuk backend_start dan log proxy di bawah ini:
2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"
Ketersediaan Tinggi PostgreSQL di Google Cloud
Google Cloud SQL untuk PostgreSQL memastikan ketersediaan tinggi menggunakan sinkronisasi data penyimpanan tingkat rendah melalui persistent disk regional. Failover otomatis, dengan interval pemeriksaan detak jantung satu detik, dan failover dipicu setelah sekitar 60 detik.
Kinerja dan Pemantauan
Bagian Performa dari dokumentasi menunjukkan aturan umum cloud:jaga agar database (replika penulis dan baca) tetap dekat dengan aplikasi, dan skalakan instance secara vertikal. Yang menonjol adalah rekomendasi untuk menyediakan instans dengan setidaknya 60 GB RAM saat kinerja penting.
Stackdriver menyediakan pemantauan dan pencatatan log, serta akses ke log PostgreSQL:
Kontrol Akses
Ini diimplementasikan pada level project, instance, dan database.
Kontrol Akses Proyek
Kontrol akses project adalah kontrol akses khusus cloud — kontrol ini menggunakan konsep peran IAM untuk memungkinkan anggota project (pengguna, grup, atau akun layanan) mengakses berbagai resource Cloud SQL. Daftar peran cukup jelas, untuk deskripsi mendetail tentang setiap peran dan izin terkait, lihat APIs Explorer, atau Cloud SQL Admin API untuk salah satu bahasa pemrograman yang didukung.
Untuk mendemonstrasikan cara kerja peran IAM, mari buat akun layanan hanya-baca (penampil):
Mulai instance proxy baru pada port 5433 menggunakan akun layanan yang terkait dengan peran pemirsa:
~/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
Buka koneksi psql ke 127.0.0.1:5433:
~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"
Perintah keluar dengan:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Ups! Mari kita periksa log 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
Kontrol Akses Instans
Akses tingkat instance bergantung pada sumber koneksi:
Kombinasi metode otorisasi menggantikan pg_hba.conf yang ada di mana-mana.
Pencadangan dan Pemulihan
Secara default, pencadangan otomatis diaktifkan:
Meskipun pencadangan tidak memengaruhi operasi baca dan tulis basis data, pencadangan memengaruhi kinerja dan oleh karena itu disarankan agar pencadangan dijadwalkan selama periode aktivitas yang lebih rendah.
Untuk redundansi, cadangan dapat disimpan di dua wilayah (berlaku biaya tambahan) dengan opsi memilih lokasi khusus.
Untuk menghemat ruang penyimpanan, gunakan kompresi. File terkompresi .gz dipulihkan secara transparan.
Cloud SQL juga mendukung kloning instans. Untuk kumpulan data terkecil, operasi memakan waktu sekitar 3 menit:
Waktu mulai kloning 10:07:10:
Log PostgreSQL menunjukkan bahwa PostgreSQL tersedia pada instance kloning pada pukul 10:10:47:
Itu masih merupakan cara yang lebih mudah daripada mencadangkan dan memulihkan, untuk membuat salinan dari sebuah instance untuk tujuan pengujian, pengembangan, atau pemecahan masalah.
Praktik Terbaik Google Cloud untuk PostgreSQL
- Konfigurasikan kebijakan aktivasi untuk instans yang tidak harus berjalan 24/7.
- Tempatkan instance database di zona, atau region yang sama, dengan instance mesin komputasi dan aplikasi App Engine untuk menghindari latensi jaringan.
- Buat instance database di zona yang sama dengan Compute Engine. Jika menggunakan jenis koneksi lain, terima zona default.
- Pengguna yang dibuat menggunakan Cloud SQL secara default adalah pengguna super cloud. Gunakan PostgreSQL ALTER ROLE untuk mengubah izinnya.
- Gunakan Proxy Cloud SQL versi terbaru.
- Nama instance harus menyertakan stempel waktu agar dapat menggunakan kembali nama tersebut saat menghapus dan membuat ulang instance.
- pg_dump default untuk menyertakan objek besar. Jika database berisi BLOB, lakukan dump selama periode aktivitas rendah untuk mencegah instance menjadi tidak responsif.
- Gunakan gcloud sql connect untuk terhubung dengan cepat dari klien eksternal tanpa perlu memasukkan alamat IP klien ke daftar putih.
- Berlangganan grup pengumuman untuk menerima pemberitahuan tentang pembaruan produk dan peringatan seperti masalah saat membuat instance:
- Pastikan aplikasi menerapkan teknik manajemen koneksi database.
- Instance yang dihentikan selama lebih dari 90 hari akan dihapus kecuali tidak dalam status ditangguhkan.
- Lakukan failover manual untuk menguji perilaku aplikasi dan lamanya waktu henti.
- Gunakan versi mesin default.
- Ruang penyimpanan untuk instans yang dikonfigurasi untuk meningkatkan penyimpanan secara otomatis, akan bertambah dengan penambahan sebesar 25 GB. Karena ruang penyimpanan tidak dapat diperoleh kembali, tetapkan batas peningkatan ke perkiraan ukuran database selama siklus anggaran berikutnya, dan pantau kueri yang tidak diinginkan,
- Gunakan waktu pemeliharaan "sebelumnya" untuk instance pengujian:
- Aplikasi harus menggunakan koneksi aktif dan backoff eksponensial agar cepat pulih setelah instance dimulai ulang.
- Aplikasi yang mengandalkan replika baca harus mempertimbangkan untuk menggunakan 3 replika untuk menghindari masalah yang disebabkan oleh kegagalan persisten disk regional yang menyebabkan kedua replika menjadi tidak tersedia.
- Konfigurasikan replika baca untuk meningkatkan performa baca.
- Instance restart diperlukan saat memperbarui daftar alamat IP yang diizinkan untuk mengakses instance publik untuk memutuskan koneksi yang ada.
- Tinjau grup khusus StackOverflow Cloud SQL untuk informasi tambahan.
Daftar Periksa Peluncuran untuk Cloud SQL
Bagian daftar periksa dalam dokumentasi memberikan ringkasan aktivitas yang direkomendasikan saat menyiapkan instance Cloud SQL untuk PostgreSQL yang siap produksi. Secara khusus, aplikasi harus dirancang untuk menangani restart Cloud SQL. Selain itu, meskipun tidak ada batasan kueri per detik, ada batasan koneksi.
Dukungan Ekstensi GCP PostgreSQL
Cloud SQL mendukung sebagian besar ekstensi PostgreSQL. Sampai tulisan ini dibuat, dari 52 ekstensi komunitas, ada 22 ekstensi yang tidak didukung dan 2 ekstensi PostGIS yang tidak didukung.
postgis_raster
postgis_sfcgal
Untuk ekstensi PostgreSQL, kami dapat meninjau repositori kontribusi PostgreSQL, atau lebih baik, membedakan output dari pg_available_extensions:
Upstream:
~ $ 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)
Ekstensi yang tidak didukung di 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
Logging
Operasi yang dilakukan dalam Cloud SQL dicatat di bawah tab Aktivitas bersama dengan semua detailnya. Contoh pembuatan instance, menampilkan semua detail instance:
Migrasi PostgreSQL ke GCP
Untuk menyediakan migrasi penginstalan PostgreSQL lokal, Google memanfaatkan pgBouncer.
Perhatikan bahwa tidak ada wizard GCP Console untuk migrasi PostgreSQL.
Awas DBA!
Ketersediaan dan Replikasi Tinggi
Node master tidak dapat melakukan failover ke replika baca. Bagian yang sama menguraikan aspek penting lainnya dari replika baca:
- bisa offline kapan saja untuk patch
- jangan ikuti master node di zona lain setelah failover — karena replikasi sinkron, ini dapat memengaruhi jeda replikasi
- tidak ada penyeimbangan beban antar replika, dengan kata lain, tidak ada aplikasi titik akhir tunggal yang dapat diarahkan
- ukuran instance replika setidaknya harus seukuran node master
- tidak ada replikasi lintas wilayah
- replika tidak dapat dicadangkan
- semua replika harus dihapus sebelum instance master dapat dipulihkan dari cadangan atau dihapus
- replikasi bertingkat tidak tersedia
Pengguna
Secara default, "cloud superuser" adalah postgres yang merupakan anggota dari peran cloudsqlsuperuser. Pada gilirannya, cloudsqlsuperuser mewarisi peran default 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} |
Perhatikan bahwa peran SUPERUSER dan REPLICATION tidak tersedia.
Pencadangan dan Pemulihan
Cadangan tidak dapat diekspor.
Cadangan tidak dapat digunakan untuk memutakhirkan instance, yaitu memulihkan ke mesin PostgreSQL yang berbeda.
Fitur seperti PITR, Replikasi Logis, dan Kompilasi JIT tidak tersedia. Permintaan fitur dapat diajukan di Pelacak Masalah Google.
Enkripsi
Saat pembuatan instance, SSL/TLS diaktifkan tetapi tidak diterapkan:
Dalam mode ini, enkripsi dapat diminta, namun validasi sertifikat tidak tersedia.
~ $ 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.
Mencoba terhubung menggunakan psql ke instance yang didukung SSL akan mengembalikan kesalahan yang cukup jelas:
~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"
psql: FATAL: connection requires a valid client certificate
Penyimpanan
- Penyimpanan dapat ditingkatkan setelah pembuatan instance tetapi tidak pernah berkurang, jadi perhatikan biaya yang terkait dengan ruang penyimpanan yang semakin besar, atau konfigurasikan batas peningkatan.
- Penyimpanan dibatasi hingga 30 TB.
CPU
Instance dapat dibuat dengan kurang dari satu inti, namun opsi ini tidak tersedia di Cloud SQL Console karena instance harus dibuat dengan menentukan salah satu jenis mesin sampel, dalam hal ini – tingkat:
Contoh membuat instance kode bersama menggunakan gcloud di dalam Cloud Shell:
Jumlah CPU dibatasi hingga 64, batas yang relatif rendah untuk besar instalasi, mengingat saat 9.2 dijadikan benchmark, server kelas atas dimulai pada 32 core.
Lokasi Instance
Lokasi multi-regional hanya tersedia untuk cadangan.
Akses melalui IP Publik
Secara default, Wizard Konsol GCP hanya mengaktifkan akses alamat IP publik, namun, akses ditolak hingga jaringan klien dikonfigurasi:
Pemeliharaan
Pembaruan dapat melebihi masa pemeliharaan dan replika baca diperbarui setiap saat.
Dokumentasi tidak menentukan berapa lama durasi periode pemeliharaan. Informasi diberikan saat membuat instance:
Perubahan pada jumlah CPU, ukuran memori, atau zona tempat instance berada berlokasi mengharuskan database offline selama beberapa menit.
Pengguna
Cloud SQL menggunakan istilah “peran” dan “pengguna” secara bergantian.
Ketersediaan Tinggi
Biaya dalam konfigurasi yang sangat tersedia adalah dua kali lipat dari instans mandiri, dan itu termasuk penyimpanan.
Failover otomatis dimulai setelah sekitar 60 detik setelah node utama tidak tersedia. Menurut laporan Oracle MAA, ini berarti kerugian $5.800 per menit. Mengingat dibutuhkan 2 hingga 3 menit hingga aplikasi dapat menyambungkan kembali pemadaman berlipat ganda hingga tiga kali lipat. Selain itu, interval detak jantung 60 detik tampaknya bukan opsi yang dapat dikonfigurasi.
Replikasi
Replika baca tidak dapat diakses menggunakan satu titik akhir, masing-masing menerima alamat IP baru:
Disk persisten regional menyediakan redundansi data dengan mengorbankan kinerja penulisan.
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 |
Pemecahan Masalah
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.
Kesimpulan
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.