【前言】 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
之前我们有介绍过如何搭建主从,主主,一主多从, 多主一从数据库集群,那么我们今天就来介绍如何通过中间键Amoeba 来实现主从数据库的读写分离, 从而提升数据库的负载性能。
在主、从服务器上安装mysql mysql-server
先准备三台服务器:
192.168.93.100 mysql-master 充当主服务器
192.168.93.101 mysql-slave 充当从服务器
192.168.93.110 充当amoeba server , 同是也充当client 端来做amoeba读写分离的测试。
1. 在两台服务器上面安装MySQL,启动服务并设置服务开机自起
yum -y install mariadb mariadb-server
systemctl start mariadb
systemctl enable mariadb
2. 开启MySQL的二进制日志:
在/etc/my.cnf 配置文件中开启bin-log 日志
3. 在主服务器上授权,从服务器上保存授权信息,并开启从服务线程
4. 测试主从同步
在主服务器上创建一个名为Yuki的数据库, 在从服务器上也可以看到该数据库, 则证明主从同步成功!
5.关闭从服务器线程
(该操作只是为了演示amoeba实现读写分离的测试效果,实际生产环境中是不能停掉的)
1. 安装gcc 环境(amoeba需要源码安装)
yum -y install gcc*
2. 下载安装包并上传到机器
jdk 的下载路径:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
Amoeba 可以使用下面的命令直接下载到本机:
wget https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz
3. 创建单独的安装目录
4. 安装jdk (amoeba 是由java语言编写的,所以先安装jdk),配置java 环境
cd /root
tar -xf jdk-8u152-linux-x64.tar.gz -C /amoeba/
cd /amoeba/
ls
ln -s jdk1.8.0_152/ jdk
5. 声明用java 写出来的程序如何调用(/etc/proflie)
编辑 /etc/profile 文件添加以下变量
JAVA_HOME=/amoeba/jdkexport JAVA_HOMEexport PATH=PATH:JAVA_HOME/binexport CLASSPATH=.:JAVA_HOME/bin/tools.jar:JAVA_HOME/lib/dt.jar:
运行 source /etc/proflie, 加载参数文件, 使其生效。
测试一下:
成功看到java 版本,安装成功!
6. 安装并配置amoeba
安装amoeba:
[root@middleware amoeba]# cd /usr/local/
[root@middleware local]# mkdir amoeba
[root@middleware local]# tar -xf /root/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@middleware local]# cd amoeba/
[root@middleware amoeba]# ls
benchmark bin changelogs.txt conf lib LICENSE.txt README.html
[root@middleware amoeba]# chmod -R +x /usr/local/amoeba/bin/
[root@middleware amoeba]#
现在我们来配置amoeba这个软件。amoeba 的主配置文件存放在/usr/local/amoeba/conf/目录下。
1) 编辑amoeba.xml配置文件
vim /usr/local/amoeba/conf/amoeba.xml
修改如下几行内容:
#实际修改了以下几行的内容:
30 <property name="user">asd</property> #访问amoeba的用户名
31
32 <property name="password">123456</property> #密码
115 <property name="defaultPool">master</property> #默认为主服务器
116
117 <property name="writePool">master</property> #写入池为master 池, 也就是写入到主服务器
118 <property name="readPool">slave1</property> #读取池为slave1 池,也就是从从服务器读取数据库内容
2) 编辑dbServers.xml配置文件
vim /usr/local/amoeba/conf/dbServer.xml
修改如下几行内容:
vim /usr/local/amoeba/conf/dbServers.xml
20 <property name="port">3306</property>
21
22 <!-- mysql schema -->
23 <property name="schema">test</property>
24
25 <!-- mysql user -->
26 <property name="user">asd</property>
27
28 <property name="password">123456</property>
46 <dbServer name="master" parent="abstractServer">
47 <factoryConfig>
48 <!-- mysql ip -->
49 <property name="ipAddress">192.168.93.100</property>
50 </factoryConfig>
51 </dbServer>
52
53 <dbServer name="slave1" parent="abstractServer">
54 <factoryConfig>
55 <!-- mysql ip -->
56 <property name="ipAddress">192.168.93.101</property>
57 </factoryConfig>
58 </dbServer>
59
60 <dbServer name="multiPool" virtual="true">
61 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
62 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
63 <property name="loadbalance">1</property>
64
65 <!-- Separated by commas,such as: server1,server2,server1 -->
66 <property name="poolNames">master,slave1</property>
67 </poolConfig>
68 </dbServer>
3)编辑amoeba.xml配置文件
vim /usr/local/amoeba/conf/amoeba.xml
在启动amoebe前更改一下启动脚本:(注意:将-Xss128k 修改为–Xss256)
/usr/local/amoeba/bin/amoeba
7. 分别在mysql 主从服务器上添加权限提供给amoeba 访问,授权目的为了让amoeba能连接到主从服务器进行查询。
grant all on *.* to 'asd'@'192.168.93.110' identified by '123456';flush privileges;
8.启动amoeba
nohup bash -x /usr/local/amoeba/bin/amoeba start&
把这个放到后台退出终端也可以继续运行
ps -ef | grep -i amoeba 查看一下运行的程序,如果可以查看到amoeba相关的进程代表amoeba已经正常启动了
9. 读写分离测试
1)将amoeba 机器作为client端来测试。
先给amoeba机器安装数据库软件。
2)通过在从库上运行stop slave停掉主库和从库之之间的同步。(只是为了演示amoeba读写分离的测试效果,实际生产环境中是不能停掉的)
3)在主库和从库上分别创建表a1,并且分别插入数据 asd-master 和 asd-slave。
4)在客户端登录测试读取池的效果:
mysql -uasd -p test --password='123456' -h 127.0.0.1 -P8066
我们发现读到的a1表的数据一直来自于从库。
5)在amobe 机器(也就是客户端)上往a1 表插入数据
我们测试是写入到了主库还是从库
然后登陆到主服务查看刚才在client端插入的数据写入到了主库。
登录到从服务器的数据库,并没有看到刚才在client端插入的内容。
由此证明, 客户端插入的数据只会写入到主库, 并不会写入到从库。
至此, 我们实现了amoeba的读写分离测试。
amoeba搭建成功!
今天我们就介绍到这里。希望此文对大家有所帮助,也希望大家持续关注转载。