> The goal is to configure a cluster in which reads and writes can
> complete successfully even if only 1 node is online. For this to work,

Why? You should be designing for "only 1 out of N nodes" where N is
RF. If you happen to have 3 machines now and you want 3 copies in
total that's fine. But why would you want RF=10 just because you add
10 nodes? It seems really off. You add nodes to increase total
capacity. The number of copies of each piece of data, for redundancy
purposes, is usually a completely separate concern from your cluster
size.

> each node would need the entire dataset. Your example of a 3 node ring
> with RF=3 would satisfy this requirement. However, if two nodes are
> offline, CL.QUORUM would not work, I would need to use CL.ONE. If all
> 3 nodes are online, CL.ONE is undershooting, I would want to use
> CL.QUORUM (or maybe CL.ALL). Or does CL.ONE actually function this
> way, somewhat?

Writes ALWAYS go to all machines eventually; usually immediately if
all nodes are up. Consistency Level ONLY affects what is *required* to
be successfully *acked* before a write (or a read) returns back to the
client. Using CL.ONE never means that data won't be replicated to all
nodes eventually.

The reason to use QUORUM is to get strong consistency in the sense
that a write followed by a subsequent read is guaranteed to see that
write.

Another reason is to guarantee that no write is lost if a single node
suddenly evaporates/explodes/kernel panics.

If you don't have strong consistency/durability demands, probably just
use CL.ONE. Data will still be replicated at whatever replication
factor (RF) you have chosen.

> A complication occurs when you want to add another node. Now there's a
> 4 node ring, but only 3 replicas, so each node isn't guaranteed to
> have all of the data, so the cluster can't completely function when
> N-1 nodes are offline. So this is why I would like to have the RF
> scale relative to the size of the cluster. Am I mistaken?

It seems like you have mistaken requirements. Even if for some strange
reason you really want to tie RF to number of nodes, you can just add
a node FIRST, and *then* increase RF. But be advised that increasing
RF implies cluster downtime (if you want to get correct data on reads)
because you have to run a rotating 'nodetool repair' after changing
the replication level.

But I repeat: You almost certainly don't want to be changing RF all
the time. You most likely just want to settle on one particular level
of redundancy, which is going to be the RF, and also implies the
*minimum* number of nodes in the cluster. Then you add more nodes for
*capacity* reasons, but not for redundancy reasons, and there's no
reason to increase RF.

If you *really* know what you're doing and why you want RF to track
total node count, I'm sure there are *some* cases where this makes
sense. But nothing you've said so far really indicates you're in such
a position.

-- 
/ Peter Schuller (@scode on twitter)

Reply via email to