Peluasan skala database dengan pengelola peta shard

Berlaku untuk:Azure SQL Database

Untuk memperluas skala database dengan mudah di Azure SQL Database, gunakan ShardMapManager. Pengelola peta shard adalah database khusus yang mempertahankan informasi pemetaan global tentang semua shard (database) dalam set shard. Metadata memungkinkan aplikasi untuk terhubung ke database yang benar berdasarkan nilai kunci sharding. Selain itu, setiap shard dalam kumpulan berisi peta yang melacak data shard lokal (dikenal sebagai shardlet).

Shard map management

Memahami bagaimana peta ini dibangun sangat penting untuk manajemen peta shard. Ini dilakukan menggunakan kelas ShardMapManager (Java, .NET), yang ditemukan di pustaka klien Elastic Database untuk mengelola peta shard.

Peta shard dan pemetaan shard

Untuk setiap shard, Anda harus memilih jenis peta shard yang dibuat. Pilihan tergantung pada arsitektur database:

  1. Penyewa tunggal per database
  2. Beberapa penyewa per database (dua jenis):
    1. Pemetaan daftar
    2. Pemetaan rentang

Untuk model penyewa tunggal, buat peta shard pemetaan daftar. Model penyewa tunggal menetapkan satu database per penyewa. Ini adalah model yang efektif untuk pengembang SaaS karena menyederhanakan manajemen peta shard.

List mapping

Model multi-penyewa menetapkan beberapa penyewa ke database individual (dan Anda bisa mendistribusikan kelompok penyewa di beberapa database). Gunakan model ini ketika Anda memperkirakan setiap penyewa memiliki kebutuhan data yang kecil. Dalam model ini, gunakan rentang penyewa ke database menggunakan pemetaan rentang.

Range mapping

Atau Anda bisa menerapkan model database multi-penyewa menggunakan pemetaan daftar untuk menetapkan beberapa penyewa ke database individual. Misalnya, DB1 digunakan untuk menyimpan informasi tentang penyewa ID 1 dan 5, dan DB2 menyimpan data untuk penyewa 7 dan penyewa 10.

Multiple tenants on single DB

Jenis yang didukung untuk kunci sharding

Skala Elastis mendukung jenis berikut sebagai kunci sharding:

.NET Java
Integer Integer
long long
guid uuid
byte[] byte[]
datetime rentang waktu
timespan durasi
tanggalwaktulewat tanggalwaktulewat

Peta shard daftar dan rentang

Peta shard dapat dibangun menggunakan daftar nilai kunci sharding individu, atau dapat dibangun menggunakan rentang nilai kunci sharding.

Peta shard daftar

Shard berisi shardlet dan pemetaan shardlet hingga shard dipertahankan oleh peta shard. Peta shard daftar adalah hubungan antara nilai kunci individual yang mengidentifikasi shardlet dan database yang berfungsi sebagai shard. Pemetaan daftar bersifat eksplisit dan nilai kunci yang berbeda dapat dipetakan ke database yang sama. Misalnya, nilai kunci 1 peta untuk Database A, dan nilai kunci 3 dan 6 keduanya peta untuk Database B.

Tombol Lokasi Shard
1 Database_A
3 Database_B
4 Database_C
6 Database_B
... ...

Peta shard rentang

Dalam peta shard rentang, rentang kunci dijelaskan oleh pasangan [Nilai Rendah, Nilai Tinggi) di mana Nilai Rendah adalah kunci minimum dalam rentang, dan Nilai Tinggi adalah nilai pertama yang lebih tinggi dari rentang.

Misalnya, [0, 100) mencakup semua bilangan bulat yang lebih besar dari atau sama dengan 0 dan kurang dari 100. Perhatikan bahwa beberapa rentang dapat menunjuk ke database yang sama, dan rentang terputus-putus didukung (misalnya, [100.200) dan [400.600) keduanya menunjuk ke Database C pada contoh berikut.)

Tombol Lokasi Shard
[1,50) Database_A
[50,100) Database_B
[100,200) Database_C
[400,600) Database_C
... ...

