Parça eşleme yöneticisiyle veritabanlarının ölçeğini genişletme

Şunlar için geçerlidir:Azure SQL Veritabanı

Azure SQL Veritabanı veritabanlarının ölçeğini kolayca genişletmek için parça eşleme yöneticisi kullanın. Parça eşleme yöneticisi, bir parça kümesindeki tüm parçalar (veritabanları) hakkında genel eşleme bilgilerini tutan özel bir veritabanıdır. Meta veriler, bir uygulamanın parçalama anahtarının değerine göre doğru veritabanına bağlanmasına olanak tanır. Buna ek olarak, kümedeki her parça yerel parça verilerini (parçacıklar olarak bilinir) izleyen haritalar içerir.

Shard map management

Bu haritaların nasıl yapıldığını anlamak parça eşleme yönetimi için çok önemlidir. Bu işlem, parça eşlemelerini yönetmek için Elastik Veritabanı istemci kitaplığında bulunan ShardMapManager sınıfı (Java, .NET) kullanılarak yapılır.

Parça eşlemeleri ve parça eşlemeleri

Her parça için, oluşturulacak parça eşlemesi türünü seçmeniz gerekir. Seçim, veritabanı mimarisine bağlıdır:

  1. Veritabanı başına tek kiracı
  2. Veritabanı başına birden çok kiracı (iki tür):
    1. Liste eşlemesi
    2. Aralık eşlemesi

Tek kiracılı bir model için liste eşleme parça eşlemesi oluşturun. Tek kiracılı model, kiracı başına bir veritabanı atar. Bu, parça eşleme yönetimini basitleştirdiğinden SaaS geliştiricileri için etkili bir modeldir.

List mapping

Çok kiracılı model, tek bir veritabanına birkaç kiracı atar (ve kiracı gruplarını birden çok veritabanına dağıtabilirsiniz). Her kiracının küçük veri gereksinimlerine sahip olmasını beklerken bu modeli kullanın. Bu modelde, aralık eşlemesini kullanarak bir veritabanına bir kiracı aralığı atayın.

Range mapping

Veya tek bir veritabanına birden çok kiracı atamak için liste eşlemesi kullanarak çok kiracılı bir veritabanı modeli uygulayabilirsiniz. Örneğin, DB1 kiracı kimliği 1 ve 5 hakkındaki bilgileri depolamak için kullanılır ve DB2 kiracı 7 ve kiracı 10 için verileri depolar.

Multiple tenants on single DB

Parçalama anahtarları için desteklenen türler

Elastik Ölçek, parçalama anahtarları olarak aşağıdaki türleri destekler:

.NET Java
integer integer
uzun uzun
guid uuid
bayt[] bayt[]
datetime timestamp
timespan süre
datetimeoffset offsetdatetime

Parça haritalarını listeleme ve aralık oluşturma

Parça eşlemeleri tek tek parçalama anahtarı değerlerinin listeleri kullanılarak oluşturulabilir veya parçalama anahtarı değerleri aralıkları kullanılarak oluşturulabilir.

Parça haritalarını listeleme

Parçalar parçalı parçalar içerir ve parçalarla parça eşlemesi bir parça eşlemesi tarafından korunur. Liste parça eşlemesi, parçacıkları tanımlayan tek tek anahtar değerleriyle parça görevi görecek veritabanları arasındaki ilişkidir. Liste eşlemeleri açıktır ve farklı anahtar değerleri aynı veritabanına eşlenebilir. Örneğin, 1. anahtar değeri Veritabanı A'ya, 3 ve 6 anahtar değerleri de B Veritabanı'na eşler.

Tuş Parça Konumu
1 Database_A
3 Database_B
4 Database_C
6 Database_B
... ...

Aralık parça haritaları

Bir aralık parça eşlemesinde anahtar aralığı, düşük değerin aralıktaki en düşük anahtar olduğu ve Yüksek Değer'in aralıktan daha yüksek olan ilk değer olduğu bir çift [Düşük Değer, Yüksek Değer) ile tanımlanır.

