ID distribué (mode multi - maître de base de données, comment optimiser MySQL étape par étape en cas d'augmentation soudaine de la pression du système

Cxyyidd 2021-08-19 22:50:51 阅读数:396

id distribu mode multi ma

Nous pouvons utiliser le segment pour obtenir l'auto - augmentationID,Le segment no peut être interprété comme une acquisition par lots,Par exemple,DistributIdServiceObtenir de la base de donnéesIDHeure,Si vous pouvez obtenir plus d'un lotIDEt mis en cache localement,Cela permettra d'obtenir beaucoup d'applications commercialesIDEfficacité.

Par exemple,DistributIdServiceChaque fois que vous obtenez de la base de donnéesIDHeure,Juste un segment,Par exemple,(1,1000],Cette plage représente1000- Oui.ID,Application commerciale sur demandeDistributIdServiceOffreIDHeure,DistributIdServiceTout ce qu'il faut, c'est être local à partir de1Commencez par augmenter et revenir,Sans avoir à demander la base de données à chaque fois,Jusqu'à l'augmentation locale de1000Heure,C'est - à - dire lorsque le segment actuel est épuisé,Je suis allé dans la base de données pour récupérer le prochain segment.

Alors...,Nous devons apporter des modifications aux tables de base de données,Comme suit:

CREATE TABLE id_generator (
id int(10) NOT NULL,
current_max_id bigint(20) NOT NULL COMMENT 'Maximum actuelid',
increment_step int(10) NOT NULL COMMENT 'Longueur du segment',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Cette table de base de données est utilisée pour enregistrer les étapes d'auto - augmentation ainsi que l'auto - augmentation actuelleIDValeur maximale de(C'est - à - dire la dernière valeur du segment actuellement appliqué),Parce que la logique d'auto - augmentation a été déplacée versDistributIdService C'est parti. ,Donc la base de données n'a pas besoin de cette partie de la logique.

Ce scénario ne repose plus fortement sur la base de données,Même si la base de données n'est pas disponible,AlorsDistributIdServiceÇa peut durer un moment..Mais siDistributIdServiceRedémarrer, Vous perdrez un segment. ID,CauseIDCreux.

Pour améliorer DistributIdServiceHaute disponibilité,Besoin d'une grappe, Affaires en cours DistributIdService Accès groupé IDHeure,Choisissez au hasard unDistributIdService Noeud pour obtenir ,Pour chaqueDistributIdService Node ,La base de données est connectée à la même base de données,Il pourrait en résulter plusieursDistributIdServiceLe noeud demande également à la base de données d'obtenir le segment numéro,Il faut donc utiliser la serrure optimiste pour contrôler,Comme ajouter une table de base de donnéesversionChamp,.Pour obtenir le segment numéro, utilisez ce qui suitSQL:

update id_generator set current_max_id=#{newMaxId}, version=version+1 where version = #{version}

  • 1.

Parce quenewMaxId- Oui.DistributIdService Base moyenne oldMaxId+ Pas calculé , Juste au - dessus. updateUne mise à jour réussie signifie que le segment a réussi.

Pour assurer une disponibilité élevée de la couche de base de données,Besoin de déployer la base de données en mode multi - Maître,Pour chaque base de données, assurez - vous que les segments générés ne sont pas dupliqués,Pour ce faire, il faut utiliser les premières idées,Ajoutez la valeur de départ et la taille de l'étape à la table de base de données que vous venez de créer,Par exemple, si c'est deux maintenantMysql,Alors mysql1 Générer des segments (1,1001],La séquence d'auto - augmentation est1,3,4,5,7… mysql1 Générer des segments (2,1002],La séquence d'auto - augmentation est2,4,6,8,10…

InTinyIdUne étape supplémentaire a été ajoutée pour améliorer l'efficacité,Dans l'implémentation ci - dessus,IDLa logique de l'auto - augmentation estDistributIdService Réalisé en ,En fait, vous pouvez transférer la logique d'auto - augmentation à l'application d'affaires locale,Pour les applications commerciales, il suffit d'obtenir le segment,Il n'est plus nécessaire de demander un appel à chaque auto - augmentationDistributIdServiceC'est.

Quatre、 Algorithme flocon de neige

Les trois méthodes ci - dessus sont généralement basées sur l'idée d'auto - augmentation,Et ensuite, je vais vous présenter les plus célèbres Algorithme flocon de neige -snowflake.

On peut changer d'angle pour la distributionID Penser ,Tant que la responsabilité de la génération distribuéeIDChaque machine produit une différence par millisecondeIDC'est tout..

snowflake- Oui.twitter Open Source Distributed ID Algorithme de génération , Est un algorithme ,Donc il est distribué avec les trois types de génération ci - dessusID Les mécanismes sont différents. ,Il ne dépend pas de la base de données.

L'idée centrale est:DistribuéID La fixation est une long Nombre de types ,Unlong Type 8Octets,C'est - à - dire64- Oui.bit,Originalsnowflake Dans l'algorithme bit La répartition est la suivante: :

image

  • Le premierbit Bit est la partie d'identification ,Injava Moyenne longLe BIT le plus élevé de est le BIT de symbole, Nombre positif oui 0, Le nombre négatif est 1, Généralement généré ID Est un nombre positif , Donc fixé à 0.
  • Part TIMESTAMP 41bit,C'est le temps en millisecondes,L'horodatage actuel n'est généralement pas stocké dans l'implémentation,C'est la différence entre les horodatages(Heure actuelle-Heure de début fixe),Cela permet deID Commencez par une valeur plus petite ;41L'horodatage des bits peut être utilisé69Année,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69Année
  • Machines de travail idPourcentage10bit, C'est plus flexible ici. ,Par exemple,, Avant utilisation 5Bit as Data Center Room ID,Après5Bit as Single Room machine identification, Peut être déployé 1024Noeuds.
  • Part du numéro de série 12bit,Prend en charge le même noeud dans la même milliseconde pour générer4096- Oui.ID

Selon la logique de cet algorithme,Il suffit d'utiliser cet algorithme avecJava La langue est mise en œuvre ,Encapsulé comme méthode d'outillage,Ensuite, chaque application commerciale peut utiliser directement la méthode de l'outil pour obtenir la distributionID,Il suffit de s'assurer que chaque application commerciale a sa propre machine de travailidC'est tout.,Au lieu d'avoir à construire un distributeur d'accès séparéIDApplication de.

Dans une grande usine ,Il n'est pas utilisé directementsnowflake,Au lieu de cela, il a été transformé,Parce quesnowflakeLa chose la plus difficile à mettre en pratique dans l'algorithme est la machine de travailid,OriginalsnowflakeL'algorithme nécessite un travail manuel pour assigner une machine à chaque machineid,Et configuré quelque part pour quesnowflakeObtenir la machine d'iciid.

Mais dans les grandes usines , Les machines sont nombreuses ,Les coûts de main - d'oeuvre sont trop élevés et sujets aux erreurs, Donc la grande usine a raison. snowflake Modifié .

Cinq、Baidu(uid-generator)

uid-generatorCe qui est utilisé estsnowflake,Juste en train de fabriquer des machinesid,Aussi appeléworkId Ça change. .

uid-generatorDansworkIdC'est paruid-generatorGénéré automatiquement,Et compte tenu du déploiement de l'application dansdocker Situation ,Inuid-generatorLes utilisateurs peuvent définir eux - mêmesworkId Politiques de construction pour ,La politique par défaut est:L'application est assignée par la base de données au démarrage.La chose la plus simple à dire est:L'application sera lancée dans la table de base de données(uid-generator Besoin d'un nouveau WORKER_NODETableau)Pour insérer une donnée,Les données retournées après insertion réussie sont uniques en auto - incrémentationid C'est la machine. workId, Et les données sont host,portComposition.

Pouruid-generatorDansworkId,C'est occupé.22- Oui.bitBits, Le temps presse. 28- Oui.bitBits, La sérialisation prend du temps 13- Oui.bitBits,Il est important de noter que, Et original snowflakeC'est différent.,Le temps est en secondes, Au lieu de millisecondes ,workId C'est différent. ,Chaque redémarrage de la même application consomme unworkId.

Six、Meituan(Leaf)

Amazing LeafC'est aussi une distributionID Générer un cadre . C'est très complet. ,C'est - à - dire qu'il supporte le mode segment,- Oui.snowflakeMode.Le modèle de segment n'est pas décrit ici,Comme l'analyse ci - dessus.

LeafDanssnowflake Mode et original snowflake Différents points de l'algorithme , Et surtout workIdGénération de,LeafMoyenneworkIdEst basé surZooKeeperOrdreId Pour générer ,Chaque application est utiliséeLeaf-snowflakeHeure,Tout sera là au démarrageZookeeperGénérer un ordre dansId,équivalent à une machine correspondant à un noeud séquentiel, C'est un workId.

Sept、Résumé

Dans l'ensemble,Les deux sont générés automatiquementworkId,Pour rendre le système plus stable et réduire le succès manuel.

Huit、Redis

Voici une autre introduction à l'utilisationRedis Pour générer une distribution ID, Et l'utilisation MysqlAuto - augmentationIDSimilaire,Peut être utiliséRedisDansincrCommande pour réaliser l'auto - augmentation et le retour de l'atomicité,Par exemple,:

127.0.0.1:6379> set seq_id 1 // Initialisation de l'auto - augmentation IDPour1 
OK
127.0.0.1:6379> incr seq_id // Ajouter1,Et revenir à 
(integer) 2
127.0.0.1:6379> incr seq_id // Ajouter1,Et revenir à 
(integer) 3

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

UtiliserredisEst très efficace,Mais considérez la question de la persistance.RedisSoutienRDBEtAOFDeux façons de persister.

RDBLa persistance est l'équivalent d'un instantané programmé pour la persistance,Si après le Snapshot,Plusieurs fois de suite,Je n'ai pas eu le temps de faire la prochaine persistance de Snapshot,À ce moment - là.Redis C'est parti. ,RedémarrerRedis Ça arrive. IDJe répète..

AOFLa persistance équivaut à la persistance de chaque commande d'écriture,SiRedis C'est parti. ,Ça n'arrivera pas.ID Phénomène répétitif , Mais parce que incr Les ordres sont passés. ,Provoque un redémarrage trop long pour récupérer les données.

**Références:《JavaAnalyse complète des connaissances de base de niveau intermédiaire et supérieur》
Comment obtenir:Message privé【Information】Accès gratuit

Résumé

Avant l'entrevue“Pratique.”C'est toujours important.,Alors soyez prêt avant de commencer l'interview.,Sinon, l'intervieweur et lui - même seront retardés..

J'a i moi - même écrit beaucoup de questions d'entrevue.,C'est pour ça que j'ai pu le savoir pendant l'entrevue.,En gros, vous comprendrez ce que vous demanderez au cours de l'entrevue.,Quels sont les problèmes à haute fréquence?,Il est donc très important de brosser les questions lors de la préparation de l'entrevue..

 Ensuite, je vais partager mon profil d'entrevue avec les lecteurs dans le besoin.——Tapez ici gratuitement

Questions d'entrevue et résumé analytique

Trois ans.JavaDéveloppement,Je viens de partir.、JD、Ali revient de l'interview.,Partagez votre expérience personnelle

Scénario d'entrevue en usine

Trois ans.JavaDéveloppement,Je viens de partir.、JD、Ali revient de l'interview.,Partagez votre expérience personnelle

Résumé des points de connaissance

Trois ans.JavaDéveloppement,Je viens de partir.、JD、Ali revient de l'interview.,Partagez votre expérience personnelle

Copyright:Cet article est[Cxyyidd]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819224954504U.html