Migrace z CouchBase na Azure Cosmos DB for NoSQL
PLATÍ PRO: NoSQL
Azure Cosmos DB je škálovatelná globálně distribuovaná plně spravovaná databáze. Poskytuje zaručený přístup k datům s nízkou latencí. Další informace o službě Azure Cosmos DB najdete v článku s přehledem. Tento článek obsahuje pokyny k migraci aplikací v Javě připojených k Couchbase do účtu API for NoSQL ve službě Azure Cosmos DB.
Rozdíly v nomenklaturě
Níže jsou uvedené klíčové funkce, které ve službě Azure Cosmos DB ve srovnání s Couchbase fungují odlišně:
Couchbase | Azure Cosmos DB |
---|---|
Server Couchbase | Obchodní vztah |
Kbelík | Databáze |
Kbelík | Kontejner nebo kolekce |
Dokument JSON | Položka / dokument |
Klíčové rozdíly
Azure Cosmos DB má v dokumentu pole ID, zatímco Couchbase má ID jako součást kontejneru. Pole ID je v rámci oddílu jedinečné.
Azure Cosmos DB se škáluje pomocí techniky dělení nebo horizontálního dělení. To znamená, že data rozdělí do několika horizontálních oddílů nebo oddílů. Tyto oddíly nebo horizontální oddíly se vytvářejí na základě vlastnosti klíče oddílu, kterou zadáte. Můžete vybrat klíč oddílu pro optimalizaci operací čtení i zápisu nebo optimalizovaných pro čtení a zápis. Další informace najdete v článku o dělení .
Ve službě Azure Cosmos DB není nutné, aby hierarchie nejvyšší úrovně označí kolekci, protože název kolekce již existuje. Tato funkce zjednodušuje strukturu JSON. Následuje příklad, který ukazuje rozdíly v datovém modelu mezi Couchbase a Azure Cosmos DB:
Couchbase: ID dokumentu = "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: Viz ID v dokumentu, jak je znázorněno níže.
{ "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" } ] }
Podpora sady Java SDK
Azure Cosmos DB má následující sady SDK (Software Development Kit), které podporují různé architektury Java:
- Asynchronní sada SDK
- Spring Boot SDK
Následující části popisují, kdy použít jednotlivé tyto sady SDK. Představte si příklad, kdy máme tři typy úloh:
Couchbase jako úložiště dokumentů a vlastní dotazy založené na spring datech
Pokud je úloha, kterou migrujete, založená na sadě Spring Boot SDK, můžete použít následující kroky:
Přidání nadřazeného objektu do souboru POM.xml:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> </parent>
Do souboru POM.xml přidejte vlastnosti:
<azure.version>2.1.6</azure.version>
Přidejte do souboru POM.xml závislosti:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-cosmosdb-spring-boot-starter</artifactId> <version>2.1.6</version> </dependency>
Přidejte vlastnosti aplikace do prostředků a zadejte následující. Nezapomeňte nahradit parametry adresy URL, klíče a názvu databáze:
azure.cosmosdb.uri=<your-cosmosDB-URL> azure.cosmosdb.key=<your-cosmosDB-key> azure.cosmosdb.database=<your-cosmosDB-dbName>
Definujte název kolekce v modelu. Můžete také zadat další poznámky. Například ID, klíč oddílu, který je explicitně označí:
@Document(collection = "mycollection") public class User { @id private String id; private String firstName; @PartitionKey private String lastName; }
Následují fragmenty kódu pro operace CRUD:
Operace vložení a aktualizace
Kde _repo je objekt úložiště a dokument je objekt třídy POJO. Můžete použít .save
k vložení nebo upsertu (pokud je dokument se zadaným ID nalezen). Následující fragment kódu ukazuje, jak vložit nebo aktualizovat objekt dokumentu:
_repo.save(doc);
Operace odstranění
Vezměte v úvahu následující fragment kódu, kde objekt dokumentu bude mít ID a klíč oddílu povinný k vyhledání a odstranění objektu:
_repo.delete(doc);
Operace čtení
Dokument si můžete přečíst pomocí klíče oddílu nebo bez zadání klíče oddílu. Pokud nezadáte klíč oddílu, považuje se za dotaz napříč oddíly. Vezměte v úvahu následující ukázky kódu, první provede operaci pomocí pole ID a klíče oddílu. Druhý příklad používá běžné pole bez zadání pole klíče oddílu.
_repo.findByIdAndName(objDoc.getId(),objDoc.getName());
_repo.findAllByStatus(objDoc.getStatus());
To znamená, že teď můžete aplikaci používat se službou Azure Cosmos DB. Kompletní ukázka kódu pro příklad popsaný v tomto dokumentu je k dispozici v úložišti CouchbaseToCosmosDB-SpringCosmos Na GitHubu.
Couchbase jako úložiště dokumentů a použití dotazů N1QL
Dotazy N1QL jsou způsob, jak definovat dotazy v Couchbase.
Dotaz N1QL | Dotaz služby Azure Cosmos DB |
---|---|
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', Bhutan'] 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" and c.country = 'India' and m.type = 'Multi-Entry' and m.Country IN ('Indie', 'Bhutan') ORDER BY c.Validity DESC OFFSET 0 LIMIT 25 |
V dotazech N1QL si můžete všimnout následujících změn:
Nemusíte používat klíčové slovo META ani odkazovat na dokument na první úrovni. Místo toho můžete vytvořit vlastní odkaz na kontejner. V tomto příkladu jsme ho považovali za "c" (může to být cokoli). Tento odkaz se používá jako předpona pro všechna pole první úrovně. Příklad, c.id, c.country atd.
Místo "ANY" teď můžete spojení provést vnořeném dokumentu a odkazovat na něj pomocí vyhrazeného aliasu, například "m". Jakmile vytvoříte alias pro vnořený dokument, musíte použít alias. Například m.Country.
Posloupnost posunu se v dotazu Služby Azure Cosmos DB liší, nejprve je potřeba zadat POSUN a pak LIMIT. Pokud používáte maximální vlastní definované dotazy, nedoporučujeme používat sadu Spring Data SDK, protože při předávání dotazu do služby Azure Cosmos DB může mít zbytečné režijní náklady na straně klienta. Místo toho máme přímou sadu Java SDK asynchronní, která se v tomto případě dá využít mnohem efektivněji.
Operace čtení
Použijte sadu Async Java SDK s následujícími kroky:
Na soubor POM.xml nakonfigurujte následující závislost:
<!-- 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>
Pomocí metody vytvořte objekt připojení pro Službu Azure Cosmos DB
ConnectionBuilder
, jak je znázorněno v následujícím příkladu. Ujistěte se, že tuto deklaraci vložíte do bean tak, aby se následující kód spustil pouze jednou: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);
Pokud chcete spustit dotaz, musíte spustit následující fragment kódu:
Flux<FeedResponse<CosmosItemProperties>> objFlux= container.queryItems(query, fo);
Teď můžete pomocí výše uvedené metody předat více dotazů a provést bez jakýchkoli potíží. Pokud máte požadavek na provedení jednoho velkého dotazu, který je možné rozdělit do několika dotazů, zkuste místo předchozího fragmentu kódu použít následující fragment kódu:
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();
}
S předchozím kódem můžete paralelně spouštět dotazy a zvýšit distribuované spouštění, aby se optimalizovaly. Můžete také spustit operace vložení a aktualizace:
Operace vložení
Pokud chcete dokument vložit, spusťte následující kód:
Mono<CosmosItemResponse> objMono= container.createItem(doc,ro);
Pak se přihlaste k odběru mono jako:
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();
Operace upsertu
Operace upsert vyžaduje, abyste zadali dokument, který je potřeba aktualizovat. Pokud chcete načíst celý dokument, můžete použít fragment kódu uvedený v operaci čtení nadpisu a potom upravit požadovaná pole. Následující fragment kódu přeloží dokument:
Mono<CosmosItemResponse> obs= container.upsertItem(doc, ro);
Pak se přihlaste k odběru mono. Podívejte se na fragment kódu mono předplatného v operaci vložení.
Operace odstranění
Následující fragment kódu provede operaci odstranění:
CosmosItem objItem= container.getItem(doc.Id, doc.Tenant);
Mono<CosmosItemResponse> objMono = objItem.delete(ro);
Pak se přihlaste k odběru mono, v operaci vložení si projděte fragment kódu mono předplatného. Kompletní ukázka kódu je k dispozici v úložišti GitHubu CouchbaseToCosmosDB-AsyncInSpring .
Couchbase jako pár klíč/hodnota
Jedná se o jednoduchý typ úlohy, ve které můžete místo dotazů provádět vyhledávání. Pro páry klíč/hodnota použijte následující postup:
Zvažte možnost "/ID" jako primární klíč, což zajistí, že můžete provádět operaci vyhledávání přímo v konkrétním oddílu. Vytvořte kolekci a jako klíč oddílu zadejte /ID.
Úplně vypněte indexování. Vzhledem k tomu, že budete provádět vyhledávací operace, neexistuje žádný bod na režii indexování. Pokud chcete indexování vypnout, přihlaste se k webu Azure Portal a přejděte na účet služby Azure Cosmos DB. Otevřete Průzkumníka dat, vyberte databázi a kontejner. Otevřete kartu Měřítko a Nastavení a vyberte Zásady indexování. V současné době zásady indexování vypadají takto:
{ "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*" } ], "excludedPaths": [ { "path": "/\"_etag\"/?" } ] }
Výše uvedené zásady indexování nahraďte následujícími zásadami:
{ "indexingMode": "none", "automatic": false, "includedPaths": [], "excludedPaths": [] }
K vytvoření objektu připojení použijte následující fragment kódu. Objekt připojení (umístit @Bean ho nebo nastavit jako statický):
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);
Operace CRUD teď můžete spustit následujícím způsobem:
Operace čtení
Ke čtení položky použijte následující fragment kódu:
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();
Operace vložení
Pokud chcete vložit položku, můžete provést následující kód:
Mono<CosmosItemResponse> objMono= container.createItem(doc,ro);
Pak se přihlaste k odběru mono jako:
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();
Operace upsertu
Pokud chcete aktualizovat hodnotu položky, projděte si následující fragment kódu:
Mono<CosmosItemResponse> obs= container.upsertItem(doc, ro);
Pak se přihlaste k odběru mono, v operaci vložení si projděte fragment kódu mono předplatného.
Operace odstranění
Pomocí následujícího fragmentu kódu spusťte operaci odstranění:
CosmosItem objItem= container.getItem(id, id);
Mono<CosmosItemResponse> objMono = objItem.delete(ro);
Pak se přihlaste k odběru mono, v operaci vložení si projděte fragment kódu mono předplatného. Kompletní ukázka kódu je k dispozici v úložišti GitHub CouchbaseToCosmosDB-AsyncKeyValue .
Migrace dat
K migraci dat použijte Azure Data Factory . Toto je nejporučovanější metoda migrace dat. Nakonfigurujte zdroj jako Couchbase a jímku jako Azure Cosmos DB for NoSQL. Podrobné kroky najdete v článku o konektoru služby Azure Cosmos DB Data Factory.
Další kroky
- Pokud chcete provést testování výkonu, přečtěte si článek o testování výkonu a škálování ve službě Azure Cosmos DB .
- Pokud chcete kód optimalizovat, podívejte se na tipy k výkonu pro azure Cosmos DB .
- Prozkoumejte sadu Java Async V3 SDK, referenční informace o úložišti GitHub sdk.