Hologres'te Tablo Gruplarını ve parça sayılarını yapılandırarak iş yükleri arasında sorgu performansını, yazma aktarım hızını ve depolama verimliliğini dengeleyin.
Tablo Gruplarını nasıl oluşturacağınızı, sorgulayacağınızı, değiştireceğinizi ve sileceğinizi öğrenin; ayrıca iş yükünüz değiştiğinde tabloları yeniden parçalayın.
Tablo Grupları ve parçaların çalışma şekli
Bir Hologres örneği verileri iki seviyeli bir hiyerarşide düzenler:
Tablo Grubu -- Bir veya daha fazla tabloyu barındıran mantıksal bir konteyner. Aynı Tablo Grubundaki tüm tablolar aynı parça sayısını paylaşır.
Parça -- Veri dağıtım birimi. Parçalar, paralel işlemeye olanak tanımak için Çalışanlar (hesaplama düğümleri) arasında yayılır.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Her veritabanının, parça sayısı örnek teknik özellikleriyle eşleşen varsayılan bir Tablo Grubu vardır. Varsayılan ayar, çoğu iş yükü için yeterlidir.
Yapılandırma önerileri
Aşağıdaki yönergeleri izleyin:
İş yükünüz farklı bir parça sayısı gerektirmiyorsa varsayılan Tablo Grubunu kullanın. Örnek boyutuna göre varsayılan parça sayıları Örnek yönetimi bölümünde listelenmiştir.
-
Büyük örnekler (> 256 CU): Yük dengeleme için birden fazla Tablo Grubu düşünün:
Büyük veri hacimleri -- daha yüksek bir parça sayısıyla ayrı bir Tablo Grubu oluşturun.
Çok sayıda küçük tablo -- sorgu başlatma ek yükünü azaltmak için daha düşük bir parça sayısıyla ayrı bir Tablo Grubu oluşturun.
Birleştirilen tablolar aynı Tablo Grubunu paylaşmalıdır.
Tablo başına bir Tablo Grubu oluşturmayın. Bu durum gereksiz ek yük ve parçalanmaya neden olur.
Parça sayısını Çalışanlarla hizalayın. Dengeli kaynak kullanımı ve daha kolay yatay ölçeklendirme için parça sayısını Çalışan sayısının katı olarak ayarlayın.
Mevcut bir Tablo Grubunun parça sayısı değiştirilemez. Parça sayısını değiştirmek için yeni bir Tablo Grubu oluşturun ve tablolarınızı bu gruba yeniden parçalayın.
Parça sayısı sınırları
Hologres V2.0'dan itibaren, aşırı parça sayısından kaynaklanan tahsis hatalarını önlemek için varsayılan üst sınırlar uygulanır. Üst sınırın aşılması too many shards in this instance hatası döndürür.
Üst sınırlar aşağıdaki formüllere göre belirlenir:
Tablo Grubu başına maksimum parça sayısı = Varsayılan parça sayısı x 2
Örnek başına toplam maksimum parça sayısı = Varsayılan parça sayısı x 8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bu üst sınırları devre dışı bırakmak için (önerilmez -- kaynak tahsis hatalarına neden olabilir):
SET hg_experimental_enable_shard_count_cap = off;
İzinler
Yalnızca süper kullanıcı Tablo Grubu oluşturabilir, değiştirebilir veya silebilir; ayrıca bir tabloyu farklı bir Tablo Grubuna taşıyabilir (yeniden parçalama).
Bir kullanıcıya süper kullanıcı ayrıcalıkları vermek için:
-- Replace <Alibaba Cloud account ID> with the user's UID.
-- For a RAM user, add the prefix "p4_" to the account ID.
ALTER USER "<Alibaba Cloud account ID>" SUPERUSER;
Yeni bir tabloyu bir Tablo Grubuna atamak için yalnızca tablo oluşturma izinleri gerekir.
Tablo Grubu meta verilerini sorgulayın
Varsayılan Tablo Grubunu görüntüleyin
SELECT * FROM hologres.hg_table_group_properties
WHERE tablegroup_name IN (
SELECT tablegroup_name FROM hologres.hg_table_group_properties
WHERE property_key = 'is_default_tg' AND property_value = '1'
);
Örnek çıktı:
tablegroup_name | property_key | property_value
-----------------+------------------+----------------
test_tg_default | tg_version | 1
test_tg_default | table_num | 1
test_tg_default | is_default_tg | 1
test_tg_default | shard_count | 3
test_tg_default | replica_count | 1
test_tg_default | created_manually | 0
(6 rows)
Çıktıda, is_default_tg varsayılan Tablo Grubunu tanımlar ve shard_count parça sayısını gösterir.
Tüm Tablo Gruplarını listeleyin
SELECT tablegroup_name
FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;
Bir Tablo Grubunun parça sayısını görüntüleyin
SELECT property_value AS shard_count
FROM hologres.hg_table_group_properties
WHERE property_key = 'shard_count' AND tablegroup_name = '<tg_name>';
Bir Tablo Grubundaki tabloları listeleyin
SELECT table_namespace AS schema_name, table_name
FROM hologres.hg_table_properties
WHERE property_key = 'table_group' AND property_value = '<tg_name>';
Bir tablo için Tablo Grubunu bulun
SELECT property_value AS table_group_name
FROM hologres.hg_table_properties
WHERE property_key = 'table_group' AND table_name = '<table_name>';
Tablo Grubu oluşturun
CALL HG_CREATE_TABLE_GROUP('<new_tg_name>', <shard_count>);
|
|
|
|
|
|
|
|
|
|
|
|
Örnek:
-- Create a Table Group named tg_8 with 8 shards.
CALL HG_CREATE_TABLE_GROUP('tg_8', 8);
Mevcut tablolar orijinal Tablo Gruplarında kalır.
Orijinal Tablo Grubu, içindeki tüm tablolar ve veriler taşındıktan veya silindikten sonra geçersiz hale gelir.
Varsayılan Tablo Grubunu değiştirin
Yeni tabloların otomatik olarak atanması için farklı bir varsayılan Tablo Grubu ayarlayın.
Hologres V0.9 veya sonraki bir sürüm gerektirir. Örneğiniz daha eski bir sürümdeyse, önce yükseltin.
CALL HG_UPDATE_DATABASE_PROPERTY('default_table_group', '<tg_name>');
|
|
|
|
|
|
|
|
Örnek:
-- Set tg_8 as the default Table Group.
CALL HG_UPDATE_DATABASE_PROPERTY('default_table_group', 'tg_8');
Yeni bir tabloyu belirli bir Tablo Grubuna atayın
CREATE TABLE ve SET_TABLE_PROPERTY çağrılarını bir işlem içinde sarın:
BEGIN;
CREATE TABLE <table_name> (
col1 text,
...
);
CALL SET_TABLE_PROPERTY('<table_name>', 'table_group', '<tg_name>');
COMMIT;
|
|
|
|
|
|
|
|
|
|
|
|
Örnek:
-- Create table tbl1 and assign it to Table Group tg_8.
BEGIN;
CREATE TABLE tbl1 (
col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;
Tabloyu yeniden parçalayın
Bir örneği yukarı ölçeklendirmek, mevcut veritabanları için parça sayısını ayarlamaz. Eklenen kapasiteyi kullanmak için daha yüksek bir parça sayısına sahip yeni bir Tablo Grubu oluşturun ve tablolarınızı bu gruba taşıyın. Ölçeklendirmeden sonra oluşturulan yeni veritabanları güncellenmiş varsayılanı kullanır. Örnek teknik özelliklerine genel bakış.
Üç yöntem kullanılabilir:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Liquid Table ile yeniden parçalama
Hologres V4.2'den itibaren, bir Liquid Table dinamik olarak Tablo Grupları arasında taşınabilir. Değişiklik, okuma veya yazmayı kesintiye uğratmadan hemen etkili olur. Liquid Table.
REBUILD ile yeniden parçalama
Hologres V3.1'den itibaren, REBUILD komutu tabloları Tablo Grupları arasında eşzamansız olarak taşır ve gerçek zamanlı ilerleme izlemeye olanak tanır. REBUILD (Beta).
Saklı yordamla yeniden parçalama
Hologres V0.10'dan itibaren, yerleşik bir saklı yordam tabloyu yeniden oluşturmadan veya verileri yeniden içe aktarmadan yeni bir Tablo Grubuna taşır.
Sınırlamalar
Hologres V0.10 veya sonraki bir sürüm gerektirir. Sürümünüzü Instance Details sayfasında kontrol edin. Daha eski bir sürüm kullanıyorsanız, örneğinizi yükseltin veya çevrimiçi destek alın.
Yeniden parçalama sırasında tüm yazma işlemlerini durdurun. Okuma işlemleri etkilenmez. V1.1'den itibaren, gerçek zamanlı yazma görevlerinin otomatik yük devretmesi için
set table readonlykullanın.Yeniden parçalama CPU tüketir ve depolamayı geçici olarak artırır. Yoğun olmayan saatlerde çalıştırın.
Yeniden parçalamadan önce tablo ikili günlüğünü devre dışı bırakın ve işlem bittikten sonra yeniden etkinleştirin. Hologres ikili günlüklerine abone olun.
SERIALalanları içeren tablolar yeniden parçalanamaz.DEFAULTdeğerleri içeren tablolar, yeniden parçalamadan sonraDEFAULTniteliğini kaybeder.Tablo, görünümler gibi diğer nesnelere bağımlı olmamalıdır. Yeniden parçalamadan önce bağımlılıkları silin; aksi takdirde Hologres şu hatayı döndürür:
"ERROR: resharding table xxx can not executed because other objects depend on it.". Görünüm bağımlılıklarını atlamak içinset hg_experimental_hg_insert_overwrite_enable_view=on;ayarlayın.Yeniden parçalama yalnızca Basit İzin Modeli (SPM) için geçerlidir. Hologres izin modeli.
Yeniden parçalama, otomatik bölümlendirme özelliklerini korumaz.
Hologres V2.0'dan itibaren, sütun açıklamaları yeniden parçalama sırasında korunur. Daha eski sürümlerde, sütun açıklamalarını manuel olarak yedekleyin ve geri yükleyin.
Söz dizimi
V2.0.24 ve sonraki sürümler için: Grafik arayüz üzerinden yeniden parçalama yapmak için HoloWeb'i kullanın. Tablo yeniden parçalama.
Daha eski sürümler için: Aşağıdaki SQL komutlarını çalıştırın.
-- For V1.1 and later:
CALL HG_MOVE_TABLE_TO_TABLE_GROUP('<table_name>', '<new_table_group_name>');
-- For V0.10 and later:
CALL HG_UPDATE_TABLE_SHARD_COUNT('<table_name>', '<new_table_group_name>');
|
|
|
|
|
|
|
|
|
|
|
|
Tabloları taşımadan önce yeni Tablo Grubunu oluşturun. Tablo Grubu oluşturun.
Yeniden parçalama sırasında tablodaki tüm yazma işlemlerini durdurun. Okuma işlemleri etkilenmez.
Tüm tablolar bir Tablo Grubundan taşındıktan sonra, artık gerekmiyorsa boş Tablo Grubunu
HG_DROP_TABLE_GROUPkullanarak manuel olarak silin.Bölümlenmiş bir tablo için yalnızca üst tablo üzerinde işlem yapın.
Sanal ambar örneğinde, taşıma işlemini hedef Tablo Grubunun lider Sanal Ambarı tarafından çalıştırılması gerekir; ayrıca kaynak Tablo Grubuna takipçi olarak erişebilmesi gerekir. Verilere erişmek için bir hesaplama grubunu yetkilendirin.
Yeniden parçalama istisnalarını yönetin
Yeniden parçalama, OOM hataları veya manuel sonlandırma nedeniyle kesintiye uğrayabilir. Kesintiye uğrarsa, orijinal tablo salt okunur hale gelir ve <initial_table_name>_xxxxxxxx adında geçici bir tablo görünür.
V2.0.24 veya sonraki sürümlerdeki örnekler için:
HoloWeb: Kullanıcı arayüzünden yeniden parçalamaya devam edin veya iptal edin. Tablo yeniden parçalama.
SQL: Aşağıdaki adımları izleyin.
Daha eski sürümlerdeki örnekler için: Önce V2.0.24 veya sonraki bir sürüme yükseltin.
Yeniden parçalamaya devam etmek için, kök nedeni çözün ve HG_MOVE_TABLE_TO_TABLE_GROUP komutunu tekrar çalıştırın.
Yeniden parçalamayı iptal etmek ve orijinal durumu geri yüklemek için, bu komutları sırayla çalıştırın:
-- 1. Remove the read-only flag from the original table.
CALL set_table_property('<schema_name>.<table_name>', 'readonly', 'false');
-- 2. Find the temporary table name.
-- For a partitioned table:
SELECT schema_name, target_temp_table_name
FROM hologres.hg_resharding_properties
WHERE reshard_table_name = '<schema_name>.<table_name>' AND is_parent_table IS TRUE;
-- For a non-partitioned table:
SELECT schema_name, target_temp_table_name
FROM hologres.hg_resharding_properties
WHERE reshard_table_name = '<schema_name>.<table_name>'
AND is_parent_table IS FALSE AND is_sub_table IS FALSE;
-- 3. Drop the temporary table.
DROP TABLE IF EXISTS <schema_name>.<target_temp_table_name>;
-- 4. Clear the resharding progress record.
CALL hologres.hg_internal_clear_resharding_properties('<schema_name>.<table_name>');
Tablo Grubunu silin
Önce Tablo Grubundaki tüm tabloları kaldırın, ardından şunu çalıştırın:
CALL HG_DROP_TABLE_GROUP('<tg_name>');
Örnek:
CALL HG_DROP_TABLE_GROUP('tg_8');
Parça-Çalışan dağıtımını kontrol edin
Parçaların Çalışanlar arasında dengesiz dağıtılması, yük dengesizliğine ve kaynakların verimsiz kullanımına neden olur.
Hologres V1.3'ten itibaren, parça-Çalışan eşlemesini kontrol etmek için worker_info sistem görünümünü kullanın. Temel kavramlar parça-düğüm ilişkisini kapsar. Çalışanlar arasındaki parça tahsisini sorgulayın sorgu söz dizimini sağlar.
En iyi uygulamalar
Varsayılan Tablo Grubu çoğu iş yükü için uygundur. Özel yapılandırmalar Tablo gruplarını ayarlama için en iyi uygulamalar bölümünde ele alınmıştır.
SSS
"internal error: Get rundown is not allowed in recovering state" hatası ne anlama gelir?
Bu hata, tablonun salt okunur olduğunu ve INSERT, UPDATE ve DELETE işlemlerini engellediğini gösterir. Hologres, veri tutarsızlığını önlemek için yeniden parçalama kesintiye uğradığında bu durumu ayarlar.
Sorunu çözmek için:
-
Tüm salt okunur tabloları bulun:
SELECT * FROM hologres.hg_table_properties WHERE property_key = 'readonly' AND property_value = 'true'; -
Salt okunur bayrağını kaldırın.
<table_name>yerine tam nitelikli tablo adını girin (örneğin,public.my_table).CALL set_table_property('<table_name>', 'readonly', 'false');