--- title: "Features" description: "Explore Qdrant features: dashboard, monitoring, scaling, snapshots, and integrations" --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import { QdrantFeaturesNav } from './QdrantFeaturesCards' # Features --- ## 1. Qdrant Dashboard Qdrant provides a built-in web dashboard for managing collections, running queries, and exploring data. ### How to Access 1. Navigate to your database in the TIR portal. 2. Click **Connect** to open the Qdrant Dashboard. 3. Enter your **API Key** and click **Apply**. ### Dashboard Sections | Section | Purpose | |---------|---------| | **Collections** | Create, view, and delete collections. Browse points, view collection info, and visualize vectors. | | **Console** | Execute Qdrant API commands interactively. Browse available API commands and run them directly. | | **Tutorial** | Interactive API tutorial provided by Qdrant to learn how the APIs work. | | **Datasets** | Sample data for testing and experimentation. | :::tip Use the Console section to test API calls before integrating them into your application. ::: --- ## 2. Monitoring Track your cluster's health and performance through the **Monitoring** tab on the database details page. ### Hardware Metrics | Metric | Description | |--------|-------------| | **CPU Usage** | Processor utilization percentage per node | | **Memory Usage** | RAM consumption per node | ### Service Metrics | Metric | Description | |--------|-------------| | **REST Request Count** | Total HTTP API requests (with failure breakdown) | | **gRPC Request Count** | Total gRPC API requests (with failure breakdown) | | **REST Response Duration** | Average latency of HTTP API responses per cluster peer | | **gRPC Response Duration** | Average latency of gRPC API responses per cluster peer | | **Cluster Pending Operations** | Operations waiting in the cluster queue | ### Cluster Gauges | Gauge | Description | |-------|-------------| | **Total Collections** | Number of collections in the cluster | | **Total Vectors** | Total vector count across all collections | | **Cluster Peers** | Number of active nodes in the cluster | **Available time intervals:** 5 minutes, 1 hour, 24 hours, 7 days, 30 days. --- ## 3. Scaling TIR deploys Qdrant in distributed mode where multiple nodes form a cluster. ### Upscaling Nodes 1. Click the **Actions** icon for your database. 2. Select **Scale Up**. 3. Choose the new node count and click **Update**. :::info Important * You can scale from **3 to 10 nodes**. Downscaling is not supported. * **New nodes start empty.** Data is not automatically rebalanced. * See [Making Use of New Nodes](#making-use-of-new-nodes) below to distribute data to new nodes. ::: ### Resizing Disk 1. Navigate to your database and open the **Resize Disk** tab. 2. Select the new storage size and confirm. :::warning Disk size can be increased from 10 GB to 1,000 GB but **cannot be reduced** once increased. Additional storage is charged per node. ::: ### Making Use of New Nodes When you add nodes, they start empty. You have three options to use them: | Option | When to Use | |--------|-------------| | **Create a new collection** | New data automatically distributes across all nodes based on shard count and replication factor. | | **Replicate existing shards** | Copy shard data to the new node for redundancy. | | **Move existing shards** | Relocate shards without duplicating data. | #### Creating a New Collection ```bash curl -X PUT \ -H "api-key: " \ -d '{ "vectors": { "size": 300, "distance": "Cosine" }, "shard_number": 8, "replication_factor": 2 }' \ https://:6333/collections/ ``` :::tip Set `shard_number` as a multiple of your node count for even distribution. ::: #### Replicating Existing Data First, get cluster info to find peer IDs and shard assignments: ```bash curl -X GET \ -H "api-key: " \ https://:6333/collections//cluster ``` Replicate a shard to a new node: ```bash curl -X PUT \ -H "api-key: " \ -d '{ "replicate_shard": { "shard_id": 0, "from_peer_id": 123, "to_peer_id": 456 } }' \ https://:6333/collections//cluster ``` Drop a replica from a node: ```bash curl -X POST \ -H "api-key: " \ -d '{ "drop_replica": { "shard_id": 0, "peer_id": 123 } }' \ https://:6333/collections//cluster ``` #### Moving Shards Move a shard between nodes without duplicating data: ```bash curl -X POST \ -H "api-key: " \ -d '{ "move_shard": { "shard_id": 0, "from_peer_id": 123, "to_peer_id": 456 } }' \ https://:6333/collections//cluster ``` **Transfer methods:** | Method | Description | |--------|-------------| | **stream_records** (default) | Streams records to the target node in batches. | | **snapshot** | Transfers the shard including index and quantized data via a snapshot. | To use snapshot transfer, add `"method": "snapshot"` to the `move_shard` payload. --- ## 4. Snapshots ### Managed Snapshots (TIR) TIR provides one-click cluster-wide snapshots that back up all data across all nodes. #### Create a Snapshot 1. Click the **Take Snapshot** icon on the Vector Database list or from the **Actions** menu. 2. Monitor the status in the **Snapshots** tab. :::info You cannot create another snapshot or scale your cluster while a snapshot is in progress. ::: #### Restore a Snapshot 1. Open the **Snapshots** tab for your database. 2. Click the **Restore** icon next to the snapshot. 3. Monitor the restoration status. :::warning * The database must be in **Running** state to restore. * During restoration, the dashboard and upscaling operations are disabled. * Do not perform write operations during restoration. ::: #### Delete a Snapshot 1. Open the **Snapshots** tab. 2. Click the **Delete** icon next to the snapshot. :::info You cannot delete a snapshot while its restoration is in progress. ::: ### API Snapshots (Per-Node, Per-Collection) Qdrant also provides per-node, per-collection snapshot APIs. These snapshots are stored on the node's local disk. :::info You must create and restore snapshots for each node per collection separately using the node-specific URI: `https://:6333/node-{node}` where node ranges from `0` to `replicas - 1`. ::: #### Create a Snapshot ```python from qdrant_client import QdrantClient client = QdrantClient( host="", port=6333, prefix="node-", api_key="" ) client.create_snapshot(collection_name="") ``` ```bash curl -X POST \ -H "api-key: " \ https://:6333/node-/collections//snapshots ``` #### List Snapshots ```python client.list_snapshots(collection_name="") ``` ```bash curl -X GET \ -H "api-key: " \ https://:6333/node-/collections//snapshots ``` #### Download a Snapshot File ```bash curl -X GET \ -H "api-key: " \ https://:6333/node-/collections//snapshots/ ``` #### Restore a Snapshot ```python client.recover_snapshot( "", "" ) ``` ```bash curl -X PUT \ -H "api-key: " \ -d '{ "location": "" }' \ https://:6333/node-/collections//snapshots/recover ``` You can also restore from an uploaded file: ```bash curl -X POST \ 'https://:6333/node-/collections//snapshots/upload?priority=snapshot' \ -H 'api-key: ' \ -H 'Content-Type: multipart/form-data' \ -F 'snapshot=@/path/to/.snapshot' ``` #### Snapshot Recovery Priorities | Priority | Behavior | |----------|----------| | **replica** (default) | Prefer existing data over snapshot data. | | **snapshot** | Prefer snapshot data over existing data. | | **no_sync** | Restore without any additional synchronization. | #### Delete a Snapshot ```python client.delete_snapshot( collection_name="", snapshot_name="" ) ``` ```bash curl -X DELETE \ -H "api-key: " \ https://:6333/node-/collections//snapshots/ ``` --- ## 5. Access Control Each Qdrant database has two access keys: | Key Type | Purpose | |----------|---------| | **API Key** | Full read/write access to all collections and operations. | | **Read-Only API Key** | Read-only access for queries and listing operations. | :::tip Use the read-only key for client applications that only need to query data. ::: --- ## 6. Integrations ### LangChain [LangChain](https://www.langchain.com/) simplifies building LLM-powered applications. Integrate Qdrant as a vector store for search and retrieval. **Install:** ```bash pip install langchain langchain-community qdrant-client ``` **Connect, embed, and search:** ```python from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Qdrant # Load and chunk documents loader = TextLoader("") documents = loader.load() docs = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0).split_documents(documents) # Embed and insert into Qdrant embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") qdrant = Qdrant.from_documents( docs, embeddings, host="", port=6333, api_key="", collection_name="my_documents", ) # Similarity search found_docs = qdrant.similarity_search_with_score("") document, score = found_docs[0] # MMR search (diverse results) found_docs = qdrant.max_marginal_relevance_search("", k=2, fetch_k=10) ``` For more, see the [Qdrant LangChain Documentation](https://qdrant.tech/documentation/frameworks/langchain/). ### LlamaIndex [LlamaIndex](https://www.llamaindex.ai/) connects your private data with LLMs. Use Qdrant as a vector store for indexing and retrieval. **Install:** ```bash pip install llama-index llama-index-vector-stores-qdrant qdrant-client ``` **Connect, embed, and search:** ```python import qdrant_client from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, StorageContext, Settings from llama_index.vector_stores.qdrant import QdrantVectorStore from llama_index.embeddings.fastembed import FastEmbedEmbedding # Configure embedding model Settings.embed_model = FastEmbedEmbedding(model_name="BAAI/bge-base-en-v1.5") Settings.llm = None # Load documents documents = SimpleDirectoryReader("").load_data() # Connect and insert into Qdrant client = qdrant_client.QdrantClient( host="", port=6333, api_key="" ) vector_store = QdrantVectorStore(client=client, collection_name="") storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents(documents, storage_context=storage_context) # Query query_engine = index.as_query_engine() response = query_engine.query("") ``` For more, see the [Qdrant LlamaIndex Documentation](https://qdrant.tech/documentation/frameworks/llamaindex/). ---