多租戶就像是一個大樓里有多個租戶,每個租戶的空間是獨立的,互不干擾。Pinecone作為向量數(shù)據(jù)庫,也支持這種模式,讓你可以在一個系統(tǒng)里為多個客戶提供服務(wù),同時保證他們的數(shù)據(jù)安全隔離。下面站長百科就來詳細介紹如何在Pinecone中實現(xiàn)多租戶。
一、Pinecone多租戶基本原理
在Pinecone里,數(shù)據(jù)的組織最高層是”索引”,在創(chuàng)建時需要定義好要放的數(shù)據(jù)維度和查找方式。
在索引里面,又有一個個”命名空間”。每個租戶的數(shù)據(jù)就存放在自己的小格子里,所有的數(shù)據(jù)操作,比如添加、查詢,都只針對特定的小格子,這樣就實現(xiàn)了租戶間的數(shù)據(jù)隔離。
Pinecone多租戶優(yōu)勢:
1、租戶隔離:在無服務(wù)器架構(gòu)中,每個命名空間都是單獨存儲的,因此使用命名空間可以在租戶/客戶之間實現(xiàn)數(shù)據(jù)的物理隔離。
2、沒有吵鬧的鄰居:讀取和寫入始終以單個命名空間為目標(biāo),因此一個租戶/客戶的行為不會影響其他租戶/客戶。
3、無需維護工作:無服務(wù)器索引根據(jù)使用情況自動擴展;您無需配置或管理任何計算或存儲資源。
4、成本效益:使用無服務(wù)器索引,您只需為存儲的數(shù)據(jù)量和執(zhí)行的作量付費。特別是對于查詢,成本部分取決于必須掃描的記錄總數(shù),因此使用命名空間可以顯著降低查詢成本。
5、簡單的租戶刪除:要卸載租戶/客戶,只需刪除相關(guān)的命名空間。
二、Pinecone多租戶實現(xiàn)步驟
1、Pinecone創(chuàng)建無服務(wù)器索引
無服務(wù)器索引就像一個智能書架,會根據(jù)你的使用情況自動擴展,而且你只需要為實際使用的空間和操作付費。創(chuàng)建時,需要指定要部署的云服務(wù)提供商和區(qū)域。
from pinecone.grpc import PineconeGRPC as Pinecone
from pinecone import ServerlessSpecpc = Pinecone(api_key=”YOUR_API_KEY”)
pc.create_index(
name=”multitenant-app”,
dimension=8,
metric=”cosine”,
spec=ServerlessSpec(
cloud=”aws”,
region=”us-east-1″
)
)
2、Pinecone隔離租戶數(shù)據(jù)
為每個租戶創(chuàng)建獨立的命名空間,就像為每個租戶分配一個專屬的小格子。當(dāng)你第一次向某個租戶的命名空間添加數(shù)據(jù)時,這個命名空間就會自動創(chuàng)建。
from pinecone.grpc import PineconeGRPC as Pinecone
連接Pinecone服務(wù)并獲取索引
pc = Pinecone(api_key=”你的API密鑰”)
index = pc.Index(“多租戶應(yīng)用”)
向租戶1的命名空間添加數(shù)據(jù)
index.upsert(
vectors=[
{“id”: “A”, “values”: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]},
{“id”: “B”, “values”: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]},
{“id”: “C”, “values”: [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]},
{“id”: “D”, “values”: [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]}
],
namespace=”租戶1″ 指定租戶1的命名空間
)
向租戶2的命名空間添加數(shù)據(jù)
index.upsert(
vectors=[
{“id”: “E”, “values”: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]},
{“id”: “F”, “values”: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6]},
{“id”: “G”, “values”: [0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7]},
{“id”: “H”, “values”: [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8]}
],
namespace=”租戶2″ 指定租戶2的命名空間
)
如果需要更新某個租戶的數(shù)據(jù),同樣要指定對應(yīng)的命名空間:
更新租戶1命名空間中的數(shù)據(jù)
index.update(id=”A”, values=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8], namespace=”租戶1″)
3、查詢租戶數(shù)據(jù)
在查詢時,也需要指定要查詢的命名空間,這樣就可以確保一個租戶的查詢不會影響其他租戶。
from pinecone.grpc import PineconeGRPC as Pinecone
連接服務(wù)并獲取索引
pc = Pinecone(api_key=”你的API密鑰”)
index = pc.Index(“多租戶應(yīng)用”)
查詢租戶2命名空間中與示例向量最相似的3個向量
query_results = index.query(
namespace=”租戶2″, 指定租戶2的命名空間
vector=[0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7], 查詢向量
top_k=3, 返回最相似的3個結(jié)果
include_values=True 包含向量值
)print(query_results)
返回結(jié)果示例:
{‘matches’: [{‘id’: ‘F’,
‘score’: 1.00000012,
‘values’: [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6]},
{‘id’: ‘G’,
‘score’: 1.0,
‘values’: [0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7]},
{‘id’: ‘E’,
‘score’: 1.0,
‘values’: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]}],
‘namespace’: ‘租戶2’,
‘usage’: {‘read_units’: 6}}
4、Pinecone租戶下線處理
當(dāng)某個Pinecone租戶不再使用服務(wù)時,你可以輕松地刪除他們的所有數(shù)據(jù),只需要指定命名空間即可。
from pinecone.grpc import PineconeGRPC as Pinecone
連接服務(wù)并獲取索引
pc = Pinecone(api_key=”你的API密鑰”)
index = pc.Index(“多租戶應(yīng)用”)
刪除租戶1的命名空間及所有數(shù)據(jù)
index.delete(delete_all=True, namespace=’租戶1′)