{"id":566,"date":"2014-04-07T18:05:53","date_gmt":"2014-04-07T18:05:53","guid":{"rendered":"https:\/\/gosqeng.test\/?p=566"},"modified":"2019-11-28T12:12:34","modified_gmt":"2019-11-28T12:12:34","slug":"upgrading-amazon-rds-mysql-5-6-without-downtime","status":"publish","type":"post","link":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime","title":{"rendered":"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime"},"content":{"rendered":"<p>MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid <em>any <\/em>downtime. We could also upgrade from a db.m1.medium to a db.m3.medium instance which provides an extra ECU and is marginally cheaper.<\/p>\n<h2>The problem<\/h2>\n<p>AWS promised automatic upgrading capabilities back in July 2013 but nothing has surfaced. MySQL 5.5 on RDS doesn&#8217;t allow access to the binlog either, which makes a zero downtime and consistent migration very tough indeed. There was no way we&#8217;d lock the tables and stream a <code>mysqldump<\/code> into the new instance \u2014that&#8217;d cause too much downtime.<\/p>\n<p>Ideally, both instances would be able to accept reads and writes for ~30 minutes whilst all of our applications were redeployed smoothly with the new MySQL endpoint. We needed to replicate all data changes on the old instance to the new one while both simultaneously served queries. This is pretty much the worst imaginable situation to be in for consistency. Further, there&#8217;s no access to the binlog (only the general log).<\/p>\n<h2>The solution<\/h2>\n<p>The solution isn&#8217;t pretty. It isn&#8217;t clean or efficient and you risk some data becoming inconsistent during the migration. It also requires you to write your own basic replication application. But it works \u2014give or take a couple of potentially lost updates\u2014 and so long as the potential issues are known they can be worked around.<\/p>\n<h3>Step 0 &#8211; Backup and write the importer<\/h3>\n<p>Take a database snapshot before starting this work (there&#8217;s always a risk that something will go wrong and you&#8217;ll need to revert back). Enable the <code>general_log<\/code> (in the Parameter Groups section) on your old instance and apply the settings immediately.<\/p>\n<p>The importer isn&#8217;t terribly nice \u00a0\u2014here&#8217;s an example of the code in Node.js:<\/p>\n<pre style=\"font-size: 18px; line-height: 20px;\"><code class=\"language-javascript\">var mysql = require('mysql');\nvar async = require('async');\nvar moment = require('moment');\n\nvar oldHost = {\n  host: 'your-old-mysql-host.us-east-1.rds.amazonaws.com',\n  user: 'root',\n  password: 'password',\n  database: 'mysql',\n  port: 3306\n};\n\n\/\/ edit concurrency to change the number of connections\n\/\/ and speed up the replication\nvar concurrency = 50;\n\nvar newHost = {\n  host: 'your-new-mysql-host.us-east-1.rds.amazonaws.com',\n  user: 'root',\n  password: 'password',\n  database: 'yourdatabase',\n  port: 3306,\n  connectionLimit: concurrency\n};\n\nvar oldMySQL = mysql.createConnection(oldHost);\nvar newMySQL = mysql.createPool(newHost);\n\n\/\/ this should be the timestamp when the mysqldump was started\nvar latest = moment.utc('2014-04-03 17:30:22').unix();\n\n\/\/ loop forever until process it exited\nasync.forever(function(done) {\n\n  \/\/ query from the general_log to get any non-SELECT queries (be aware that this is very inefficient)\n  oldMySQL.query(\n    \"SELECT UNIX_TIMESTAMP(event_time) as unix, argument FROM mysql.general_log WHERE command_type = 'Query' AND UNIX_TIMESTAMP(event_time) &gt; ? AND argument != 'flush logs' AND argument NOT LIKE '%SELECT%' AND argument != ''\",\n    [ latest ],\n    function(err, rows) {\n    if (!rows.length) {\n      console.log('NO MORE ROWS', latest);\n\n      \/\/ check the log again for any new queries in 5s\n      setTimeout(function() {\n        done();\n      }, 5000);\n      return;\n    }\n\n    \/\/ set latest to be the event_time of the last query selected\n    latest = rows[rows.length -1].unix;\n\n    \/\/ log to show we're actually doing something\n    console.log(rows.length, moment.unix(latest).format());\n\n    async.eachLimit(rows, concurrency, function(row, fin) {\n\n      newMySQL.getConnection(function(err, con) {\n\n        \/\/ replay the query on our new instance\n        con.query(row.argument, function(err, rows) {\n          con.release();\n          if (err) {\n            console.log(row.argument, err);\n          }\n          fin();\n        });\n      });\n    }, done);\n  });\n});\n<\/code><\/pre>\n<h3>Step 1 &#8211; Boot up the desired instance(s)<\/h3>\n<p>Booting up a read-replica of your old instance isn&#8217;t essential, but it will help stop the <code>mysqldump<\/code> from affecting the main instance.<\/p>\n<p>Next, boot up the new MySQL 5.6 instance that you&#8217;d like to be the new master.<\/p>\n<h3>Step 2 &#8211; Stream a `mysqldump` of the old instance into the new one<\/h3>\n<p>Remember to note down the timestamp when the dump started and update the replication script. Preferably use a read replica for this.<\/p>\n<pre style=\"font-size: 20px; line-height: 24px;\"><code>mysqldump \\\n  \u2013h old-mysql-host-pref-read-replica.us-east-1.rds.amazonaws.com \\ \n  -u root \u2013pPASSWORD \\\n  --port 3306 --single-transaction --routines --triggers \\ \n  --databases your-databases-here --compress --compact \\\n  | mysql \\ \n    -h your-new-mysql-host.us-east-1.rds.amazonaws.com \\\n    -u root user -pPASSWORD --port 3306\n<\/code><\/pre>\n<h3>Step 3 &#8211; Start the replication!<\/h3>\n<p>Run the replication app, it should log how many queries it&#8217;s doing. As you migrate your applications to use the new instance, the numbers should decrease.<\/p>\n<h3>Step 4 &#8211; Migrate your applications to use the new instance<\/h3>\n<p>If you&#8217;re using a custom domain for your MySQL and a CNAME record for where that points, migrating is easy (so long as the DNS TTL is short enough).<\/p>\n<p>Otherwise, every application will need deploying with the new MySQL host configured. Start with the most UPDATE heavy applications. SELECT only applications can be left until last.<\/p>\n<h3>Step 5 &#8211; Wait until replication stops<\/h3>\n<p>After all applications are deployed, there shouldn&#8217;t be any updates going into the old instance. Once this happens, stop the replicator. Taking an export of the entire general_log from the start timestamp may be a good idea &#8211; you can take a look through\/query it and see if there were any critical changes in there (for us &#8211; upgrades, downgrades etc.) to double-check they were replicated properly. <code>SHOW processlist<\/code> may help to see any open connections that have been forgotten.<\/p>\n<h2>Conclusions<\/h2>\n<p>Doing a zero downtime migration from MySQL 5.5 to 5.6 on Amazon RDS is not easy, nor is it 100% consistent. Especially as the <code>general_log<\/code> only provides the query that was run \u00a0and not the resultant row so default values\/auto-increments can be lost or changed. It worked well for our use case \u2014we don&#8217;t run huge number of UPDATE queries. The replication worked fine and we were able to check for any inconsistencies manually.<\/p>\n<p>If possible, it&#8217;d be best to schedule some downtime (or at least UPDATE downtime) for the migration.<\/p>\n<p><a href=\"http:\/\/www.twitter.com\/gosquared\"><em>Good luck and let us know how you got on via Twitter\u00a0@GoSquared<\/em><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime&#8230;.<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1452],"tags":[93,119,1550],"class_list":["post-566","post","type-post","status-publish","format-standard","hentry","category-engineering","tag-amazon","tag-aws","tag-rds"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.6 (Yoast SEO v19.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime<\/title>\n<meta name=\"description\" content=\"MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime\" \/>\n<meta property=\"og:description\" content=\"MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime\" \/>\n<meta property=\"og:site_name\" content=\"GoSquared Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/GoSquared\" \/>\n<meta property=\"article:published_time\" content=\"2014-04-07T18:05:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-28T12:12:34+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@simon_tabor\" \/>\n<meta name=\"twitter:site\" content=\"@GoSquared\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Tabor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/#organization\",\"name\":\"GoSquared\",\"url\":\"https:\/\/www.gosquared.com\/blog\/\",\"sameAs\":[\"https:\/\/instagram.com\/gosquaredteam\",\"https:\/\/www.linkedin.com\/company\/go-squared-ltd.\",\"https:\/\/www.facebook.com\/GoSquared\",\"https:\/\/twitter.com\/GoSquared\"],\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.gosquared.com\/blog\/wp-content\/uploads\/2015\/07\/gosquared.png\",\"contentUrl\":\"https:\/\/www.gosquared.com\/blog\/wp-content\/uploads\/2015\/07\/gosquared.png\",\"width\":1270,\"height\":250,\"caption\":\"GoSquared\"},\"image\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/#website\",\"url\":\"https:\/\/www.gosquared.com\/blog\/\",\"name\":\"GoSquared Blog\",\"description\":\"Turn visitors into customers.\",\"publisher\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.gosquared.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#webpage\",\"url\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime\",\"name\":\"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime\",\"isPartOf\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/#website\"},\"datePublished\":\"2014-04-07T18:05:53+00:00\",\"dateModified\":\"2019-11-28T12:12:34+00:00\",\"description\":\"MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.gosquared.com\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#webpage\"},\"author\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/#\/schema\/person\/71fad71f60ad33cf9356687b37aed3d0\"},\"headline\":\"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime\",\"datePublished\":\"2014-04-07T18:05:53+00:00\",\"dateModified\":\"2019-11-28T12:12:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#webpage\"},\"wordCount\":656,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.gosquared.com\/blog\/#organization\"},\"keywords\":[\"Amazon\",\"AWS\",\"RDS\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#respond\"]}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/#\/schema\/person\/71fad71f60ad33cf9356687b37aed3d0\",\"name\":\"Simon Tabor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.gosquared.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dc920e48608646bda51d2e6e2595e8ad926cff52eba534c1d25fb1618f15b59f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dc920e48608646bda51d2e6e2595e8ad926cff52eba534c1d25fb1618f15b59f?s=96&d=mm&r=g\",\"caption\":\"Simon Tabor\"},\"description\":\"Lead developer at GoSquared for integrations, partnerships and the API. Works on pretty much everything.\",\"sameAs\":[\"http:\/\/simontabor.com\",\"https:\/\/twitter.com\/simon_tabor\"],\"url\":\"https:\/\/www.gosquared.com\/blog\/author\/simontabor\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime","description":"MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime","og_locale":"en_US","og_type":"article","og_title":"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime","og_description":"MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime.","og_url":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime","og_site_name":"GoSquared Blog","article_publisher":"https:\/\/www.facebook.com\/GoSquared","article_published_time":"2014-04-07T18:05:53+00:00","article_modified_time":"2019-11-28T12:12:34+00:00","twitter_card":"summary_large_image","twitter_creator":"@simon_tabor","twitter_site":"@GoSquared","twitter_misc":{"Written by":"Simon Tabor","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"https:\/\/www.gosquared.com\/blog\/#organization","name":"GoSquared","url":"https:\/\/www.gosquared.com\/blog\/","sameAs":["https:\/\/instagram.com\/gosquaredteam","https:\/\/www.linkedin.com\/company\/go-squared-ltd.","https:\/\/www.facebook.com\/GoSquared","https:\/\/twitter.com\/GoSquared"],"logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.gosquared.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.gosquared.com\/blog\/wp-content\/uploads\/2015\/07\/gosquared.png","contentUrl":"https:\/\/www.gosquared.com\/blog\/wp-content\/uploads\/2015\/07\/gosquared.png","width":1270,"height":250,"caption":"GoSquared"},"image":{"@id":"https:\/\/www.gosquared.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"WebSite","@id":"https:\/\/www.gosquared.com\/blog\/#website","url":"https:\/\/www.gosquared.com\/blog\/","name":"GoSquared Blog","description":"Turn visitors into customers.","publisher":{"@id":"https:\/\/www.gosquared.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.gosquared.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#webpage","url":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime","name":"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime","isPartOf":{"@id":"https:\/\/www.gosquared.com\/blog\/#website"},"datePublished":"2014-04-07T18:05:53+00:00","dateModified":"2019-11-28T12:12:34+00:00","description":"MySQL 5.6 has many improvements over 5.5. At GoSquared, we wanted to upgrade and we wanted to avoid any downtime.","breadcrumb":{"@id":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.gosquared.com\/blog"},{"@type":"ListItem","position":2,"name":"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime"}]},{"@type":"Article","@id":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#article","isPartOf":{"@id":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#webpage"},"author":{"@id":"https:\/\/www.gosquared.com\/blog\/#\/schema\/person\/71fad71f60ad33cf9356687b37aed3d0"},"headline":"Upgrading Amazon RDS MySQL 5.5 to 5.6 without downtime","datePublished":"2014-04-07T18:05:53+00:00","dateModified":"2019-11-28T12:12:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#webpage"},"wordCount":656,"commentCount":0,"publisher":{"@id":"https:\/\/www.gosquared.com\/blog\/#organization"},"keywords":["Amazon","AWS","RDS"],"articleSection":["Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.gosquared.com\/blog\/upgrading-amazon-rds-mysql-5-6-without-downtime#respond"]}]},{"@type":"Person","@id":"https:\/\/www.gosquared.com\/blog\/#\/schema\/person\/71fad71f60ad33cf9356687b37aed3d0","name":"Simon Tabor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.gosquared.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dc920e48608646bda51d2e6e2595e8ad926cff52eba534c1d25fb1618f15b59f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dc920e48608646bda51d2e6e2595e8ad926cff52eba534c1d25fb1618f15b59f?s=96&d=mm&r=g","caption":"Simon Tabor"},"description":"Lead developer at GoSquared for integrations, partnerships and the API. Works on pretty much everything.","sameAs":["http:\/\/simontabor.com","https:\/\/twitter.com\/simon_tabor"],"url":"https:\/\/www.gosquared.com\/blog\/author\/simontabor"}]}},"wps_subtitle":"It\u2019s not easy, but upgrading to 5.6 is possible with zero downtime","_links":{"self":[{"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/posts\/566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/comments?post=566"}],"version-history":[{"count":0,"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/posts\/566\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/media?parent=566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/categories?post=566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gosquared.com\/blog\/wp-json\/wp\/v2\/tags?post=566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}