Migrálás a CouchBase-ből az Azure Cosmos DB for NoSQL-be
A KÖVETKEZŐRE VONATKOZIK: NoSQL
Az Azure Cosmos DB egy skálázható, globálisan elosztott, teljes mértékben felügyelt adatbázis. Garantáltan alacsony késésű hozzáférést biztosít az adatokhoz. Az Azure Cosmos DB-ről további információt az áttekintési cikkben talál. Ez a cikk útmutatást nyújt a Couchbase-hez csatlakoztatott Java-alkalmazások azure Cosmos DB-beli Api for NoSQL-fiókba való migrálásához.
A nómenklatúra különbségei
Az alábbiakban az Azure Cosmos DB-ben a Couchbase-hez képest eltérően működő főbb funkciók találhatók:
Couchbase | Azure Cosmos DB |
---|---|
Couchbase-kiszolgáló | Számla |
Vödör | Adatbázis |
Vödör | Tároló/gyűjtemény |
JSON-dokumentum | Elem/dokumentum |
Fő eltérések
Az Azure Cosmos DB egy "ID" mezővel rendelkezik a dokumentumban, míg a Couchbase az azonosítót a gyűjtő részeként használja. Az "ID" mező egyedi a partíción.
Az Azure Cosmos DB particionálási vagy horizontális skálázási technikával méretezhető. Ez azt jelenti, hogy több szegmensre/partícióra osztja az adatokat. Ezek a partíciók/szegmensek a megadott partíciókulcs-tulajdonság alapján jönnek létre. Kiválaszthatja a partíciókulcsot az olvasási és írási műveletek optimalizálásához, illetve az olvasási/írási műveletek optimalizálásához is. További információ: particionálási cikk.
Az Azure Cosmos DB-ben nem szükséges, hogy a legfelső szintű hierarchia a gyűjteményt jelölje, mert a gyűjtemény neve már létezik. Ez a funkció egyszerűbbé teszi a JSON-struktúrát. Az alábbi példa az adatmodellben a Couchbase és az Azure Cosmos DB közötti különbségeket mutatja be:
Couchbase: Dokumentumazonosító = "99FF4444"
{ "TravelDocument": { "Country":"India", "Validity" : "2022-09-01", "Person": { "Name": "Manish", "Address": "AB Road, City-z" }, "Visas": [ { "Country":"India", "Type":"Multi-Entry", "Validity":"2022-09-01" }, { "Country":"US", "Type":"Single-Entry", "Validity":"2022-08-01" } ] } }
Azure Cosmos DB: Tekintse át az "ID" kifejezést a dokumentumban az alábbiak szerint
{ "id" : "99FF4444", "Country":"India", "Validity" : "2022-09-01", "Person": { "Name": "Manish", "Address": "AB Road, City-z" }, "Visas": [ { "Country":"India", "Type":"Multi-Entry", "Validity":"2022-09-01" }, { "Country":"US", "Type":"Single-Entry", "Validity":"2022-08-01" } ] }
Java SDK-támogatás
Az Azure Cosmos DB az alábbi szoftverfejlesztői készletekkel (SDK-kkal) támogatja a különböző Java-keretrendszereket:
- Async SDK
- Spring Boot SDK
A következő szakaszok ismertetik, hogy mikor érdemes ezeket az SDK-kat használni. Vegyünk egy példát, ahol három típusú számítási feladatunk van:
Couchbase mint dokumentumtár és spring data-alapú egyéni lekérdezések
Ha az áttelepített számítási feladat Spring Boot-alapú SDK-n alapul, az alábbi lépéseket használhatja:
Szülő hozzáadása a POM.xml fájlhoz:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> </parent>
Tulajdonságok hozzáadása a POM.xml fájlhoz:
<azure.version>2.1.6</azure.version>
Függőségek hozzáadása a POM.xml fájlhoz:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-cosmosdb-spring-boot-starter</artifactId> <version>2.1.6</version> </dependency>
Adjon hozzá alkalmazástulajdonságokat az erőforrásokhoz, és adja meg a következőket. Mindenképpen cserélje le az URL-cím, a kulcs és az adatbázisnév paramétereit:
azure.cosmosdb.uri=<your-cosmosDB-URL> azure.cosmosdb.key=<your-cosmosDB-key> azure.cosmosdb.database=<your-cosmosDB-dbName>
Adja meg a gyűjtemény nevét a modellben. További széljegyzeteket is megadhat. Például azonosító, partíciókulcs, amely explicit módon jelöli őket:
@Document(collection = "mycollection") public class User { @id private String id; private String firstName; @PartitionKey private String lastName; }
A CRUD-műveletek kódrészletei a következők:
Műveletek beszúrása és frissítése
Ahol _repo az adattár objektuma, a doc pedig a POJO-osztály objektuma. Használhatja .save
a beszúrást vagy a beillesztést (ha a megadott azonosítóval rendelkező dokumentum található). A következő kódrészlet bemutatja, hogyan szúrhat be vagy frissíthet dokumentumobjektumokat:
_repo.save(doc);
Művelet törlése
Fontolja meg a következő kódrészletet, ahol a doc objektum azonosítóval és partíciókulcsmal rendelkezik, amely kötelező az objektum megkereséséhez és törléséhez:
_repo.delete(doc);
Olvasási művelet
A dokumentumot a partíciókulcs megadásával vagy anélkül is elolvashatja. Ha nem adja meg a partíciókulcsot, akkor a rendszer partícióközi lekérdezésként kezeli. Vegye figyelembe a következő kódmintákat, először az azonosító és a partíciókulcs mező használatával hajtja végre a műveletet. A második példa egy normál mezőt használ a partíciókulcs mező megadása nélkül.
_repo.findByIdAndName(objDoc.getId(),objDoc.getName());
_repo.findAllByStatus(objDoc.getStatus());
Ez az, most már használhatja az alkalmazást az Azure Cosmos DB-vel. A dokumentumban ismertetett példa teljes kódmintája a CouchbaseToCosmosDB-SpringCosmos GitHub adattárban érhető el.
Couchbase mint dokumentumtár & N1QL-lekérdezések használatával
Az N1QL-lekérdezések a Couchbase lekérdezéseinek definiálásának módjai.
N1QL-lekérdezés | Azure Cosmos DB-lekérdezés |
---|---|
SELECT META(TravelDocument ).id AS id, TravelDocument .* FROM TravelDocument WHERE _type = "com.xx.xx.xx.xxx.xxx.xxxx" and country = "India" and ANY m in Visas SATISFIES m.type == "Multi-Entry" and m.Country IN "India", Bhután" ORDER BY Validity DESC LIMIT 25 OFFSET 0 |
SELECT c.id,c FROM c JOIN m in c.country='India' WHERE c._type = " com.xx.xx.xx.xxx.xxx.xxxx" és c.country = "India" és m.type = "Multi-Entry" és m.Country IN ('India', 'Bhután') ORDER BY c.Validity DESC OFFSET 0 LIMIT 25 |
Az N1QL-lekérdezésekben a következő változások észlelhetők:
Nem kell használnia a META kulcsszót, és nem kell az első szintű dokumentumra hivatkoznia. Ehelyett létrehozhat saját hivatkozást a tárolóra. Ebben a példában "c" -nek tekintettük (bármi lehet). Ez a hivatkozás az összes első szintű mező előtagjaként használatos. Fr példa, c.id, c.country stb.
Az "ANY" helyett most már csatlakozhat az aldokumentumhoz, és hivatkozhat rá egy dedikált aliassal, például az "m"-vel. Miután létrehozott aliast egy aldokumentumhoz, aliast kell használnia. Például: m.country.
Az ELTOLÁS sorrendje eltér az Azure Cosmos DB-lekérdezésben, először meg kell adnia az OFFSET, majd a LIMIT értéket. Javasoljuk, hogy ne használja a Spring Data SDK-t, ha maximális egyéni lekérdezéseket használ, mivel szükségtelen többletterhelést okozhat az ügyféloldalon, miközben átadja a lekérdezést az Azure Cosmos DB-nek. Ehelyett egy közvetlen Async Java SDK-val rendelkezünk, amely ebben az esetben sokkal hatékonyan használható.
Olvasási művelet
Használja az Async Java SDK-t a következő lépésekkel:
Konfigurálja a következő függőséget a POM.xml fájlra:
<!-- https://mvnrepository.com/artifact/com.microsoft.azure/azure-cosmosdb --> <dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-cosmos</artifactId> <version>3.0.0</version> </dependency>
Hozzon létre egy kapcsolatobjektumot az Azure Cosmos DB-hez az
ConnectionBuilder
alábbi példában látható módszer használatával. Győződjön meg arról, hogy ezt a deklarációt a babba helyezi, hogy a következő kód csak egyszer legyen végrehajtva:ConnectionPolicy cp=new ConnectionPolicy(); cp.connectionMode(ConnectionMode.DIRECT); if(client==null) client= CosmosClient.builder() .endpoint(Host)//(Host, PrimaryKey, dbName, collName).Builder() .connectionPolicy(cp) .key(PrimaryKey) .consistencyLevel(ConsistencyLevel.EVENTUAL) .build(); container = client.getDatabase(_dbName).getContainer(_collName);
A lekérdezés végrehajtásához a következő kódrészletet kell futtatnia:
Flux<FeedResponse<CosmosItemProperties>> objFlux= container.queryItems(query, fo);
A fenti módszer segítségével mostantól több lekérdezést is átadhat, és minden további nélkül végrehajthatja a lekérdezéseket. Ha egy nagy lekérdezés végrehajtására van szükség, amely több lekérdezésre is felosztható, próbálkozzon az alábbi kódrészlettel az előző helyett:
for(SqlQuerySpec query:queries)
{
objFlux= container.queryItems(query, fo);
objFlux .publishOn(Schedulers.elastic())
.subscribe(feedResponse->
{
if(feedResponse.results().size()>0)
{
_docs.addAll(feedResponse.results());
}
},
Throwable::printStackTrace,latch::countDown);
lstFlux.add(objFlux);
}
Flux.merge(lstFlux);
latch.await();
}
Az előző kóddal párhuzamosan futtathat lekérdezéseket, és optimalizálhatja az elosztott végrehajtásokat. A beszúrási és frissítési műveleteket is futtathatja:
Művelet beszúrása
A dokumentum beszúrásához futtassa a következő kódot:
Mono<CosmosItemResponse> objMono= container.createItem(doc,ro);
Ezután iratkozzon fel a Mono-ra a következő módon:
CountDownLatch latch=new CountDownLatch(1);
objMono .subscribeOn(Schedulers.elastic())
.subscribe(resourceResponse->
{
if(resourceResponse.statusCode()!=successStatus)
{
throw new RuntimeException(resourceResponse.toString());
}
},
Throwable::printStackTrace,latch::countDown);
latch.await();
Upsert művelet
Az Upsert művelethez meg kell adnia a frissíteni kívánt dokumentumot. A teljes dokumentum beolvasásához használhatja a címsor olvasási műveletében említett kódrészletet, majd módosíthatja a szükséges mezőket. A dokumentumot az alábbi kódrészletek iktatják össze:
Mono<CosmosItemResponse> obs= container.upsertItem(doc, ro);
Ezután iratkozzon fel a mono-ra. Tekintse meg a mono-előfizetés kódrészletét a beszúrási műveletben.
Törlési művelet
A következő kódrészlet törli a műveletet:
CosmosItem objItem= container.getItem(doc.Id, doc.Tenant);
Mono<CosmosItemResponse> objMono = objItem.delete(ro);
Ezután iratkozzon fel a monóra, és tekintse meg a mono-előfizetés kódrészletét a beszúrási műveletben. A teljes kódminta a CouchbaseToCosmosDB-AsyncInSpring GitHub-adattárban érhető el.
Couchbase kulcs/érték párként
Ez egy egyszerű számítási feladattípus, amelyben lekérdezések helyett kereséseket hajthat végre. Kulcs/érték párok esetén kövesse az alábbi lépéseket:
Fontolja meg a "/ID" elsődleges kulcsként való kezelését, amely biztosítja, hogy a keresési műveletet közvetlenül az adott partíción hajthatja végre. Hozzon létre egy gyűjteményt, és adja meg a "/ID" értéket partíciókulcsként.
Kapcsolja ki teljesen az indexelést. Mivel keresési műveleteket fog végrehajtani, nincs értelme indexelési többletterhelést hordozni. Az indexelés kikapcsolásához jelentkezzen be az Azure Portalra, és használja az Azure Cosmos DB-fiókot. Nyissa meg az Adatkezelőt, válassza ki az adatbázist és a tárolót. Nyissa meg a Méretezés > Beállítások lapot, és válassza ki az Indexelési szabályzatot. Az indexelési szabályzat jelenleg a következőhöz hasonlóan néz ki:
{ "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*" } ], "excludedPaths": [ { "path": "/\"_etag\"/?" } ] }
Cserélje le a fenti indexelési szabályzatot a következő házirendre:
{ "indexingMode": "none", "automatic": false, "includedPaths": [], "excludedPaths": [] }
A kapcsolatobjektum létrehozásához használja az alábbi kódrészletet. Kapcsolatobjektum (amelybe @Bean helyezendő vagy statikussá kell tenni):
ConnectionPolicy cp=new ConnectionPolicy(); cp.connectionMode(ConnectionMode.DIRECT); if(client==null) client= CosmosClient.builder() .endpoint(Host)//(Host, PrimaryKey, dbName, collName).Builder() .connectionPolicy(cp) .key(PrimaryKey) .consistencyLevel(ConsistencyLevel.EVENTUAL) .build(); container = client.getDatabase(_dbName).getContainer(_collName);
Most az alábbiak szerint hajthatja végre a CRUD-műveleteket:
Olvasási művelet
Az elem elolvasásához használja a következő kódrészletet:
CosmosItemRequestOptions ro=new CosmosItemRequestOptions();
ro.partitionKey(new PartitionKey(documentId));
CountDownLatch latch=new CountDownLatch(1);
var objCosmosItem= container.getItem(documentId, documentId);
Mono<CosmosItemResponse> objMono = objCosmosItem.read(ro);
objMono .subscribeOn(Schedulers.elastic())
.subscribe(resourceResponse->
{
if(resourceResponse.item()!=null)
{
doc= resourceResponse.properties().toObject(UserModel.class);
}
},
Throwable::printStackTrace,latch::countDown);
latch.await();
Művelet beszúrása
Elem beszúrásához hajtsa végre a következő kódot:
Mono<CosmosItemResponse> objMono= container.createItem(doc,ro);
Ezután iratkozzon fel a monóra a következő módon:
CountDownLatch latch=new CountDownLatch(1);
objMono.subscribeOn(Schedulers.elastic())
.subscribe(resourceResponse->
{
if(resourceResponse.statusCode()!=successStatus)
{
throw new RuntimeException(resourceResponse.toString());
}
},
Throwable::printStackTrace,latch::countDown);
latch.await();
Upsert művelet
Egy elem értékének frissítéséhez tekintse meg az alábbi kódrészletet:
Mono<CosmosItemResponse> obs= container.upsertItem(doc, ro);
Ezután iratkozzon fel a monóra, és tekintse meg a mono-előfizetés kódrészletét a beszúrási műveletben.
Törlési művelet
A törlési művelet végrehajtásához használja az alábbi kódrészletet:
CosmosItem objItem= container.getItem(id, id);
Mono<CosmosItemResponse> objMono = objItem.delete(ro);
Ezután iratkozzon fel a monóra, és tekintse meg a mono-előfizetés kódrészletét a beszúrási műveletben. A teljes kódminta a CouchbaseToCosmosDB-AsyncKeyValue GitHub-adattárban érhető el.
Adatok áttelepítése
Adatok áttelepítése az Azure Data Factory használatával. Ez a leginkább ajánlott módszer az adatok migrálásához. Konfigurálja a forrást Couchbase-ként, és merüljen el a NoSQL-hez készült Azure Cosmos DB-ként. A részletes lépésekért tekintse meg az Azure Cosmos DB Data Factory-összekötőről szóló cikket.
Következő lépések
- A teljesítménytesztelést az Azure Cosmos DB-vel kapcsolatos teljesítmény- és méretezési tesztekkel foglalkozó cikkben tekinthet meg.
- A kód optimalizálásához tekintse meg az Azure Cosmos DB-hez készült teljesítménytippeket.
- Ismerkedjen meg a Java Async V3 SDK-val, az SDK-referencia GitHub-adattárral.