mysql基于Amoeba(变形虫)实现读写分离

article/2025/9/13 14:42:24

一,Amoeba介绍

1、什么是amoeba?

​ Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

主要解决:

• 降低 数据切分带来的复杂多数据库结构

• 提供切分规则并降低 数据切分规则 给应用带来的影响

• 降低db 与客户端的连接数

• 读写分离

2、为什么要用Amoeba

目前要实现mysql的主从读写分离,主要有以下几种方案:

1、 通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。

2、 通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。

二、实验环境

1、准备五台主机,其中三台已经实现了Mysql的主从复制(主从复制不再演示,从安装Amoeba开始),一台安装Amoeba,一台用作试验机

  • mysql-master:192.168.200.111

  • mysql-slave1:192.168.200.112

  • mysql-slave2:192.168.200.113

  • Amoeba:192.168.200.114

  • Client:192.168.200.115

2、所有主机关闭安全机制和防火墙。

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0

二、在主机Amoeba上安装java环境(192.168.200.114)

1、上传需要的安装包

[root@amoeba ~]# ls
amoeba-mysql-binary-2.2.0.tar.gz  jdk-6u14-linux-x64.bin
anaconda-ks.cfg

2、执行.bin文件(就相当于解压.tar包)

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin 
[root@amoeba ~]# ./jdk-6u14-linux-x64.bin 
[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6

3、设置开机启动项,添加内容

[root@amoeba ~]# vim /etc/profile 
export JAVA_HOME=/usr/local/jdk1.6     //声明一个全局变量JAVA_HOME,安装路径为/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib   //更新类的搜索路径
export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin
​
export AMOEBA_HOME=/usr/local/amoeba   //amoeba的解压路径
export PATH=$PATH:$AMOEBA_HOME/bin   //amoeba的命令

4、jdk安装完成后,java的版本与jdk的版本不同,删除高版本的java程序文件,重新执行一下/etc/profile

[root@amoeba ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
[root@amoeba ~]# which java
/usr/bin/java
[root@amoeba ~]# rm -rf /usr/bin/java 
[root@amoeba ~]# source /etc/profile
[root@amoeba ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

三、安装并配置Amoeba(192.168.200.114)

1、解压安装包

[root@amoeba ~]# mkdir /usr/local/amoeba
[root@amoeba ~]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/

2、配置Amoeba的读写分离,两个Slave读负载均衡

在Master、Slave1、Slave2服务器中配置Amoeba的访问授权

[root@mysql-m ~]# mysql -uroot -p123123    //三台主机都要执行
MariaDB [(none)]> grant all on *.* to 'test'@'192.168.200.%' identified by '123123';   //对所有库下的所有表,授权的用户名为test,允许访问的网段为200网段,密码为123123.
Query OK, 0 rows affected (0.01 sec)
​
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4、编辑amoeba.xml配置文件

[root@amoeba ~]# cd /usr/local/amoeba/
[root@amoeba amoeba]# ls
benchmark  changelogs.txt  lib          README.html
bin        conf            LICENSE.txt
[root@amoeba amoeba]# cd conf/
[root@amoeba conf]# ls
access_list.conf  dbServers.xml    log4j.xml
amoeba.dtd        function.dtd     rule.dtd
amoeba.xml        functionMap.xml  ruleFunctionMap.xml
dbserver.dtd      log4j.dtd        rule.xml
[root@amoeba conf]# cp amoeba.xml amoeba.xml.bak
[root@amoeba conf]# vim amoeba.xml
30           <property name="user">amoeba</property>      //客户端必须拿这个用户名和密码登录amoeba
32           <property name="password">123123</property>
​
115          <property name="defaultPool">master</property>   //默认
118          <property name="writePool">master</property>    //写的池,交给master
119          <property name="readPool">slaves</property>     //读的池,交给slaves组

5、编辑dbServer.xml配置文件

[root@amoeba conf]# cp dbServers.xml dbServers.xml.bak
​
[root@amoeba ~]# vim /usr/local/amoeba/conf/dbServers.xml19                         <!-- mysql port -->20                         <property name="port">3306</property>21 22                         <!-- mysql schema -->23                         <property name="schema">test</property>24 25                         <!-- mysql user -->26                         <property name="user">test</property>27 28                         <!--  mysql password --> 29                         <property name="password">123123</property>
​45         <dbServer name="master"  parent="abstractServer">46                 <factoryConfig>47                         <!-- mysql ip --> 48                         <property name="ipAddress">192.168.200.111</property>49                 </factoryConfig>50         </dbServer>51 52         <dbServer name="slave1"  parent="abstractServer">53                 <factoryConfig>54                         <!-- mysql ip --> 55                         <property name="ipAddress">192.168.200.112</property>56                 </factoryConfig>57         </dbServer>58         <dbServer name="slave2"  parent="abstractServer">59                 <factoryConfig>60                         <!-- mysql ip -->61                         <property name="ipAddress">192.168.200.113</property> 62                 </factoryConfig>63         </dbServer> 
​
​66         <dbServer name="slaves" virtual="true">    //声明组67                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">68                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->69                         <property name="loadbalance">1</property>  //组内成员的效果为轮询70                         71                         <!-- Separated by commas,such as: server1,server2,server1 -->72                         <property name="poolNames">slave1,slave2</property>73                 </poolConfig>74         </dbServer>

6、配置无误后,启动Amoeba软件,默认端口为TCP协议8066

nohup:执行命令不依赖于任何终端

[root@amoeba ~]# nohup /usr/local/amoeba/bin/amoeba start &   //将命令放到后台运行,不依赖于任何终端
​
[root@amoeba ~]# netstat -lnpt   //查看端口8066
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1366/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1632/master         
tcp6       0      0 :::8066                 :::*                    LISTEN      21943/java          
tcp6       0      0 127.0.0.1:18195         :::*                    LISTEN      21943/java          
tcp6       0      0 :::22                   :::*                    LISTEN      1366/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1632/master 

四、client客户机访问测试(192.168.200.115)

安装mariadb

1、连接数据库测试

[root@client ~]# mysql -u amoeba -p123123 -h 192.168.200.114 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 74675057
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 MariaDB Server
​
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
MySQL [(none)]> 

2、测试读写分离

master主机上

MariaDB [(none)]> create database db_test;
Query OK, 1 row affected (0.00 sec)
​
MariaDB [(none)]> use db_test;
Database changed
MariaDB [db_test]> create table student (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.01 sec)

建完库之后在两台slave机上查看,能看到新建的库说明主从复制没有问题

3、将两台slave主机上的主从服务给关掉

salve1:
MariaDB [(none)]> stop salve;
​
-------------------------------------------------------------------------------
​
slave2:
MariaDB [(none)]> stop salve;

编写测试

master:
MariaDB [db_test]> insert into student values('1','crushlinux','this_is_master');
Query OK, 1 row affected (0.01 sec)
​
---------------------------------------------------------------------------
slave1:
MariaDB [db_test]> insert into student values('2','crushlinux','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
​
--------------------------------------------------------------------------
slave2:
Database changed
MariaDB [db_test]> insert into student values('3','crushlinux','this_is_slave2');
Query OK, 1 row affected (0.01 sec)

从client客户机上访问,访问到的是两台salve机的轮询

MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
+------+------------+----------------+
1 row in set (0.00 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
+------+------------+----------------+
1 row in set (0.01 sec)

4、客户机上添加一个数据,访问,还是读到两台slave机上的

MySQL [db_test]> insert into student values('4','crushlinux','this_is_client');
Query OK, 1 row affected (0.01 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
+------+------------+----------------+
1 row in set (0.01 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
+------+------------+----------------+
1 row in set (0.02 sec)

在client机上写数据时,写交给master主机来处理,两台slave主机没有变化,因为此时主从服务已经停了,所以两台slave机上不会访问到master主机上写入的内容

5、开启主从复制测试

slave1:
MariaDB [db_test]> start slave;
Query OK, 0 rows affected (0.00 sec)
​
-----------------------------------------------------------------------
slave2:
MariaDB [db_test]> start slave;
Query OK, 0 rows affected (0.01 sec)
​
==========================================
​
client:
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
|    1 | crushlinux | this_is_master |
|    4 | crushlinux | this_is_client |
+------+------------+----------------+
3 rows in set (0.01 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
|    1 | crushlinux | this_is_master |
|    4 | crushlinux | this_is_client |
+------+------------+----------------+
3 rows in set (0.01 sec)

主从复制开启后,两台slave机上可以读取到master主机上写入的数据,client在访问测试的时候就能读到主机上的数据,因为两台slave机是轮询效果,所以能访问到1、2、4或1、3、4


http://chatgpt.dhexx.cn/article/mLKLjHYG.shtml

相关文章

Amoeba:开源的分布式数据库Porxy解决方案

什么是Amoeba? Amoeba(变形虫)项目&#xff0c;该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层&#xff0c;它主要在应用层访问MySQL的 时候充当SQL路由功能&#xff0c;专注于分布式数据库代理层&#xff08;Database …

findbugs html报告,利用findBugs插件来扫描代码,并用ant生成报告

最近项目要用findbugs插件来生成报告&#xff0c;总结了一下用法和如何生成报告 1&#xff0c; 把下载的压缩包解压后&#xff0c;把 copy到eclipse的plugin目录中去&#xff1b; 2&#xff0c; 重新启动eclipse 3&#xff0c; 打开eclipse->window->Preferences&#xf…

AS之Findbugs

一 前言 Findbugs是由 National Science Foundation支持的一个用静态分析的方式来寻找Java代码中Bug的项目&#xff0c;它是一个静态分析工具&#xff0c;它检查类或者jar文件&#xff0c;将字节码和一组缺陷模式进行对比以发现可能的问题。有了静态分析工具&#xff0c;就可以…

AndroidStudio中FindBugs的简单使用教程

对于代码质量的检查&#xff0c;一直是一个比较棘手的问题。虽然我们部门有关于java代码的各种规范&#xff0c;领导也多次强调对代码的评审。 但是在实际执行过程中&#xff0c;由于开发人员的水平参差不齐&#xff0c;在开发项目时还有各种其他因素&#xff0c;比如时间紧任…

maven项目集成findbugs详解

文章目录 0、概述一、接入方式二、如何使用方式一、在控制台中执行打包命令方式二、使用IntelliJ IDEA的maven工具&#xff08;其他IDE用户忽略&#xff09; 三、bug详情查看四、忽略指定的包、类、类中的方法步骤一、在pom.xml中 增加配置。步骤二、增加配置文件&#xff0c;用…

Findbugs maven 插件使用

Findbugs maven 插件使用 FindBugs™手册 http://findbugs.sourceforge.net/manual/index.html 0、概述 FindBugs是一个静态分析工具&#xff0c;它将**字节码&#xff08;因此需要先编译&#xff09;**与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具&#xff0c;…

检查代码质量的插件Findbugs使用说明

一、简介 Findbugs是一个静态分析工具&#xff0c;它检查类或者jar文件&#xff0c;将字节码与一组缺陷模式进行对比以发现可能的问题。利用这个工具可以在不实际运行程序的情况下对软件进行分析。可以帮助改进代码质量。Findbugs提供了方便操作的可视化界面&#xff0c;同时也…

Findbugs的使用

转载请注明出处&#xff1a;http://blog.csdn.net/feibendexiaoma/article/details/72821781前言 Findbugs很多人都并不陌生&#xff0c;Eclipse中有插件可以帮助查找代码中隐藏的bug&#xff0c;IDEA中也有这款插件。这个插件可以帮助我们查找隐藏的bug,比较重要的功能就是查找…

android studio findbugs 过滤,Android Studio中使用FindBugs

1.什么是FindBugs 一句话简单理解就是&#xff1a;是一个工具&#xff0c;可以用它自动帮你找出代码中潜在的BUG。当然事实并不一定总是如此&#xff0c;也有很多它找不出来的地方。下面将直接介绍如何在Android Studio中的简单使用。有兴趣的童鞋可以自己去了解了解&#xff0…

FindBugs插件

官网 FindBugs官网&#xff1a;http://findbugs.sourceforge.net/ 插件安装 点击settings---->plugins---->Browse repositories 搜索框输入FindBugs-IDEA并点击右侧Install按钮 安装完毕后重启idea&#xff0c;发现左下角多了一个FindBugs图标 插件使用 在被检查文…

eclipse常用插件之FindBugs

1、简介 FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具。FindBugs通过检查类文件或 JAR文件&#xff0c;将字节码与一组缺陷模式进行对比从而发现代码缺陷&#xff0c;完成静态代码分析。FindBugs既提供可视化 UI 界面&#xff0c;同时也可以作为 Eclipse插件使…

php findbugs,findBugs插件

现在使用Java进行开发的软件已经很多了&#xff0c;那么我们在使用Java开发的时候&#xff0c;是不是会遇到各种各样的错误了&#xff0c;有的错误隐藏着&#xff0c;有的错误你发现了&#xff0c;可以修改&#xff0c;那没有发现的错误就令人担忧了&#xff01;小编这款插件就…

软件测试实验 FindBugs

1.配置 FindBugs 打开 Eclipse&#xff0c;通过【Window -> Preferences】下【Java -> FindBugs】查看 FindBugs的 配置情况。问题: 这里可以配置 FindBugs的哪些特性&#xff1f; 选择导入的项目&#xff0c;通过【Window -> Preferences】下【Java -> FindBugs…

Findbug使用指南

Findbug使用指南 findbugs是一个开源的eclipse 代码检查工具&#xff1b;它可以简单高效全面地帮助我们发现程序代码中存在的bug&#xff0c;bad smell&#xff0c;以及潜在隐患。针对各种问题&#xff0c;它并且提供了简单的修改意见供我们重构时进行参考&#xff1b; 通过使…

findbugs用法教程

代码分析工具FindBugs详细配置使用教程 一&#xff0c;关于FindBugs (1) FindBugs 是由马里兰大学提供的一款开源 Java 静态代码分析工具&#xff0c;它检查类或者 JAR 文件&#xff0c;将字节码与一组缺陷模式进行对比以发现可能的问题(先对编译后的class进行扫描&#xff0c;…

自动找Bug/插件-代码静态检查findbugs-idea安装以及使用

目录 简介 IDEA安装FindBugs Findbugs配置 配置排除一些类 扫描级别 IDEA中使用FindBugs: 一些常见错误 补充 简介 Findbugs是一个静态分析工具&#xff0c;它检查类或者JAR 文件&#xff0c;将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器&…

Elasticsearch安装IK分词器、配置自定义分词词库

一、分词简介1、单字分词&#xff1a;2、二分法分词&#xff1a;3、词库分词&#xff1a; 二、配置IK中文分词器三、配置自定义分词拓展词库 一、分词简介 在Elasticsearch中&#xff0c;假设搜索条件是“华为手机平板电脑”&#xff0c;要求是只要满足了其中任意一个词语组合…

Elasticsearch 英文分词 中文分词

对于倒排索引来说&#xff0c;很重要的一件事情就是需要对文本进行分词&#xff0c;经过分词可以获取情感、词性、质性、词频等等的数据。 Elasticsearch 分词工作原理 在 Elasticsearch 中进行行分词的需要经过分析器的3个模块&#xff0c;字符过滤器将文本进行替换或者删除&…

【ElasticSearch】分词器(ElasticSearchIK分词器)

1. 分词器介绍 •IKAnalyzer 是一个开源的&#xff0c;基于java语言开发的轻量级的中文分词工具包•是一个基于Maven构建的项目•具有60万字/秒的高速处理能力•支持用户词典扩展定义 2. ik 分词器安装 IK 分词器安装 3. 分词器的使用 IK分词器有两种分词模式&#xff1a;ik…

ElasticSearch中文分词,看这一篇就够了

写在前面&#xff1a;我是「且听风吟」&#xff0c;目前是某上市游戏公司的大数据开发工程师&#xff0c;热爱大数据开源技术&#xff0c;喜欢分享自己的所学所悟&#xff0c;现阶段正在从头梳理大数据体系的知识&#xff0c;以后将会把时间重点放在Spark和Flink上面。 如果你…