[HN Gopher] Logical replication and decoding for Cloud SQL for P...
       ___________________________________________________________________
        
       Logical replication and decoding for Cloud SQL for PostgreSQL
        
       Author : wdb
       Score  : 56 points
       Date   : 2021-06-05 16:49 UTC (6 hours ago)
        
 (HTM) web link (cloud.google.com)
 (TXT) w3m dump (cloud.google.com)
        
       | atombender wrote:
       | Google just launched the Datastream product in beta, which looks
       | very cool. I find it curious that it doesn't support Postgres at
       | all, even as they're launching the logical replication feature
       | for Cloud SQL.
       | 
       | In fact, the Datastream documentation has a diagram showing
       | Postgres as a source, as well as custom sources -- but,
       | disappointingly, neither is supported. Only Oracle and MySQL are
       | supported.
        
         | wdb wrote:
         | Blog article says its planned for later this year. :)
        
       | jacobkg wrote:
       | Glad to see that they are adding features but I wish the pace was
       | faster. We have been using Cloud SQL for Postgres and overall it
       | is good but there are a number of glaring and frustrating feature
       | holes. The two top of mind for me are:
       | 
       | 1) No way to force SSL connections without enforcing two-way SSL
       | (which is a huge pain and not supported by all the clients we
       | use). This is literally just a Postgres config option but they
       | don't expose it. RDS has had this feature since 2016.
       | 
       | 2) No in place upgrade. This is again a feature built in to
       | Postgres and RDS has had it for years. Instead the upgrade story
       | for Cloud SQL is cumbersome and involves setting up a new
       | instance, creating and loading backups, etc.
       | 
       | We switched to Cloud SQL from running our own Postgres and it is
       | a huge improvement, but the feature set is disappointing compared
       | to RDS
        
         | dilatedmind wrote:
         | how significant is 1 if you are using cloud sql proxy? My
         | understanding is that the proxy tunnels traffic over an
         | encrypted connection, so there is no benefit to adding an extra
         | layer.
        
           | jacobkg wrote:
           | cloud sql proxy is secure and that is what all our developers
           | use for local access to the database.
           | 
           | However, we have some third party data analysis tools (such
           | as Tableau) that also connect to one of our databases. They
           | are hosted in their own clouds and have to connect over the
           | databases's public IP address and can't use cloud_sql_proxy.
           | I of course manually confirmed that these connections use SSL
           | but I would feel much more comfortable if I could enforce it
           | from our end.
        
         | dajonker wrote:
         | I could not agree with you more. These are exactly our two
         | complaints about Postgres on Cloud SQL.
        
           | jacobkg wrote:
           | Glad to know I am not alone!
        
         | Diggsey wrote:
         | Also, if you use Cloud SQL in HA mode, it may still go down
         | randomly for up to 90s with no warning or entry in the
         | operation log, and this is considered expected behaviour.
         | 
         | Here is a direct quote from google support when we contacted
         | them about our database going down outside of our scheduled
         | maintenance window:
         | 
         | > As I mentioned previously remember that the maintenance
         | window is preferred but there are time-sensitive maintenance
         | events that are considered quite important such as this one
         | which is a Live migration. Most maintenance events should be
         | reflected on the operations logs but there are a few other
         | maintenance events such as this one that are more on the
         | infrastructure side that appear transparent to clients because
         | of the nature of the changes made to the Google managed Compute
         | Engine that host the instances, this is a necessary step for
         | maintaining the managed infrastructure. For this reason this
         | maintenance does not appear visible in your logs or on the
         | platform.
         | 
         | Here "transparent to clients" means that the database is
         | completely inaccessible for up to 90s. Furthermore, because
         | there's no entry in the operation log, there's no way to detect
         | if the database is down because of "expected maintenance", or
         | because of some other issue without talking to a human at
         | google support: so really great if you're woken up in the
         | middle of the night because your database is down, and you're
         | trying to figure out what happened...
        
           | [deleted]
        
           | jacobkg wrote:
           | That's troubling. In fairness, when I last used RDS (2018) we
           | had 9 databases running and we averaged about one database
           | failover per month, with about 2-3 minutes of downtime per
           | incident. I never got a satisfactory answer from support
           | other than that this was a thing that sometimes happened.
        
             | Diggsey wrote:
             | To be clear: there is no failover happening, even though we
             | do have a failover instance. If there was, we could at
             | least detect that something had happened after the fact!
             | 
             | The Cloud SQL failover only occurs in certain
             | circumstances, and in all our time using Cloud SQL the
             | failover has not once kicked in automatically (despite many
             | outages).
             | 
             | In fact, one of our earliest support issues was that the
             | "manual failover" button was _disabled_ when any sort of
             | operation was occuring on the datbase, making it almost
             | completely useless! Luckily this issue at least was fixed.
        
       | btown wrote:
       | This is awesome! For comparison, this is also supported on Amazon
       | RDS, so AFAICT this opens up the possibility of near-zero-
       | downtime streaming migrations between the two cloud providers:
       | https://aws.amazon.com/blogs/database/using-logical-replicat...
       | 
       | Also, it enables a really cool pattern of change data capture,
       | which allows you to capture "normal" changes to your Postgres
       | database as events that can be fed to e.g. Kafka and power an
       | event-driven/CQRS system. https://www.confluent.io/blog/bottled-
       | water-real-time-integr... is a 2015 post describing the pattern
       | well; the modern tool that replaces Bottled Water is
       | https://debezium.io/ . For instance, if you have a
       | "last_updated_by" column in your tables that's respected by all
       | your applications, this becomes a more-or-less-free audit log, or
       | at the very least something that you can use to spot-check that
       | your audit logging system is capturing everything it should be!
       | 
       | When you're building and debugging systems that combine trusted
       | human inputs, untrusted human inputs, results from machine
       | learning, and results from external databases, all related to the
       | same entity in your business logic (and who isn't doing all of
       | these things, these days!), having this kind of replayable event
       | capture is invaluable. If you value observability of how your
       | distributed system evolves within the context of a single
       | request, tracking a datum as it evolves over time is the logical
       | (heh) evolution of that need.
        
         | cpursley wrote:
         | Similarly - Supabase uses Elixir to listen to Postgres changes
         | via logical replication. Pretty neat pattern and Elixir/Erlang
         | is especially good at this sort of thing:
         | 
         | https://github.com/supabase/realtime
        
       | pyrophane wrote:
       | Hijacking this thread a bit for a related question. Anyone have a
       | solution for replicating data from Cloud SQL Postgres to BigQuery
       | that they like?
       | 
       | Have been shopping around for a good way to do this, ideally with
       | the ability to capture deletions and schema changes.
       | 
       | Have looked at Fivetran but it seems expensive for this use case,
       | and won't capture deletions until they can support logical
       | replication.
        
         | jeffbee wrote:
         | Bigquery can read directly from cloud SQL.
        
           | pyrophane wrote:
           | Are you referring to federated queries?
        
         | joeswartz wrote:
         | One option is to use DBeam (http://github.com/spotify/dbeam) to
         | export Avro records into GCS and then load to BigQuery with a
         | load job.
        
         | tbrock wrote:
         | We get data into BigQuery from pg using a custom airflow plugin
         | but recently started doing something similar on AWS with DMS to
         | get data from postgres -> redshift.
         | 
         | DMS is awesome. No code is the best code. Big query is great
         | but not having a "snap-your-fingers and the data is there"
         | connector makes it a PITA for me to maintain.
         | 
         | As a result... we are using more redshift.
        
         | hermanradtke wrote:
         | We went with StitchData over FiveTran. We also had to build a
         | custom way to delete records. Hopefully we can get rid of this
         | soon.
        
         | spookylettuce wrote:
         | I tend to utilize bigquery's external connections and scheduled
         | queries to periodically clone my "hot" PG data to an BQ table
         | for long term storage and analysis.
         | 
         | It seems so much easier to go PG=>BQ than the other way around.
        
           | tlarkworthy wrote:
           | I second federated table connector (and scheduled queries).
        
           | patwolf wrote:
           | Same here. We previously used Stitch until they dropped the
           | free tier.
        
           | sa46 wrote:
           | Is the idea something like a scheduled:
           | INSERT INTO bq_table SELECT * FROM EXTERNAL_QUERY('');
           | 
           | I'm guessing you're on the hook for keeping the schema up to
           | date with the Postgres schema.
        
         | mrbungie wrote:
         | An option, albeit a bit complex would be:
         | 
         | Debezium => Kafka => Parquet in Google Cloud Storage =>
         | BigQuery external queries.
        
           | gunnarmorling wrote:
           | Why the Parquet step? You should be able to do straight
           | Debezium -> Kafka -> BQ, using the BQ sink connector for
           | Kafka Connect (https://github.com/confluentinc/kafka-connect-
           | bigquery); we have users using this with the Debezium MySQL
           | connector, I'd expect this to work equally for Postgres.
           | 
           | Disclaimer: working on Debezium
        
       ___________________________________________________________________
       (page generated 2021-06-05 23:00 UTC)