Shuffle join ve broadcast join gibi standart dağıtılmış birleştirme (join) stratejileri, birleştirme işleminden önce verileri backend (BE) düğümleri arasında taşır; bu durum veri hacmiyle orantılı gecikme süresine yol açar. Colocation join, aynı Colocation Group (CG) içindeki tabloların eşleşen paketlerini her zaman aynı BE düğümünde saklayarak bu ağ aktarımını ortadan kaldırır. Böylece paket sütunları üzerinden yapılan birleştirmeler tamamen yerel olarak gerçekleşir.
Bir tablonun colocation özelliği, kümeler arası çoğaltma (CCR) tarafından senkronize edilemez. Bir tabloda is_being_synced = true değeri varsa colocation özelliği kaldırılır.
Nasıl çalışır
ApsaraDB for SelectDB, birlikte konumlandırılan tabloları bir Colocation Group (CG) içinde gruplar. Aynı CG içindeki tüm tablolar aynı Colocation Group Schema (CGS) yapısını paylaşmalıdır. Bu koşullar sağlandığında bir paket sıralaması, her paket indeksini tüm CG tablolarında aynı BE düğümüne eşit şekilde map eder. Aynı paket sütunu değerlerine sahip satırlar her zaman aynı BE düğümüne yazıldığından yerel birleştirmeler mümkün hale gelir.
Örnek: 4 BE düğümüne (A, B, C, D) eşlenen 8 paket
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| A | | B | | C | | D | | A | | B | | C | | D |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
CGS gereksinimleri — bir CG içindeki tüm tablolarda eşleşmesi gerekenler:
| Gereksinim | Ayrıntılar |
|---|---|
| Paket sütunu türleri | Her paket sütununun veri türü aynı olmalıdır |
| Paket sütunu sayısı | DISTRIBUTED BY HASH(...) yan tümcesi aynı sayıda sütun içermelidir |
| Paket sayısı | BUCKETS değeri aynı olmalıdır |
Eşleşmesi gerekmeyenler:
Bölüm sayısı
Bölüm kapsamı veya aralığı
Bölüm sütunu türleri
Tek bölümlü bir tabloda her paket tek bir tablet içerir. Çok bölmeli bir tabloda ise her paket bölüm başına bir tane olmak üzere birden çok tablet içerir.
Temel kavramlar
Colocation Group (CG): Aynı CGS ve paket dağıtımını paylaşan bir veya daha fazla tablodan oluşan adlandırılmış grup. Bir CG tek bir veritabanına aittir; adı o veritabanı içinde benzersizdir. SelectDB, CG'yi dahili olarak
dbId_groupNamebiçiminde saklar ancak siz yalnızca grup adını kullanarak etkileşime girersiniz.Colocation Group Schema (CGS): Bir CG içindeki tüm tabloların paylaştığı şema kısıtlamaları: paket sütunu türleri, paket sütunu sayısı ve paket sayısı.
Stable/Unstable: Tüm tabletleri tam olarak çoğaltıldığında ve herhangi bir geçiş işlemi devam etmediğinde bir CG Stable durumundadır. Bir CG Unstable olduğunda (örneğin çoğaltma onarımı veya yeniden dengeleme sırasında) colocation join geçici olarak normal bir birleştirmeye düşer; bu durum sorgu performansını belirgin şekilde azaltabilir.
Colocation tablosu oluşturma
Tablo oluştururken PROPERTIES yan tümcesine "colocate_with" = "group_name" ekleyin:
CREATE TABLE tbl (k1 int, v1 int sum)
DISTRIBUTED BY HASH(k1)
BUCKETS 8
PROPERTIES(
"colocate_with" = "group1"
);
CG yoksa SelectDB bu tabloyu ilk üye olarak otomatik şekilde oluşturur.
CG zaten mevcutsa SelectDB tablonun CGS'i karşılayıp karşılamadığını denetler. Karşılanıyorsa tablo eklenir ve tabletleri mevcut paket dağıtımına göre oluşturulur.
Veritabanları arası colocation grupları
Tabloları veritabanları arasında birlikte konumlandırmak için grup adının önüne __global__ önekini ekleyin:
CREATE TABLE tbl (k1 int, v1 int sum)
DISTRIBUTED BY HASH(k1)
BUCKETS 8
PROPERTIES(
"colocate_with" = "__global__group1"
);
Global bir CG herhangi bir veritabanına ait değildir ve adı küme genelinde benzersizdir.
Colocation join'in etkin olduğunu doğrulama
Colocation tablolarını diğer tabloları sorguladığınız gibi sorgulayın. Koşullar sağlandığında SelectDB colocation join kullanan bir sorgu planını otomatik olarak oluşturur.
Doğrulamak için bir birleştirme sorgusunda DESC (veya EXPLAIN) çalıştırın ve çıktıyı inceleyin:
-- Create tbl1 and tbl2 in the same CG, then run:
DESC SELECT * FROM tbl1 INNER JOIN tbl2 ON (tbl1.k2 = tbl2.k2);
Colocation join etkin — HASH JOIN düğümü colocate: true gösterir:
| 2:HASH JOIN |
| | join op: INNER JOIN |
| | colocate: true |
| | `tbl1`.`k2` = `tbl2`.`k2` |
Colocation join etkin değil — HASH JOIN düğümü bir gerekçeyle colocate: false gösterir ve bir EXCHANGE düğümü görünür:
| 2:HASH JOIN |
| | join op: INNER JOIN (BROADCAST) |
| | colocate: false, reason: group is not stable |
| | `tbl1`.`k2` = `tbl2`.`k2` |
...
| 3:EXCHANGE |
colocate: false değerinin en yaygın nedeni CG'nin Unstable olmasıdır; bu durum çoğaltma onarımı veya yeniden dengelemenin devam ettiğini gösterir.
Colocation gruplarını yönetme
CG bilgilerini görüntüleme
Kümedeki tüm CG'leri listelemek için aşağıdaki komutu çalıştırın (admin rolü gerekir):
SHOW PROC '/colocation_group';
Örnek çıktı:
+-------------+--------------+--------------+------------+----------------+----------+----------+
| GroupId | GroupName | TableIds | BucketsNum | ReplicationNum | DistCols | IsStable |
+-------------+--------------+--------------+------------+----------------+----------+----------+
| 10005.10008 | 10005_group1 | 10007, 10040 | 10 | 3 | int(11) | true |
+-------------+--------------+--------------+------------+----------------+----------+----------+
| Alan | Açıklama |
|---|---|
| GroupId | dbId.grpId biçiminde küme genelinde benzersiz tanımlayıcı |
| GroupName | CG'nin tam adı |
| TableIds | CG içindeki tabloların ID'leri |
| BucketsNum | Paket sayısı |
| ReplicationNum | Çoğaltma sayısı |
| DistCols | Paket sütunu türleri |
| IsStable | CG Stable ise ve colocation join kullanılabilir ise true |
Belirli bir CG için paket-BE eşlemesini incelemek için:
SHOW PROC '/colocation_group/10005.10008';
Örnek çıktı:
+-------------+------------+
| BucketIndex | BackendIds |
+-------------+------------+
| 0 | 10004 |
| 1 | 10003 |
| 2 | 10002 |
| 3 | 10003 |
| 4 | 10002 |
| 5 | 10003 |
| 6 | 10003 |
| 7 | 10003 |
+-------------+------------+
SHOW PROC komutlarını çalıştırmak için admin rolü gereklidir. Normal kullanıcılar bu komutları çalıştıramaz.
Tablonun colocation özelliğini değiştirme
Bir tabloyu farklı bir CG'ye taşımak için:
ALTER TABLE tbl SET ("colocate_with" = "group2");
Tablo henüz herhangi bir CG'de değilse SelectDB şemayı denetler ve tabloyu belirtilen CG'ye ekler (gerekirse CG'yi oluşturur).
Tablo zaten bir CG'deyse SelectDB tabloyu mevcut CG'den kaldırır ve belirtilen CG'ye ekler (gerekirse CG'yi oluşturur).
Bir tablodan colocation özelliğini kaldırmak için:
ALTER TABLE tbl SET ("colocate_with" = "");
Colocation tablosu silme
DROP TABLE çalıştırdığınızda tablo geri dönüşüm kutusuna taşınır ve kalıcı olarak silinmeden önce bir gün boyunca orada kalır. Bir CG içindeki son tablo kalıcı olarak silindikten sonra CG otomatik olarak kaldırılır.
Şema değişikliklerine ilişkin kısıtlamalar
Bir colocation tablosuna bölüm eklerken (ADD PARTITION) veya çoğaltma sayısını değiştirirken SelectDB değişikliği CGS'e göre doğrular. Değişiklik CGS kısıtlamalarını ihlal ederse SelectDB değişikliği reddeder.
Gelişmiş yapılandırma
FE yapılandırma öğeleri
Aşağıdaki frontend (FE) yapılandırma öğeleri colocation join davranışını kontrol eder. disable_colocate_relocate ve disable_colocate_balance değerlerini ADMIN SET CONFIG kullanarak dinamik şekilde değiştirebilirsiniz. Mevcut değerleri görüntülemek veya yapılandırma söz dizimi hakkında bilgi edinmek için HELP ADMIN SHOW CONFIG; ve HELP ADMIN SET CONFIG; çalıştırın.
| Yapılandırma öğesi | Varsayılan | Açıklama |
|---|---|---|
disable_colocate_relocate |
false |
Otomatik colocation çoğaltma onarımını devre dışı bırakır. Yalnızca colocation tablolarını etkiler. |
disable_colocate_balance |
false |
Otomatik colocation çoğaltma yeniden dengelemesini devre dışı bırakır. Yalnızca colocation tablolarını etkiler. |
disable_colocate_join |
false |
Colocation join özelliğini tamamen devre dışı bırakır. |
use_new_tablet_scheduler |
true |
Yeni çoğaltma zamanlama mantığını etkinleştirir. |
HTTP RESTful API
SelectDB, CG'leri görüntülemek ve yönetmek için HTTP RESTful API uç noktalarını sunar. Tüm uç noktalar FE düğümleri tarafından fe_host:fe_http_port adresinde sunulur ve admin rolü gerektirir.
Tüm colocation bilgilerini görüntüleme:
GET /api/colocate
Colocation bilgilerini JSON biçiminde döndürür:
{
"msg": "success",
"code": 0,
"data": {
"infos": [
["10003.12002", "10003_group1", "10037, 10043", "1", "1", "int(11)", "true"]
],
"unstableGroupIds": [],
"allGroupIds": [{"dbId": 10003, "grpId": 12002}]
},
"count": 0
}
Bir CG'yi Stable olarak işaretleme:
DELETE /api/colocate/group_stable?db_id=10005&group_id=10008
Return value: 200
Bir CG'yi Unstable olarak işaretleme:
POST /api/colocate/group_stable?db_id=10005&group_id=10008
Return value: 200
Paket dağıtımını manuel yapılandırma:
POST /api/colocate/bucketseq?db_id=10005&group_id=10008
Body:
[[10004],[10003],[10002],[10003],[10002],[10003],[10003],[10003],[10003],[10002]]
Return value: 200
İstek gövdesi, her elemanın o paket indeksi için BE düğüm ID'lerini listelediği iç içe geçmiş bir dizidir.
bucketseq uç noktasını çağırmadan önce disable_colocate_relocate ve disable_colocate_balance değerlerinin ikisini de true olarak ayarlayın. Aksi takdirde sistemin otomatik onarım ve yeniden dengeleme işlemleri manuel yapılandırmanızı geçersiz kılar.
Çoğaltma dengeleme ve onarım
Çoğaltma onarımı nasıl çalışır
Colocation çoğaltmaları belirli BE düğümlerine sabitlenir. Bir BE düğümü çöker veya hizmet dışı bırakılırsa SelectDB yedek olarak en az yükte olan uygun BE düğümünü seçer ve etkilenen tüm tabletleri onarmaya başlar. Bu geçiş sırasında CG Unstable olarak işaretlenir.
Çoğaltma yeniden dengeleme nasıl çalışır
Normal tablolar için SelectDB çoğaltmaları tek tek dengeler; her çoğaltma için bağımsız şekilde uygun bir BE bulur. Colocation tablolarında ise çoğaltmalar paket düzeyinde dengelenir: birlikte konumlandırma garantisi korunması için bir paketteki tüm çoğaltmalar birlikte taşınır.
Dengeleme algoritması paket sıralamasını gerçek veri boyutuna göre değil çoğaltma sayısına göre BE düğümlerine dağıtır.
Geçerli dengeleme algoritması, BE düğümlerinin farklı disk kapasitelerine, disk sayılarına veya disk türlerine (SSD ile HDD) sahip olduğu heterojen dağıtımlarda yükü eşit şekilde dağıtmayabilir. Bu tür ortamlarda küçük kapasiteli ve büyük kapasiteli düğümler aynı sayıda çoğaltma tutabilir.
Bir CG Unstable hale gelirse ve otomatik yeniden dengelemenin sorguları tekrar tekrar bozmasını önlemek isterseniz disable_colocate_balance değerini true olarak ayarlayın. Yeniden dengelemeye izin vermeye hazır olduğunuzda değeri tekrar false olarak ayarlayın.