[Openstack] Fwd: [trove] - Discussion on Clustering and Replication API

McReynolds, Auston amcreynolds at ebay.com
Tue Sep 3 00:39:21 UTC 2013


"Also, we discussed removing actions altogether so we won't have a
promote action, but rather an explicit path for promotion..."

As long as it's agreed that the /instances API should be retrofitted
at some point to fit this vision, we have a consensus. Such a change
would likely necessitate an API version bump, creating an opportune
time to fold in Jay's suggestions.

"For example, adding an instance to a cluster would be a PUT on
/cluster/{id}, not /cluster/{id}/nodes."

In the latest wiki you provided, "Create Replication Set: (Previous
db instance)" is a POST to /clusters whereas "Add instance to
cluster/replication" is a PUT to /clusters/{cluster_id}/. Creating
a replica set is the same as adding an instance to an existing
cluster, albiet you're adding multiple instances. Why then, is it a
POST to /clusters vs. a PUT to /clusters/{cluster_id}?

What are your thoughts on the resize question I posed earlier?

> 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?

Looking forward to your thoughts/comments on the discussion portion
of my email.

Cheers,
amc


On 8/27/13 7:06 AM, "Jay Pipes" <jaypipes at gmail.com> wrote:

>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-Usin
>>g-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
>>
>
>
>_______________________________________________
>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