{"id":1912,"date":"2015-01-29T14:04:16","date_gmt":"2015-01-29T14:04:16","guid":{"rendered":"https:\/\/www.anagram.at\/en\/high-performance-mysql-cluster-auf-azure-vms\/"},"modified":"2016-05-03T13:58:23","modified_gmt":"2016-05-03T13:58:23","slug":"high-performance-mysql-cluster-auf-azure-vms","status":"publish","type":"post","link":"https:\/\/www.anagram.at\/en\/high-performance-mysql-cluster-auf-azure-vms\/","title":{"rendered":"Wir nehmen unseren Job ernst: High-Performance and Availability MariaDB Cluster"},"content":{"rendered":"<p>Dieser Artikel beschreibt das Setup eines High-Performance MariaDB Cluster mittels <strong>Azure Ubuntu VMs<\/strong>.<\/p>\n<blockquote><p>Wir wollen unseren Kunden die Sicherheit geben, dass ihre Websites und Services, zu jeder Zeit verf\u00fcgbar sind.<br \/>\nUm das zu bewerkstelligen, setzt Anagram auf ein synchronisiertes Cluster System, um uns und unsere Kunden ruhig schlafen zu lassen.<\/p><\/blockquote>\n<p>Das Resultat des ersten Versuchs ist ein verteiltes und synchronisiertes Datenbanksystem mit vorgelagertem Loadbalancer. Die VMs n\u00fctzen\u00a0Software RAID um Harddiskausf\u00e4lle kompensieren zu k\u00f6nnen. Die Verwendung einer Affinity Group\u00a0gew\u00e4hrt die schnelle Kommunikation innerhalb des virtuellen Netzes, und die \u00a0Availability Group verhindert den gleichzeitigen Ausfall mehrere VMs auf Grund von Wartungsarbeiten.<\/p>\n<p>Auch wenn nicht Azure verwendet wird,\u00a0werden wertvolle Informationen zum Setup eines High Performance Clusters gegeben.<\/p>\n<p>Das Ganze ist eine Adaption dieses <a href=\"http:\/\/azure.microsoft.com\/sv-se\/documentation\/articles\/virtual-machines-mariadb-cluster\/74b5206e-ee98-4057-96df-29887d391d9f\">Artikels<\/a>, jedoch umgesetzt f\u00fcr Ubuntu und ins Deutsche \u00fcbersetzt. Zudem wurden Alternativen aufgezeigt, f\u00fcr Befehle die zum Zeitpunkt der Niederschrift nicht durch Azure unterst\u00fctzt wurden.<\/p>\n<p>Als kleiner Hint: Um den Cursor in der Powershell Console sichtbar zu machen, kann folgender Befehl verwendet werden<\/p>\n<p><code>[Console]::CursorSize = 25<\/code><\/p>\n<p>Ich w\u00fcrde das Ganze zudem noch ins Startupprofile aufnehmen. Dadurch muss das dann nicht immer wieder ausgef\u00fchrt werden.<\/p>\n<h2>Azure Connect<\/h2>\n<p><code>azure login -u\u00a0YOUR_AZURE_USER<\/code><\/p>\n<h2>Affinity Group erzeugen<\/h2>\n<p>Um die Latency zwischen des Virtuellen Servers und des Speichers zu minimieren, kann eine Affinit\u00e4tsgruppe erstellt werden. Diese wird dann dem virtuellen Server und dem Speicher zugewiesen, wodurch garantiert ist, dass diese r\u00e4umlich nah aneinander liegen.<\/p>\n<p><code>azure account affinity-group create anagramcluster --location \"West Europe\" --label \"Anagram Cluster\"<\/code><\/p>\n<p>Anschlie\u00dfend muss noch das virtuelle Netzwerk erstellt werden<br \/>\n(Da zu Beginn Informationen zum virtuellen Netzwerk abgefragt werden, funktioniert das nur, wenn bereits ein virtuelles Netzwerk existiert)<\/p>\n<p><code><br \/>\nazure network vnet create --address-space 10.0.0.0 --cidr 8 --subnet-name dbcluster --subnet-start-ip 10.0.0.0 --subnet-cidr 24 --affinity-group anagramcluster anagramvnet<br \/>\n<\/code><\/p>\n<p>Die folgenden Befehle erwarten eine bestehenden Speicher. Am einfachsten l\u00f6st man das \u00fcber die Platform.<\/p>\n<p>Ich habe den Speicher<\/p>\n<p><code><br \/>\nanagramclusterstorage<br \/>\n<\/code><\/p>\n<p>genannt.<\/p>\n<p>Nun haben wir unser erstes Setup:<\/p>\n<p>Affinity-Group: anagramcluster<br \/>\nVirtual Network:anagramvnet \/ dbcluster<br \/>\nStorage: anagramclusterstorage<\/p>\n<h2>VM\u00a0w\u00e4hlen<\/h2>\n<p>Auflisten aller Ubuntu Images<\/p>\n<p><code>azure vm image list | findstr Ubuntu<\/code><\/p>\n<p>Wir w\u00e4hlen die Ubuntu 14.10<\/p>\n<p>b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_10-amd64-server-20141204-en-us-30GB<\/p>\n<h2>Anlegen der virtuellen Maschine<\/h2>\n<p><code>azure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --blob-url \"https:\/\/anagramclusterstorage.blob.core.windows.net\/vhds\/clustertemplate-os.vhd\" --vm-size Medium --ssh 22 --ssh-cert \"C:\/development\/azure\/azure.pem\" --no-ssh-password a-vm-1 b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_10-amd64-server-20141204-en-us-30GB YOUR_AZURE_USER<br \/>\n<\/code><\/p>\n<p>Jetzt f\u00fcgen wir noch\u00a03 500GB\u00a0Laufwerke hinzu<\/p>\n<p>azure vm disk attach-new a-vm-1 512 https:\/\/www.anagram.atclusterstorage.blob.core.windows.net\/vhds\/a-vm-1-data-1.vhd<br \/>\nazure vm disk attach-new a-vm-1 512 https:\/\/www.anagram.atclusterstorage.blob.core.windows.net\/vhds\/a-vm-1-data-2.vhd<br \/>\nazure vm disk attach-new a-vm-1 512 https:\/\/www.anagram.atclusterstorage.blob.core.windows.net\/vhds\/a-vm-1-data-3.vhd<\/p>\n<h2>Software Installation auf dem virtuellen Rechner<\/h2>\n<p>Wir brauchen root Rechte.<\/p>\n<p><code>sudo su<\/code><\/p>\n<h2>Installiere RAID Unsterst\u00fctzung<\/h2>\n<p>(bei MDADM handelt es sich um Software RAID):<\/p>\n<p><code>apt-get install mdadm<\/code><\/p>\n<p>Die RAID0\/stripe Konfiguration mit einem EXT4 Dateisystem erstellen<\/p>\n<p><code><br \/>\nmdadm --create --verbose \/dev\/md0 --level=stripe --raid-devices=3 \/dev\/sdc \/dev\/sdd \/dev\/sde<br \/>\nmdadm --detail --scan &gt;&gt; \/etc\/mdadm.conf<br \/>\nmkfs -t ext4 \/dev\/md0<br \/>\n<\/code><\/p>\n<p>Den Mount Point erzeugen<\/p>\n<p><code>mkdir \/mnt\/data<\/code><\/p>\n<p>Feststellen der UUID des neu erzeugten RAID Device<\/p>\n<p><code>blkid | grep \/dev\/md0<br \/>\n<\/code><\/p>\n<p>z.B.. 74b5206e-ee98-4057-96df-29887d391d9f<\/p>\n<p><code>\/etc\/fstab<\/code> bearbeiten, damit beim n\u00e4chsten Reboot das Ganze wieder gemounted ist<\/p>\n<p><code>UUID=<\/code><\/p>\n<p>z.B.<\/p>\n<p><code>UUID=\"3ef2895a-d6e8-4d45-8519-75eff134c9a7 \/mnt\/data ext4 defaults,noatime 1 2<\/code><\/p>\n<p>Und Laufwerk einh\u00e4ngen<\/p>\n<p><code><br \/>\nmount \/mnt\/data<br \/>\n<\/code><\/p>\n<h2>MariaDB Installation<\/h2>\n<p><strong>MariaDB Repository anlegen (mittels apt-get)<\/strong><\/p>\n<p><code><br \/>\nsudo apt-get install software-properties-common<br \/>\napt-key adv --recv-keys --keyserver hkp:\/\/keyserver.ubuntu.com:80 0xcbcb082a1bb943db<br \/>\nsudo add-apt-repository 'deb http:\/\/mirror.jmu.edu\/pub\/mariadb\/repo\/5.5\/ubuntu precise main'<br \/>\n<\/code><\/p>\n<p>Nun kann MariaDB installiert werden<\/p>\n<p><code><br \/>\nsudo apt-get update<br \/>\napt-get install mariadb-galera-server mariadb-client galera<br \/>\n<\/code><\/p>\n<p>(Bei der Deinstallation sollte zudem apt-get remove mysql-common ausgef\u00fchrt werden)<\/p>\n<p>Nun sollte auch der mysql Dienst installiert sein (und zumindest auf Ubuntu auch schon gestartet.) Das pr\u00fcft man am besten mit<\/p>\n<p><code>service mysql status <\/code><\/p>\n<p>das Ganze sollte dann ungef\u00e4hr so aussehen:<\/p>\n<p><code><br \/>\n* \/usr\/bin\/mysqladmin Ver 9.0 Distrib 5.5.41-MariaDB, for debian-linux-gnu on x86_64<br \/>\nCopyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.<\/code><\/p>\n<p>Server version 5.5.41-MariaDB-1~precise-wsrep-log<br \/>\nProtocol version 10<br \/>\nConnection Localhost via UNIX socket<br \/>\nUNIX socket \/var\/run\/mysqld\/mysqld.sock<br \/>\nUptime: 5 sec<\/p>\n<p>Threads: 1 Questions: 80 Slow queries: 0 Opens: 54 Flush tables: 2 Open tables: 39 Queries per second avg: 16.000<\/p>\n<h2>Verwenden der RAID Platte f\u00fcr\u00a0MariaDB<\/h2>\n<p>Daten kopieren<br \/>\n<code><br \/>\ncp -avr \/var\/lib\/mysql \/mnt\/data<br \/>\nrm -rf \/var\/lib\/mysql<br \/>\n<\/code><br \/>\nRechte setzen<br \/>\n<code><br \/>\nchown -R mysql:mysql \/mnt\/data &amp;&amp; chmod -R 755 \/mnt\/data\/<br \/>\n<\/code><\/p>\n<p>und einen Symlink auf die RAID Partition setzen<\/p>\n<p><code><br \/>\nln -s \/mnt\/data\/mysql \/var\/lib\/mysql<br \/>\n<\/code><\/p>\n<p>Nun sollte mysql korrekt als Service installiert sein, und mittels<\/p>\n<p><code><br \/>\nservice mysql start<br \/>\nservice mysql stop<br \/>\nservice mysql status<br \/>\n<\/code><\/p>\n<p>gestartet, gestoppt und der Status abgefragt werden.<\/p>\n<p>Nachdem man nun den Dienst mysql gestartet hat, sollte die Sicherheit erh\u00f6ht werden<\/p>\n<p><code>mysql_secure_installation<\/code><\/p>\n<p>Anlage eines Benutzer f\u00fcr Cluster Operationen<\/p>\n<p><code><br \/>\nmysql -u root -p<br \/>\nGRANT ALL PRIVILEGES ON <em>.<\/em> TO 'cluster'@'%' IDENTIFIED BY 'p@ssw0rd' WITH GRANT OPTION; FLUSH PRIVILEGES;<br \/>\nexit<br \/>\n<\/code><\/p>\n<p>wobei das Passwort durch ein sichereres ersetzt werden sollte.<\/p>\n<p>Stoppen des Service<br \/>\n<code><br \/>\nservice mysql stop<br \/>\n<\/code><\/p>\n<h2>Firewall Einstellungen<\/h2>\n<p>Installieren von firewall-cmd<\/p>\n<p><code>apt-get install firewalld <\/code><\/p>\n<p>\u00d6ffnen der Ports<br \/>\n<code><br \/>\nMySQL: firewall-cmd --zone=public --add-port=3306\/tcp --permanent<br \/>\nGALERA: firewall-cmd --zone=public --add-port=4567\/tcp --permanent<br \/>\nGALERA IST: firewall-cmd --zone=public --add-port=4568\/tcp --permanent<br \/>\nRSYNC: firewall-cmd --zone=public --add-port=4444\/tcp --permanent<br \/>\n<\/code><\/p>\n<p>Firewall neu starten<\/p>\n<p><code>firewall-cmd --reload<\/code><\/p>\n<p>Man kann \u00fcberpr\u00fcfen, ob der Port auch wirklich offen ist, mittels<\/p>\n<p><code>firewall-cmd --zone=public --query-port=3306\/tcp<\/code><\/p>\n<p>F\u00fcr die Einstellungen erstellen wir eine neue Datei unter<\/p>\n<p>\/etc\/mysql\/conf.d\/cluster.cnf<br \/>\n<code><br \/>\n[mysqld]\nquery_cache_size=0<br \/>\nbinlog_format=ROW<br \/>\ndefault-storage-engine=innodb<br \/>\ninnodb_autoinc_lock_mode=2<br \/>\nquery_cache_type=0<br \/>\nbind-address=0.0.0.0<\/code><\/p>\n<h1>Galera Provider Configuration<\/h1>\n<p>wsrep_provider=\/usr\/lib\/galera\/libgalera_smm.so<br \/>\n#wsrep_provider_options=&#8221;gcache.size=32G&#8221;<\/p>\n<h1>Galera Cluster Configuration<\/h1>\n<h1>wsrep_cluster_name=&#8221;test_cluster&#8221;<\/h1>\n<h1>wsrep_cluster_address=&#8221;gcomm:\/\/first_ip,second_ip,third_ip&#8221;<\/h1>\n<h1>Galera Synchronization Congifuration<\/h1>\n<p>wsrep_sst_method=rsync<br \/>\nwsrep_sst_auth=cluster:p@ssw0rd<\/p>\n<h1>Galera Node Configuration<\/h1>\n<h1>wsrep_node_address=&#8221;this_node_ip&#8221;<\/h1>\n<h1>wsrep_node_name=&#8221;this_node_name&#8221;<\/h1>\n<p>chkconfig existiert leider nicht f\u00fcr Ubuntu, die brauchbarste Alternative ist wohl<\/p>\n<p><code>sudo apt-get install sysv-rc-conf<\/code><\/p>\n<p>und dann<\/p>\n<p><code>sudo sysv-rc-conf<\/code><\/p>\n<p>und mysql deselektieren. (ich habe es f\u00fcr Level 3,4,5 deaktiviert)<\/p>\n<p>TODO<\/p>\n<p>Wir sollten die Einstellungen von Mysql noch f\u00fcr dieses Setup verbessern. To be continued!<\/p>\n<p><code>waagent -deprovision <\/code><\/p>\n<p>Image Capture durch das Azure Portal, damit dieses Setup nicht nochmals ausgef\u00fchrt werden muss.<\/p>\n<p>Das Image nennen wir<\/p>\n<p>a-vm-1-template<\/p>\n<h2>Erzeugen des Cluster<\/h2>\n<p><code><br \/>\nazure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --availability-set clusteravset --vm-size Medium --ssh-cert \"C:\/development\/azure\/azure.pem\" --no-ssh-password --ssh 22 --vm-name a-vm-1 a-vm-ha a-vm-1-template azure@anagram.at<br \/>\n<\/code><\/p>\n<p>Dadurch wird die erste Instanz unseres Clusters erzeugt. Hier erzeugen wir eine neue VM im virtuellen Netzwerk anagramvnet mit dem Subnet dbluster innerhalb des availability-set clusteravset. Die Rechnergr\u00f6\u00dfe wird medium sein und das Zertifikat azure.pem f\u00fcr das Login verwendet. Zudem wir noch ein Cloud-Endpoint mit dem Namen a-vm-ha angelegt.<\/p>\n<p>Die Ausgaben sollten ungef\u00e4hr so aussehen<br \/>\n<code><br \/>\ninfo: Executing command vm create<br \/>\n+ Looking up image a-vm-1-template<br \/>\n+ Looking up virtual network<br \/>\n+ Looking up cloud service<br \/>\ninfo: cloud service a-vm-ha not found.<br \/>\ninfo: Using the virtual network's affinity group anagramcluster<br \/>\n+ Creating cloud service<br \/>\n+ Configuring certificate<br \/>\n+ Creating VM<br \/>\ninfo: vm create command OK<br \/>\n<\/code><\/p>\n<p>Jetzt erzeugen wir noch zwei weitere VMs, und verbinden diese mit dem Endpoint a-vm-ha.<br \/>\n<code><br \/>\nazure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --availability-set clusteravset --vm-size Medium --ssh-cert \"C:\/development\/azure\/azure.pem\" --no-ssh-password --ssh 23 --vm-name a-vm-2 --connect a-vm-ha a-vm-1-template azure@anagram.at<br \/>\n<\/code><\/p>\n<p><code><br \/>\nazure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --availability-set clusteravset --vm-size Medium --ssh-cert \"C:\/development\/azure\/azure.pem\" --no-ssh-password --ssh 24 --vm-name a-vm-3 --connect a-vm-ha a-vm-1-template azure@anagram.at<br \/>\n<\/code><\/p>\n<p>Nun m\u00fcssen wir die IP-Adressen der gerade erzeugten VMs ausfindig machen. Das geschieht am Besten \u00fcber das Portal.<\/p>\n<p>Dann verbinden wir uns mit den drei erzeugten VMs und \u00e4ndern folgende Einstellungen unter \/etc\/conf.d\/cluster.cnf<br \/>\n<code><br \/>\n[mysqld]\nquery_cache_size=0<br \/>\nbinlog_format=ROW<br \/>\ndefault-storage-engine=innodb<br \/>\ninnodb_autoinc_lock_mode=2<br \/>\nquery_cache_type=0<br \/>\nbind-address=0.0.0.0<\/code><\/p>\n<h1>Galera Provider Configuration<\/h1>\n<p>wsrep_provider=\/usr\/lib\/galera\/libgalera_smm.so<br \/>\n#wsrep_provider_options=&#8221;gcache.size=32G&#8221;<\/p>\n<h1>Galera Cluster Configuration<\/h1>\n<p>wsrep_cluster_name=&#8221;a-vm-ha&#8221;<br \/>\nwsrep_cluster_address=&#8221;gcomm:\/\/10.10.0.4,10.10.0.5,10.10.0.6&#8243;<\/p>\n<h1>Galera Synchronization Congifuration<\/h1>\n<p>wsrep_sst_method=rsync<br \/>\nwsrep_sst_auth=cluster:PW<\/p>\n<h1>Galera Node Configuration<\/h1>\n<p>wsrep_node_address=&#8221;10.10.0.4&#8243;<br \/>\nwsrep_node_name=&#8221;a-vm-1&#8243;<\/p>\n<p>Anschlie\u00dfend m\u00fcssen wir noch den Inhalt von \/etc\/conf.d\/debian.cnf auf a-vm1 und a-vm-2 kopieren (jeweils in das gleich File)<\/p>\n<p>Aktuell sollte keiner der drei DB-Server laufen, deshalb k\u00f6nnen wir nun unseren Cluster starten.<\/p>\n<p><code>sudo service mysql start --wsrep-new-cluster<\/code><\/p>\n<p>Der Parameter &#8211;wsrep-new-cluster legt fest, dass es sich hier um einen neuen Cluster handelt. Alle anderen Clusterteilnehmer werden diese quasi &#8220;Joinen&#8221;, w\u00fcrde man das weglassen, so schl\u00e4gt das Kommando fehl, da kein anderer Clusternode vorhanden ist.<\/p>\n<p>Alle weiteren VMs k\u00f6nnen dann mittels<\/p>\n<p><code>sudo service mysql start<\/code><\/p>\n<p>gestartet werden.<\/p>\n<h2>Load Balancing<\/h2>\n<p>Zu Beginn haben wir eine ein Availability Set angelegt, dem wir die virtuellen Maschinene zugewiesen haben. Dadurch ist garantiert, dass Wartungsarbeiten nicht an zwei Maschinen gleichzeitig stattfinden. Nun erf\u00fcllen wir auch die Bedingungen f\u00fcr das Azure Service Level Agreement (SLA).<\/p>\n<p>Jetzt aktivieren wir noch den Azure Loadbalancer.<\/p>\n<p>Die Definition des Kommandos lautet dabei folgenderma\u00dfen<\/p>\n<p><code>azure vm endpoint create-multiple ::::::<\/code><\/p>\n<p><code><br \/>\nazure vm endpoint create-multiple a-vm-1 3306:3306:tcp:false:MySQL:tcp:3306<br \/>\nazure vm endpoint create-multiple a-vm-2 3306:3306:tcp:false:MySQL:tcp:3306<br \/>\nazure vm endpoint create-multiple a-vm-3 3306:3306:tcp:false:MySQL:tcp:3306<br \/>\n<\/code><\/p>\n<h2>Test<\/h2>\n<p>Hat alles richtig funktioniert, so sollten nun alle Daten zwischen den drei Clusternodes synchronisiert werden.<\/p>\n<p>Zudem l\u00e4uft die Verbindung zu a-vm-ha.cloudapp.net nun \u00fcber den Azure Loadbalancer und w\u00e4hlt, je nach Last, eine der drei Instanzen.<\/p>\n<p>Die Verbindung zu a-vm-ha.cloudapp.net sollte nun auch durch die verschiedenen Clients m\u00f6glich sein.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Artikel beschreibt das Setup eines High-Performance MariaDB Cluster mittels <strong>Azure Ubuntu VMs<\/strong>.<\/p>\n<blockquote><p>Wir wollen unseren Kunden die Sicherheit geben, dass ihre Websites und Services, zu jeder Zeit verf\u00fcgbar sind.<br \/>\nUm das zu bewerkstelligen, setzt Anagram auf ein synchronisiertes Cluster System, um uns und unsere Kunden ruhig schlafen zu lassen.\n<\/p><\/blockquote>\n<p>Das Resultat des ersten Versuchs ist ein verteiltes und synchronisiertes Datenbanksystem mit vorgelagertem Loadbalancer. Die VMs n\u00fctzen\u00a0Software RAID um Harddiskausf\u00e4lle kompensieren zu k\u00f6nnen. Die Verwendung einer Affinity Group\u00a0gew\u00e4hrt die schnelle Kommunikation innerhalb des virtuellen Netzes, und die \u00a0Availability Group verhindert den gleichzeitigen Ausfall mehrere VMs auf Grund von Wartungsarbeiten. <\/p>\n<p>Auch wenn nicht Azure verwendet wird,\u00a0werden wertvolle Informationen zum Setup eines High Performance Clusters gegeben.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":""},"categories":[79],"tags":[],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Harald","author_link":"https:\/\/www.anagram.at\/en\/author\/admin\/"},"_links":{"self":[{"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/posts\/1912"}],"collection":[{"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/comments?post=1912"}],"version-history":[{"count":1,"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/posts\/1912\/revisions"}],"predecessor-version":[{"id":2475,"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/posts\/1912\/revisions\/2475"}],"wp:attachment":[{"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/media?parent=1912"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/categories?post=1912"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.anagram.at\/en\/wp-json\/wp\/v2\/tags?post=1912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}