mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-12 23:02:28 +00:00
Move the public website pages into `docs/web` beside the SDK, with
shared navigation and executable example sources in `docs/web-tests`.
The combined website is assembled by
[lancedb/docs#355](https://github.com/lancedb/docs/pull/355), with six
Enterprise replacements from
[lancedb/sophon#7681](https://github.com/lancedb/sophon/pull/7681).
This includes Function guidance, runnable Quickstarts, regenerated
snippets, production contact/demo fixes, the legacy SQL route, and the
LeRobot redirect. LeRobot remains attributed to Geneva; all 34 Geneva
pages remain in the docs repository until Function officially launches.
Materialized-view guidance follows the full rebuild refresh introduced
by #4373: local refresh writes the complete result, has no `full`
argument, supports `source_version`, and no longer requires stable row
IDs. Deployment SQL refresh options and stable-ID setup are qualified by
version/configuration. Function input guidance distinguishes ordinary
stored columns from computed inputs supported by newer deployments.
**Validation:** independently accepted local checks include 95 Python
tests (real Enterprise excluded), eight TypeScript tests, Rust
Quickstart, snippet parity, typos, deterministic assembly, Mint
validation and links/anchors/redirects. The combined baseline retains
all 181 production routes and 17 legacy redirects. Examples ran locally
against source-built Python SDK 0.40.0b13; existing GitHub workflows do
not run `docs/web-tests`. New main at `069b2f7d` is 0.41.0b0 and adds
computed Function inputs; that SDK was not exercised by the accepted
tests. Latest prose corrections receive focused site validation.
**Merge/rollout:** merge this and #7681 before #355's combined CI, which
reads producer `main`. This is migration infrastructure: section
overlays, source-owned skills and automatic versioned paired releases
remain follow-ups. The current manual publisher is transitional. Hosted
validation, a supported SDK/Enterprise release pair and a real
Enterprise walkthrough remain pending.
Production Mintlify watches `lancedb/docs:deploy-freeze`, directory
`docs`; preserve that source through review. The separate SDK GitHub
Pages reference workflow rebuilds on main merges.
**Updated-head CI (9a50f8db):**
[Typos](https://github.com/lancedb/lancedb/actions/runs/37654185443/job/112904990558),
[PR
title](https://github.com/lancedb/lancedb/actions/runs/37654179507/job/112904974595)
and
[Aikido](https://app.aikido.dev/featurebranch/scan/215386145?groupId=74229)
pass. Critical findings in the example lockfiles were patched: all Sharp
copies use 0.35.5, protobufjs 7.6.6, tar 7.5.22, quinn-proto 0.11.19,
zerovec 0.11.8 and zerovec-derive 0.11.6. The SDK's product dependencies
are unchanged. The revised lockfiles pass eight TypeScript examples,
HuggingFace decode/resize/crop/rescale/normalize plus AVIF roundtrip,
and Rust Quickstart. Aikido passing does not mean every advisory is
cleared; npm still reports 29 high and five moderate advisories in the
example dependency graph. No scanner bypass or suppression was added.
The Function prose correction passes combined/standalone Mint,
deterministic assembly, routes and assets. The revised 325-file site
checksum is
`175bec06864abb400dd292e667ba93448c0479b8359fd7bf6146afabf9040647`. This
PR remains open for independent review; further merges are on hold.
---------
Co-authored-by: Brendan Clement <brendan.clement@lancedb.com>
154 lines
7.0 KiB
Plaintext
154 lines
7.0 KiB
Plaintext
---
|
|
title: "Architecture"
|
|
sidebarTitle: "Architecture"
|
|
description: "How LanceDB is put together, and what changes between running it embedded and running it distributed."
|
|
icon: cubes
|
|
keywords: ["architecture", "embedded", "distributed", "object storage", "compute", "deployment"]
|
|
---
|
|
|
|
LanceDB has one storage layer and two ways to put compute on top of it. Which
|
|
one you run decides where queries execute, what runs on your behalf, and what
|
|
you have to operate — and almost nothing else. The data is the same
|
|
[Lance](/basics/lance) tables either way.
|
|
|
|
## One storage layer {#storage}
|
|
|
|
Everything durable lives in object storage: table data, manifests, indexes. No
|
|
machine owns a dataset, and no server has to be running for the data to exist.
|
|
|
|
```
|
|
┌──────────────────────────────────────────┐
|
|
│ object storage │
|
|
│ table data · manifests · indexes │
|
|
└──────────────────────────────────────────┘
|
|
```
|
|
|
|
That is the whole persistence story, and it is why the two deployment shapes can
|
|
differ so much above it while staying compatible below it. A table written
|
|
embedded is opened by a deployment, and the reverse, without conversion.
|
|
|
|
## Embedded {#embedded}
|
|
|
|
```
|
|
your process
|
|
┌────────────────────────────────┐
|
|
│ application │
|
|
│ LanceDB library │ ← plans, executes, indexes, compacts
|
|
└────────────────────────────────┘
|
|
│
|
|
┌─────────▼─────────┐
|
|
│ object storage │
|
|
└───────────────────┘
|
|
```
|
|
|
|
`lancedb.connect("./data")` or `connect("s3://bucket/path")` gives you a
|
|
**library**, not a client. Your process opens the tables, plans the queries,
|
|
runs the scans, builds the indexes, and writes the new versions. There is no
|
|
server in the picture at all.
|
|
|
|
**What follows from that.** Nothing runs unless you call it — no background
|
|
compaction, no server-side [jobs](/basics/jobs), no
|
|
[SQL endpoint](/basics/sql). Scale is your process's scale: a query gets the
|
|
cores and memory your process has. Access control is whatever your object store
|
|
enforces, since there is no other gatekeeper.
|
|
|
|
**What it is good at.** Development, notebooks, single-node pipelines, embedding
|
|
LanceDB inside an application, and anything where "no service to operate" is
|
|
worth more than elasticity. Comfortably handles millions of vectors on one
|
|
node -- disk-based indexes keep it performant without extra infrastructure.
|
|
|
|
## Distributed {#distributed}
|
|
|
|
<Badge color="red">Enterprise</Badge>
|
|
|
|
```
|
|
your process
|
|
┌──────────────┐
|
|
│ application │
|
|
│ LanceDB SDK │ ← a thin client
|
|
└──────┬───────┘
|
|
│ db:// (REST / Flight SQL)
|
|
┌──────▼──────────────────────────────────────┐
|
|
│ control plane config · identity · policy │
|
|
├─────────────────────────────────────────────┤
|
|
│ data plane query serving · writes │
|
|
│ indexers indexing · compaction │
|
|
└──────┬──────────────────────────────────────┘
|
|
│
|
|
┌──────▼────────────┐
|
|
│ object storage │
|
|
└───────────────────┘
|
|
```
|
|
|
|
`connect("db://...")` gives you a **client**. Planning and execution move to a
|
|
cluster, and the work splits across tiers that scale independently: a control
|
|
plane governing configuration, identity and policy; a data plane serving reads
|
|
and writes; and indexers building indexes and compacting outside the request
|
|
path.
|
|
|
|
**What follows from that.** Compute and storage are separated, so a query fleet
|
|
scales for interactive traffic without also scaling indexing capacity, and heavy
|
|
background work does not steal resources from user queries. Because a server
|
|
exists, so do the things that need one: [SQL](/sql),
|
|
[functions](/management/function), server-side jobs, and
|
|
[authorization](/governance/authorization) per object rather than per bucket.
|
|
|
|
**What it is good at.** Many concurrent queries, continuous ingestion and
|
|
indexing, multi-team access with real permissions, and workloads too large for
|
|
one machine -- customers regularly operate on billions of rows and tens of
|
|
terabytes.
|
|
|
|
## What changes, precisely {#differences}
|
|
|
|
| | Embedded | Distributed |
|
|
| --- | --- | --- |
|
|
| What you connect to | a library in your process | a cluster |
|
|
| Where queries plan and execute | your process | the data plane |
|
|
| Table handle | `LanceTable` | `RemoteTable` |
|
|
| Indexing and compaction | when you call it | dedicated indexers |
|
|
| [Jobs](/basics/jobs) | run in-process, no server record | real jobs: id, status, events, cancel |
|
|
| [SQL](/sql) | unavailable | Flight SQL endpoint |
|
|
| [Functions](/management/function) | unavailable | run on workers |
|
|
| Access control | object-store permissions | [per-object grants](/governance/authorization) |
|
|
| Scale bound | your process | the cluster |
|
|
| What you operate | nothing | a deployment |
|
|
|
|
Both expose the same table API — create, open, mutate, query — so application
|
|
code moves between them by changing the URI. What does not move is code that
|
|
depends on a row in the right-hand column.
|
|
|
|
## Choosing, and changing your mind {#choosing}
|
|
|
|
Start embedded. It has no operational cost and the API is the same one you will
|
|
keep using.
|
|
|
|
Move when you hit something in the right-hand column — usually concurrent
|
|
serving, ingestion that outgrows one machine, or a permissions requirement.
|
|
Because the storage layer is identical, moving is a connection-string change
|
|
plus a data migration, not a rewrite.
|
|
|
|
<Note>
|
|
The one thing to decide early is **stable row ids**: the SDK can give them to a
|
|
table only when it creates one on a local path or an object store, and a
|
|
deployment may require them on a
|
|
[materialized view](/management/materialized-view) source. See
|
|
[Limits](/basics/limits#schema).
|
|
</Note>
|
|
|
|
## Where to go next {#next}
|
|
|
|
<CardGroup cols={2}>
|
|
<Card title="Guarantees" icon="shield-check" href="/basics/guarantees">
|
|
What a write promises, and what a reader sees.
|
|
</Card>
|
|
<Card title="Lance format" icon="layer-group" href="/basics/lance">
|
|
The open format underneath both shapes.
|
|
</Card>
|
|
<Card title="Enterprise architecture" icon="cubes" href="/enterprise/architecture">
|
|
The distributed tiers in detail.
|
|
</Card>
|
|
<Card title="Limits" icon="ruler" href="/basics/limits">
|
|
The bounds you can actually hit.
|
|
</Card>
|
|
</CardGroup>
|