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

Pratique de séparation en lecture et en écriture MySQL - Exemples de code pour créer un Web haute performance

黄舟
黄舟original
2017-03-11 14:28:241111parcourir

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 master

Modifiez 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 restart
Vérifiez enfin l'état du maître :


3) Configurer l'esclave

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


En vérifiant le journal de la machine esclave (/var/log/mysqld.log) :

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
Si 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 ici

1) Installer amibe

Té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ée

2) Configurez amiba

Configurez 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=&#39;replace_word&#39; title=".NET知识库" target=&#39;_blank&#39; style=&#39;color:#df3434; font-weight:bold;&#39;>.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=&#39;replace_word&#39; title=".NET知识库" target=&#39;_blank&#39; style=&#39;color:#df3434; font-weight:bold;&#39;>.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

1) Écrire un programme d'appel client

Les détails spécifiques du programme ne seront pas détaillés, il s'agit simplement du programme d'exploitation de base de données JDBC le plus courant basé sur le pilote MySQL

2) Configurer la connexion à la base de données

🎜>

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,&#39;name_20003&#39;)

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,&#39;name_20003&#39;)

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,&#39;name_20003&#39;)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn