Sdílet prostřednictvím


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:

  1. 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>
    
  2. Do souboru POM.xml přidejte vlastnosti:

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

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

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

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