2017-06-21 2 views
0

J'ai une question de réplication MySql Maître/Esclave à laquelle google n'a pas pu répondre. Lorsque vous utilisez com.mysql.jdbc.ReplicationDriver, comment le pilote gère-t-il les échecs sur les réplicas en lecture? Le fait-il de les mettre sur liste noire, essaie-t-il simplement de continuer à les essayer et de lancer une exception à chaque fois (après que les délais aient été configurés)? De mes tests il semble que mon application est juste suspendue quand je tue une réplique en lecture. J'utilise tomcat et voici mon context.xml ....Mysql ReplicationDriver - gestion des erreurs

<Resource auth="Container" 
     driverClassName="com.mysql.jdbc.ReplicationDriver" 
     defaultAutoCommit="false" 
     initialSize="10" 
     minIdle="5" 
     logAbandoned="false" 
     maxIdle="10" 
     maxWait="10000" 
     name="jdbc/db" 
     removeAbandoned="true" 
     testOnBorrow="true" 
     removeAbandonedTimeout="86400" 
     testWhileIdle="true" 
     type="javax.sql.DataSource" 
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     username="powerptc" 
     password="password" 
     url="jdbc:mysql:replication://localhost:3306,host1,host2:3306/db?allowSlavesDownConnections=true&amp;readFromMasterWhenNoSlaves=true" 
     validationQuery="/* ping */ SELECT 1" 
     validationQueryTimeout="5" /> 

Est-il possible d'avoir la liste noire du pilote une réplique lecture a échoué (pour x minutes) au lieu d'une nouvelle tentative encore et encore ?

Répondre

2

Dans ce cas, le pilote MySQL utilise LoadBalanced driver pour les esclaves et ne passe au maître que si la connexion du cluster LoadBalanced d'esclaves échoue. Application suspendue, car la valeur par défaut est retriesAllDown = 120. Si vous définissez retriesAllDown = 4, Load Balancer dormira 4 fois pour 250 millisecondes avant de passer au maître.

Par défaut loadBalanceBlacklistTimeout = 0, cela signifie que l'équilibreur de charge pour les esclaves n'utilise pas de liste noire. Même si vous définissez loadBalanceBlacklistTimeout > 0, cela n'aide pas, car une implémentation étrange de la liste noire, qui est vide si tous les hôtes sont ajoutés à la liste noire. Mais vous pouvez utiliser l'astuce suivante: Utilisez ServerAffinityStrategy et placez le nom d'hôte maître dans la liste des esclaves, mais ne définissez que des esclaves comme serveurs d'affinité.

Mon URL de travail est:

jdbc:mysql:replication://master:3306,slave1,slave2:3306/db?allowSlaveDownConnections=true&readFromMasterWhenNoSlaves=true&loadBalanceBlacklistTimeout=30000&retriesAllDown=4&loadBalanceStrategy=serverAffinity&serverAffinityOrder=slave1,slave2 

En conséquence, le maître ne sera utilisée que s'il n'y a pas esclave disponible