


MySQL-One maître et plusieurs esclaves méthode de configuration de séparation en lecture et en écriture basée sur l'amibe
MySql est utilisé comme base de données dans le système récemment développé. Étant donné que les données impliquent de l'argent, nous devons être prudents. Dans le même temps, les utilisateurs ont également mis en avant des exigences concernant le nombre maximum de visites. Afin d'éviter que MySQL ne devienne un goulot d'étranglement en termes de performances et d'avoir une bonne tolérance aux pannes, une sauvegarde à chaud maître-esclave et une séparation lecture-écriture sont mises en œuvre. Je garderai une brève note ici pour référence future !
1. Configurer le maître et l'esclave
Conditions : Deux PC, les IP sont respectivement 192.168.168.253 et 192.168.168.251. La version de Mysql sur les deux PC est 5.0. Mysql sur 253 est maître et Mysql sur 251 est esclave.
1. Configuration du serveur de base de données principal
Entrez le répertoire d'installation du serveur de base de données principal, ouvrez my.ini et ajoutez la configuration suivante à la fin du fichier :
#数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值; server-id = 1 #启用二进制日志; log-bin=mysql-bin #需要同步的二进制数据库名; binlog-do-db=minishop #不同步的二进制数据库名,如果不设置可以将其注释掉; binlog-ignore-db=information_schema binlog-ignore-db=mysql binlog-ignore-db=personalsite binlog-ignore-db=test #设定生成的log文件名; log-bin="D:/Database/materlog" #把更新的记录写到二进制文件中; log-slave-updates
Enregistrez le fichier. Redémarrez le service Mysql.
Entrez le répertoire d'installation du serveur de base de données esclave, ouvrez my.ini et ajoutez la configuration suivante à la fin du fichier :
#如果需要增加Slave库则,此id往后顺延; server-id = 2 log-bin=mysql-bin #主库host master-host = 192.168.168.253 #在主数据库服务器中建立的用于该从服务器备份使用的用户 master-user = forslave master-password = ****** master-port = 3306 #如果发现主服务器断线,重新连接的时间差; master-connect-retry=60 #不需要备份的数据库; replicate-ignore-db=mysql #需要备份的数据库 replicate-do-db=minishop log-slave-update
Enregistrez le fichier. Redémarrez le service Mysql.
Entrez dans le serveur de base de données principal, créez le nom d'utilisateur et le mot de passe utilisés pour la sauvegarde ci-dessus, et autorisez la réplication esclave, super et rechargez
mysql>grant replication slave,super,reload on minishop.* to forslave@192.168.168.251 identified by '******';
Entrez dans le serveur de base de données esclave et démarrez Slave.
mysql>slave start; mysql>show slave status\G;
Test : entrez dans le serveur de base de données principal, insérez une donnée dans une table de Minishop, puis vérifiez si le serveur de base de données esclave contient les données qui viennent d'être insérées. complet!
Remarques : 1) Exécutez le serveur de base de données maître configuré avant le serveur de base de données esclave. De cette façon, lors de l'exécution du serveur de base de données esclave, le fichier et la position de la base de données maître seront cohérents avec les paramètres Master_Log_File et Read_Master_Log_Pos. de la base de données esclave. Sinon, des incohérences pourraient survenir. Cela peut également être ajusté via des commandes.
2) Si vous constatez que la réplication maître-esclave échoue, vous pouvez d'abord arrêter le serveur de base de données esclave, puis supprimer les fichiers relay-log.info, hosname-relay-bin*, master.info et d'autres fichiers dans le répertoire de données du serveur de base de données esclave, redémarrez le serveur esclave.
2. Configuration de la séparation en lecture et en écriture
Je voulais utiliser le proxy Mysql pour réaliser la séparation en lecture et en écriture, mais le script Lua qu'il utilisait était vraiment un casse-tête. utilisez le proxy de base de données open source développé par Chinese Pieces of Amoeba. En utilisant Amoeba, vous pouvez facilement réaliser une séparation lecture-écriture avec une configuration XML simple.
Amoeba se situe entre l'application et le serveur de base de données, agissant comme une couche proxy intermédiaire. Il prend en charge l'équilibrage de charge, la haute disponibilité, le filtrage des requêtes, la séparation en lecture-écriture, peut acheminer les requêtes associées vers la base de données cible et peut demander simultanément à plusieurs bases de données de fusionner les résultats. La fonction est très puissante.
Le port par défaut d'Amoeba est 8066, qui implémente le protocole Mysql. L'application n'a besoin que de modifier une connexion à la base de données pour utiliser Amoeba pour proxyer l'accès à la base de données. Par exemple : dans une application Java, si votre chaîne de connexion jdbc d'origine est : jdbc:mysql://192.168.168.42:3306/minishop, alors si vous souhaitez utiliser Amoeba comme proxy d'accès à la base de données, il vous suffit de modifier ce qui précède. chaîne de connexion Remplacez-le par ce qui suit (si l'adresse IP de la machine sur laquelle se trouve Amoeba est 192.168.168.88) : jdbc:mysql://192.168.168.88:8066/minishop. Amoeba fait un excellent travail en matière de transparence.
L'essentiel est de configurer Amoeda, mais la configuration est également assez simple. Fondamentalement, seuls deux fichiers doivent être configurés : confdbServers.xml et confamoeba.xml. Pour la signification de chaque élément de la configuration, vous pouvez vous référer au guide chinois amoeda que je n’expliquerai pas trop ici. Enregistrez simplement la configuration.
Configuration principale dbServers.xml
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/"> <!-- Each dbServer needs to be configured into a Pool, If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration: add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig such as 'multiPool' dbServer --> <dbServer name="abstractServer" abstractive="true"> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">${defaultManager}</property> <property name="sendBufferSize">64</property> <property name="receiveBufferSize">128</property> <!-- mysql port --> <property name="port">3306</property> <!-- mysql schema --> <property name="schema">minishop</property> <!-- mysql user --> <property name="user">chenjie</property> <!-- mysql password --> <property name="password">chenjie</property> </factoryConfig> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <property name="maxActive">500</property> <property name="maxIdle">500</property> <property name="minIdle">10</property> <property name="minEvictableIdleTimeMillis">600000</property> <property name="timeBetweenEvictionRunsMillis">600000</property> <property name="testOnBorrow">true</property> <property name="testWhileIdle">true</property> </poolConfig> </dbServer> <dbServer name="master" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.168.253</property> </factoryConfig> </dbServer> <dbServer name="slave1" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.168.119</property> </factoryConfig> </dbServer> <dbServer name="slave2" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.168.251</property> </factoryConfig> </dbServer> <dbServer name="multiPool" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> <!-- Separated by commas,such as: server1,server2,server1 --> <property name="poolNames">slave1,slave2</property> </poolConfig> </dbServer> </amoeba:dbServers>
Configuration amoeba.xml :
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/"> <proxy> <!-- service class must implements com.meidusa.amoeba.service.Service --> <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager"> <!-- port --> <property name="port">8066</property> <!-- bind ipAddress --> <property name="ipAddress">192.168.168.253</property> <property name="manager">${clientConnectioneManager}</property> <property name="connectionFactory"> <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory"> <property name="sendBufferSize">128</property> <property name="receiveBufferSize">64</property> </bean> </property> <property name="authenticator"> <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <property name="user">chenjie</property> <property name="password">chenjie</property> <property name="filter"> <bean class="com.meidusa.amoeba.server.IPAccessController"> <property name="ipFile">${amoeba.home}/conf/access_list.conf</property> </bean> </property> </bean> </property> </service> <!-- server class must implements com.meidusa.amoeba.service.Service --> <service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer"> <!-- port --> <!-- default value: random number <property name="port">9066</property> --> <!-- bind ipAddress --> <property name="ipAddress">127.0.0.1</property> <property name="daemon">true</property> <property name="manager">${clientConnectioneManager}</property> <property name="connectionFactory"> <bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean> </property> </service> <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext"> <!-- proxy server net IO Read thread size --> <property name="readThreadPoolSize">20</property> <!-- proxy server client process thread size --> <property name="clientSideThreadPoolSize">30</property> <!-- mysql server data packet process thread size --> <property name="serverSideThreadPoolSize">30</property> <!-- per connection cache prepared statement size --> <property name="statementCacheSize">500</property> <!-- query timeout( default: 60 second , TimeUnit:second) --> <property name="queryTimeout">60</property> </runtime> </proxy> <!-- Each ConnectionManager will start as thread manager responsible for the Connection IO read , Death Detection --> <connectionManagerList> <connectionManager name="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper"> <property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property> <!-- default value is avaliable Processors <property name="processors">5</property> --> </connectionManager> <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper"> <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property> <!-- default value is avaliable Processors <property name="processors">5</property> --> </connectionManager> </connectionManagerList> <!-- default using file loader --> <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader"> <property name="configFile">${amoeba.home}/conf/dbServers.xml</property> </dbServerLoader> <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> <property name="ruleLoader"> <bean class="com.meidusa.amoeba.route.TableRuleFileLoader"> <property name="ruleFile">${amoeba.home}/conf/rule.xml</property> <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property> </bean> </property> <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property> <property name="LRUMapSize">1500</property> <property name="defaultPool">master</property> <property name="writePool">master</property> <property name="readPool">multiPool</property> <property name="needParse">true</property> </queryRouter> </amoeba:configuration>
À ce stade, la veille chaude maître-esclave Mysql et lire et écrire La configuration de séparation est terminée. Cependant, l’application spécifique dans l’environnement de production n’a pas encore été testée et étudiée. Plus tard, lors du test d'un maître et de plusieurs esclaves, un serveur de base de données esclave Mysql a été ajouté. C'est pourquoi il y a une adresse IP supplémentaire de 119 dans la configuration amibe ci-dessus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

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

Compétences en matière de traitement de la structure des Big Data : Chunking : décomposez l'ensemble de données et traitez-le en morceaux pour réduire la consommation de mémoire. Générateur : générez des éléments de données un par un sans charger l'intégralité de l'ensemble de données, adapté à des ensembles de données illimités. Streaming : lisez des fichiers ou interrogez les résultats ligne par ligne, adapté aux fichiers volumineux ou aux données distantes. Stockage externe : pour les ensembles de données très volumineux, stockez les données dans une base de données ou NoSQL.

Les performances des requêtes MySQL peuvent être optimisées en créant des index qui réduisent le temps de recherche d'une complexité linéaire à une complexité logarithmique. Utilisez PreparedStatements pour empêcher l’injection SQL et améliorer les performances des requêtes. Limitez les résultats des requêtes et réduisez la quantité de données traitées par le serveur. Optimisez les requêtes de jointure, notamment en utilisant des types de jointure appropriés, en créant des index et en envisageant l'utilisation de sous-requêtes. Analyser les requêtes pour identifier les goulots d'étranglement ; utiliser la mise en cache pour réduire la charge de la base de données ; optimiser le code PHP afin de minimiser les frais généraux.

La sauvegarde et la restauration d'une base de données MySQL en PHP peuvent être réalisées en suivant ces étapes : Sauvegarder la base de données : Utilisez la commande mysqldump pour vider la base de données dans un fichier SQL. Restaurer la base de données : utilisez la commande mysql pour restaurer la base de données à partir de fichiers SQL.

Comment insérer des données dans une table MySQL ? Connectez-vous à la base de données : utilisez mysqli pour établir une connexion à la base de données. Préparez la requête SQL : Écrivez une instruction INSERT pour spécifier les colonnes et les valeurs à insérer. Exécuter la requête : utilisez la méthode query() pour exécuter la requête d'insertion en cas de succès, un message de confirmation sera généré.

L'un des changements majeurs introduits dans MySQL 8.4 (la dernière version LTS en 2024) est que le plugin « MySQL Native Password » n'est plus activé par défaut. De plus, MySQL 9.0 supprime complètement ce plugin. Ce changement affecte PHP et d'autres applications

Pour utiliser les procédures stockées MySQL en PHP : Utilisez PDO ou l'extension MySQLi pour vous connecter à une base de données MySQL. Préparez l'instruction pour appeler la procédure stockée. Exécutez la procédure stockée. Traitez le jeu de résultats (si la procédure stockée renvoie des résultats). Fermez la connexion à la base de données.

La création d'une table MySQL à l'aide de PHP nécessite les étapes suivantes : Connectez-vous à la base de données. Créez la base de données si elle n'existe pas. Sélectionnez une base de données. Créer un tableau. Exécutez la requête. Fermez la connexion.

La base de données Oracle et MySQL sont toutes deux des bases de données basées sur le modèle relationnel, mais Oracle est supérieur en termes de compatibilité, d'évolutivité, de types de données et de sécurité ; tandis que MySQL se concentre sur la vitesse et la flexibilité et est plus adapté aux ensembles de données de petite et moyenne taille. ① Oracle propose une large gamme de types de données, ② fournit des fonctionnalités de sécurité avancées, ③ convient aux applications de niveau entreprise ; ① MySQL prend en charge les types de données NoSQL, ② a moins de mesures de sécurité et ③ convient aux applications de petite et moyenne taille.