Örneğin, [0, 100) 0'dan büyük veya 100'den küçük tüm tamsayıları içerir. Birden çok aralığın aynı veritabanına işaret ettiğini ve kopuk aralıkların desteklendiğini (örneğin, [100.200) ve [400.600) aşağıdaki örnekte C Veritabanı'nı işaret ettiğini unutmayın.)

Tuş Parça Konumu
[1,50) Database_A
[50,100) Database_B
[100,200) Database_C
[400,600) Database_C
... ...

Yukarıda gösterilen tabloların her biri, ShardMap nesnesinin kavramsal bir örneğidir. Her satır, tek bir PointMapping (liste parça eşlemesi için) veya RangeMapping (aralık parça eşlemesi için) nesnesinin basitleştirilmiş bir örneğidir.

Parça eşleme yöneticisi

İstemci kitaplığında, parça eşleme yöneticisi bir parça eşlemeleri koleksiyonudur. ShardMapManager örneği tarafından yönetilen veriler üç yerde tutulur:

  1. Genel Parça Haritası (GSM): Tüm parça eşlemeleri ve eşlemeleri için depo görevi görecek bir veritabanı belirtirsiniz. Bilgileri yönetmek için özel tablolar ve saklı yordamlar otomatik olarak oluşturulur. Bu genellikle küçük bir veritabanıdır ve kolay erişilir ve uygulamanın diğer ihtiyaçları için kullanılmamalıdır. Tablolar __ShardManagement adlı özel bir şemada yer alır.
  2. Yerel Parça Eşlemesi (LSM):Parça olarak belirttiğiniz her veritabanı, parçaya özgü parça eşleme bilgilerini içeren ve yöneten birkaç küçük tablo ve özel saklı yordam içerecek şekilde değiştirilir. Bu bilgiler GSM'deki bilgilerle yedeklidir ve uygulamanın GSM'ye herhangi bir yük yerleştirmeden önbelleğe alınmış parça haritası bilgilerini doğrulamasını sağlar; uygulama, önbelleğe alınmış eşlemenin hala geçerli olup olmadığını belirlemek için LSM'yi kullanır. Her parçadaki LSM'ye karşılık gelen tablolar da şema __ShardManagement.
  3. Uygulama önbelleği: ShardMapManager nesnesine erişen her uygulama örneği, eşlemelerinin yerel bellek içi önbelleğini tutar. Yakın zamanda alınan yönlendirme bilgilerini depolar.

ShardMapManager Oluşturma

ShardMapManager nesnesi fabrika (Java, .NET) deseni kullanılarak oluşturulur. ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) yöntemi kimlik bilgilerini (GSM'yi tutan sunucu adı ve veritabanı adı dahil) Bağlan ionString biçiminde alır ve bir ShardMapManager örneğini döndürür.

Lütfen Unutmayın:ShardMapManager , bir uygulamanın başlatma kodu içinde uygulama etki alanı başına yalnızca bir kez örneklenmelidir. Aynı uygulama etki alanında ek ShardMapManager örneklerinin oluşturulması, uygulamanın belleğinin ve CPU kullanımının artmasına neden olur. ShardMapManager herhangi bir sayıda parça eşlemesi içerebilir. Tek bir parça eşlemesi birçok uygulama için yeterli olsa da, farklı şema veya benzersiz amaçlar için farklı veritabanı kümelerinin kullanıldığı zamanlar olabilir; bu gibi durumlarda birden çok parça haritası tercih edilebilir.

Bu kodda bir uygulama, TryGetSqlShardMapManager (Java, .NET yöntemi) ile mevcut bir ShardMapManager'ı açmaya çalışır. Global ShardMapManager'ı (GSM) temsil eden nesneler henüz veritabanında yoksa, istemci kitaplığı bunları CreateSqlShardMapManager (Java, .NET) yöntemini kullanarak oluşturur.

// Try to get a reference to the Shard Map Manager in the shardMapManager database.
// If it doesn't already exist, then create it.
ShardMapManager shardMapManager = null;
boolean shardMapManagerExists = ShardMapManagerFactory.tryGetSqlShardMapManager(shardMapManagerConnectionString,ShardMapManagerLoadPolicy.Lazy, refShardMapManager);
shardMapManager = refShardMapManager.argValue;

if (shardMapManagerExists) {
    ConsoleUtils.writeInfo("Shard Map %s already exists", shardMapManager);
}
else {
    // The Shard Map Manager does not exist, so create it
    shardMapManager = ShardMapManagerFactory.createSqlShardMapManager(shardMapManagerConnectionString);
    ConsoleUtils.writeInfo("Created Shard Map %s", shardMapManager);
}
// Try to get a reference to the Shard Map Manager via the Shard Map Manager database.  
// If it doesn't already exist, then create it.
ShardMapManager shardMapManager;
bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager(
                                        connectionString,
                                        ShardMapManagerLoadPolicy.Lazy,
                                        out shardMapManager);

if (shardMapManagerExists)
{
    Console.WriteLine("Shard Map Manager already exists");
}
else
{
    // Create the Shard Map Manager.
    ShardMapManagerFactory.CreateSqlShardMapManager(connectionString);
    Console.WriteLine("Created SqlShardMapManager");

    shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(
            connectionString,
            ShardMapManagerLoadPolicy.Lazy);

// The connectionString contains server name, database name, and admin credentials for privileges on both the GSM and the shards themselves.
}

.NET sürümü için PowerShell'i kullanarak yeni bir Parça Eşleme Yöneticisi oluşturabilirsiniz. Burada bir örnek verilmiştir.

RangeShardMap veya ListShardMap alma

Parça eşleme yöneticisi oluşturduktan sonra TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) veya GetShardMap (Java, .NET) yöntemini kullanarak RangeShardMap (Java, .NET) veya ListShardMap (Java, .NET) yöntemini alabilirsiniz.

// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
static <T> RangeShardMap<T> createOrGetRangeShardMap(ShardMapManager shardMapManager,
            String shardMapName,
            ShardKeyType keyType) {
    // Try to get a reference to the Shard Map.
    ReferenceObjectHelper<RangeShardMap<T>> refRangeShardMap = new ReferenceObjectHelper<>(null);
    boolean isGetSuccess = shardMapManager.tryGetRangeShardMap(shardMapName, keyType, refRangeShardMap);
    RangeShardMap<T> shardMap = refRangeShardMap.argValue;

    if (isGetSuccess && shardMap != null) {
        ConsoleUtils.writeInfo("Shard Map %1$s already exists", shardMap.getName());
    }
    else {
        // The Shard Map does not exist, so create it
        try {
            shardMap = shardMapManager.createRangeShardMap(shardMapName, keyType);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        ConsoleUtils.writeInfo("Created Shard Map %1$s", shardMap.getName());
    }

    return shardMap;
}
// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
public static RangeShardMap<T> CreateOrGetRangeShardMap<T>(ShardMapManager shardMapManager, string shardMapName)
{
    // Try to get a reference to the Shard Map.
    RangeShardMap<T> shardMap;
    bool shardMapExists = shardMapManager.TryGetRangeShardMap(shardMapName, out shardMap);

    if (shardMapExists)
    {
        ConsoleUtils.WriteInfo("Shard Map {0} already exists", shardMap.Name);
    }
    else
    {
        // The Shard Map does not exist, so create it
        shardMap = shardMapManager.CreateRangeShardMap<T>(shardMapName);
        ConsoleUtils.WriteInfo("Created Shard Map {0}", shardMap.Name);
    }

    return shardMap;
}

Parça eşleme yönetimi kimlik bilgileri

Parça eşlemelerini yöneten ve işleyen uygulamalar, bağlantıları yönlendirmek için parça eşlemelerini kullanan uygulamalardan farklıdır.

Parça eşlemelerini yönetmek için (parça ekleme veya değiştirme, parça eşlemeleri, parça eşlemeleri vb.) hem GSM veritabanında hem de parça görevi görecek her veritabanında okuma/yazma ayrıcalıklarına sahip kimlik bilgilerini kullanarak ShardMapManager örneğini oluşturmanız gerekir. Parça eşleme bilgileri girildiğinden veya değiştirildiğinden ve yeni parçalarda LSM tabloları oluşturmak için kimlik bilgilerinin hem GSM hem de LSM'deki tablolarda yazma işlemine izin vermesi gerekir.

Bkz . Elastik Veritabanı istemci kitaplığına erişmek için kullanılan kimlik bilgileri.

Yalnızca etkilenen meta veriler

ShardMapManager verilerini doldurmak veya değiştirmek için kullanılan yöntemler, parçalarda depolanan kullanıcı verilerini değiştirmez. Örneğin CreateShard, DeleteShard, UpdateMapping gibi yöntemler yalnızca parça eşleme meta verilerini etkiler. Parçalardaki kullanıcı verilerini kaldırmaz, eklemez veya değiştirmez. Bunun yerine, bu yöntemler gerçek veritabanlarını oluşturmak veya kaldırmak için gerçekleştirdiğiniz ayrı işlemlerle birlikte kullanılacak veya parçalı bir ortamı yeniden dengelemek için satırları bir parçadan diğerine taşıyacak şekilde tasarlanmıştır. (Elastik veritabanı araçlarına dahil edilen bölünmüş birleştirme aracı, parçalar arasında gerçek veri hareketini düzenlemenin yanı sıra bu API'leri kullanır.) Bkz. Elastik Veritabanı bölünmüş birleştirme aracını kullanarak ölçeklendirme.

Verilere bağımlı yönlendirme

Parça eşleme yöneticisi, uygulamaya özgü veri işlemlerini gerçekleştirmek için veritabanı bağlantıları gerektiren uygulamalarda kullanılır. Bu bağlantılar doğru veritabanıyla ilişkilendirilmelidir. Bu, Verilere Bağımlı Yönlendirme olarak bilinir. Bu uygulamalar için, GSM veritabanında salt okunur erişime sahip kimlik bilgilerini kullanarak fabrikadan bir parça eşleme yöneticisi nesnesi oluşturun. Daha sonraki bağlantılar için tek tek istekler, uygun parça veritabanına bağlanmak için gereken kimlik bilgilerini sağlar.

Bu uygulamaların (salt okunur kimlik bilgileriyle açılan ShardMapManager kullanılarak) eşlemelerde veya eşlemelerde değişiklik yapamayacağını unutmayın. Bu gereksinimler için, daha önce açıklandığı gibi daha yüksek ayrıcalıklı kimlik bilgileri sağlayan yönetime özgü uygulamalar veya PowerShell betikleri oluşturun. Bkz . Elastik Veritabanı istemci kitaplığına erişmek için kullanılan kimlik bilgileri.

Daha fazla bilgi için bkz . Verilere bağımlı yönlendirme.

Parça eşlemesini değiştirme

Parça eşlemesi farklı şekillerde değiştirilebilir. Aşağıdaki yöntemlerin tümü parçaları ve bunların eşlemelerini açıklayan meta verileri değiştirir, ancak parçalar içindeki verileri fiziksel olarak değiştirmez ve gerçek veritabanlarını oluşturmaz veya silmez. Aşağıda açıklanan parça haritasındaki bazı işlemlerin, verileri fiziksel olarak taşıyabilen veya parça olarak hizmet veren veritabanlarını ekleyip kaldıran yönetim eylemleriyle eşgüdümlü olması gerekebilir.

Bu yöntemler, parçalanmış veritabanı ortamınızdaki verilerin genel dağılımını değiştirmek için kullanılabilen yapı taşları olarak birlikte çalışır.

  • Parça eklemek veya kaldırmak için: parça haritası (Java, .NET) sınıfının CreateShard (Java, .NET) ve DeleteShard (Java, .NET) kullanın.

    Bu işlemlerin yürütülmesi için hedef parçanın temsili sunucu ve veritabanı zaten mevcut olmalıdır. Bu yöntemlerin veritabanları üzerinde herhangi bir etkisi yoktur, yalnızca parça eşlemesindeki meta veriler üzerinde.

  • Parçalarla eşlenen noktaları veya aralıkları oluşturmak veya kaldırmak için: ListShardMap (Java, .NET) sınıfının CreateRangeMapping (Java, .NET), RangeShardMapping (Java, .NET) sınıfının DeleteMapping (Java, .NET) ve CreatePointMapping (Java, .NET) sınıfını kullanın.

    Birçok farklı nokta veya aralık aynı parçaya eşlenebilir. Bu yöntemler yalnızca meta verileri etkiler. Bunlar parçalarda zaten mevcut olabilecek verileri etkilemez. Verilerin DeleteMapping işlemleriyle tutarlı olması için veritabanından kaldırılması gerekiyorsa, bu işlemleri ayrı ayrı ancak bu yöntemleri kullanarak gerçekleştirirsiniz.

  • Mevcut aralıkları ikiye bölmek veya bitişik aralıkları tek bir aralıkta birleştirmek için: SplitMapping (Java, .NET) ve MergeMappings (Java, .NET) kullanın.

    Bölme ve birleştirme işlemlerinin anahtar değerlerinin eşlendiği parçanın değişmediğini unutmayın. Bölme, var olan bir aralığı iki bölüme ayırır, ancak her ikisini de aynı parçaya eşlenmiş olarak bırakır. Birleştirme, aynı parçaya zaten eşlenmiş olan iki bitişik aralıkta çalışır ve bunları tek bir aralıkta birleştirir. Noktaların veya aralıkların parçalar arasındaki hareketin, gerçek veri taşıma ile birlikte UpdateMapping kullanılarak koordine edilmesi gerekir. Taşıma gerektiğinde parça eşlemesi değişikliklerini veri hareketiyle koordine etmek için elastik veritabanı araçlarının parçası olan Bölme/Birleştirme hizmetini kullanabilirsiniz.

  • Tek tek noktaları veya aralıkları farklı parçalara yeniden eşlemek (veya taşımak) için: UpdateMapping (Java, .NET) kullanın.

    UpdateMapping işlemleriyle tutarlı olması için verilerin bir parçadan diğerine taşınması gerekebileceğinden, bu hareketi ayrı ayrı ancak bu yöntemleri kullanarak gerçekleştirmeniz gerekir.

  • Eşlemeleri çevrimiçi ve çevrimdışı yapmak için: Eşlemenin çevrimiçi durumunu denetlemek için MarkMappingOffline (Java, .NET) ve MarkMappingOnline (Java, .NET) kullanın.

    Parça eşlemelerinde belirli işlemlere yalnızca eşleme çevrimdışı durumdayken izin verilir( UpdateMapping ve DeleteMapping gibi). Eşleme çevrimdışı olduğunda, bu eşlemeye dahil edilen anahtarı temel alan verilere bağımlı istek bir hata döndürür. Ayrıca, bir aralık ilk kez çevrimdışına alındığında, değişen aralıklara yönelik sorgularda tutarsız veya eksik sonuçları önlemek için etkilenen parçaya yönelik tüm bağlantılar otomatik olarak sonlandırılır.

Eşlemeler .NET'teki sabit nesnelerdir. Yukarıdaki eşlemeleri değiştiren tüm yöntemler de kodunuzda bunlara yapılan başvuruları geçersiz kılmıştır. Eşlemenin durumunu değiştiren işlem dizilerini gerçekleştirmeyi kolaylaştırmak için, eşlemeyi değiştiren tüm yöntemler yeni bir eşleme başvurusu döndürerek işlemlerin zincirlenebilmesini sağlar. Örneğin, 25 anahtarını içeren parça haritası sm'sindeki mevcut eşlemeyi silmek için aşağıdakileri yürütebilirsiniz:

    sm.DeleteMapping(sm.MarkMappingOffline(sm.GetMappingForKey(25)));

Parça ekleme

Uygulamaların, mevcut olan bir parça eşlemesi için yeni anahtarlardan veya anahtar aralıklarından beklenen verileri işlemek için genellikle yeni parçalar eklemesi gerekir. Örneğin, Kiracı Kimliğine göre parçalanmış bir uygulamanın yeni bir kiracı için yeni bir parça sağlaması gerekebilir veya aylık olarak parçalanmış verilerin her yeni ayın başlangıcından önce yeni bir parça sağlanması gerekebilir.

Yeni anahtar değerleri aralığı zaten var olan bir eşlemenin parçası değilse ve veri taşıma gerekli değilse, yeni parçayı eklemek ve yeni anahtarı veya aralığı bu parçayla ilişkilendirmek basit bir işlemdir. Yeni parçalar ekleme hakkında ayrıntılı bilgi için bkz . Yeni parça ekleme.

Ancak veri taşıma gerektiren senaryolarda, parçalar arasındaki veri hareketini gerekli parça eşleme güncelleştirmeleriyle birlikte düzenlemeye yönelik bölünmüş birleştirme aracı gereklidir. Bölünmüş birleştirme aracını kullanma hakkında ayrıntılı bilgi için bkz . Bölünmüş birleştirmeye genel bakış

Ek kaynaklar

Elastik veritabanı araçlarını henüz kullanmıyor musunuz? Başlarken Kılavuzumuza göz atın. Sorular için, SQL Veritabanı ve özellik istekleri için Microsoft Soru-Cevap soru sayfasından bizimle iletişime geçin, yeni fikirler ekleyin veya SQL Veritabanı geri bildirim forumunda mevcut fikirler için oy verin.