Trove-Replication-And-Clustering-API-Single
MYSQL
MySQL Master/Slave
For Master/Slave, the server_id must differ, and optionally the slave can specify whether it is read_only or not to avoid accidental writes.
Create Configuration-Group for Master
Request:
POST /configurations { "configuration": { "name": "config-a", "datastore": { "type": "mysql", "version": "mysql-5.5" }, "values": { "server_id": 1 } } }
Response:
{ "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "name": "config-a", "description": null, "datastore_version_id": "c5ad9638-b7a1-464b-8cef-721d8c29dbf9", "values": { "server_id": 1 } } }
Create Configuration-Group for Slave
Request:
POST /configurations { "configuration": { "name": "config-b", "datastore": { "type": "mysql", "version": "mysql-5.5" }, "values": { "server_id": 2, "read_only": true } } }
Response:
{ "configuration": { "id": "fc318e00-3a6f-4f93-af99-146b44912188", "name": "config-b", "description": null, "datastore_version_id": "c5ad9638-b7a1-464b-8cef-721d8c29dbf9", "values": { "server_id": 2, "read_only": true } } }
Notes:
- read_only here is used for illustrative purposes; it can be omitted or set to false on the slave/read-replica as desired.
Create Master
Request:
POST /instances { "instance": { "availability_zone": "us-west-1", "name": "product-a", "datastore": { "type": "mysql", "version": "mysql-5.5" }, "topology": { "mysql": { "type": "master", } }, "configuration": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "flavorRef": "7", "volume": { "size": 1 } } }
Response:
{ "instance": { "status": "BUILD", "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "product-a", "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "name": "config-a", "links": [{...}] }, ... } }
Create Slave
Request:
POST /instances { "instance": { "availability_zone": "us-west-2", "name": "product-b", "datastore": { "type": "mysql", "version": "mysql-5.5" }, "topology": { "mysql": { "type": "slave", "replicates_from": [{"id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998"}] } }, "configuration": "fc318e00-3a6f-4f93-af99-146b44912188", "flavorRef": "7",, "volume": { "size": 1 } } }
Response:
{ "instance": { "status": "BUILD", "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", "name": "product-b", "configuration": { "id": "fc318e00-3a6f-4f93-af99-146b44912188", "name": "config-b", "links": [{...}] }, ... } }
Notes:
- type and replicates_from will be the only supported input fields, despite replicates_to being returned in a GET /instances/<id> response
- replicates_from and replicates_to should be arrays to properly represent star + fan-in/multi-source + all-masters replication patterns (Tungsten, MySQL 5.7)
- For now, replicates_from takes a trove instance uuid, but inevitably will need to be prefixed with resource-names to support multiple dcs and sources
- Format of trove:dc:tenant:source:id/name, where source is instance, or backup or etc.
- *or* additional fields like datacenter, tenant, etc. will need to be added to each dict in replicates_from
Show Instance
Request:
GET /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998
Response:
{ "instance": { "status": "ACTIVE", "updated": "2014-02-16T03:38:49" "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "product-a", "datastore": { "version": "mysql-5.5", "type": "mysql", }, "topology": { "mysql": { "type": "master", "replicates_to": [{"id": "061aaf4c-3a57-411e-9df9-2d0f813db859"}] } }, "flavor": { "id": "7", "links": [{...}] }, "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "name": "config-a", "links": [{...}] } } }
Show Topology
Request:
GET /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998/topology
Response:
{ "instance": { "status": "ACTIVE", "updated": "2014-02-16T03:38:49" "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "product-a", "datastore": { "version": "mysql-5.5", "type": "mysql", }, "topology": { "members": [ { "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "product-a", "mysql": { "type": "master", "replicates_to": [{"id": "061aaf4c-3a57-411e-9df9-2d0f813db859"}] } }, { "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", "name": "product-b", "mysql": { "type": "slave", "replicates_from": [{"id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998"}] } } ] } "flavor": { "id": "7", "links": [{...}] }, "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "name": "config-a", "links": [{...}] } } }
Remove Replication (aka "Promote" to Standalone)
Request:
POST /instances/061aaf4c-3a57-411e-9df9-2d0f813db859/topology { "promote": {} }
Response:
TBD
Notes:
- The PUT /instances/<id> approach requires bloat to prevent multiple unrelated fields from changing in-tandem.
- configuration-groups uses PUT, yet things like resize use /action; no ubiquitous approach.
MySQL Master/Master
For Master/Master, the server_id must differ and the increments be offset so as to avoid collisions.
Create Configuration-Group for Master A
Request:
POST /configurations { "configuration": { ... "values": { "server_id": 1, "auto_increment_increment": 2, "auto_increment_offset": 1 }, ... } }
Response:
{ "configuration": { ... "values": { "server_id": 1, "auto_increment_increment": 2, "auto_increment_offset": 1 }, ... } }
Create Configuration-Group for Master B
Request:
POST /configurations { "configuration": { ... "values": { "server_id": 2, "auto_increment_increment": 2, "auto_increment_offset": 2 }, ... } }
Response:
{ "configuration": { ... "values": { "server_id": 2, "auto_increment_increment": 2, "auto_increment_offset": 2 }, ... } }
Create Master A
Request:
- Same as seen in Master/Slave scenario
Response:
- Same as seen in Master/Slave scenario
Create Master B
Request:
POST /instances { "instance": { ... "topology": { "mysql": { "type": "master", "join": [{"id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998"}] } }, ... } }
Response:
{ "instance": { "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", ... } }
Show Instance
Request:
- Same as in Master/Slave scenario
Response:
{ "instance": { ... "topology": { "mysql": { "type": "master", "join": [{"id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998"}] } }, ... } }
Show Topology
Request:
- Same as in Master/Slave scenario
Response:
{ "topology": { "id": "377d54bb-9e89-4ac3-bf29-f78c2fd4faca", ... "members": [ { "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", ... "topology": { "mysql": { "type": "master", "join": [{"id": "061aaf4c-3a57-411e-9df9-2d0f813db859"}] } } }, { "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", ... "topology": { "mysql": { "type": "master", "join": [{"id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998"}] } } } ] } }
Remove Replication (aka "Promote")
Request:
POST /instances/061aaf4c-3a57-411e-9df9-2d0f813db859/action { "update_topology": { "topology": { "mysql": { "type": "master", "join": [] } } } } *or* PUT /instances/061aaf4c-3a57-411e-9df9-2d0f813db859 { "instance": { "topology": { "mysql": { "type": "master", "join": [] } } } } *or* POST /instances/061aaf4c-3a57-411e-9df9-2d0f813db859/topology { "promote": {} }
Response:
TBD