Setiap tabel yang ditunjukkan di atas adalah contoh konseptual sebuah objek ShardMap. Setiap baris adalah contoh yang disederhanakan dari objek individual PointMapping (untuk peta shard daftar) atau RangeMapping (untuk peta shard rentang).

Pengelola peta shard

Di pustaka klien, manajer peta shard adalah kumpulan peta shard. Data yang dikelola oleh instans ShardMapManager disimpan di tiga tempat:

  1. Peta Shard Global (GSM): Anda menentukan database untuk berfungsi sebagai repositori untuk semua peta dan pemetaan shard. Tabel khusus dan prosedur tersimpan dibuat secara otomatis untuk mengelola informasi. Biasanya ini adalah database kecil dan diakses dengan mudah, dan tidak boleh digunakan untuk kebutuhan lain dari aplikasi. Tabel berada dalam skema khusus bernama __ShardManagement.
  2. Peta Shard Lokal (LSM): Setiap database yang Anda tentukan sebagai shard dimodifikasi untuk berisi beberapa tabel kecil dan prosedur khusus yang tersimpan yang berisi dan mengelola informasi peta shard khusus untuk shard itu. Informasi ini berlebihan dengan informasi di GSM, dan memungkinkan aplikasi untuk memvalidasi informasi peta shard dalam cache tanpa menempatkan beban apa pun pada GSM; aplikasi menggunakan LSM untuk menentukan apakah pemetaan dalam cache masih valid. Tabel yang sesuai dengan LSM pada setiap shard juga berada dalam skema __ShardManagement.
  3. Cache aplikasi: Setiap instans aplikasi yang mengakses objek ShardMapManager mempertahankan cache dalam memori lokal dari pemetaannya. Cache menyimpan informasi perutean yang diambil baru-baru ini.

Membangun sebuah ShardMapManager

Objek ShardMapManager dibangun menggunakan pola pabrik (Java, .NET). Metode ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) mengambil informasi masuk (termasuk nama server dan nama database yang memegang GSM) dalam bentuk ConnectionString dan mengembalikan instans ShardMapManager.

Harap Perhatikan:ShardMapManager harus di-instantiasi hanya sekali per domain aplikasi, dalam kode inisialisasi untuk aplikasi. Pembuatan instans tambahan ShardMapManager di domain aplikasi yang sama menghasilkan peningkatan penggunaan memori dan CPU aplikasi. ShardMapManager dapat berisi sejumlah peta shard. Meskipun satu peta shard tunggal mungkin cukup untuk banyak aplikasi, ada kalanya kumpulan database yang berbeda digunakan untuk skema yang berbeda atau untuk tujuan khusus; dalam kasus tersebut beberapa peta shard mungkin lebih disukai.

Dalam kode ini, sebuah aplikasi mencoba membuka ShardMapManager yang telah ada dengan metode TryGetSqlShardMapManager (Java, .NET). Jika objek yang mewakili Global ShardMapManager (GSM) belum ada di dalam database, pustaka klien membuatnya menggunakan metode CreateSqlShardMapManager (Java, .NET).

// 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.
}

Untuk versi .NET, Anda bisa menggunakan PowerShell untuk membuat Shard Map Manager baru. Contoh tersedia di sini.

Mendapatkan RangeShardMap atau ListShardMap

Setelah membuat Shard Map Manager, Anda bisa mendapatkan RangeShardMap (Java, .NET) atau ListShardMap (Java, .NET) menggunakan metode TryGetRangeShardMap (Java, .NET), tryGetListShardMap (Java, .NET), atau metode GetShardMap (Java, .NET).

// 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;
}

Informasi masuk administrasi peta Shard

Aplikasi yang mengelola dan memanipulasi peta shard berbeda dari aplikasi yang menggunakan peta shard untuk merutekan koneksi.

Untuk mengelola peta shard (menambahkan atau mengubah shard, peta shard, pemetaan shard, dll.), Anda harus membuat ShardMapManager menggunakan infromasi masuk yang memiliki hak istimewa baca/tulis pada database GSM dan pada setiap database yang berfungsi sebagai shard. Informasi harus memperbolehkan penulisan pada tabel GSM dan LSM saat informasi peta shard dimasukkan atau diubah, serta untuk membuat tabel LSM pada shard baru.

