centos7.8 configura la separación de lectura y escritura de la base de datos Amoeba + MySQL

 

1. ¿Qué es la ameba?

El proyecto Amoeba se centra en el desarrollo de proxy de bases de datos distribuidas. Ubicado entre el Cliente y el Servidor de Base de Datos. Transparente para el cliente. Tiene equilibrio de carga, alta disponibilidad, filtrado SQL, separación de lectura y escritura, puede enrutar consultas relacionadas a la base de datos de destino y puede solicitar simultáneamente varias bases de datos para fusionar resultados.

Soluciones principales:

• Reducir la compleja estructura de múltiples bases de datos causada por la segmentación de datos.

• Proporcionar reglas de segmentación y reducir el impacto de las reglas de segmentación de datos en las aplicaciones.

• Reducir el número de conexiones entre la base de datos y los clientes.

• Separación de lectura y escritura

 

2. ¿Por qué utilizar Amoeba?

Actualmente, existen varias soluciones principales para realizar la separación de lectura y escritura maestro-esclavo de MySQL:

1. Implementado a través de programas. Hay muchos códigos listos para usar en Internet, que son relativamente complicados. Si agrega servidores esclavos, debe cambiar los códigos de varios servidores.

2. Implementado a través de mysql-proxy. Dado que la separación de lectura y escritura maestro-esclavo de mysql-proxy se implementa a través de scripts lua, el desarrollo actual de scripts lua no puede seguir el ritmo y no existen scripts perfectos listos para usar. Por eso se usa. En un entorno de producción, el riesgo es relativamente alto. Según muchas personas en Internet, el rendimiento de mysql-proxy no es alto.

3. Desarrolle su propia implementación de interfaz. Esta solución tiene un umbral alto y un alto costo de desarrollo, que las pequeñas empresas comunes y corrientes no pueden permitirse.

4. Utilice el proyecto de código abierto Amoeba de Alibaba para implementarlo, que tiene equilibrio de carga, alta disponibilidad, filtrado SQL, separación de lectura y escritura, puede enrutar consultas relacionadas a la base de datos de destino y la instalación y configuración es muy simple. El software nacional de código abierto debería ser compatible y está actualmente en uso. No publicaré demasiadas conclusiones. Esperaré hasta que se complete la prueba antes de publicar cualquier conclusión, ¡jaja!

 

3. Instalación de ameba

Primero introduzca el entorno de implementación:

amoeba:192.168.121.10 (La máquina donde está instalado amoeba es la versión mysql5.5, que no es compatible con mysql8.0)

masterDB: 192.168.121.20 (mysql8.0 instalado)

esclavoDB: 192.168.121.30 (mysql8.0 instalado)

Los sistemas anteriores son todos centos7.8

 

El marco Amoeba está desarrollado en base a JDK1.5 y adopta las características de JDK1.5, por lo que también necesita instalar un entorno Java. Se recomienda utilizar una versión JDK de javaSE1.5 o superior (la versión jdk1.8.0_242). instalado aquí)

1. Instalar el entorno Java

Primero vaya al sitio web oficial para descargar: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Instalación: Después de descargar el paquete comprimido jdk, simplemente descomprímalo y podrá usarlo, aquí lo descomprimo en el directorio / amoeba / jdk.

tar -zxf jdk-8u251-linux-x64.tar.gz -C /amoeba/jdk

 

Luego configure las variables de entorno de Java: modifique el archivo de configuración /etc/profile

#set java environment
JAVA_HOME=/amoeba/jdk
JRE_HOME=/amoeba/jdk/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

Después de modificar el archivo de configuración, debe volver a cargarlo:

[root@hadoop1 amoeba]# source /etc/profile

Pruebe si la instalación es exitosa

[root@hadoop1 amoeba]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

 El entorno jdk está configurado correctamente.

2. Instalar Ameba

