Hey,
Thanks for the reply, it is clearer now! Only one point remains
"mysterious" to me:
> - quorum applies to document operations (read, write, delete), but
not view queries (R is inherently 1)
This means that queries might be inconsistent. View queries aren't
necessarily different from reads, so I don't get why it's ok in this case
On 13/06/2024 14:40, Robert Newson wrote:
Hi,
Right. a database is divided into Q shards, each of which covers part of a
numeric range from 0 to 2^32-1, the doc id is run through a hashing function
that outputs a number in that range, and the document is then stored inside the
shard whose range contains that number.
as this effectively randomises which doc goes in which shard when we need to
perform a query across the database we need to ask each shard range to perform
the query and then combine the results.
This is good in some ways (the shards can be stored across multiple machines
and thus benefit from more cores/disks/memory/etc) it's bad in others, the
number of workers that need to respond goes up as Q goes up.
"Partition" is just our word (and arguably a misleading word) for allowing users to control which
shard range their documents end up in. Only part of the doc id is passed through the hashing function(doc id
"foo:bar" would be partition foo, and we'd hash only "foo"). Thus the user can ensure
that a group of documents lands in the same shard range. The benefit is as Nick described, when querying
_within_ a given partition we know that only one shard range is in play, so we do not consult shards for
other ranges (we already know they will have no results).
So, to your specific list of questions;
- yes
- yes, but the reason to keep partitions small is because of the fixed
assignment to a given shard range. the default scheme would load up each shard
range fairly evenly. it's about disk space management and predictable
performance.
- when querying a global view we need Q responses (and will issue Q*N requests,
but cancel Q*(N-1) of those when the first response from each range has been
received, though they may have already done some, or all, of their work, before
that happens). for a partitioned view we need 1 response (but will issue N
requests).
- quorum applies to document operations (read, write, delete), but not view
queries (R is inherently 1)
B.
On 13 Jun 2024, at 09:01, Matthieu Rakotojaona
<matthieu.rakotojaona-rainimangav...@imt-atlantique.fr> wrote:
Hello, I'm still a bit confused with shards versus partitions, is this correct ?
- A database is composed of Q shards, shards splice the database "automatically"
- A shard is composed of 1 or more partitions, partitions splice the database
according to the user's choice. A partition should thus be made so that it is
not huge, in fact must be under (total size/Q)
- When querying a view, the whole database needs to be processed, that means
all Q shards
- When querying a view only on documents inside a partition, since one
partition is on 1 shard, only one shard is queried
- Whatever the number of shards, quorum still needs to be verified, ie for Q=2
and N=3 I still need to wait for (3+1)/2 = 2 replies for each shard
On 12/06/2024 19:54, Nick Vatamaniuc wrote:
Another feature related to efficient view querying are partitioned
databases: https://docs.couchdb.org/en/stable/partitioned-dbs/index.html.
It's a bit of a niche, as you'd need to have a good partition key, but
aside from that, it can speed up your queries as responses would be coming
from a single shard only instead of Q shards.
On Wed, Jun 12, 2024 at 1:30 PM Markus Doppelbauer
<doppelba...@gmx.net.invalid> wrote:
Hi Nick,
Thank you very much for your reply.This is exactly what we are looking
for.There are so many DBs that store the secondary indexlocally
(Cassandra, Aerospike, SyllaDB, ...)
Thanks again for the answerMarcus
Am Mittwoch, dem 12.06.2024 um 13:23 -0400 schrieb Nick Vatamaniuc:
Hi Marcus,
The node handling the request only queries the nodes with shard
copies ofthat database. In a 100 node cluster the shards for that
particulardatabase might be present on only 6 nodes, depending on the
Q and Nsharding factors, so it will query 6 out 100 nodes. For
instance, for N=3and Q=2 sharding factors, it will first send N*Q=6
requests, and wait untilit gets at least one response for each of the
Q=2 shard ranges. Thishappens very quickly. Then, for the duration of
the response, it will onlystream responses from those Q=2 workers.
So, to summarize for a Q=2database, it will be a streaming response
from 2 workers. For Q=4, from 4workers, etc...
Cheers,-Nick
On Wed, Jun 12, 2024 at 1:00 PM Markus Doppelbauer<
doppelba...@gmx.net.invalid> wrote:
Hello,
Is the CouchDB-view a "global" or "local" index?For example, if a
cluster has 100 nodes, would the query askfor a single node - or
100 nodes?
/.../_view/posts?startkey="foobar"&endkey="foobaz"
Best wishesMarcus