Lihat Informasi masuk yang digunakan untuk mengakses pustaka klien Elastic Database.

Hanya metadata yang terpengaruh

Metode yang digunakan untuk mengisi atau mengubah data ShardMapManager tidak mengubah data pengguna yang disimpan dalam shard itu sendiri. Misalnya, metode seperti CreateShard, DeleteShard, UpdateMapping, dll. hanya memengaruhi metadata peta shard. Metode tersebut tidak menghapus, menambahkan, atau mengubah data pengguna yang tersimpan dalam shard. Sebaliknya, metode ini dirancang untuk digunakan bersama dengan operasi terpisah yang Anda lakukan untuk membuat atau menghapus database aktual, atau yang memindahkan baris dari satu shard ke shard lainnya untuk menyeimbangkan kembali lingkungan shard. (Alat pisah-gabung yang disertakan dengan alat Elastic Database menggunakan API bersamaan dengan mengatur pergerakan data aktual di antara shard.) Lihat Penskalaan menggunakan alat pisah-gabung Elastic Database.

Perutean tergantung data

Pengelola peta shard digunakan dalam aplikasi yang memerlukan koneksi database untuk melakukan operasi data aplikasi tertentu. Koneksi tersebut harus dikaitkan dengan database yang benar. Ini dikenal sebagai Perutean Tergantung Data. Untuk aplikasi ini, instansiasi objek pengelola peta shard dari pabrik menggunakan informasi yang memiliki akses baca-saja pada database GSM. Permintaan individual untuk koneksi selanjutnya memberikan informasi masuk yang diperlukan untuk menyambungkan ke database shard yang sesuai.

Perhatikan bahwa aplikasi ini (menggunakan ShardMapManager yang dibuka dengan informasi masuk baca-saja) tidak dapat membuat perubahan pada peta atau pemetaan. Untuk kebutuhan tersebut, buat aplikasi administratif khusus atau skrip PowerShell yang menyediakan informasi masuk istimewa yang lebih tinggi seperti yang dibahas sebelumnya. Lihat Informasi masuk yang digunakan untuk mengakses pustaka klien Elastic Database.

Untuk informasi selengkapnya, lihat Perutean tergantung data.

Memodifikasi peta shard

Peta shard dapat diubah dengan cara yang berbeda. Semua metode berikut memodifikasi metadata yang menjelaskan shard dan pemetaannya, tetapi mereka tidak memodifikasi data secara fisik dalam shard, juga tidak membuat atau menghapus database yang sebenarnya. Beberapa operasi pada peta shard yang dijelaskan di bawah ini mungkin perlu dikoordinasikan dengan tindakan administratif yang secara fisik memindahkan data atau yang menambahkan dan menghapus database yang berfungsi sebagai shard.

