Maison  >  Article  >  base de données  >  Mysql-Introduction à l'exemple de code de configuration de séparation maître-multi-esclave et lecture-écriture

Mysql-Introduction à l'exemple de code de configuration de séparation maître-multi-esclave et lecture-écriture

黄舟
黄舟original
2017-03-11 14:30:521086parcourir

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 &#39;multiPool&#39; 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, Mysql master- Slave Hot Standby La configuration de la séparation en lecture et en écriture 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!

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