All Products
Search
Document Center

Data Management:Konfigurasikan algoritma perutean

Last Updated:Aug 29, 2026

Algoritma perutean memungkinkan kueri yang membawa bidang routing dari sebuah database logis untuk langsung menemukan shard tabel target tanpa perlu menghitung rute secara manual. Topik ini mencakup format ekspresi, prosedur konfigurasi, contoh ekspresi routing, serta fungsi bawaan yang dapat Anda panggil dalam suatu ekspresi.

Mengapa menggunakan algoritma perutean

Algoritma perutean mengurangi beban overhead perutean. Setelah Anda mengonfigurasi algoritma perutean untuk sebuah tabel logis, kueri yang membawa bidang routing dapat dengan cepat menemukan shard tabel yang dituju, sehingga Anda tidak perlu lagi menghitung rute secara manual atau berpindah antar database dan tabel fisik.

Untuk informasi lebih lanjut tentang algoritma perutean, lihat routing algorithm.

Kasus penggunaan

  • Kueri data dari shard tabel tertentu.

  • Ubah data di shard tabel tertentu.

  • Ekspor data dari shard tabel tertentu.

Prasyarat

  • Konfigurasikan tabel logis dalam database logis. Untuk petunjuknya, lihat logical table.

Konfigurasikan algoritma perutean modulo simple

Prosedur berikut mengonfigurasi algoritma perutean yang menggunakan operasi modulo simple. Sebelum memilih operasi modulo, perhatikan tipe bidang yang didukung oleh masing-masing operasi:

  • Simple Modulo Operation — Hanya mendukung bidang bertipe numerik.

  • Modular hashing — Mendukung bidang bertipe numerik atau string.

  1. Buka halaman Global Search dan klik Query di sebelah kanan database logis target untuk membuka halaman SQL Console.

    Catatan

    Anda juga dapat memilih SQL Console > SQL Console dari bilah menu atas.

  2. Di pojok kanan atas halaman, klik ikon Icon that opens the table list untuk membuka halaman daftar tabel.

  3. Pada baris yang berisi tabel logis target, klik Configure Algorithm.

  4. Di halaman daftar algoritma, klik Create.

  5. Konfigurasikan Algorithm Type, Modulo Operation, Table Partitioning Field, dan Modulus.

    Dalam contoh ini, atur Algorithm Type menjadi Modulo Operation on One Column, Modulo Operation menjadi Simple Modulo Operation, Table Partitioning Field menjadi id, dan Modulus menjadi 4. Ekspresinya adalah #id#%4.

  6. Klik Save.

  7. Lakukan kueri data tabel atau jalankan pernyataan INSERT pada tabel logis untuk memverifikasi hasil perutean. Sistem akan menghitung hasil perutean dan memasukkan data ke shard tabel yang memiliki indeks yang sesuai.

    Sebagai contoh, jika Anda memasukkan baris data dengan ID 9, hasil perutean yang dihitung adalah 1, dan data dimasukkan ke shard tabel logic_table_01.

Format ekspresi

Algoritma perutean sharding tabel di DMS didefinisikan oleh ekspresi Groovy, mirip dengan algoritma perutean yang dikonfigurasi dalam kode aplikasi. Suatu ekspresi mereferensikan bidang routing dalam format # + bidang routing + #, misalnya #shardKey#. Bidang routing tersebut adalah bidang yang Anda pilih sebagai Table Partitioning Field.

Contoh ekspresi routing

Dalam ekspresi berikut, user_id adalah contoh bidang tabel. Contoh-contoh ini dikelompokkan berdasarkan apa yang ditentukan oleh ekspresi tersebut: hanya shard tabel, baik shard database maupun shard tabel, atau target yang diturunkan dari tanggal, digit dalam string, atau fungsi kustom.

  • Routing berdasarkan aturan tabel

    • Operasi modulo simple

      • Modulo pada angka: #user_id#%100

      • Modulo berantai: #user_id#%10000%100

      • Modulo pada hash Java dari angka: Math.abs(#user_id#.hashCode())%100

    • Penghashan modular pada string

      • Hash dari string numerik: Math.abs(#user_id#.toString().hashCode())%100

      • Hash dari string: Math.abs(#user_id#.hashCode())%100

      • CobarHash: Math.abs(cobarHash(#column#,start, end)).intdiv(8)

      • CobarOldHash: Math.abs(cobarOldHash(#column#, len)).intdiv(8)

  • Routing berdasarkan aturan database

    • Aturan nama database dan tabel yang sama: 'schema_prefix_'+(#user_id#%10)+'.table_name'

    • Nama database dan nama tabel

      • 'schema_prefix_'+(#user_id#%100)+'.table_name_prefix_'+(#user_id#%1000)

      • Set shard tabel yang sama di setiap shard database: 'schema_prefix_'+lastSwapZero(String.valueOf((#user_id#%1024).intdiv(128)),4)+'.table_name_prefix_'+lastSwapZero(String.valueOf((#user_id#%128)),4)

      • Rute ke shard database dengan membagi dua digit ke-16 dan ke-17 dari string, dan rute ke shard tabel menggunakan digit ke-16 dan ke-17 dari string: 'schema_prefix_'+substring(#EXTEND_ID#,16,18).toLong().intdiv(2)+'.table_name_prefix_'+substring(#EXTEND_ID#,16,18)

  • Routing berdasarkan tanggal

    Rute ke tabel yang sama pada hari yang sama setiap bulan: dayOfMonth(#time#)

  • Routing berdasarkan digit ketiga dari belakang sebuah string

    Nama tabel bertambah dengan kelipatan 10, sehingga digit yang diekstraksi dikalikan dengan 10. Jika penambahan bernilai 1, tidak diperlukan perkalian: Integer.valueOf(substring(#ip_id#,-3,-2))*10

  • Routing kompleks lainnya

    Gunakan fungsi kustom:

    String func(String arg){ return arg.hashCode()%10;}
    'table_name_'+func(#user_id#)+'_other_'+func(#user_id#)
    • Tambahkan jeda baris antara fungsi dan ekspresi.

    • DMS mendukung routing menggunakan fungsi CRC32(java.util.zip.CRC32).

Fungsi bawaan untuk ekspresi routing

Anda dapat langsung memanggil fungsi bawaan berikut dalam ekspresi routing.

  • cobarOldHash — Algoritma CobarHash lawas.

    public static long cobarOldHash(String s, int len) {
      long h = 0;
      int sLen = s.length();
      for (int i = 0; (i < len && i < sLen); i++) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • cobarHash — Algoritma cobarHash baru.

    public static long cobarHash(String s, int start, int end) {
      if (start < 0) {
          start = 0;
      }
      if (end > s.length()) {
          end = s.length();
      }
      long h = 0;
      for (int i = start; i < end; ++i) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • weekOfYear — Mengembalikan minggu ke dalam tahun.

    public static int weekOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getWeekOfYear(date);
      }
      return 0;
    }
  • dayOfYear — Mengembalikan hari ke dalam tahun.

    public static int dayOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getDayOfYear(date);
      }
      return 0;
    }
  • dayOfMonth — Mengembalikan hari ke dalam bulan.

    public static int dayOfMonth(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          return DateTimeUtils.getDayOfMonth(date);
      }
      return 0;
    }
  • dayOfWeek — Mengembalikan hari dalam seminggu.

    public static int dayOfWeek(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          int dayOfWeek = DateTimeUtils.getDayOfWeek(date);
          if (dayOfWeek==1){
              dayOfWeek=7;
          }else {
              dayOfWeek=dayOfWeek-1;
          }
          return dayOfWeek;
      }
      return 0;
    }
  • substring — Mengekstraksi substring. Posisi awal dan akhir mendukung nilai negatif, yang menghitung mundur dari akhir string.

    public static String substring(String value, int start, int end) {
      return StringUtils.substring(value, start, end);
    }
    public static String substring(String value, int start) {
      return StringUtils.substring(value, start);
    }
  • last4swap — Mengembalikan empat karakter terakhir dari sebuah string. Jika panjang string kurang dari empat karakter, nol ditambahkan di sebelah kiri. Empat karakter terakhir kemudian ditukar berpasangan.

    public static String last4swap(String value) {
      if(value.length() < 4) {
          value = StringUtils.leftPad(value, 4, '0');
      }
      return StringUtils.substring(value, -2)+StringUtils.substring(value, -4, -2);
    }
  • lastSwapZero — Mengembalikan string dengan panjang minimum yang ditentukan. Jika panjang string lebih pendek dari panjang yang ditentukan, nol ditambahkan di depan digit.

    public static String lastSwapZero(String value, int length) {
      if (value.length() < length) {
          return StringUtils.leftPad(value, length, '0');
      }
      return value;
    }