HBase MVCC and built-in Atomic Operations
By Lars Hofhansl (This is a follow to my ACID in HBase post from March this year) HBase has a few special atomic operations: checkAndPut, checkAndDelete - these simply check a value of a column as a precondition and then apply the Put or D
By Lars Hofhansl(This is a follow to my ACID in HBase post from March this year)
HBase has a few special atomic operations:
- checkAndPut, checkAndDelete - these simply check a value of a column as a precondition and then apply the Put or Delete if the check succeeded.
- Increment, Append - these allow an atomic add to a column value interpreted as an integer, or append to the end of a column, resp.
Increment and Append are not idempotent. They are the only non-repeatable operations in HBase. Increment and Append are also the only operations for which the snapshot isolation provided by HBase's MVCC model is not sufficient... More on that later.
In turns out that checkAndPut and checkAndDelete are not as atomic as expected (the issue was raised by Gregory and despite me not believing it first he is right - see HBASE-7051).
A look at the code makes this quite obvious:
Some of the Put optimizations (HBASE-4528) allow releasing the rowlock before the changes are sync'ed to the WAL. This also requires the lock to be released before the MVCC changes are committed so that changes are not visible to other transaction before they are guaranteed to be durable.
Another operation (such as checkAndXXX) that acquires the rowlock to make atomic changes may in fact not see current picture of things despite holding the rowlock as there could be still outstanding MVCC changes that only become visible after the row lock was release and re-acquired. So it might operate on stale data. Holding the rowlock is no longer good enough after HBASE-4528.
Increment and Append have the same issue.
The fix for this part is relatively simple: We need a "MVCC barrier" of sorts. Instead of completing a single MVCC transaction at the end of the update phase (which will wait for all prior transactions to finish), we just wait a little earlier instead for prior transactions to finish before we start the check or get phase of the atomic operation. This only reduces concurrency slightly, since before the end of the operation we have to await all prior transactions anyway. HBASE-7051 does exactly that for the checkAndXXX operations.
In addition - as mentioned above - Increment and Append have another issue, they need to be serializable transactions. Snapshot isolation is not good enough.
For example: If you start with 0 and issue an increment of 1 and another increment of 2 the outcome must always be 3. If both could start with the same start value (a snapshot) the outcome could 1 or 2 depending on which one finishes first.
Increment and Append currently skirt the issue with an ugly "hack": When they write their changes into the memstore they set the memstoreTS of all new KeyValues to 0! The effect is that they are made visible to other transactions immediately, violating HBase's MVCC. Again see ACID in HBase for an explanation of the memstoreTS.
This guarantees the correct outcome of concurrent Increment and Append operations, but the visibility to concurrent scanners is not what you expect. An Incremented and Appended value even for partial rows can be become visible to any scanner at any time even though the scanner should see an earlier snapshot of the data.
Increment and Append are also designed for very high throughput so they actually manipulate HBase's memstore to remove older versions of the columns just modified. Thus you lose the version history of the changes in exchange for avoiding a memstore exploding with version of the many Increments or Appends. This is called "upsert" in HBase. Upsert is nice in that it prevents the memstore being filled will a lot of old value if nobody cares for them. The downside is that is a special operation on the memstore, and hard to get right w.r.t. MVCC. It also does not work with mslab (see this Cloudera blog post for explanation of mslab).
If you don't care about visibility this is a simple problem, since you can just look through the memstore and remove old values. If you care about MVCC, though, you have to prove first that is safe to remove a KV.
I tried to fix this almost exactly a year ago (HBASE-4583), but after some discussions with my fellow committers we collectively gave up on that.
A few days ago I reopened HBASE-4583 and started with a radical patch that gets rid of all upsert-type logic (which set the memstoreTS to 0) and just awaits prior transactions before commencing the Increment/Append. Then I rely on my changes from HBASE-4241 to only flush the versions of columns needed when it is time to flush the memstore to disk. Turns out this is still quite a bit slower (10-15%), since it needs to flush the memstore frequently even thought it leads to mostly empty files. Still that was nice try, as it gets rid of a lot of special code and turns Increment and Append into normal HBase citizens.
A 2nd less radical version makes upsert MVCC aware.
That is actually not as easy as it looks. In order to remove a version of a column (a KeyValue) from the memstore you have to prove that is not and will not be seen by any concurrent or future scanner. That means we have to find the earliest readpoint of any scanner and ensure that there is at least one version of the KV older than that smallest readpoint; then we can safely remove any older versions of that KV from the memstore - because any scanner is guaranteed to see a newer version of the KV.
The "less radical" patch in does exactly that.
In the end the patch I ended up committed with HBASE-4583 does both:
If the column family that has the column to be incremented or appended to has VERSIONS set to 1, we perform an MVCC aware upsert added by the patch. If VERSIONS is > 1, we use the usual logic to add a KeyValue to the memstore. So now this behaves as expected in all cases. If multiple versions are requested they are retained and time range queries will work even with Increment and Append; and it also keeps the performance characteristics (mostly) when VERSIONS is set to 1.
原文地址:HBase MVCC and built-in Atomic Operations, 感谢原作者分享。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Analyse approfondie des principes et de la mise en œuvre de MySQLMVCC MySQL est actuellement l'un des systèmes de gestion de bases de données relationnelles les plus populaires. Il fournit un mécanisme de contrôle de concurrence multiversion (Multiversion Concurrency Control, MVCC) pour prendre en charge un traitement simultané efficace. MVCC est une méthode de gestion des transactions simultanées dans la base de données qui peut fournir une simultanéité et une isolation élevées. Cet article fournira une analyse approfondie des principes et de la mise en œuvre de MySQLMVCC, et l'illustrera avec des exemples de code. 1.M

