{"id":7088,"date":"2014-10-27T11:55:39","date_gmt":"2014-10-27T09:55:39","guid":{"rendered":"http:\/\/code.openark.org\/blog\/?p=7088"},"modified":"2014-10-27T16:33:38","modified_gmt":"2014-10-27T14:33:38","slug":"refactoring-replication-topologies-with-pseudo-gtid-a-visual-tour","status":"publish","type":"post","link":"https:\/\/code.openark.org\/blog\/mysql\/refactoring-replication-topologies-with-pseudo-gtid-a-visual-tour","title":{"rendered":"Refactoring replication topologies with Pseudo GTID: a visual tour"},"content":{"rendered":"<p><em>Orchestrator<\/em> <a href=\"https:\/\/github.com\/outbrain\/orchestrator\/releases\/tag\/v1.2.1-beta\">1.2.1-beta<\/a> supports Pseudo GTID (<a href=\"http:\/\/code.openark.org\/blog\/mysql\/orchestrator-1-2-1-beta-pseudo-gtid-support-reconnect-slaves-even-after-master-failure\">read announcement<\/a>): a means to refactor the replication topology and connect slaves even without direct relationship; even across failed servers. This post illustrates two such scenarios and shows the visual way of mathcing\/re-synching slaves.<\/p>\n<p>Of course, orchestrator is not just a GUI tool; anything done with drag-and-drop is also done via web API (in fact, the drag-and-drop invoke the web API) as well as via command line. I&#8217;m mentioning this as this is the grounds for failover automation planned for the future.<\/p>\n<h4>Scenario 1: the master unexpectedly dies<\/h4>\n<p>The master crashes and cannot be contacted. All slaves are stopped as effect, but each in a different position. Some managed to salvage relay logs just before the master dies, some didn&#8217;t. In our scenario, all three slaves are at least caught up with the relay log (that is, whatever they managed to pull through the network, they already managed to execute). So they&#8217;re otherwise sitting idle waiting for something to happen. Well, something&#8217;s about to happen.<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7090\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-1024x323.png\" alt=\"orchestrator-pseudo-gtid-dead-master\" width=\"1024\" height=\"323\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-1024x323.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-300x94.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-900x284.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master.png 1132w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>Note the green &#8220;Safe mode&#8221; button to the right. This means operation is through calculation of binary log files &amp; positions with relation to one&#8217;s master. But the master is now dead, so let&#8217;s switch to adventurous mode; in this mode we can drag and drop slaves onto instances normally forbidden. At this stage the web interface allows us to drop a slave onto its sibling or any of its ancestors (including its very own parent, which is a means of reconnecting a slave with its parent). Anyhow:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7091\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode-1024x296.png\" alt=\"orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode\" width=\"1024\" height=\"296\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode-1024x296.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode-300x86.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode-900x260.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-pseudo-gtid-mode.png 1188w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>We notice that orchestrator is already kind enough to say which slave is best candidate to be the new master (<strong>127.0.0.1:22990<\/strong>): this is the slave (or one of the slaves) with most up-to-date data. So we choose to take another server and make it a slave of <strong>127.0.0.1:22990<\/strong>:<!--more--><\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7093\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag.png\" alt=\"orchestrator-pseudo-gtid-dead-master-begin-drag\" width=\"770\" height=\"349\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag.png 770w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-300x135.png 300w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/a><\/p><\/blockquote>\n<p>And drop:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-drop.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7094\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-drop.png\" alt=\"orchestrator-pseudo-gtid-dead-master-drop\" width=\"799\" height=\"366\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-drop.png 799w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-drop-300x137.png 300w\" sizes=\"auto, (max-width: 799px) 100vw, 799px\" \/><\/a><\/p><\/blockquote>\n<p>There we have it: although their shared master is inaccessible, and the two slave&#8217;s binary log file names &amp; position mean nothing to each other, we are able to correctly match the two and make one child of the other:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7095\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-1-1024x269.png\" alt=\"orchestrator-pseudo-gtid-dead-master-refactored-1\" width=\"1024\" height=\"269\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-1-1024x269.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-1-300x78.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-1-900x236.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-1.png 1068w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>Likewise, we do the same with <strong>127.0.0.1:22988<\/strong>:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7096\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-2-1024x279.png\" alt=\"orchestrator-pseudo-gtid-dead-master-begin-drag-2\" width=\"1024\" height=\"279\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-2-1024x279.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-2-300x81.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-2-900x245.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-begin-drag-2.png 1066w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>And end up with our (almost) final topology:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7097\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-2-1024x255.png\" alt=\"orchestrator-pseudo-gtid-dead-master-refactored-2\" width=\"1024\" height=\"255\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-2-1024x255.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-2-300x74.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-2-900x224.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-master-refactored-2.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>Notice how the two slaves <strong>22988<\/strong>, <strong>22989<\/strong> are happily replicating from <strong>22990<\/strong>. As far as they&#8217;re concerned, there is no problem in the topology any more. Now it&#8217;s your decision: do you decommission the old master? You will need to <strong>RESET SLAVE<\/strong> on <strong>22990<\/strong> (can do via <em>orchestrator<\/em>), turn off <strong>22990<\/strong>&#8216;s <strong>read_only<\/strong> (can do via <em>orchestrator<\/em>) and change DNS entries (or what have you).<\/p>\n<h4>Scenario 2: a local master (&#8220;relay-master&#8221;) unexpectedly dies<\/h4>\n<p>In this scenario we have a <a href=\"http:\/\/code.openark.org\/blog\/mysql\/using-deep-nested-replication-topologies\">deep nested topology<\/a>, and a local master died. What of its slaves?<\/p>\n<blockquote><p>\u00a0<a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7100\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-1024x237.png\" alt=\"orchestrator-pseudo-gtid-dead-relay-master\" width=\"1024\" height=\"237\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-1024x237.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-300x69.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-900x208.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master.png 1168w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>We choose one of the children and drag it over onto the master, which is up and healthy:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7101\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-1024x292.png\" alt=\"orchestrator-pseudo-gtid-dead-relay-master-begin-drag\" width=\"1024\" height=\"292\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-1024x292.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-300x85.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-900x256.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag.png 1097w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>As you can see we are allowed (green instances are allowed drop places) to drop <strong>22989<\/strong> on its sibling and on its grandparent, the latter bypassing a broken connection. There <em>is no<\/em> connection between the two!<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-drop.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7102\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-drop-1024x282.png\" alt=\"orchestrator-pseudo-gtid-dead-relay-master-drop\" width=\"1024\" height=\"282\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-drop-1024x282.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-drop-300x82.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-drop-900x248.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-drop.png 1120w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>And we get a new topology:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7103\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-1-1024x264.png\" alt=\"orchestrator-pseudo-gtid-dead-relay-master-refactored-1\" width=\"1024\" height=\"264\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-1-1024x264.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-1-300x77.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-1-900x232.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-1.png 1095w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p><strong>22989<\/strong> is now lagging, but on the right path! Let&#8217;s do the same for <strong>22988<\/strong>:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-7104\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2-1024x276.png\" alt=\"orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2\" width=\"1024\" height=\"276\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2-1024x276.png 1024w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2-300x81.png 300w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2-900x243.png 900w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-begin-drag-2.png 1085w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p><\/blockquote>\n<p>And finally:<\/p>\n<blockquote><p><a href=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7105\" src=\"http:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-2.png\" alt=\"orchestrator-pseudo-gtid-dead-relay-master-refactored-2\" width=\"809\" height=\"357\" srcset=\"https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-2.png 809w, https:\/\/code.openark.org\/blog\/wp-content\/uploads\/2014\/10\/orchestrator-pseudo-gtid-dead-relay-master-refactored-2-300x132.png 300w\" sizes=\"auto, (max-width: 809px) 100vw, 809px\" \/><\/a><\/p><\/blockquote>\n<p>Great success! <strong>22989<\/strong> already caught up, <strong>22988<\/strong> on the way, victory is ours!<\/p>\n<p>The real fun, of course, is to execute with <strong>&#8211;debug<\/strong> and review the DEBUG messages as orchestrator seeks, finds, matches and follows up on Pseudo GTID entries in the binary logs. We each have our pleasures.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Orchestrator 1.2.1-beta supports Pseudo GTID (read announcement): a means to refactor the replication topology and connect slaves even without direct relationship; even across failed servers. This post illustrates two such scenarios and shows the visual way of mathcing\/re-synching slaves. Of course, orchestrator is not just a GUI tool; anything done with drag-and-drop is also done [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[5],"tags":[108,115,8],"class_list":["post-7088","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-orchestrator","tag-pseudo-gtid","tag-replication"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2bZZp-1Qk","_links":{"self":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts\/7088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/comments?post=7088"}],"version-history":[{"count":14,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts\/7088\/revisions"}],"predecessor-version":[{"id":7143,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/posts\/7088\/revisions\/7143"}],"wp:attachment":[{"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/media?parent=7088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/categories?post=7088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code.openark.org\/blog\/wp-json\/wp\/v2\/tags?post=7088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}