Herkese merhaba,
Bu yazımda aşağıdaki senaryoda gösterilen akış takip edilerek Azure SQL DB’den Azure Data Factory ile Azure Cosmos DB’ye data migration’ı anlatacağım.

Öncesinde biraz Cosmos DB’den bahsedelim.
Cosmos DB, Microsoft’un NoSQL ve relational bulut tabancı veri tabanı çözümüdür.
Önemli bazı özelliklerini sıralayalım;
- Horizontal Partitioning (Yatay Bölme): Comos DB verinizin büyüme hızını yatayda otomatik olarak bölünerek otomatik bir şekilde yönetir. Böylece hem verinizin hacmini hem de büyüme hızını (throughput) elastik olarak ölçeklendirebilir. Cosmos DB otomatik ölçeklendirmeyi aslında partition’lar üzerinden yapar.
- Global Distribution: Diğer tüm Azure servislerinde olduğu gibi Cosmos DB’de de Microsoft’un veri merkezleri arasında data replikasyonu ve yönetimi mümkün. Global veri replikasyonu aslında farklı bölgelere dağılmış sistemlerdeki veri gecikmelerini en aza indirmek, yüksek kullanılabilirlik sağlamak veya disaster recovery senaryoları için kullanıcılara çözüm sağlar. Global distribution kullanımında karşılaşabileceğiniz conflictler‘in sizlere sunulan Last Write Wins (-ki default olarak bu seçili gelir) yada sizin belirleyeceğiniz Custom çözümler (prosedür) ile üstesinden gelebilirsiniz. Benzer şekilde farklı lokasyonlardaki verinin tutarlılığı (consistency) için sizlere sunulan 5 farklı tutarlılık seviyeden uygun olanını seçebilirsiniz.
- Yönetim: Azure Cosmos DB’nin yönetimini Azure portal, Azure CLI, PowerShell scriptleri, Rest Apı veya notebook’lar ile sağlayabilirsiniz.
- Erişim: Cosmos DB’yi kullanabileceğiniz 3 yöntem mevcut
- Azure Portal ‘de oluşturacağınız Cosmos DB hesabıyla kullanabilirsiniz.
- Gerçek Cosmos DB gibi davranan emulatör üzerinden kullanmak için tıklayın. Internet bağlantısı ve Cosmos DC hesabı gerektirmeden kullanabileceğiniz veritabanında tabikide global distribution gibi özellikler mevcut değil.
- 30 gün boyunca Microsoft hesabınızla ücretsiz deneyebileceğiniz link işte burda.
Peki Cosmos DB’ye data migration nasıl sağlanır?
Bunun için aslında birkaç yöntem var. Öncelikle veri aktarımını online veya offline olarak yapabilirsiniz. Bu ne demek? Online data migration’da veriyi real-time olarak uygulama çalışırken aktarırsınız, yani herhangi bir downtime (veri bekleme/aksama süresi) söz konusu olmaz. Bu tür migration’larda Change Feed veya Striim gibi servisleri kullanabilirsiniz.
Offline migration’larda ise küçük veya büyük ölçekli datasetlerin taşınmasında WPF data migration uygulamalarını kullanabileceğiniz gibi büyük hacimli veriler için Azure data factory (ADF)‘yi kullanabilirsiniz. ADF aynı zamanda büyük verinin sadece taşınmasında değil onun denormalize edilmesinde de kullandığımız bir Microsoft ETL servisidir. ADF, büyük hacimli veriyi taşırken arkada Azure Cosmos DB’nin bulk executor library‘sini kullanır. Kütüphaneyle ilgili detaylara linkten bakabilirsiniz. Yeri gelmişken Spark connector’ünde aynı kütüphaneyi big data için kullandığını söyleyelim. Ayrıca bu kütüphaneyi kullanan kendi custom tool’unuzu da pekala geliştirebilirsiniz.
Bunların dışında IoT cihazlardan gelen veya hava durumu-finansal piyasalar gibi alanlarda kullanılan stream datayı Azure Stream Analytics üzerinde toplayıp transfrom edip yine Cosmos DB’ye aktarımını sağlayabilirsiniz.
Datanızın hacmine, aktarım hızına ve tipine bağlı olarak yukarıda kullanabileceğiniz servislerin isimlerini sıralamaya çalıştım. Şimdi bu postta Azure SQL DB’de yer alan demo ilişkisel veritabanım olan Northwind DB’nin Product tablosunu Cosmos DB’ye Azure Data Factory’de oluşturacağım pipeline ile aktarımını adım adım göstereceğim.
Önce Azure SQL DB’ye daha önce import ettiğim Nortwind tablolarıma ve aktarımını yapacağım Product tablosundan örnek bir kayda (Aniseed Syrup) bakalım;

Ardından Azure Data Factory’yegeçip veriyi migrate edecek pipeline dizaynını adım adım yapıyorum.

Senaryomda Source’um Azure SQL DB. Dolayısıyla SQL DB için yeni bir linked service oluşturuyorum.

Azure SQL DB ile yeni bir linked service oluşturduktan sonra connection setup’ıma bakıyorum. Table name kısmı fail olarak geldi, migration’da query olutşuracağım için şuan sorun değil, doğrudan OK diyorum.

Tablonun tamamını migrate etmeyeceğim. Sadece belirli kolonları isimlerini JSON formata uygun olması için değiştirerek alacağım.

Basitçe scripti aşağıya bırakıyorum;
SELECT
ProductName AS [product.Name],
QuantityPerUnit AS [product.quantity],
UnitPrice AS [product.price],
UnitsInStock AS [product.stock]
FROM
Products
Cosmos DB’ye aktaracağım datayı ‘preview’ ile önizliyorum.

Source dataseti tamamladığıma göre, şimdi benzer şeyleri Cosmos DB yani hedef kaynak (Sink) için yapacağım

Containerımı seçiyorum;

Pipeline’ı önce publish edip sonra trigger ediyorum ve dataların Cosmos DB’ye migration’ını monitor ediyorum.

Cosmos DB’ye gidip gelen dataya bakalım. AniSeed Syrup Rise Container içinde Item altında duruyor ve sadece Product tablosunda SQL query’de belirttiğim kolonlar ile JSON formatta karşımda duruyor. Pek güzel!

Bu pipeline’ı istediğiniz zaman aralıklarında istediğiniz intervalde tetikleyebilir, veri aktarımını sağlayabilirsiniz.

Böylece Azure SQL veritabanından Cosmos DB’ye veri aktarımını Azure Data Factory ile nasıl yapıalcağını göstermiş oldum.
Umarım faydalı olmuştur.