[Openstack] Fwd: [trove] - Discussion on Clustering and Replication API
Jay Pipes
jaypipes at gmail.com
Tue Aug 27 14:06:18 UTC 2013
On 08/27/2013 09:26 AM, Daniel Salinas wrote:
> Forwarding to ML. Sorry somehow this got sent directly to Auston.
Hi Daniel,
On perusing the API, my initial comment was that I would hope we can
remove the redundant key in the JSON serialized object returned by the
various calls?
For example, GET /instances/<ID> returns:
{
"instance": {
"created": "2013-05-08T22:43:34",
"flavor": ...
}
}
Can we get rid of the redundant "instance" key and just return:
{
"created": "2013-05-08T22:43:34",
"flavor": ...
}
Same for "list" results, like GET /clustertypes:
{
"clusterTypes": [
{
"id": "7782954c-ebec-42f0-894b-d3601016a91e",
"links": ...
}
]
}
The result should be an array, not an object with a single key that is
an array:
[
{
"id": "7782954c-ebec-42f0-894b-d3601016a91e",
"links": ...
}
]
Lists do not have any other attributes other than length. We shouldn't
dirty our JSON returns with the filth of XML. ;)
Best,
-jay
> ---------- Forwarded message ----------
> From: *Daniel Salinas* <imsplitbit at gmail.com <mailto:imsplitbit at gmail.com>>
> Date: Fri, Aug 23, 2013 at 3:18 PM
> Subject: Re: [Openstack] [trove] - Discussion on Clustering and
> Replication API
> To: "McReynolds, Auston" <amcreynolds at ebay.com
> <mailto:amcreynolds at ebay.com>>
>
>
> Auston,
>
> The wiki page you're looking through was one approach we discussed but
> ultimately decided against. The current proposal is here:
>
> https://wiki.openstack.org/wiki/Trove-Replication-And-Clustering-API-Using-Instances
>
> It is a bit of a misnomer to call it "using instances" since it uses
> both /instance and /cluster but the consensus during design discussions
> was that we were going to have a clustering api which provides a control
> structure for clustering/replication, not instances. For example,
> adding an instance to a cluster would be a PUT on /cluster/{id}, not
> /cluster/{id}/nodes.
>
> Also we discussed removing actions altogether so we won't have a promote
> action but rather an explicit path for promotion for an instance of a
> cluster. This path *should* be /cluster/{id}/promote with a body
> containing the instance id being promoted.
>
> If you get a chance to read through the above link and still have
> questions feel free to let me know.
>
> I will try to spend some time looking through your discussion points and
> get back to you asap.
>
>
> On Wed, Aug 21, 2013 at 7:46 PM, McReynolds, Auston
> <amcreynolds at ebay.com <mailto:amcreynolds at ebay.com>> wrote:
>
> Blueprint:
>
> https://wiki.openstack.org/wiki/Trove-Replication-And-Clustering-API
>
> Questions:
>
> * Today, /instance/{instance_id}/action is the single endpoint for all
> actions on an instance (where the action is parsed from the payload).
> I see in the newly proposed /clusters api that there's
> /clusters/{cluster_id}/restart, etc. Is this a purposeful move from
> "field of a resource" to sub-resources? If so, is there a plan to
> retrofit the /instance api?
>
> * For "Promote a Slave Node to Master", where is the request
> indicating the promote action (explicitly or implicitly)? I don't see
> it in the uri or the payload.
>
> * "Create Replication Set" is a POST to /clusters, but "Add Node" is a
> PUT to /clusters/{cluster_id}/nodes. This seems inconsistent given
> both are essentially doing the same thing: adding nodes to a cluster.
> What's the reasoning behind the divergence?
>
> * What is the expected result of a resize action request on
> /instance/{instance_id} for an instance that's a part of a cluster
> (meaning the request could have alternatively been executed against
> /cluster/{cluster_id}/nodes/{node_id})? Will it return an error?
> Redirect the request to the /clusters internals?
>
> Discussion:
>
> Although it's common and often advised that the same flavor be used
> for every node in a cluster, there are many situations in which you'd
> purposefully buck the tradition. One example would be choosing a
> beefier flavor for a slave to support ad-hoc queries from a tertiary
> web application (analytics, monitoring, etc.).
>
> Therefore,
>
> {
> "cluster":{
> "nodes":3,
> "flavorRef":"https://service/v1.0/1234/flavors/1",
> "name":"replication_set_1",
> "volume":{
> "size":2
> },
> "clusterConfig":{
> "type":"https://service/v1.0/1234/clustertypes/1234"
> }
> }
> }
>
> is not quite expressive enough. One "out" is that you could force the
> user to resize the slave(s) after the cluster has been completely
> provisioned, but that seems a bit egregious.
>
> Something like the following seems to fit the bill:
>
> {
> "cluster":{
> "clusterConfig":{
> "type":"https://service/v1.0/1234/clustertypes/1234"
> },
> "nodes":[
> {
> "flavorRef":"https://service/v1.0/1234/flavors/1",
> "volume":{
> "size":2
> }
> },
> {
> "flavorRef":"https://service/v1.0/1234/flavors/3",
> "volume":{
> "size":2
> }
> }]
> }
> }
>
> but, which node is arbitrarily elected the master if the clusterConfig
> is set to MySQL Master/Slave? When region awareness is supported in
> Trove, how would you pin a specifically configured node to its
> earmarked region/datacenter? What will the names of the nodes of the
> cluster be?
>
> {
> "cluster":{
> "clusterConfig":{
> "type":"https://service/v1.0/1234/clustertypes/1234"
> },
> "nodes":[
> {
> "name":"usecase-master",
> "flavorRef":"https://service/v1.0/1234/flavors/1",
> "volume":{
> "size":2
> },
> "region": "us-west",
> "nodeConfig": {
> "type": "master"
> }
> },
> {
> "name":"usecase-slave-us-east"
> "flavorRef":"https://service/v1.0/1234/flavors/3",
> "volume":{
> "size":2
> },
> "region": "us-east",
> "nodeConfig": {
> "type": "slave"
> }
> },
> {
> "name":"usecase-slave-eu-de"
> "flavorRef":"https://service/v1.0/1234/flavors/3",
> "volume":{
> "size":2
> },
> "region": "eu-de",
> "nodeConfig": {
> "type": "slave"
> }
> }]
> }
> }
>
> This works decently enough, but it assumes a simple master/slave
> architecture. What about MySQL multi-master with replication?
> See /doc/refman/5.5/en/mysql-cluster-replication-multi-master.html.
> Now, a 'slaveof' or 'primary'/'parent' field is necessary to be more
> specific (either that, or nesting of JSON to indicate relationships).
>
> From above, it's clear that a "nodeConfig" of sorts is needed to
> indicate whether the node is a slave or master, and to whom. Thus far,
> a RDBMS has been assumed, but consider other offerings in the space:
> How will you designate if the node is a seed in the case of Cassandra?
> The endpoint snitch for a Cassandra node? The cluster name for
> Cassandra or the replica-set for Mongo? Whether a slave should be
> daisy-chained to another slave or attached to directly to master in
> the case of Redis?
>
> Preventing service type specifics from bleeding into what should be a
> generic (as possible) schema is paramount. Unfortunately, "nodeConfig"
> as you can see starts to become an amalgamation of fields that are
> only applicable in certain situations, making documentation, codegen
> for clients, and ease of use, a bit challenging. Fast-forward to when
> editable parameter groups become a priority (a.k.a. being able to set
> name-value-pairs in the service type's CONF). If users/customers
> demand the ability to set things like buffer-pool-size while
> provisioning, these fields would likely be placed in "nodeConfig",
> making the situation worse.
>
> Here's an attempt with a slightly different approach:
> https://gist.github.com/amcr/96c59a333b72ec973c3a
>
> From there, you could build a convenience /cluster api to facilitate
> multi-node deployments (vs. building and associating node by node), or
> wait for Heat integration.
>
> Both approaches have their strengths, so I'm convinced it's the
> blending of the two that will result in what we're all looking for.
>
> Thoughts?
>
> Cheers,
> amc
>
>
> _______________________________________________
> Mailing list:
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
> Post to : openstack at lists.openstack.org
> <mailto:openstack at lists.openstack.org>
> Unsubscribe :
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
>
>
>
>
>
> _______________________________________________
> Mailing list: http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
> Post to : openstack at lists.openstack.org
> Unsubscribe : http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack
>
More information about the Openstack
mailing list