Megosztás a következőn keresztül:


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:

  1. 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>
    
  2. Tulajdonságok hozzáadása a POM.xml fájlhoz:

    <azure.version>2.1.6</azure.version>
    
  3. 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>
    
  4. 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>
    
  5. 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:

  1. 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>
    
  2. 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);
    
  3. 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:

  1. 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.

  2. 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": []
     }
    
  3. 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