Puede descargar la última versión de Amoeba desde https://sourceforge.net/projects/amoeba/. Lo que descargué aquí es amoeba-mysql-binary-2.1.0-RC5.tar.gz. La instalación de Amoeba es muy simple. Simplemente descomprímalo y úselo. Aquí, descomprima Amoeba en el directorio /usr/local/amoeba. La instalación está completa. Primero cree el directorio amoeba en el directorio /usr/local/ .

[root@hadoop1 opt]# tar -zxf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba/

Puedes ver que la ameba se descomprime de la siguiente manera: 

 

[root@hadoop1 opt]# cd /usr/local/amoeba/
[root@hadoop1 amoeba]# pwd
/usr/local/amoeba
[root@hadoop1 amoeba]# ll
总用量 64
drwxr-xr-x. 2 root root  4096 11月 24 18:28 benchmark
drwxr-xr-x. 2 root root  4096 11月 24 18:40 bin
-rw-r--r--. 1 root root  3983 5月  18 2011 changelogs.txt
drwxr-xr-x. 2 root root  4096 11月 25 14:49 conf
drwxr-xr-x. 3 root root  4096 11月 24 18:28 lib
-rw-r--r--. 1 root root 34520 5月  18 2011 LICENSE.txt
drwxr-xr-x. 2 root root  4096 11月 25 14:50 logs
-rw-r--r--. 1 root root  2031 5月  18 2011 README.html

 éxito.

3. Configurar Ameba

El archivo de configuración de Amoeba se encuentra en el directorio /usr/local/amoeba/conf en este entorno. Hay muchos archivos de configuración, pero si solo usa la función de separación de lectura y escritura, solo necesita configurar dos archivos, a saber, dbServers.xml y amoeba.xml. Si necesita configurar el control de acceso IP, también debe modificar el archivo access_list.conf. Vamos a presentarlo primero: dbServers.xml

[root@hadoop1 amoeba]# cd conf/
[root@hadoop1 conf]# cat dbServers.xml 
<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<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 'multiPool' 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>  #设置Amoeba要连接的mysql数据库的端口,默认是3306
			
			<!-- mysql schema -->
			<property name="schema">testdb</property>  #设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver。注意检查你的数据库里面一定要有这个数据库
			
			<!-- mysql user -->
			<property name="user">test1</property> #设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接
			
			<property name="password">111111</property> #设置amoeba连接后端数据库服务器的账号的密码,注意这里原来是注释的状态,注意把注释去掉,否则无效
		</factoryConfig>

		<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
			<property name="maxActive">500</property> #最大连接数,默认500
			<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="writedb"  parent="abstractServer"> #writedb名称可以根据自己需求改变
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.121.20</property> #这里写你预设的想写入数据的主服务器IP
		</factoryConfig>
	</dbServer>
	
	<dbServer name="slave"  parent="abstractServer"> #slave名称可以根据自己需求改变
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.121.30</property> #这里写你预设的想读取数据的从服务器IP
		</factoryConfig>
	</dbServer>
	<dbServer name="myslave" virtual="true"> #写你的连接池,myslave池名称可以改,这个池提供客户端读取数据
		<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">slave</property> #指定读取数据时从从服务器上读取。也可以指定读取数据时从主服务器和从服务器上读取,则改成writedb,slave
		</poolConfig>
	</dbServer>
		
</amoeba:dbServers>
[root@hadoop1 conf]# 
另一个配置文件amoeba.xml
[root@hadoop1 conf]# cat amoeba.xml 
<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<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> #设置amoeba监听的端口,默认是8066
			
			<!-- bind ipAddress -->
			<property name="ipAddress">192.168.121.10</property> #配置监听的接口,此处写amoeba安装所在的服务器IP,注意把原本的注释状态取消,否则无效
			
			<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">amoeba</property> # 提供客户端连接amoeba时需要使用这里设定的账号 (这里的账号密码和amoeba连接后端数据库服务器的密码无关)
					
					<property name="password">123456</property> #客户端连接amoeba时的账户的密码
					
					<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">writedb</property> #设置amoeba默认连接的池,这里设置为writedb
		
		<property name="writePool">writedb</property> #这两个选项默认是注销掉的,需要取消注释,这里用来指定前面定义好的俩个读写池。写入数据到刚才dbServer.xml中配置的write池
		<property name="readPool">myslave</property> #写入数据到刚才dbServer.xml中配置的write池
		<property name="needParse">true</property>
	</queryRouter>
