Hologres propose une fonctionnalité de journalisation binaire (binlog) pour capturer les événements de base de données. Exploitez ces événements pour la réplication des données, la synchronisation ou comme flux de messages destiné aux consommateurs en aval. La consommation des journaux binaires de Hologres améliore la réutilisation des données et réduit la latence du traitement de bout en bout. Cette rubrique explique comment s'abonner aux journaux binaires de Hologres et réaliser les opérations associées.
Journaux binaires
À l'instar des bases de données traditionnelles telles que MySQL, Hologres prend en charge les journaux binaires pour enregistrer tous les événements de modification des données. Les journaux binaires de Hologres permettent de mettre en œuvre la réplication et la synchronisation des données. Toutefois, ils sont généralement réservés à la synchronisation, contrairement aux journaux binaires des bases de données classiques qui servent également à des scénarios de haute disponibilité, tels que la synchronisation entre instances primaire et réplique ou la récupération des données. Leurs implémentations diffèrent donc sur plusieurs aspects clés :
Les journaux binaires de Hologres n'enregistrent pas les opérations DDL.
La configuration des journaux binaires est flexible et spécifique à chaque table. Activez-les ou désactivez-les au cas par cas et définissez un délai de conservation (TTL) distinct pour chaque table.
En tant qu'entrepôt de données en temps réel distribué, Hologres utilise un système de journaux binaires distribué.
L'interrogation des journaux binaires de Hologres est simple.
Dans les scénarios Big Data, Flink peut consommer directement les journaux binaires de Hologres. Comparée à l'architecture traditionnelle en couches d'entrepôt de données, la combinaison de Flink et des journaux binaires de Hologres permet de mettre en place une architecture entièrement pilotée par les événements. Cette approche assure un traitement en temps réel depuis le magasin de données opérationnelles (ODS) vers la couche de détail des données (DWD), puis de la couche DWD vers la couche de services de données (DWS). Elle favorise la gouvernance des données grâce à cette structuration en couches tout en unifiant le stockage, en améliorant la réutilisation des données et en réduisant la latence de traitement de bout en bout. Il s'agit d'une solution complète d'entrepôt de données en temps réel.
Limites
Tenez compte des limites suivantes lors de l'abonnement aux journaux binaires de Hologres :
Seules les versions Hologres V0.9 et ultérieures prennent en charge l'abonnement aux journaux binaires. Si votre instance exécute une version antérieure, rejoignez le groupe de support en ligne sur DingTalk. Pour plus de détails, consultez la rubrique Comment obtenir davantage de support en ligne ?.
Sur les versions Hologres V0.9 et V0.10, il est impossible d'activer les journaux binaires sur des tables existantes en modifiant leurs propriétés. Vous devez recréer la table. À partir de la version V1.1, vous pouvez activer les journaux binaires à la demande.
Avant les versions Hologres V1.3.14 et V1.1.82, seul un Superuser pouvait consommer le journal binaire. L'utilisation d'un compte disposant de privilèges restreints entraînait l'erreur
permission denied for table hg_replication_slot_properties. À partir des versions V1.3.14 et V1.1.82, un compte a uniquement besoin de l'autorisation SELECT sur la table pour consommer le journal binaire avec Flink. Pour consommer le journal binaire via JDBC, le compte doit disposer du rôle Replication Role.-
Hologres prend en charge les journaux binaires au niveau de la table, aussi bien pour les tables orientées lignes que pour les tables orientées colonnes. Le tableau suivant répertorie les méthodes de consommation prises en charge.
|
**Catégorie Flink**
|
**Table orientée lignes**
|
**Table orientée colonnes**
|
**Table hybride lignes-colonnes (pris en charge à partir de la version V1.1)**
| | --- | --- | --- | --- | |
Blink
|
Pris en charge
|
Pris en charge
|
Pris en charge
| |
Realtime Compute for Apache Flink
|
Pris en charge
|
Pris en charge
|
Pris en charge
| |
Apache Flink
|
Non pris en charge
|
Non pris en charge
|
Non pris en charge
| |
JDBC
|
Pris en charge à partir de la version V1.1
|
Pris en charge à partir de la version V1.1
|
Pris en charge à partir de la version V1.1
| Lors de la consommation des journaux binaires de Hologres, Blink ne prend pas en charge le type de données
TIMESTAMP. Utilisez le typeTIMESTAMPTZlors de la création des tables dans Hologres. D'autres types spéciaux, tels queSMALLINT, ne sont pas non plus pris en charge.Vous ne pouvez pas consommer les journaux binaires de la table parente d'une table partitionnée. Utilisez une table enfant ou une table classique (non partitionnée). À partir de Hologres V1.3.24, vous pouvez modifier le TTL du journal binaire d'une table enfant à la demande. Si vous ne spécifiez pas explicitement de TTL pour le journal binaire d'une table enfant, celle-ci hérite du TTL de sa table parente. Notez que le TTL du journal binaire n'est pas un minuteur précis. Le système ne garantit pas la suppression immédiate du journal binaire dès son expiration. La suppression intervient quelque temps après l'expiration.
Pour les charges de travail intensives en écriture, l'activation des journaux binaires sur une table orientée colonnes engendre théoriquement plus de surcharge que sur une table orientée lignes. Par conséquent, privilégiez une table orientée lignes lorsque vous activez les journaux binaires. Si la table sert également à des requêtes OLAP, optez pour le format de stockage hybride lignes-colonnes. Pour plus d'informations, consultez la rubrique Formats de stockage des tables.
Seules les tables internes de Hologres prennent en charge les journaux binaires. Les tables externes ne les prennent pas en charge.
Format et principes des journaux binaires
Un enregistrement de journal binaire contient des champs système et les colonnes de la table utilisateur. Le tableau ci-dessous décrit ces champs.
|
Nom du champ |
Type |
Description |
|
hg_binlog_lsn |
BIGINT |
Champ système du journal binaire représentant le numéro de séquence du journal (LSN). La valeur augmente de manière monotone, mais n'est pas garantie continue au sein d'un shard. Elle n'est pas non plus garantie unique ou ordonnée entre les shards. Remarque
Pour plus d'informations sur la distribution des données des journaux binaires entre les shards, consultez la rubrique Clé de distribution. |
|
hg_binlog_event_type |
BIGINT |
Champ système du journal binaire indiquant le type d'événement de modification.
|
|
hg_binlog_timestamp_us |
BIGINT |
Champ système du journal binaire représentant l'horodatage système en microsecondes (µs). |
|
user_table_column_1 |
Défini par l'utilisateur |
Colonne de la table utilisateur. |
|
... |
... |
... |
|
user_table_column_n |
Défini par l'utilisateur |
Colonne de la table utilisateur. |
Une opération
UPDATEgénère deux enregistrements dans le journal binaire : l'un pour l'état de la ligne avant la mise à jour et l'autre pour l'état après la mise à jour. La fonctionnalité d'abonnement aux journaux binaires garantit que ces deux enregistrements sont consécutifs, l'enregistrement « avant mise à jour » apparaissant en premier.Lorsque vous effectuez une opération
UPDATEavec un connecteur Hologres, tel que Holo Client, Flink Connector ou Data Integration, le connecteur traduit l'événementBEFORE_UPDATEen événementDELETEet l'événementAFTER_UPDATEen événementINSERT. Par conséquent, vous verrez les valeurs2et5dans le champhg_binlog_event_type. Toutefois, le connecteur garantit la cohérence finale des données.Le champ
hg_binlog_event_typeenregistre les événementsBEFORE_UPDATEetAFTER_UPDATEuniquement lorsque vous exécutez une instructionUPDATEen SQL pur.
Considérez un journal binaire Hologres comme une table orientée lignes spéciale. Activer les journaux binaires pour une table revient à créer une nouvelle table orientée lignes où hg_binlog_lsn est la clé, et les colonnes de la table d'origine, ainsi que hg_binlog_event_type et hg_binlog_timestamp_us, forment conjointement la valeur. La table du journal binaire possède un schéma fixe, ou fortement typé. L'ordre des colonnes utilisateur correspond à celui défini dans le DDL de la table. C'est pourquoi il est recommandé d'utiliser des tables orientées lignes ou hybrides lignes-colonnes pour les tables activées avec les journaux binaires afin d'optimiser les performances de lecture.
Activation des journaux binaires
Par défaut, la fonctionnalité de journalisation binaire est désactivée dans Hologres. Activez-la en définissant les propriétés de table binlog.level et binlog.ttl. Les exemples suivants montrent comment activer les journaux binaires. Pour plus d'informations sur les paramètres de création de table, consultez la rubrique CREATE TABLE.
Théoriquement, l'activation des journaux binaires sur une table orientée colonnes coûte plus cher que sur une table orientée lignes. Si vous mettez fréquemment la table à jour, nous vous recommandons d'activer les journaux binaires sur une table orientée lignes.
-
Syntaxe pour la version V2.1 et ultérieures :
Les noms des propriétés de table
binlog.leveletbinlog.ttlont été mis à jour enbinlog_leveletbinlog_ttl.CREATE TABLE test_message_src ( id int PRIMARY KEY, title text NOT NULL, body text ) WITH ( orientation = 'row', clustering_key = 'id', binlog_level = 'replica', binlog_ttl = '86400' -- The TTL of the binlog, in seconds. ); -
Syntaxe prise en charge dans toutes les versions :
begin; create table test_message_src( id int primary key, title text not null, body text); call set_table_property('test_message_src', 'orientation', 'row');--Create a row-oriented table named test_message_src. call set_table_property('test_message_src', 'clustering_key', 'id');--Create a clustered index on the id column. call set_table_property('test_message_src', 'binlog.level', 'replica');--Set a table property to enable the binlog feature. call set_table_property('test_message_src', 'binlog.ttl', '86400');--The TTL of the binlog, in seconds. commit;
Le tableau suivant décrit les paramètres.
|
Paramètre |
Description |
|
|
Indique si les journaux binaires sont activés. Valeurs possibles :
|
|
|
Durée de conservation (TTL) du journal binaire, en secondes. Valeur par défaut : 2592000 (30 jours). |
Activation des journaux binaires à la demande
À partir de Hologres V1.1, vous pouvez activer ou désactiver les journaux binaires. Vous pouvez également configurer la durée de conservation (TTL) pour répondre à différentes exigences de rétention. Il est possible d'activer les journaux binaires sur une table existante sans avoir à la recréer.
Les fonctionnalités suivantes sont disponibles uniquement sur Hologres V1.1 et versions ultérieures. Si vous utilisez une version antérieure, consultez la rubrique Résolution des échecs de préparation à la mise à niveau ou contactez-nous via le groupe DingTalk Hologres. Pour plus d'informations, consultez la rubrique Comment obtenir davantage de support en ligne ?.
-
Activation des journaux binaires
Utilisez les instructions suivantes pour activer les journaux binaires sur une table existante et définir la durée de conservation (TTL) du journal binaire.
-- Set table properties to enable binlogs. begin; call set_table_property('<table_name>', 'binlog.level', 'replica'); commit; -- Set table properties to configure the binlog TTL in seconds. begin; call set_table_property('<table_name>', 'binlog.ttl', '2592000'); commit;table_name correspond au nom de la table pour laquelle vous souhaitez activer les journaux binaires.
-
Désactivation des journaux binaires
Utilisez l'instruction suivante pour désactiver les journaux binaires d'une table.
-- Set table properties to disable binlogs. begin; call set_table_property('<table_name>', 'binlog.level', 'none'); commit;table_name correspond au nom de la table pour laquelle vous souhaitez désactiver les journaux binaires.
-
Modification de la durée de conservation (TTL) du journal binaire
Utilisez l'instruction suivante pour modifier la durée de conservation (TTL) d'une table dont les journaux binaires sont activés.
RemarqueÀ partir de Hologres V1.3.24, vous pouvez définir la durée de conservation (TTL) du journal binaire pour une table enfant d'une table partitionnée. Si vous ne définissez pas explicitement la TTL du journal binaire pour une table enfant, celle-ci hérite de la TTL de la table parente.
call set_table_property('<table_name>', 'binlog.ttl', '8640000'); -- The unit is seconds.table_name correspond au nom de la table pour laquelle vous souhaitez modifier la durée de conservation (TTL) du journal binaire.
Interrogation des journaux binaires
Les données des journaux binaires de Hologres sont fortement typées. Pour interroger les journaux binaires d'une table spécifique, combinez les champs système intégrés des journaux binaires avec les colonnes de la table d'origine. Hologres fournit également des fonctions permettant d'interroger le journal binaire le plus ancien ou le plus récent, ou d'obtenir des informations sur le journal binaire à partir d'un LSN ou d'un horodatage connu.
Interrogation par champs intégrés
Utilisez l'instruction suivante pour interroger le journal binaire en combinant les champs intégrés du journal binaire avec les champs de la table d'origine.
SELECT hg_binlog_lsn,hg_binlog_event_type,hg_binlog_timestamp_us,* FROM test_message_src;
Le code suivant présente un exemple de résultat.
postgres=# select hg_binlog_lsn, hg_binlog_event_type, hg_binlog_timestamp_us, * from test_message_src ;
hg_binlog_lsn | hg_binlog_event_type | hg_binlog_timestamp_us | id | title | body
---------------+----------------------+------------------------+----+---------+-------------------
1081 | 5 | 1626856018921653 | 1 | title 1 | body 1
1092 | 3 | 1626856054284918 | 1 | title 1 | body 1
1093 | 7 | 1626856054284918 | 1 | title 1 | body after update
1095 | 2 | 1626856059747536 | 1 | title 1 | body after update
(4 rows)
Interrogation du journal binaire le plus ancien ou le plus récent
Utilisez la fonction hg_get_binlog_cursor pour interroger le journal binaire le plus ancien ou le plus récent sur un shard spécifique. La syntaxe est présentée ci-dessous.
-- OLDEST: Query the earliest binlog on this shard.
SELECT * FROM hg_get_binlog_cursor('<table_name>','OLDEST',<shard_id>);
-- LATEST: Query the latest binlog on this shard.
SELECT * FROM hg_get_binlog_cursor('<table_name>','LATEST',<shard_id>);
Le code suivant fournit un exemple.
SELECT * FROM hg_get_binlog_cursor('test_message_src','OLDEST',0);
Le code suivant présente un exemple de résultat.
test=# select * from hg_get_binlog_cursor('test_message_src','OLDEST',0);
hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us
-------------+---------------+------------------------
0 | 152 | 1716204893791755
(1 row)
Interrogation de l'horodatage par LSN
Utilisez la fonction hg_get_binlog_cursor_by_lsn pour interroger l'horodatage d'un journal binaire. Cette fonction renvoie les informations relatives au premier enregistrement de journal binaire dont le LSN est supérieur ou égal au LSN spécifié. Si le LSN spécifié n'existe pas, le champ hg_binlog_timestamp_us du résultat renvoie l'heure actuelle. La syntaxe est présentée ci-dessous.
SELECT * FROM hg_get_binlog_cursor_by_lsn('<table_name>',<lsn>,<shard_id>);--The LSN value must be of the BIGINT type.
Le code suivant fournit un exemple.
SELECT * FROM hg_get_binlog_cursor_by_lsn('test_message_src',152,0);
Le code suivant présente un exemple de résultat.
test=# select * from hg_get_binlog_cursor_by_lsn('test_message_src',152,0);
hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us
-------------+---------------+------------------------
0 | 152 | 1716204893791755
(1 row)
Interrogation du LSN par horodatage
Utilisez la fonction hg_get_binlog_cursor_by_timestamp pour interroger le LSN d'un journal binaire. Cette fonction renvoie les informations relatives au premier enregistrement de journal binaire dont l'horodatage est supérieur ou égal à l'heure spécifiée. Si l'heure spécifiée est postérieure à la dernière entrée du journal binaire, le champ hg_binlog_timestamp_us du résultat renvoie l'heure actuelle, et le champ hg_binlog_lsn renvoie le LSN qui sera attribué à la prochaine ligne insérée. La syntaxe est présentée ci-dessous.
Si l'horodatage fourni est postérieur à l'heure actuelle renvoyée par la fonction now(), la fonction lève une exception « get binlog cursor in future time ».
SELECT * FROM hg_get_binlog_cursor_by_timestamp('<table_name>',<timestamp>,<shard_id>);
Le code suivant fournit un exemple.
SELECT *,to_timestamp(hg_binlog_timestamp_us/1000000.0) FROM hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);
Le code suivant présente un exemple de résultat.
test=# select *, to_timestamp(hg_binlog_timestamp_us/1000000.0) from hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);
hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us | to_timestamp
-------------+---------------+------------------------+-------------------------------
0 | 152 | 1716204893791755 | 2024-05-20 19:34:53.791755+08
(1 row)
Consommation des journaux binaires en temps réel
Consommez les journaux binaires de Hologres avec Flink, Blink et JDBC (y compris Holo Client). Pour plus d'informations, consultez les rubriques suivantes :
Pour consommer les journaux binaires en temps réel avec Flink ou Blink, consultez la rubrique Consommer les journaux binaires de Hologres en temps réel à l'aide de Flink ou Blink.
Pour consommer les journaux binaires avec JDBC, consultez la rubrique Consommer les journaux binaires de Hologres à l'aide de JDBC.
Affichage des tables avec journaux binaires activés
Utilisez l'instruction SQL suivante pour identifier les tables dont les journaux binaires sont activés.
SELECT
*
FROM
hologres.hg_table_properties
WHERE
property_key = 'binlog.level'
AND property_value = 'replica';
Voici un exemple de résultat. La requête renvoie quatre colonnes : table_namespace, table_name, property_key et property_value. Ces colonnes fournissent des informations sur toutes les tables dont les journaux binaires sont activés.
Affichage de la taille de stockage des journaux binaires
Utilisez la fonction
pg_relation_sizepour obtenir la taille de stockage d'une table, qui inclut la taille de stockage des journaux binaires. Pour plus d'informations, consultez la rubrique Interroger la taille de stockage d'une table.À partir de Hologres V2.1, utilisez la fonction
hologres.hg_relation_sizepour afficher les détails de stockage d'une table, y compris les données et les journaux binaires. Pour plus d'informations, consultez la rubrique Interroger les détails de stockage d'une table.
Désactivation des journaux binaires lors des opérations DML
Utilisez le paramètre GUC suivant pour empêcher la session actuelle de générer des journaux binaires lors des opérations DML. Définissez ce paramètre au niveau de la session avant d'exécuter une instruction DML.
-- Enable at the session level.
SET hg_experimental_generate_binlog=off;