Metode ini bekerja sama sebagai blok penyusun yang tersedia untuk memodifikasi distribusi data secara keseluruhan di lingkungan shard database Anda.

  • Untuk menambahkan atau menghapus shard: gunakan CreateShard (Java, .NET) dan DeleteShard (Java, .NET) dari kelas peta shard (Java, .NET).

    Server dan database yang mewakili shard target harus sudah ada agar operasi ini bisa dijalankan. Metode-metode ini tidak memiliki dampak pada database itu sendiri, hanya pada metadata dalam peta shard.

  • Untuk membuat atau menghapus titik atau rentang yang dipetakan ke shard: gunakan CreateRangeMapping (Java, .NET), DeleteMapping (Java, .NET) dari kelas RangeShardMapping (Java, .NET),dan CreatePointMapping (Java, .NET) dari kelas ListShardMap (Java, .NET).

    Banyak titik atau rentang yang berbeda dapat dipetakan ke shard yang sama. Metode ini hanya mempengaruhi metadata - mereka tidak mempengaruhi data apa pun yang mungkin sudah ada dalam shard. Jika data perlu dihapus dari database agar konsisten dengan operasi DeleteMapping, Anda melakukan operasi tersebut secara terpisah tetapi bersamaan dengan menggunakan metode ini.

  • Untuk memisahkan rentang yang ada menjadi dua, atau menggabungkan rentang yang berdekatan menjadi satu: gunakan SplitMapping (Java, .NET) dan MergeMappings (Java, .NET).

    Perhatikan bahwa operasi pemisahan dan penggabungan tidak mengubah shard yang nilai kuncinya dipetakan. Operasi pemisahan memecah rentang yang ada menjadi dua bagian, tetapi membiarkan keduanya dipetakan ke shard yang sama. Penggabungan beroperasi pada dua rentang yang berdekatan yang sudah dipetakan ke shard yang sama, menyatukannya ke dalam satu rentang. Pergerakan titik atau rentang sendiri antara shard perlu dikoordinasikan dengan menggunakan UpdateMapping bersamaan dengan pergerakan data aktual. Anda dapat menggunakan layanan Split/Merge yang merupakan bagian dari alat Elastic Database untuk mengoordinasikan perubahan peta shard dengan pergerakan data, saat pergerakan diperlukan.

  • Untuk memetakan ulang (atau memindahkan) titik atau rentang individual ke shard yang berbeda: gunakan UpdateMapping (Java, .NET).

    Karena data mungkin perlu dipindahkan dari satu shard ke shard lain agar konsisten dengan operasi UpdateMapping, Anda perlu melakukan gerakan itu secara terpisah tetapi bersamaan dengan menggunakan metode ini.

  • Untuk mengambil pemetaan online dan offline: gunakan MarkMappingOffline (Java, .NET) dan MarkMappingOnline (Java, .NET) untuk mengontrol kondisi pemetaan online.

    Operasi tertentu pada pemetaan shard hanya diperbolehkan saat pemetaan berada dalam kondisi offline, termasuk UpdateMapping dan DeleteMapping. Saat pemetaan offline, permintaan bergantung pada data berdasarkan kunci yang disertakan dalam pemetaan tersebut menghasilkan kesalahan. Selain itu, ketika rentang pertama kali diambil secara offline, semua koneksi ke shard yang terpengaruh akan secara otomatis diputus untuk mencegah hasil yang tidak konsisten atau tidak lengkap pada kueri yang diarahkan terhadap rentang yang diubah.

Pemetaan adalah objek yang tidak dapat diubah di .NET. Semua metode di atas yang mengubah pemetaan juga membatalkan semua referensi pada pemetaan di kode anda. Untuk mempermudah melakukan urutan operasi yang mengubah status pemetaan, semua metode yang mengubah pemetaan mengembalikan referensi pemetaan baru, sehingga operasi dapat ditautkan. Misalnya, untuk menghapus pemetaan yang ada dalam peta shard sm yang berisi kunci 25, Anda dapat mengeksekusi tindakan berikut:

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

Menambahkan shard

Aplikasi sering perlu menambahkan shard baru untuk menangani data yang diharapkan dari kunci baru atau rentang kunci, untuk peta shard yang sudah ada. Misalnya, aplikasi yang telah berisi shard ID Penyewa mungkin perlu menyediakan shard baru untuk penyewa baru, atau data yang di-shard setiap bulan mungkin memerlukan shard baru yang disediakan sebelum awal setiap bulan.

Jika rentang baru nilai kunci belum menjadi bagian dari pemetaan yang ada dan tidak ada pergerakan data yang diperlukan, mudah untuk menambahkan shard baru dan mengaitkan kunci atau rentang baru ke shard tersebut. Untuk detail tentang menambahkan shard baru, lihat Menambahkan shard baru.

Namun, untuk skenario yang memerlukan pergerakan data, alat pisah-gabung diperlukan untuk mengatur pergerakan data antara shard yang dikombinasi dengan pembaruan peta shard yang diperlukan. Untuk detail tentang menggunakan alat pisah-gabung, lihat Gambaran umum pisah-gabung

Sumber daya tambahan

Belum menggunakan alat database elastis? Lihat Panduan Memulai kami. Jika memiliki pertanyaan, hubungi kami di halaman pertanyaan Tanya Jawab Microsoft untuk SQL Database dan untuk permintaan fitur, tambahkan ide-ide baru atau ambil suara terbanyak untuk ide yang sudah ada di forum umpan balik SQL Database.