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的具体数据库
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';
/etc/init.d/mysqld restart
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;
mysql> start slave;
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 161261
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>
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!