Migreren van CouchBase naar Azure Cosmos DB for NoSQL
VAN TOEPASSING OP: NoSQL
Azure Cosmos DB is een schaalbare, wereldwijd gedistribueerde, volledig beheerde database. Het biedt gegarandeerde toegang tot lage latentie tot uw gegevens. Zie het overzichtsartikel voor meer informatie over Azure Cosmos DB. Dit artikel bevat instructies voor het migreren van Java-toepassingen die zijn verbonden met Couchbase met een API voor NoSQL-account in Azure Cosmos DB.
Verschillen in nomenclatuur
Hier volgen de belangrijkste functies die anders werken in Azure Cosmos DB in vergelijking met Couchbase:
Couchbase | Azure Cosmos DB |
---|---|
Couchbase-server | Rekening |
Emmer | Database |
Emmer | Container/verzameling |
JSON-document | Item/document |
Belangrijke verschillen
Azure Cosmos DB heeft een id-veld in het document, terwijl Couchbase de id als onderdeel van bucket heeft. Het veld Id is uniek voor de partitie.
Azure Cosmos DB schaalt met behulp van de partitionerings- of shardingtechniek. Dit betekent dat de gegevens worden gesplitst in meerdere shards/partities. Deze partities/shards worden gemaakt op basis van de partitiesleuteleigenschap die u opgeeft. U kunt de partitiesleutel selecteren om lees- en schrijfbewerkingen te optimaliseren of ook geoptimaliseerd voor lezen/schrijven. Zie het artikel partitionering voor meer informatie.
In Azure Cosmos DB is het niet vereist voor de hiërarchie op het hoogste niveau om de verzameling aan te geven omdat de naam van de verzameling al bestaat. Deze functie maakt de JSON-structuur eenvoudiger. Hier volgt een voorbeeld met verschillen in het gegevensmodel tussen Couchbase en Azure Cosmos DB:
Couchbase: Document-id = "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: Raadpleeg 'ID' in het document, zoals hieronder wordt weergegeven
{ "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-ondersteuning
Azure Cosmos DB heeft de volgende SDK's (Software Development Kits) ter ondersteuning van verschillende Java-frameworks:
- Async SDK
- Spring Boot SDK
In de volgende secties wordt beschreven wanneer u elk van deze SDK's gebruikt. Bekijk een voorbeeld waarin we drie typen workloads hebben:
Couchbase als documentopslagplaats en aangepaste query's op basis van springgegevens
Als de workload die u migreert, is gebaseerd op de Spring Boot Based SDK, kunt u de volgende stappen uitvoeren:
Bovenliggend item toevoegen aan het POM.xml-bestand:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> </parent>
Eigenschappen toevoegen aan het POM.xml-bestand:
<azure.version>2.1.6</azure.version>
Afhankelijkheden toevoegen aan het POM.xml-bestand:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-cosmosdb-spring-boot-starter</artifactId> <version>2.1.6</version> </dependency>
Voeg toepassingseigenschappen toe onder resources en geef het volgende op. Zorg ervoor dat u de url-, sleutel- en databasenaamparameters vervangt:
azure.cosmosdb.uri=<your-cosmosDB-URL> azure.cosmosdb.key=<your-cosmosDB-key> azure.cosmosdb.database=<your-cosmosDB-dbName>
Definieer de naam van de verzameling in het model. U kunt ook verdere aantekeningen opgeven. Bijvoorbeeld id, partitiesleutel om deze expliciet aan te geven:
@Document(collection = "mycollection") public class User { @id private String id; private String firstName; @PartitionKey private String lastName; }
Hier volgen de codefragmenten voor CRUD-bewerkingen:
Bewerkingen invoegen en bijwerken
Waar _repo het object van de opslagplaats is en het document het object van de POJO-klasse is. U kunt gebruiken .save
om in te voegen of upsert (als het document met de opgegeven id is gevonden). In het volgende codefragment ziet u hoe u een documentobject invoegt of bijwerkt:
_repo.save(doc);
Verwijderbewerking
Houd rekening met het volgende codefragment, waarbij het doc-object id en partitiesleutel verplicht is om het object te zoeken en te verwijderen:
_repo.delete(doc);
Leesbewerking
U kunt het document lezen met of zonder de partitiesleutel op te geven. Als u de partitiesleutel niet opgeeft, wordt deze behandeld als een query voor meerdere partities. Houd rekening met de volgende codevoorbeelden. Eerst voert u een bewerking uit met behulp van het veld ID en partitiesleutel. In het tweede voorbeeld wordt een gewoon veld gebruikt en zonder het partitiesleutelveld op te geven.
_repo.findByIdAndName(objDoc.getId(),objDoc.getName());
_repo.findAllByStatus(objDoc.getStatus());
Dat is het, u kunt nu uw toepassing gebruiken met Azure Cosmos DB. Volledig codevoorbeeld voor het voorbeeld dat in dit document wordt beschreven, is beschikbaar in de CouchbaseToCosmosDB-SpringCosmos GitHub-opslagplaats.
Couchbase als documentopslagplaats en met behulp van N1QL-query's
N1QL-query's zijn de manier om query's in de Couchbase te definiëren.
N1QL-query | Azure Cosmos DB-query |
---|---|
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', Resource'] 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" en c.country = 'India' and m.type = 'Multi-Entry' and m.Country IN ('India', 'Source') ORDER BY c.Validity DESC OFFSET 0 LIMIT 25 |
U ziet de volgende wijzigingen in uw N1QL-query's:
U hoeft het trefwoord META niet te gebruiken of naar het document op het eerste niveau te verwijzen. In plaats daarvan kunt u uw eigen verwijzing naar de container maken. In dit voorbeeld hebben we het beschouwd als 'c' (het kan alles zijn). Deze verwijzing wordt gebruikt als voorvoegsel voor alle velden op het eerste niveau. Fr voorbeeld, c.id, c.country etc.
In plaats van 'ANY' kunt u nu een join uitvoeren in een subdocument en deze verwijzen met een speciale alias, zoals 'm'. Nadat u een alias hebt gemaakt voor een subdocument, moet u alias gebruiken. Bijvoorbeeld m.Country.
De volgorde van OFFSET verschilt in de Azure Cosmos DB-query. Eerst moet u OFFSET opgeven en vervolgens LIMIT. Het is raadzaam om Spring Data SDK niet te gebruiken als u maximaal aangepaste gedefinieerde query's gebruikt, omdat deze onnodige overhead aan de clientzijde kan hebben tijdens het doorgeven van de query aan Azure Cosmos DB. In plaats daarvan hebben we een directe Async Java SDK, die in dit geval veel efficiënt kan worden gebruikt.
Leesbewerking
Gebruik de Async Java SDK met de volgende stappen:
Configureer de volgende afhankelijkheid voor het POM.xml-bestand:
<!-- 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>
Maak een verbindingsobject voor Azure Cosmos DB met behulp van de
ConnectionBuilder
methode, zoals wordt weergegeven in het volgende voorbeeld. Zorg ervoor dat u deze declaratie in de bean plaatst, zodat de volgende code slechts eenmaal moet worden uitgevoerd: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);
Als u de query wilt uitvoeren, moet u het volgende codefragment uitvoeren:
Flux<FeedResponse<CosmosItemProperties>> objFlux= container.queryItems(query, fo);
Met behulp van de bovenstaande methode kunt u meerdere query's doorgeven en zonder gedoe uitvoeren. Als u een grote query moet uitvoeren, die kan worden gesplitst in meerdere query's, kunt u het volgende codefragment proberen in plaats van het vorige codefragment:
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();
}
Met de vorige code kunt u query's parallel uitvoeren en de gedistribueerde uitvoeringen verhogen om te optimaliseren. Verder kunt u de invoeg- en updatebewerkingen ook uitvoeren:
Bewerking invoegen
Voer de volgende code uit om het document in te voegen:
Mono<CosmosItemResponse> objMono= container.createItem(doc,ro);
Abonneer u vervolgens op Mono als:
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-bewerking
Voor de upsert-bewerking moet u het document opgeven dat moet worden bijgewerkt. Als u het volledige document wilt ophalen, kunt u het fragment gebruiken dat wordt vermeld onder de leesbewerking van de kop en vervolgens de vereiste velden wijzigen. Met het volgende codefragment wordt het document upsert:
Mono<CosmosItemResponse> obs= container.upsertItem(doc, ro);
Abonneer u vervolgens op mono. Raadpleeg het mono-abonnementsfragment in de invoegbewerking.
Bewerking verwijderen
Met het volgende fragment wordt de verwijderbewerking uitgevoerd:
CosmosItem objItem= container.getItem(doc.Id, doc.Tenant);
Mono<CosmosItemResponse> objMono = objItem.delete(ro);
Abonneer u vervolgens op mono, raadpleeg het mono-abonnementsfragment in de invoegbewerking. Het volledige codevoorbeeld is beschikbaar in de GitHub-opslagplaats CouchbaseToCosmosDB-AsyncInSpring GitHub.
Couchbase als sleutel-waardepaar
Dit is een eenvoudig type workload waarin u zoekopdrachten kunt uitvoeren in plaats van query's. Gebruik de volgende stappen voor sleutel-waardeparen:
Overweeg om '/ID' als primaire sleutel te hebben, zodat u de opzoekbewerking rechtstreeks in de specifieke partitie kunt uitvoeren. Maak een verzameling en geef '/ID' op als partitiesleutel.
Schakel de indexering volledig uit. Omdat u opzoekbewerkingen uitvoert, is er geen sprake van overhead voor indexering. Als u indexering wilt uitschakelen, meldt u zich aan bij Azure Portal, gaat u naar het Azure Cosmos DB-account. Open Data Explorer, selecteer uw database en de container. Open het tabblad Schaal & instellingen en selecteer het indexeringsbeleid. Het indexeringsbeleid ziet er momenteel als volgt uit:
{ "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*" } ], "excludedPaths": [ { "path": "/\"_etag\"/?" } ] }
Vervang het bovenstaande indexeringsbeleid door het volgende beleid:
{ "indexingMode": "none", "automatic": false, "includedPaths": [], "excludedPaths": [] }
Gebruik het volgende codefragment om het verbindingsobject te maken. Verbindingsobject (in te plaatsen @Bean of statisch te maken):
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);
U kunt nu de CRUD-bewerkingen als volgt uitvoeren:
Leesbewerking
Gebruik het volgende fragment om het item te lezen:
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();
Bewerking invoegen
Als u een item wilt invoegen, kunt u de volgende code uitvoeren:
Mono<CosmosItemResponse> objMono= container.createItem(doc,ro);
Abonneer u vervolgens op mono als:
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-bewerking
Als u de waarde van een item wilt bijwerken, raadpleegt u het onderstaande codefragment:
Mono<CosmosItemResponse> obs= container.upsertItem(doc, ro);
Abonneer u vervolgens op mono, raadpleeg het mono-abonnementsfragment in de invoegbewerking.
Bewerking verwijderen
Gebruik het volgende codefragment om de verwijderbewerking uit te voeren:
CosmosItem objItem= container.getItem(id, id);
Mono<CosmosItemResponse> objMono = objItem.delete(ro);
Abonneer u vervolgens op mono, raadpleeg het mono-abonnementsfragment in de invoegbewerking. Het volledige codevoorbeeld is beschikbaar in de GitHub-opslagplaats CouchbaseToCosmosDB-AsyncKeyValue .
Gegevensmigratie
Gebruik Azure Data Factory om gegevens te migreren. Dit is de meest aanbevolen methode om de gegevens te migreren. Configureer de bron als Couchbase en sink als Azure Cosmos DB for NoSQL. Zie het artikel over de Azure Cosmos DB Data Factory-connector voor gedetailleerde stappen.
Volgende stappen
- Als u prestatietests wilt uitvoeren, raadpleegt u het artikel Prestatie - en schaaltests met Azure Cosmos DB .
- Als u de code wilt optimaliseren, raadpleegt u het artikel Prestatietips voor Azure Cosmos DB .
- Verken Java Async V3 SDK, SDK-referentieopslagplaats voor GitHub.