Avec l'avènement de l'ère du Big Data, le traitement et le stockage des données sont devenus de plus en plus importants, et la gestion et l'analyse efficaces de grandes quantités de données sont devenues un défi pour les entreprises. Hadoop et HBase, deux projets de la Fondation Apache, proposent une solution de stockage et d'analyse du Big Data. Cet article explique comment utiliser Hadoop et HBase dans Beego pour le stockage et les requêtes Big Data. 1. Introduction à Hadoop et HBase Hadoop est un système informatique et de stockage distribué open source qui peut

Interprétation approfondie des principes et des meilleures pratiques de MySQL MVCC 1. Présentation MySQL est l'un des systèmes de gestion de bases de données relationnelles les plus utilisés. Il prend en charge le mécanisme de contrôle de concurrence multiversion (Multi-Version Concurrency Control, MVCC) pour gérer les accès simultanés. problèmes. Cet article fournira une explication approfondie des principes de MySQLMVCC et donnera quelques exemples de bonnes pratiques. 2. Le numéro de version du principe MVCC MVCC est obtenu en ajoutant des

Comprendre les principes de MySQLMVCC et optimiser le traitement des transactions de base de données. Ces dernières années, avec la croissance continue du volume de données et l'amélioration des exigences des applications, l'optimisation des performances du traitement des transactions de base de données est devenue un maillon très important dans le développement, l'exploitation et la maintenance des bases de données. En tant que base de données relationnelle open source les plus couramment utilisées, le principe MVCC (Multi-VersionConcurrencyControl) de MySQL joue un rôle important dans le traitement des transactions. Cet article présentera les principes de MySQLMVCC et

Maîtrisez les principes de MySQLMVCC et améliorez l'efficacité de la lecture des données Introduction : MySQL est un système de gestion de bases de données relationnelles couramment utilisé, et MVCC (Multi-VersionConcurrencyControl) est un mécanisme de contrôle de concurrence couramment utilisé dans MySQL. Maîtriser le principe MVCC peut nous aider à mieux comprendre les principes de fonctionnement internes de MySQL et à améliorer l'efficacité de la lecture des données. Cet article présentera le principe de MVCC et comment utiliser ce principe pour améliorer l'efficacité de la lecture des données.

1. MVCCMVCC, le nom complet est Multi-VersionConcurrencyControl, qui est un contrôle de concurrence multiversion. MVCC est une méthode de contrôle de concurrence. Elle est généralement utilisée dans les systèmes de gestion de bases de données pour obtenir un accès simultané à la base de données et pour implémenter la mémoire transactionnelle dans les langages de programmation. L'implémentation de MVCC dans MySQLInnoDB vise principalement à améliorer les performances de concurrence des bases de données et à utiliser une meilleure façon de gérer les conflits de lecture et d'écriture, de sorte que même s'il y a des conflits de lecture et d'écriture, aucune lecture simultanée verrouillable et non bloquante ne peut être obtenue. 2. La lecture actuelle est comme selectlockinsharemode (verrou partagé), selectforupdate, insert, de ;

Analyse du principe MySQLMVCC : pourquoi est-ce le meilleur choix pour le contrôle de concurrence ? Dans les bases de données relationnelles, la cohérence des données et le contrôle de la concurrence sont cruciaux. En tant que l'un des systèmes de gestion de bases de données relationnelles les plus populaires, MySQL utilise le mécanisme MVCC (Multi-VersionConcurrencyControl, contrôle de concurrence multiversion) pour réaliser le contrôle de concurrence. Cet article analysera en profondeur les principes de MySQLMVCC et expliquera pourquoi il s'agit du meilleur choix pour le contrôle de concurrence. M.

1. Qu'est-ce que MVCCMVCC (MultiversionConcurrencyControl), contrôle de concurrence multiversion. Comme son nom l'indique, MVCC implémente le contrôle de simultanéité des bases de données grâce à la gestion de plusieurs versions des lignes de données. Cette technologie garantit des opérations de lecture cohérentes sous le niveau d'isolation des transactions d'InnoDB. En d'autres termes, il s'agit d'interroger certaines lignes qui sont mises à jour par une autre transaction, et vous pouvez voir les valeurs avant qu'elles ne soient mises à jour, afin que vous n'ayez pas à attendre qu'une autre transaction libère le verrou lors de la requête. . Il n'existe pas de norme formelle pour MVCC. L'implémentation de MVCC peut être différente selon les SGBD et elle n'est pas universellement utilisée (vous pouvez vous référer à la documentation du SGBD correspondante).