</amoeba:configuration>
[root@hadoop1 conf]# 

Modifique el script amoeba; de lo contrario, el inicio de JVM fallará debido a que el tamaño de la pila es demasiado pequeño. Debe realizar las siguientes modificaciones:

[root@hadoop1 bin]# vim /usr/local/amoeba/bin/amoeba
58 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"

 

4. Cree la base de datos testdb en masterdb (verifique si la sincronización maestro-esclavo es normal. La configuración de la sincronización maestro-esclavo no se explicará aquí. Puede consultar el proceso de configuración anterior)

Compruebe si Slavedb se copió correctamente:

Arriba, la configuración de sincronización maestro-esclavo es exitosa.

 

Autorice amoedb en masterdb y SlavedDB respectivamente (tenga en cuenta que debido a que la sincronización maestro-esclavo está configurada en este momento, la operación de autorización se realiza aquí. Simplemente hágalo una vez en el servidor maestro y el servidor esclavo se sincronizará automáticamente)

mysql8.0如下方式授权:
mysql>create user 'test1'@'192.168.121.10' identified with mysql_native_password by '111111';

mysql>GRANT ALL ON testdb.* TO 'test1'@'192.168.121.10';

mysql>flush privileges;
mysql> GRANT ALL ON testdb.* TO 'test1'@'192.168.121.10' IDENTIFIED BY '111111';
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

Iniciar ameba

[root@hadoop1 bin]# pwd
/usr/local/amoeba/bin
[root@hadoop1 bin]# 
[root@hadoop1 bin]# ./amoeba start
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2020-11-25 16:17:49,825 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.1.0-RC5
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2020-11-25 16:17:50,491 INFO  net.ServerableConnectionManager - Amoeba for Mysql listening on /192.168.121.10:8066.
2020-11-25 16:17:50,506 INFO  net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:28750.

Comenzó con éxito.

 

Verifique el puerto para ver el estado de inicio de ameba:

De esto podemos ver que Amoeba se inicia normalmente.

 

5. Prueba

Inicie sesión de forma remota en el cliente mysql para conectarse a la base de datos mysql especificando el nombre de usuario, la contraseña y el puerto especificados en el archivo de configuración de amoeba y la dirección IP del servidor de amoeba. Tenga en cuenta que -h escribe el servidor donde se encuentra amoeba .

[root@hadoop1 bin]# mysql -uamoeba -p -h192.168.121.10 -P8066
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1899284416
Server version: 5.1.45-mysql-amoeba-proxy-2.1.0-RC5 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

Los datos actuales son los siguientes:

En la base de datos del cliente testdb tabla a e inserte datos:

Arriba, se verifica que el servidor maestro esté configurado para escribir datos correctamente.

 

Verifique si la configuración de datos de lectura es exitosa:

Ahora insertamos un dato del servidor.

  •  Debido a que el servidor maestro-esclavo está configurado, el servidor esclavo inserta datos y no sincroniza los datos con el servidor maestro.
  • Pero el cliente que configuramos lee datos del servidor esclavo.
  • Por lo tanto, el cliente leerá los datos recién agregados del servidor.

 

Arriba, la configuración de separación de lectura y escritura fue exitosa.

 

 

 

Supongo que te gusta

Origin blog.csdn.net/liuwkk/article/details/110093118
Recomendado
Clasificación