后端分布式系列:分布式存储-MySQL数据库事务与复制_MySQL
好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适。最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类。结合实际工作中碰到的问题,以寻找答案的方式来剖解技术,很多时候我们都不是在创造新技术,而是在应用技术。为了更有效率与效果的用好技术,我们需要了解一些技术的原理与工作方式。带着问题从使用者的角度去剖析技术原理,并将开源技术产品和框架作为一类技术的参考实现来讲解。以讲清原理为主要目的,对于具体实现的技术细节若无特别之处则尽可能点到即止。
事务与复制
近期参与了一个数据分布化相关的项目,涉及到数据库 MySQL 的数据分布化。简单来说就是需要在异地数据中心实现多点可写并保证分布后的数据能达成最终一致性。以前对 MySQL 作数据分布仅仅是读写分离,通过数据库自身的主从复制即可实现写主库、读从库。现在则需要双写主库并在经历一个短暂的延时后达成最终一致性,这个问题乍一想比较复杂,但归根结底还是数据最终一致性的问题。
先回到最简单的情况,只有一个 MySQL 数据库时,数据一致性是怎么保证的?了解数据库的都知道,这是通过数据库的事务特性来保证的,事务包括四大特性:
Atomicity 原子性 Consistency 一致性 Isolation 隔离性 Durability 持久性事务的 ACID 四大特性不是本文重点,就不展开做学术性解说了,不了解的可以在后面参考文献里[3]去看相关文章。这里只想提一个问题,单一数据库事务能保证数据的一致性,那么 MySQL 在部署成主从架构时,如何保证主从之间数据的一致性的?
MySQL 为了提供主从复制功能引入了一个新的日志文件叫 binlog,它包含了引发数据变更的事件日志集合。从库请求主库发送 binlog 并通过日志事件还原数据写入从库,所以从库的数据来源为 binlog。这样 MySQL 主库只需做到 binlog 与本地数据一致就可以保证主从库数据一致(暂且忽略网络传输引发的主从不一致)。我们知道保证本地数据一致性是靠数据库事务特性来达成的,而数据库事务是如何实现的呢?先看下面这张图:
vcrHu/nT2iByZWRvIGxvZyC6zSB1bmRvIGxvZ6GjvPK1pcC0y7WjrHJlZG8gbG9nILzHwrzKws7x0N64xLrztcTK/b7dLCB1bmRvIGxvZyC8x8K8ysLO8cewtcTUrcq8yv2+3aGjy/nS1LWx0ru49srCzvHWtNDQyrHKtbzKt6LJ+rn9s8y88ruvw+jK9sjnz8KjujwvcD4NCs/IvMfCvCB1bmRvL3JlZG8gbG9no6zIt7GjyNXWvsuitb20xcXMyc+z1r7DtOa0oqGjILj80MLK/b7dvMfCvKOsu7q05rLZ1/eyotLssr3LosXMoaMgzOG9u8rCzvGjrNTaIHJlZG8gbG9nINbQ0LTI6yBjb21taXQgvMfCvKGjDQo8cD7U2iBNeVNRTCDWtNDQysLO8bn9s8zW0MjnufvS8rnK1c/W0LbPo6y/ydLUzai5/SByZWRvIGxvZyDAtNbY1/bKws7xu/LNqLn9IHVuZG8gbG9nIMC0u9i59qOsyLexo8HLyv2+3bXE0rvWwtDUoaPV4tCptrzKx9PJysLO8dDUtOa0otL9x+bAtM3qs8m1xKOstasgYmlubG9nILK71NrKws7xtOa0otL9x+a3ts6nxNqjrLb4ysfTySBNeVNRTCBTZXJ2ZXIgwLS8x8K8tcSho8THw7S+zbHY0Ouxo9akIGJpbmxvZyDK/b7dus0gcmVkbyBsb2cg1q685LXE0rvWwtDUo6zL+dLUv6rG9MHLIGJpbmxvZyC688q1vMq1xMrCzvHWtNDQvs224MHL0ruyvaOsyOfPwqO6PC9wPg0Kz8i8x8K8IHVuZG8vcmVkbyBsb2ejrMi3saPI1da+y6K1vbTFxczJz7PWvsO05rSioaMguPzQwsr9vt28x8K8o6y7urTmstnX97Ki0uyyvcuixcyhoyC9q8rCzvHI1da+s9a+w7uvtb0gYmlubG9noaMgzOG9u8rCzvGjrNTaIHJlZG8gbG9nINbQ0LTI68zhvbu8x8K8oaMNCjxwPtXi0fm1xLuwo6zWu9KqIGJpbmxvZyDDu9C0s8m5pqOs1fu49srCzvHKx9Do0qq72Ln2tcSjrLb4IGJpbmxvZyDQtLPJuaa687y0yrkgTXlTUUwgQ3Jhc2ggwcu2vL/J0tS71ri0ysLO8bKizeqzyczhvbuho9Kq1/a1vdXiteOjrL7N0OjSqrDRIGJpbmxvZyC6zcrCzvG52MGqxvDAtKOstvjWu9PQsaPWpMHLIGJpbmxvZyC6zcrCzvHK/b7dtcTSu9bC0NSjrLLFxNyxo9ak1ve008r9vt21xNK71sLQ1KGjy/nS1CBiaW5sb2cgtcTQtMjruf2zzLK7tcOyu8e2yOu1vbS/tOK1xMrCzvG05rSi0v3H5ta00NC5/bPM1tCjrLKi0tTE2rK/t9ayvMq9ysLO8aOoeGEgysLO8aOptcS3vcq9zeqzycG9vde2zszhvbuho7340ruyvbXEz7i92r7NsrvVub+qwcujrL/J0tSyzr+0uvPD5rLOv7zOxM/XWzVdoaM8L3A+DQo8aDIgaWQ9"总结">总结
我们前面先提出了一个问题,然后从数据一致性的角度去思考,参考了 MySQL 的实现方式。理清并分析了 MySQL 单机环境是如何保证复制机制的数据一致性,也就是 binlog 和事务数据的一致。后面我们才能基于 binlog 这个机制去实现复制并保证主从复制的一致性。主从复制又引入了网络因素,进一步增加了保证主从数据一致性的复杂度,后面还会撰文进一步分析这个问题。

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)

