Maison > Article > base de données > Pratique de séparation en lecture et en écriture MySQL - Exemples de code pour créer un Web haute performance
Un environnement MySQL complet de séparation en lecture-écriture comprend les parties suivantes :
Client d'application
proxy de base de données
cluster de base de données
Dans ce combat réel, le client de l'application se connecte au proxy de base de données back-end basé sur c3p0. Le proxy de base de données est responsable de la gestion de la stratégie de routage permettant aux clients d'accéder réellement à la base de données, à l'aide du framework open source amiba. Le cluster de bases de données utilise la solution de réplication maître-esclave de MySQL. Le schéma de structure de l'ensemble de l'environnement est le suivant :
Étapes pratiques et explications détaillées
1. Construire l'environnement maître-esclave de MySQL.
1) Installez mysql (5.0.45) sur host1 (10.20.147.110) et host2 (10.20.147.111) respectivement. La méthode d'installation spécifique peut être trouvée dans le document officiel
2) Configurez masterModifiez d'abord /etc/my.cnf et ajoutez la configuration suivante :
log-bin=mysql-bin #slave会基于此log-bin来做replication server-id=1 #master的标示 binlog-do-db = amoeba_study #用于master-slave的具体数据库Ajoutez ensuite un utilisateur spécifiquement pour la réplication :
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';Redémarrez MySQL pour que la configuration prenne effet :
/etc/init.d/mysqld restartVérifiez enfin l'état du maître :
Modifiez d'abord /etc/my.cnf , ajoutez la configuration suivante : server-id=2 #slave label Une fois la configuration prise en compte, configurez la connexion avec le maître :
mysql> CHANGE MASTER TO -> MASTER_HOST='10.20.147.110', -> MASTER_USER='repl', -> MASTER_PASSWORD='111111', -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=161261;où MASTER_HOST est l'IP de la machine maître, MASTER_USER et MASTER_PASSWORD sont les utilisateurs que nous venons d'ajouter sur le maître et MASTER_LOG_POS correspondent aux informations dans l'état du maître Enfin démarrez l'esclave. :
mysql> start slave;4) Vérifier le maître - La build esclave prend effet
100703 10:51:42 [Note] Slave I/O thread: connected to master 'repl@10.20.147.110:3306', replication started in log 'mysql-bin.000003' at position 161261Si vous voyez les informations ci-dessus, cela prouve que la construction est réussie. S'il y en a, la cause du problème peut également être trouvée via ce journal
2. . Construisez un proxy de base de données
Dans ce combat réel, le proxy de base de données utilise l'amibe. , ses informations associées peuvent être trouvées dans les documents officiels, qui ne seront pas détaillés ici1) Installer amibeTélécharger amibe (1.2.0-GA) et décompressez-le localement (D : /openSource/amoeba -mysql-1.2.0-GA), c'est-à-dire que l'installation est terminée2) Configurez amibaConfigurez d'abord la connexion proxy et les informations de connexion avec chaque back- serveur mysql final (D:/openSource/amoeba- mysql-1.2.0-GA/conf/amoeba.xml) : Ce qui précède est la configuration de connexion fournie par proxy au client<dbServerList> <dbServer name="server1"> <!-- PoolableObjectFactory实现类 --> <factoryConfig class="com.meidusa.amoeba.mysql <a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.NET</a> .MysqlServerConnectionFactory"> <property name="manager">defaultManager</property> <!-- 真实mysql数据库端口 --> <property name="port">3306</property> <!-- 真实mysql数据库IP --> <property name="ipAddress">10.20.147.110</property> <property name="schema">amoeba_study</property> <!-- 用于登陆mysql的用户名 --> <property name="user">root</property> <!-- 用于登陆mysql的密码 --> <property name="password"></property> </factoryConfig> <!-- ObjectPool实现类 --> <poolConfig class="com.meidusa.amoeba <a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.Net</a> .poolable.PoolableObjectPool"> <property name="maxActive">200</property> <property name="maxIdle">200</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="server2"> <!-- PoolableObjectFactory实现类 --> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">defaultManager</property> <!-- 真实mysql数据库端口 --> <property name="port">3306</property> <!-- 真实mysql数据库IP --> <property name="ipAddress">10.20.147.111</property> <property name="schema">amoeba_study</property> <!-- 用于登陆mysql的用户名 --> <property name="user">root</property> <!-- 用于登陆mysql的密码 --> <property name="password"></property> </factoryConfig> <!-- ObjectPool实现类 --> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <property name="maxActive">200</property> <property name="maxIdle">200</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> </dbServerList>Ce qui précède est la configuration de chaque serveur de base de données mysql entre proxy et backend Informations, la configuration spécifique est très claire dans les commentaires Enfin configurer la stratégie de séparation en lecture et en écriture : De la configuration ci-dessus, on constate que l'opération d'écriture est acheminée vers le serveur1 (maître), et l'opération de lecture est acheminée vers le serveur2 (esclave) )3) Démarrez amibe et exécutez D :/openSource/amoeba-mysql-1.2.0-GA/amoeba.bat dans la ligne de commande :
log4j:WARN log4j config load completed from file:D:/openSource/amoeba-mysql-1.2.0-GA/conf/log4j.xml log4j:WARN ip access config load completed from file:D:/openSource/amoeba-mysql-1.2.0-GA/conf/access_list.conf 2010-07-03 09:55:33,821 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.
3. Appel et test du client
Ce client est basé sur c3p0. La configuration spécifique de la source de données est la suivante :
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" /> <property name="user" value="root" /> <property name="password" value="root" /> <property name="minPoolSize" value="1" /> <property name="maxPoolSize" value="1" /> <property name="maxIdleTime" value="1800" /> <property name="acquireIncrement" value="1" /> <property name="maxStatements" value="0" /> <property name="initialPoolSize" value="1" /> <property name="idleConnectionTestPeriod" value="1800" /> <property name="acquireRetryAttempts" value="6" /> <property name="acquireRetryDelay" value="1000" /> <property name="breakAfterAcquireFailure" value="false" /> <property name="testConnectionOnCheckout" value="true" /> <property name="testConnectionOnCheckin" value="false" /> </bean>
Il convient de noter que le client n'a besoin que de se connecter au proxy et n'a rien à faire. avec la base de données réelle, donc les configurations jdbcUrl, utilisateur et mot de passe correspondent toutes aux informations de configuration exposées par amibe
3) Appel et test
Insérez d'abord une donnée :
insert into zone_by_id(id,name) values(20003,'name_20003')
En vérifiant le log /var/lib/mysql/mysql_log.log sur la machine maître :
100703 11:58:42 1 Query set names latin1 1 Query SET NAMES latin1 1 Query SET character_set_results = NULL 1 Query SHOW VARIABLES 1 Query SHOW COLLATION 1 Query SET autocommit=1 1 Query SET sql_mode='STRICT_TRANS_TABLES' 1 Query SHOW VARIABLES LIKE 'tx_isolation' 1 Query SHOW FULL TABLES FROM `amoeba_study` LIKE 'PROBABLYNOT' 1 Prepare [1] insert into zone_by_id(id,name) values(?,?) 1 Prepare [2] insert into zone_by_id(id,name) values(?,?) 1 Execute [2] insert into zone_by_id(id,name) values(20003,'name_20003')
On sait que l'opération d'écriture s'est produite sur la machine maître
En vérifiant le log /var/lib/mysql/mysql_log.log sur la machine esclave :
100703 11:58:42 2 Query insert into zone_by_id(id,name) values(20003,'name_20003')
On sait que l'esclave a exécuté cette instruction de manière synchrone
et puis vérifiez les données : sélectionnez t.name depuis zone_by_id t où t.id = 20003
Lisez en vérifiant le journal /var/lib/mysql/mysql_log.log sur la machine esclave :
100703 12:02:00 33 Query set names latin1 33 Prepare [1] select t.name from zone_by_id t where t.id = ? 33 Prepare [2] select t.name from zone_by_id t where t.id = ? 33 Execute [2] select t.name from zone_by_id t where t.id = 20003
L'opération s'est produite sur la machine esclave
et en vérifiant le log /var/lib/mysql/mysql_log.log sur la machine esclave, il a été constaté que cette instruction n'a pas été exécutée sur la machine maître
Grâce à la vérification ci-dessus, on sait que la simple construction maître-esclave et le combat réel peuvent prendre effet
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!