Difference between revisions of "Trove/Replication-And-Clustering-With-Nodes"
< Trove
(updated remove node notes and changed to DELETE) |
|||
Line 1: | Line 1: | ||
− | == Cassandra == | + | == Summary == |
+ | <br> | ||
+ | ==== Summary of instance.cluster{} Fields for Instance-Create ==== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Field !! Type !! Description !! Applicable Datastore(s) | ||
+ | |- | ||
+ | | size || int || size of the new cluster || mongdb, cassandra, couchbase, redis-cluster | ||
+ | |- | ||
+ | | slave.of || string (uuid) || instance-id of the master of which to be a slave || mysql, redis, redis-cluster | ||
+ | |- | ||
+ | | slave.read_only || boolean || whether this slave should be read-only || mysql, redis, redis-cluster | ||
+ | |} | ||
+ | <br> | ||
+ | <br> | ||
+ | ==== Summary of instance.cluster{} Fields for Instance-Show ==== | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Field !! Type !! Description !! Datastore(s) | ||
+ | |- | ||
+ | | size || int || size of the cluster (excluding slaves) || mongdb, cassandra, couchbase, redis-cluster | ||
+ | |- | ||
+ | | nodes || array || instance-ids of nodes || mongdb, cassandra, couchbase, redis-cluster | ||
+ | |- | ||
+ | | slaves || array || instance-ids of slaves || mysql, redis, redis-cluster | ||
+ | |- | ||
+ | | slave.of || string (uuid) || instance-id of master (if a slave) || mysql, redis, redis-cluster | ||
+ | |- | ||
+ | | slave.read_only || boolean || if a slave, whether it's read-only || mysql, redis, redis-cluster | ||
+ | |} | ||
+ | <br> | ||
+ | ==== Summary of Route Changes ==== | ||
+ | <br> | ||
+ | New Route: | ||
+ | <pre> | ||
+ | GET /instances/<id>/node/<node-id> | ||
+ | </pre> | ||
+ | <pre> | ||
+ | { | ||
+ | "node": { | ||
+ | "status": "<status>", | ||
+ | "id": "<node-id>", | ||
+ | "name": "<name>", | ||
+ | "created": "<timestamp>", | ||
+ | "updated": "<timestamp>", | ||
+ | "links": [{...}], | ||
+ | "ip": ["<ip>"], //or hostname, depending on conf | ||
+ | "volume": { | ||
+ | "size": <size>, | ||
+ | "used": <used> | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | New Route: | ||
+ | <pre> | ||
+ | POST /instances/<id>/node/<node-id>/action | ||
+ | </pre> | ||
+ | <pre> | ||
+ | { | ||
+ | "<action>": { | ||
+ | <action-specific fields> | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | <br> | ||
+ | == Example: Cassandra == | ||
+ | <br> | ||
+ | To illustrate the approach, Cassandra is used in the examples below. The eccentricities of each Datastore will be explained in their own sections. | ||
+ | <br> | ||
<br> | <br> | ||
==== Create Instance ==== | ==== Create Instance ==== | ||
Line 12: | Line 81: | ||
"datastore": { | "datastore": { | ||
"type": "cassandra", | "type": "cassandra", | ||
− | "version": "2.0. | + | "version": "2.0.6" |
}, | }, | ||
"configuration": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", | "configuration": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", | ||
Line 20: | Line 89: | ||
}, | }, | ||
"cluster": { | "cluster": { | ||
− | " | + | "size": 3 |
} | } | ||
} | } | ||
Line 39: | Line 108: | ||
"datastore": { | "datastore": { | ||
"type": "cassandra", | "type": "cassandra", | ||
− | "version": "2.0. | + | "version": "2.0.6" |
}, | }, | ||
"configuration": { | "configuration": { | ||
Line 53: | Line 122: | ||
}, | }, | ||
"cluster": { | "cluster": { | ||
− | " | + | "size": 3, |
"nodes": [ | "nodes": [ | ||
{"id": "416b0b16-ba55-4302-bbd3-ff566032e1c1"}, | {"id": "416b0b16-ba55-4302-bbd3-ff566032e1c1"}, | ||
Line 66: | Line 135: | ||
Notes: | Notes: | ||
* The instance.name now acts as the "cluster name", and in the case of Cassandra, the actual cluster_name. | * The instance.name now acts as the "cluster name", and in the case of Cassandra, the actual cluster_name. | ||
− | * cluster. | + | * cluster.size indicates how many nodes should be in the initial cluster (required) |
* The cluster.nodes[].id are generated uuids | * The cluster.nodes[].id are generated uuids | ||
* Cassandra-specific fields that are required to construct the initial cluster (num_tokens, endpoint_snitch, seed ip-list, etc.) are to be determined/calculated based on configuration file values and common-sense. | * Cassandra-specific fields that are required to construct the initial cluster (num_tokens, endpoint_snitch, seed ip-list, etc.) are to be determined/calculated based on configuration file values and common-sense. | ||
Line 92: | Line 161: | ||
"datastore": { | "datastore": { | ||
"type": "cassandra", | "type": "cassandra", | ||
− | "version": "2.0. | + | "version": "2.0.6" |
}, | }, | ||
"configuration": { | "configuration": { | ||
Line 106: | Line 175: | ||
}, | }, | ||
"cluster": { | "cluster": { | ||
− | " | + | "size": 3, |
"nodes": [ | "nodes": [ | ||
{"id": "416b0b16-ba55-4302-bbd3-ff566032e1c1"}, | {"id": "416b0b16-ba55-4302-bbd3-ff566032e1c1"}, | ||
Line 155: | Line 224: | ||
* the node.status will likely mirror the state values and transitions seen in instance.status prior to the clustering implementation. | * the node.status will likely mirror the state values and transitions seen in instance.status prior to the clustering implementation. | ||
<br> | <br> | ||
− | ==== | + | ==== Scale Nodes ==== |
<br> | <br> | ||
− | + | Request: | |
<pre> | <pre> | ||
− | POST /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998 | + | POST /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998/action |
+ | |||
{ | { | ||
− | " | + | "resize_cluster": { |
+ | "size": 6 | ||
+ | } | ||
} | } | ||
</pre> | </pre> | ||
<br> | <br> | ||
− | ==== | + | Response: |
+ | <pre> | ||
+ | HTTP 202 (Empty Body) | ||
+ | </pre> | ||
+ | <br> | ||
+ | Notes: | ||
+ | * For the first iteration, only increasing the number of nodes is supported (decreasing is not). | ||
+ | <br> | ||
+ | ==== All Other Operations ==== | ||
+ | <br> | ||
+ | Notes: | ||
+ | * Other operations like: removing a node, replacing a running node, replacing a dead node, repairing a node, etc. are not supported in the first iteration. | ||
+ | <br> | ||
+ | == Example: MySQL == | ||
+ | <br> | ||
+ | ==== Create Instance ==== | ||
<br> | <br> | ||
Request: | Request: | ||
<pre> | <pre> | ||
− | + | POST /instances | |
+ | { | ||
+ | "instance": { | ||
+ | "name": "products", | ||
+ | "datastore": { | ||
+ | "type": "mysql", | ||
+ | "version": "5.5" | ||
+ | }, | ||
+ | "configuration": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", | ||
+ | "flavorRef": "7", | ||
+ | "volume": { | ||
+ | "size": 1 | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | Response: | ||
+ | |||
+ | <pre> | ||
+ | { | ||
+ | "instance": { | ||
+ | "status": "BUILD", | ||
+ | "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", | ||
+ | "name": "products", | ||
+ | "created": "2014-04-25T20:19:23", | ||
+ | "updated": "2014-04-25T20:19:23", | ||
+ | "links": [{...}], | ||
+ | "datastore": { | ||
+ | "type": "mysql", | ||
+ | "version": "5.5" | ||
+ | }, | ||
+ | "configuration": { | ||
+ | "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "flavor": { | ||
+ | "id": "7", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "volume": { | ||
+ | "size": 1 | ||
+ | } | ||
+ | } | ||
+ | } | ||
</pre> | </pre> | ||
<br> | <br> | ||
− | + | ==== Create Slave ==== | |
− | |||
− | |||
<br> | <br> | ||
+ | Request: | ||
+ | |||
+ | <pre> | ||
+ | POST /instances | ||
+ | { | ||
+ | "instance": { | ||
+ | "name": "products-slave", | ||
+ | "datastore": { | ||
+ | "type": "mysql", | ||
+ | "version": "5.5" | ||
+ | }, | ||
+ | "configuration": "fc318e00-3a6f-4f93-af99-146b44912188", | ||
+ | "flavorRef": "7", | ||
+ | "volume": { | ||
+ | "size": 1 | ||
+ | }, | ||
+ | "cluster": { | ||
+ | "slave": { | ||
+ | "of": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", | ||
+ | "read_only": true | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
− | ==== | + | Response: |
+ | |||
+ | <pre> | ||
+ | { | ||
+ | "instance": { | ||
+ | "status": "BUILD", | ||
+ | "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", | ||
+ | "name": "products", | ||
+ | "created": "2014-04-25T20:19:23", | ||
+ | "updated": "2014-04-25T20:19:23", | ||
+ | "links": [{...}], | ||
+ | "datastore": { | ||
+ | "type": "mysql", | ||
+ | "version": "5.5" | ||
+ | }, | ||
+ | "configuration": { | ||
+ | "id": "fc318e00-3a6f-4f93-af99-146b44912188", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "flavor": { | ||
+ | "id": "7", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "volume": { | ||
+ | "size": 1 | ||
+ | }, | ||
+ | "cluster": { | ||
+ | "slave": { | ||
+ | "of": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", | ||
+ | "read_only": true | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | <br> | ||
+ | ==== Show Master ==== | ||
<br> | <br> | ||
Request: | Request: | ||
<pre> | <pre> | ||
− | + | GET /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998 | |
+ | </pre> | ||
+ | |||
+ | Response: | ||
+ | <pre> | ||
{ | { | ||
− | " | + | "instance": { |
− | " | + | "status": "ACTIVE", |
+ | "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", | ||
+ | "name": "products", | ||
+ | "created": "2014-04-25T20:19:23", | ||
+ | "updated": "2014-04-25T20:19:23", | ||
+ | "links": [{...}], | ||
+ | "datastore": { | ||
+ | "type": "mysql", | ||
+ | "version": "5.5" | ||
+ | }, | ||
+ | "configuration": { | ||
+ | "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "flavor": { | ||
+ | "id": "7", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "volume": { | ||
+ | "size": 1 | ||
+ | }, | ||
+ | "cluster": { | ||
+ | "slaves": [ | ||
+ | {"id": "061aaf4c-3a57-411e-9df9-2d0f813db859"} | ||
+ | ] | ||
+ | } | ||
} | } | ||
} | } | ||
</pre> | </pre> | ||
<br> | <br> | ||
+ | ==== Show Slave ==== | ||
+ | <br> | ||
+ | Request: | ||
+ | |||
+ | <pre> | ||
+ | GET /instances/061aaf4c-3a57-411e-9df9-2d0f813db859 | ||
+ | </pre> | ||
+ | |||
Response: | Response: | ||
+ | |||
<pre> | <pre> | ||
− | + | { | |
+ | "instance": { | ||
+ | "status": "ACTIVE", | ||
+ | "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", | ||
+ | "name": "products", | ||
+ | "created": "2014-04-25T20:19:23", | ||
+ | "updated": "2014-04-25T20:19:23", | ||
+ | "links": [{...}], | ||
+ | "datastore": { | ||
+ | "type": "mysql", | ||
+ | "version": "5.5" | ||
+ | }, | ||
+ | "configuration": { | ||
+ | "id": "fc318e00-3a6f-4f93-af99-146b44912188", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "flavor": { | ||
+ | "id": "7", | ||
+ | "links": [{...}], | ||
+ | }, | ||
+ | "volume": { | ||
+ | "size": 1 | ||
+ | }, | ||
+ | "cluster": { | ||
+ | "slave": { | ||
+ | "of": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", | ||
+ | "read_only": true | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
</pre> | </pre> | ||
<br> | <br> | ||
+ | == MongoDB == | ||
+ | <br> | ||
+ | Notes: | ||
+ | * instance.name will function as the replica-set name | ||
+ | * The smallest viable deployment pattern for a replica-set is 3 nodes. A three member replica-set can either be (a) a primary and two secondaries or (b) a primary, a secondary, and an arbiter. option (b) provides less redundancy and fault tolerance, so it will not be supported in this first iteration. Therefore, size=3 by default creates a three member replica-set with one primary and two secondaries. | ||
+ | * instance.cluster.size will only support '3', '5', and '7' as values for MongoDB in this first iteration. Why? (a) an odd number of members ensures the replica-set is always able to elect a primary (b) only 7 members can vote at a time. | ||
+ | ** Scaling the Nodes from 3 to 5, or 5 to 7 will be supported. | ||
+ | ** A replica-set can have up to 12 members, but only 7 voting members. To avoid having to implement and handle 'priority'/'hidden' in the first iteration, the maximum number of nodes is capped at 7. | ||
+ | * Changing the priority, hidden, slaveDelay, or adding an Arbiter will not be supported in this first iteration. | ||
+ | <br> | ||
+ | == Couchbase == | ||
+ | <br> | ||
+ | Notes: | ||
+ | * instance.cluster.size can be any positive number | ||
+ | * Scaling the Nodes by increasing the number will be supported. | ||
+ | * Removing a Node will not be supported in the first iteration. |
Revision as of 20:44, 28 April 2014
Summary
Summary of instance.cluster{} Fields for Instance-Create
Field | Type | Description | Applicable Datastore(s) |
---|---|---|---|
size | int | size of the new cluster | mongdb, cassandra, couchbase, redis-cluster |
slave.of | string (uuid) | instance-id of the master of which to be a slave | mysql, redis, redis-cluster |
slave.read_only | boolean | whether this slave should be read-only | mysql, redis, redis-cluster |
Summary of instance.cluster{} Fields for Instance-Show
Field | Type | Description | Datastore(s) |
---|---|---|---|
size | int | size of the cluster (excluding slaves) | mongdb, cassandra, couchbase, redis-cluster |
nodes | array | instance-ids of nodes | mongdb, cassandra, couchbase, redis-cluster |
slaves | array | instance-ids of slaves | mysql, redis, redis-cluster |
slave.of | string (uuid) | instance-id of master (if a slave) | mysql, redis, redis-cluster |
slave.read_only | boolean | if a slave, whether it's read-only | mysql, redis, redis-cluster |
Summary of Route Changes
New Route:
GET /instances/<id>/node/<node-id>
{ "node": { "status": "<status>", "id": "<node-id>", "name": "<name>", "created": "<timestamp>", "updated": "<timestamp>", "links": [{...}], "ip": ["<ip>"], //or hostname, depending on conf "volume": { "size": <size>, "used": <used> } } }
New Route:
POST /instances/<id>/node/<node-id>/action
{ "<action>": { <action-specific fields> } }
Example: Cassandra
To illustrate the approach, Cassandra is used in the examples below. The eccentricities of each Datastore will be explained in their own sections.
Create Instance
Request:
POST /instances { "instance": { "name": "products", "datastore": { "type": "cassandra", "version": "2.0.6" }, "configuration": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "flavorRef": "7", "volume": { "size": 1 }, "cluster": { "size": 3 } } }
Response:
{ "instance": { "status": "BUILD", "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "products", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "datastore": { "type": "cassandra", "version": "2.0.6" }, "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "links": [{...}], }, "flavor": { "id": "7", "links": [{...}], }, "volume": { "size": 1 }, "cluster": { "size": 3, "nodes": [ {"id": "416b0b16-ba55-4302-bbd3-ff566032e1c1"}, {"id": "7f52e4f9-3fa6-4238-ac08-1ce15197329a"}, {"id": "ff9d680c-fde3-49c6-a84e-76173b6df39d"} ] } } }
Notes:
- The instance.name now acts as the "cluster name", and in the case of Cassandra, the actual cluster_name.
- cluster.size indicates how many nodes should be in the initial cluster (required)
- The cluster.nodes[].id are generated uuids
- Cassandra-specific fields that are required to construct the initial cluster (num_tokens, endpoint_snitch, seed ip-list, etc.) are to be determined/calculated based on configuration file values and common-sense.
Show Instance
Request:
GET /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998
Response:
{ "instance": { "status": "ACTIVE", "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "products", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "datastore": { "type": "cassandra", "version": "2.0.6" }, "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "links": [{...}], }, "flavor": { "id": "7", "links": [{...}], }, "volume": { "size": 1 }, "cluster": { "size": 3, "nodes": [ {"id": "416b0b16-ba55-4302-bbd3-ff566032e1c1"}, {"id": "7f52e4f9-3fa6-4238-ac08-1ce15197329a"}, {"id": "ff9d680c-fde3-49c6-a84e-76173b6df39d"} ] } } }
Notes:
- Change: instance.volume.used, instance.ip[], and instance.hostname will never be returned
- It's possible that instance.ip[] can remain if it only returns the seed ips.
- It's possible that instance.hostname can remain if it's converted to an array and only contains the seed hostnames.
- Change: the semantic meaning of instance.status, and the possible states, will change
Show Node
Request:
GET /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998/node/416b0b16-ba55-4302-bbd3-ff566032e1c1
Response:
{ "node": { "status": "ACTIVE", "id": "416b0b16-ba55-4302-bbd3-ff566032e1c1", "name": "products-1", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "ip": ["10.0.0.1"], "volume": { "size": 2, "used": 0.17 } } }
Notes:
- node.name is the instance.name with "-<num>" as a suffix (counter for the cluster, starting at 1)
- the node.status will likely mirror the state values and transitions seen in instance.status prior to the clustering implementation.
Scale Nodes
Request:
POST /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998/action { "resize_cluster": { "size": 6 } }
Response:
HTTP 202 (Empty Body)
Notes:
- For the first iteration, only increasing the number of nodes is supported (decreasing is not).
All Other Operations
Notes:
- Other operations like: removing a node, replacing a running node, replacing a dead node, repairing a node, etc. are not supported in the first iteration.
Example: MySQL
Create Instance
Request:
POST /instances { "instance": { "name": "products", "datastore": { "type": "mysql", "version": "5.5" }, "configuration": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "flavorRef": "7", "volume": { "size": 1 } } }
Response:
{ "instance": { "status": "BUILD", "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "products", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "datastore": { "type": "mysql", "version": "5.5" }, "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "links": [{...}], }, "flavor": { "id": "7", "links": [{...}], }, "volume": { "size": 1 } } }
Create Slave
Request:
POST /instances { "instance": { "name": "products-slave", "datastore": { "type": "mysql", "version": "5.5" }, "configuration": "fc318e00-3a6f-4f93-af99-146b44912188", "flavorRef": "7", "volume": { "size": 1 }, "cluster": { "slave": { "of": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "read_only": true } } } }
Response:
{ "instance": { "status": "BUILD", "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", "name": "products", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "datastore": { "type": "mysql", "version": "5.5" }, "configuration": { "id": "fc318e00-3a6f-4f93-af99-146b44912188", "links": [{...}], }, "flavor": { "id": "7", "links": [{...}], }, "volume": { "size": 1 }, "cluster": { "slave": { "of": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "read_only": true } } } }
Show Master
Request:
GET /instances/dfbbd9ca-b5e1-4028-adb7-f78643e17998
Response:
{ "instance": { "status": "ACTIVE", "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "name": "products", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "datastore": { "type": "mysql", "version": "5.5" }, "configuration": { "id": "b9c8a3f8-7ace-4aea-9908-7b555586d7b6", "links": [{...}], }, "flavor": { "id": "7", "links": [{...}], }, "volume": { "size": 1 }, "cluster": { "slaves": [ {"id": "061aaf4c-3a57-411e-9df9-2d0f813db859"} ] } } }
Show Slave
Request:
GET /instances/061aaf4c-3a57-411e-9df9-2d0f813db859
Response:
{ "instance": { "status": "ACTIVE", "id": "061aaf4c-3a57-411e-9df9-2d0f813db859", "name": "products", "created": "2014-04-25T20:19:23", "updated": "2014-04-25T20:19:23", "links": [{...}], "datastore": { "type": "mysql", "version": "5.5" }, "configuration": { "id": "fc318e00-3a6f-4f93-af99-146b44912188", "links": [{...}], }, "flavor": { "id": "7", "links": [{...}], }, "volume": { "size": 1 }, "cluster": { "slave": { "of": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", "read_only": true } } } }
MongoDB
Notes:
- instance.name will function as the replica-set name
- The smallest viable deployment pattern for a replica-set is 3 nodes. A three member replica-set can either be (a) a primary and two secondaries or (b) a primary, a secondary, and an arbiter. option (b) provides less redundancy and fault tolerance, so it will not be supported in this first iteration. Therefore, size=3 by default creates a three member replica-set with one primary and two secondaries.
- instance.cluster.size will only support '3', '5', and '7' as values for MongoDB in this first iteration. Why? (a) an odd number of members ensures the replica-set is always able to elect a primary (b) only 7 members can vote at a time.
- Scaling the Nodes from 3 to 5, or 5 to 7 will be supported.
- A replica-set can have up to 12 members, but only 7 voting members. To avoid having to implement and handle 'priority'/'hidden' in the first iteration, the maximum number of nodes is capped at 7.
- Changing the priority, hidden, slaveDelay, or adding an Arbiter will not be supported in this first iteration.
Couchbase
Notes:
- instance.cluster.size can be any positive number
- Scaling the Nodes by increasing the number will be supported.
- Removing a Node will not be supported in the first iteration.