Sujets chauds



Le langage Go est un langage de programmation efficace, concis et facile à apprendre. Il est privilégié par les développeurs en raison de ses avantages en programmation simultanée et en programmation réseau. Dans le développement réel, les opérations de base de données font partie intégrante. Cet article explique comment utiliser le langage Go pour implémenter les opérations d'ajout, de suppression, de modification et de requête de base de données. Dans le langage Go, nous utilisons généralement des bibliothèques tierces pour faire fonctionner les bases de données, telles que les packages SQL couramment utilisés, gorm, etc. Ici, nous prenons le package SQL comme exemple pour présenter comment implémenter les opérations d'ajout, de suppression, de modification et de requête de la base de données. Supposons que nous utilisons une base de données MySQL.

Le mappage polymorphe Hibernate peut mapper les classes héritées à la base de données et fournit les types de mappage suivants : join-subclass : crée une table séparée pour la sous-classe, incluant toutes les colonnes de la classe parent. table par classe : créez une table distincte pour les sous-classes, contenant uniquement des colonnes spécifiques aux sous-classes. union-subclass : similaire à join-subclass, mais la table de classe parent réunit toutes les colonnes de la sous-classe.

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

HTML ne peut pas lire directement la base de données, mais cela peut être réalisé via JavaScript et AJAX. Les étapes comprennent l'établissement d'une connexion à la base de données, l'envoi d'une requête, le traitement de la réponse et la mise à jour de la page. Cet article fournit un exemple pratique d'utilisation de JavaScript, AJAX et PHP pour lire les données d'une base de données MySQL, montrant comment afficher dynamiquement les résultats d'une requête dans une page HTML. Cet exemple utilise XMLHttpRequest pour établir une connexion à la base de données, envoyer une requête et traiter la réponse, remplissant ainsi les données dans les éléments de la page et réalisant la fonction de lecture HTML de la base de données.

Comment utiliser MySQLi pour établir une connexion à une base de données en PHP : Inclure l'extension MySQLi (require_once) Créer une fonction de connexion (functionconnect_to_db) Appeler la fonction de connexion ($conn=connect_to_db()) Exécuter une requête ($result=$conn->query()) Fermer connexion ( $conn->close())

Pour gérer les erreurs de connexion à la base de données en PHP, vous pouvez utiliser les étapes suivantes : Utilisez mysqli_connect_errno() pour obtenir le code d'erreur. Utilisez mysqli_connect_error() pour obtenir le message d'erreur. En capturant et en enregistrant ces messages d'erreur, les problèmes de connexion à la base de données peuvent être facilement identifiés et résolus, garantissant ainsi le bon fonctionnement de votre application.

PHP est un langage de programmation back-end largement utilisé dans le développement de sites Web. Il possède de puissantes fonctions d'exploitation de bases de données et est souvent utilisé pour interagir avec des bases de données telles que MySQL. Cependant, en raison de la complexité du codage des caractères chinois, des problèmes surviennent souvent lorsqu'il s'agit de caractères chinois tronqués dans la base de données. Cet article présentera les compétences et les pratiques de PHP dans la gestion des caractères chinois tronqués dans les bases de données, y compris les causes courantes des caractères tronqués, les solutions et des exemples de code spécifiques. Les raisons courantes pour lesquelles les caractères sont tronqués sont des paramètres de jeu de caractères incorrects dans la base de données : le jeu de caractères correct doit être sélectionné lors de la création de la base de données, comme utf8 ou u.

Les transactions garantissent l'intégrité des données de la base de données, y compris l'atomicité, la cohérence, l'isolation et la durabilité. JDBC utilise l'interface Connection pour assurer le contrôle des transactions (setAutoCommit, commit, rollback). Les mécanismes de contrôle de concurrence coordonnent les opérations simultanées, à l'aide de verrous ou d'un contrôle de concurrence optimiste/pessimiste pour obtenir une isolation des transactions afin d'éviter les incohérences des données.
