Mysql代理软件Amoeba
来源:互联网 发布:ubuntu启动snmp 编辑:程序博客网 时间:2024/04/29 02:34
==============
Mysql代理软件Amoeba
=========================
--直接复制粘贴上去,格式空格之类的太多;可以先在vim里:set paste再insert模式粘贴上去就可以了
Amoeba的作用是在于Mysql之上,用于代理应用与Mysql的连接,可以理解为中间件,他的作用是将连接细化,如:将读写进行分离,分别指向不同的数据库,也可用根据不同的数据进行指向不同的数据库,还可以做读或写的负载均衡
mysql 代理层有mysqlproxy, amoeba, cobar等。
Mysqlproxy:数据量很小的时候用的还不错,可数据量一但大起来,这个软件就会暴露出很多BUG问题,Mysql官方给出的建议是适应轻量级的应用。
Amoeba:适用中大型数据量的应用负载,可做读写分离,数据切分,负载均衡等技术,是目前企业中用的最广的数据库代理。
Cobar:Cobar的分布式主要是通过将表放入不同的库来实现。是阿里吧吧开发的软件,本地的软件和Amoeba一样。
Amoeba代理Mysql读写分离,架构图:
客户
|
|
web应用程序,游戏程序(c,php,java.......)客户端
|
|
代理层 (mysqlproxy,amoeba) 读写分离/数据切分/集群分发
|
|
mysql主 <----> mysql从
准备4台服务器
192.168.169.161 --客户端
192.168.169.162 --amoeba
192.168.169.163 --mysql主
192.168.169.164 --mysql从
架构前所有节点准备:
1,主机名三步,互相绑定
2,时间同步
3,关闭iptables,selinux
4, 配置好yum
5, 静态ip地址
第一步:安装amoeba服务器
因为是java开发的,需要java运行环境,需要先安装JDK
1、安装jdk1.8版本,tar包源码包,解压即能用。
解压jdk包
tar xfjdk-8u45-linux-x64.tar.gz -C /usr/local/
cd到解压目录
cd /usr/local
把刚解压的JDK改名为java
mv./jdk1.8.0_45 ./java
完整的目录为:/usr/local/java
验证一下刚解压安装的的jdk版本
#/usr/local/java/bin/java -version
java version"1.8.0_45"
Java(TM) SERuntime Environment (build 1.8.0_45-b14)
JavaHotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
到此为止JDK已经好了,下面amoeba要用到这个jdk目录
2、安装amoeba软件
a、新建一个amoeba目录,用于存放amoeba解压指定用
# mkdir/usr/local/amoeba
b、解压到上一步新建的目录里
# tar xf/opt/amoeba/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
c、使用ls查看解压的目录
# ls /usr/local/amoeba/ --amoeba的所有文件在此目录下
benchmark changelogs.txt lib README.html
bin conf LICENSE.txt
关注下面二个目录
bin 是启动脚本目录
conf 是配置文件目录
配置文件目录里我们要关注有三个文件:
amoeba.xml --配置amoeba的全局配置文件
dbServers.xml --配置amoeba连接mysql数据库的文件
rule.xml --配置我们数据切分的文件
d、开始配置amoeba连接mysql数据库
# cd/usr/local/amoeba --进到amoeba目录
先修改./conf/amoeba.xml
vi/usr/local/amoeba/conf/amoeba.xml
11 <propertyname="port">3307</property> --修改端口 这是amoeba服务的端口,可以自己设置,不是本机的mysql服务端口
30 <propertyname="user">test</property> --修改mysql登陆用户名 这是给客户端登录的amoeba帐号
32 <propertyname="password">123321</property> --登陆密码 这是给客户端登录的amoeba密码
117 <!-- --删除该行,去掉注释
118 <propertyname="writePool">server1</property> --这里指定写走server1
119 <propertyname="readPool">server2</property> --把server1改成server2,指定读
120 --> --删除该行,去掉注释
再修改./conf/dbServers.xml
vim/usr/local/amoeba/conf/dbServers.xml
20 <propertyname="port">3307</property> --修改端口
23 <propertyname="schema">aaa</property> --指定访问数据库
26 <propertyname="user">test</property> --登陆数据库的用户名
29 <propertyname="password">123321</property> --登陆密码 这里要把它的注释删掉
45 <dbServer name="server1" parent="abstractServer"> --服务器1,mysql主服务器,45-50行是一段
46 <factoryConfig>
47 <!-- mysql ip -->
48 <propertyname="ipAddress">192.168.169.163</property> --mysql主服务器IP
49 </factoryConfig>
50 </dbServer> --如果要有多个IP就把这一段多写一次
51
52 <dbServer name="server2" parent="abstractServer"> --服务器2,mysql从服务器,52-57行是一段
53 <factoryConfig>
54 <!-- mysql ip -->
55 <propertyname="ipAddress">192.168.169.164</property> --mysql从服务器IP
56 </factoryConfig>
57 </dbServer>
3、修改amoeba启动文件
启动文件/usr/local/amoeba/bin/amoeba是需要jdk的支持才能启动,下面我们配置启动文件指定访问jdk
在第1步时我们解压了jdk,这里要配置amoeba访问jdk
vi/usr/local/amoeba/bin/amoeba ---在10行下面,加上以下代码
11 JAVA_HOME=/usr/local/java
12 PATH=$PATH:$JAVA_HOME/bin
13 export JAVA_HOME PATH
62 DEFAULT_OPTS="-server -Xms256m-Xmx256m -Xss228k" --在62行把 Xss128k 改成228k,因启动时要求最低内存是228k
注:-Xms256m --分配置256m物理内存给amoeba软件用,连接数据库时初始化内存就要256m
-Xmx256m --这个是amoeba软件最大可用的物理内存,(32位的JDK最大只能是2G,64位的JDK无限制但不能大于本机的物理内存大小)
-Xss128k --默认是128k,但amoeba软件要求是228k,这个启动amoeba软件就要228k的内存
再使用nohup方法启动amoeba服务
nohup./bin/amoeba start & --这个启动方法把启动的信息写进nohup.out文件里,并在后台运行。建议用这种方法,方便我们排错。
启动的另外二个方法:建议不使用
./bin/amoeba start & --这个启动的方法是把启动的信息打印在终端窗口。
./bin/amoeba start >/dev/null & --把启动的信息输出到/dev/null 空洞里面。
第二大步:在mysql主从服务器上授权并验证
为了方便验证,把两台mysql复制关闭,然后两台mysql都新建下面的测试表
下面的步骤,两台数据库都要操作执行。
mysql>create database aaa;
Query OK, 1 rowaffected (0.00 sec)
mysql> useaaa;
Databasechanged
mysql>create table emp (id int,ename varchar(20));
Query OK, 0rows affected (0.01 sec)
mysql>insert into emp values(1,"主服务器192.168.169.163"); --主服务器插入这一条
mysql>insert into emp values(1,"从服务器192.168.169.164"); --从服务器插入这一条
--并对mysql进行授权,授权的IP为amoeba的IP
mysql> grantall on aaa.* to 'test'@'%' identified by '123321';
Query OK, 0rows affected (0.04 sec)
mysql> flushprivileges;
Query OK, 0rows affected (0.00 sec)
授权后,可以去amoeba(192.168.169.162)这台去连接一下这两个mysql,需要能连才行,如果不能连则把上面再做一遍
在amoeba服务器测试连接两台mysql
mysql56 -utest-p123321 -h192.168.169.163 -P3307
mysql56 -utest-p123321 -h192.168.169.164 -P3307
第三大步:在客户端进行测试
客户端使用mysql命令连接 amoeba服务器登陆测试
mysql56 -utest-p123321 -h192.168.169.162 -P3307
mysql> useaaa;
Databasechanged
mysql>
mysql>
mysql>insert into emp(id) values(3); --这里往数据库插入了一条数据,插入的动作是指定到了mysql主
Query OK, 1 rowaffected (0.01 sec)
mysql>select id from emp; --这里再查时,看不到刚插入的数据,是因为读我们指定到了mysql从
+------+
| id |
+------+
| 1 |
+------+
1 row in set(0.00 sec)
mysql>备注:
如果服务器名字更改了以后,在dbServers.xml 的最下面也需要更改相应的名字:
64 <!-- Separated bycommas,such as: server1,server2,server1 -->
65 <propertyname="poolNames">server1,server2</property>
====================================华丽的分隔线====================================
================
Mysql 数据切分
================
是按照不同的数据访问不同的数据库 切片不要进行复制技术
第一步:搭建前,先将mysql主从打开,再关闭读写分离
# vim/usr/local/amoeba/conf/amoeba.xml --在117行前面加上<!--,在119行下面加上--> 注释到117、118行,读写分享成功关闭。
116 <!--
117 <propertyname="writePool">server1</property>
118 <propertyname="readPool">server2</property>
119 -->
第二步:配置数据切片
--下面我是按aaa.emp表里的emp_id这一列来切分,当它为奇数就给server2,为偶数就给server1
# vim/usr/local/amoeba/conf/rule.xml --修改第三个配置文件,定义数据切分的规则
<?xmlversion="1.0" encoding="gbk"?>
<!DOCTYPEamoeba:rule SYSTEM "rule.dtd">
<amoeba:rulexmlns:amoeba="http://amoeba.meidusa.com/">
<tableRule name="emp"schema="aaa" defaultPools="server1,server2"> --name代表表名称,schema代表数据库名,defaultPools代表可支持的服务器
<rule name="rule1"ruleResult="POOLNAME"> --name代表切片动作的名称
<parameters>emp_id</parameters> --代表aaa.emp表里哪个字段要做切片的判断
<expression><![CDATA[ --切片开始
var division = emp_id% 2; --定义division变量,值为 emp_id % 2 ,也就是取余
case division when 1then 'server1'; --变量值不能被2整除的转到server1
when 0then 'server2'; --变量值能被2整除的转到server2
end case;
]]> --切片结束
</expression>
</rule>
</tableRule>
</amoeba:rule>
--直接复制粘贴上去,格式空格之类的太多;可以先在vim里:set paste再insert模式粘贴上去就可以了
备:复制到rule.xml文件后,要把后面的中文注释删除,使用命令d$
d$使用方法:按d再按下$,就是删除该行光标后面的内容。
第三步:重启amoeba
# cd/usr/local/amoeba --进入到amoeba安装目录
# ./bin/amoebastop --停止服务
# nohup./bin/amoeba start & --启动服务
第四步:客户端测试
在客户端连接进行测试,连接的IP为amoeba的IP,端口为3307
# mysql-h192.168.169.163 -utest -p123321 -P3307
注意:amoeba是根据sql解析来进行数据切分的,所以需要把切分的关键字段(这里是emp表的id字段)加入到sql中.否则切分规则无效。无效后,会在 server1,server2 均都插入数据。
mysql>insert into aaa.emp values (1,'aaa'); --这样做是错误的,会在两个后台数据库里都插入数据
--正确的插入方法
mysql>insert into aaa.emp(emp_id,ename) values (1,'aaa');
mysql>insert into aaa.emp(emp_id,ename) values (2,'bbb');
mysql>insert into aaa.emp(emp_id,ename) values (3,'ccc');
mysql>insert into aaa.emp(emp_id,ename) values (4,'ddd');
然后去server1(2.2.2.128)上查看,只有1,3两条数据
去server2(2.2.2.129)上查看,只有2,4两条数据
数据切分成功
delete和update操作也是同理
----------------------------------华丽的分隔线--------------------------------
--按照上面的配置文件,只修改rule.xml规则文件如下,做成以emp_id值的范围来进行水平切分
--下面实现的是emp_id小于等于100的任何操作都在server1,大于100的任何操作都是在server2
<?xmlversion="1.0" encoding="gbk"?>
<!DOCTYPEamoeba:rule SYSTEM "rule.dtd">
<amoeba:rulexmlns:amoeba="http://amoeba.meidusa.com/">
<tableRule name="emp"schema="aaa" defaultPools="server1,server2">
<rulename="rule1">
<parameters>emp_id</parameters>
<expression><![CDATA[ emp_id <= 100]]></expression>
<defaultPools>server1</defaultPools>
<readPools>server1</readPools>
<writePools>server1</writePools>
</rule>
<rulename="rule2">
<parameters>emp_id</parameters>
<expression><![CDATA[ emp_id > 100]]></expression>
<defaultPools>server2</defaultPools>
<readPools>server2</readPools>
<writePools>server2</writePools>
</rule>
</tableRule>
</amoeba:rule>
--直接复制粘贴上去,格式空格之类的太多;可以先在vim里:set paste再insert模式粘贴上去就可以了
====================================华丽的分隔线====================================
===========================
Amoeba数据切分 之 垂直切分:
===========================
架构图
client(192.168.169.164)
|
|
amoeba(192.168.169.163)
|
|
|-----------------------|
mysqlA mysqlB
192.168.169.165 192.168.169.166
aaa.aaa表 aaa.bbb表
第一步:准备测试环境
1、先把两个mysql(不做AB复制的)以前的数据删掉,新建两个表来做测试
192.168.169.165上
mysql>create database aaa;
mysql> useaaa;
mysql>create table aaa.aaa (id int);
192.168.169.166上
mysql>create database aaa;
mysql> useaaa;
mysql>create table aaa.bbb (id int);
第二步:修改rule.xml配置文件
# vim/usr/local/amoeba/conf/rule.xml --清空文件内容,加上下面一段
<?xmlversion="1.0" encoding="gbk"?>
<!DOCTYPEamoeba:rule SYSTEM "rule.dtd">
<amoeba:rulexmlns:amoeba="http://amoeba.meidusa.com/">
<tableRule name="aaa"schema="aaa" defaultPools="server1"/>
<tableRule name="bbb"schema="aaa" defaultPools="server2"/>
</amoeba:rule>
第三步:重启amoeba
# cd/usr/local/amoeba --进入到amoeba安装目录
# ./bin/amoebastop --停止服务
# nohup./bin/amoeba start & --启动服务
第四步:在客户端测试
# mysql -utest -p123321-h192.168.169.163 -P3307
mysql> useaaa;
mysql>insert into aaa values (1); --这一条被插入到192.168.169.167上的aaa.aaa表
mysql>insert into bbb values (2); --这一条被插入到192.168.169.168上的aaa.bbb表
mysql>select * from aaa.aaa;
+------+
| id |
+------+
| 1 |
+------+
1 row in set(0.01 sec)
mysql>
mysql>select * from aaa.bbb;
+------+
| id |
+------+
| 2 |
+------+
1 row in set(0.03 sec)
mysql>
====================================华丽的分隔线====================================
Amoeba集群 之 集群
集群的好处是,可以让服务器平均负载我们连接请求
Amoeba集群分发算法有三种:
1=ROUNDROBIN ,2=WEIGHTBASED , 3=HA
ROUNDROBIN --代表轮询,是台访问一次
WEIGHTBASED --代表加权轮询,是以哪一台性能好就承载多一点连接
HA --代表高可用
把读写分离改成读集群的条件是只少2台服务器做读,
第一步:配置dbServers.xml文件:
dbServer.xml文件里的 59行~67行 是设置集群的段
我们关注的行有59,62,65行
59行的name="multiPool",这个是设置服务器集群名称,在amoeba.xml文件里设备读服务器时要用到
62行是设置集群的算法,默认是1轮询
65行是设置服务器列表。
以下是配置代码:
vim/usr/local/amoeba/conf/dbServers.xml
59 <dbServer name="multiPool" virtual="true">
60 <poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool">
61 <!-- Load balancingstrategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
62 <propertyname="loadbalance">1</property>
63
64 <!-- Separated bycommas,such as: server1,server2,server1 -->
65 <propertyname="poolNames">server1,server2</property>
66 </poolConfig>
67 </dbServer>
第二步:配置amoeba.xml文件:
amoeba.xml文件里我们要修改118行。
vim/usr/local/amoeba/conf/amoeba.xml --修改配置文件
117 <propertyname="writePool">server1</property> ---设置写的服务器,
118 <propertyname="readPool">multiPool</property> ---设置读的服务器。将原来的server2改成multiPool。multiPool就是第一步设置的集群服务器名称
第三步:重启amoeba代理软件。
1、先将amoeba代理软件重启
命令:
--cd到amoeba安装目录:cd /usr/local/amoeba/
--停止:./bin/amoebastop
--启动:nohup./bin/amoeba start &
2、查看amoeba软件是否启动成功
命令:
--查看nohup.out文件,里面有启动的信息,如果有以下这段就代表启动成功。
2016-09-05 22:24:30,897 INFO net.ServerableConnectionManager - Amoeba forMysql listening on 0.0.0.0/0.0.0.0:3066.
2016-09-05 22:24:30,934 INFO net.ServerableConnectionManager - AmoebaMonitor Server listening on /127.0.0.1:19659.
--查看amoeba进程,判断是否启动。
命令:
--使用ps命令:ps -ef|grep mysql,如果能查出来进程,就代表已有进程,如果无则启动失败。
[root@node1 amoeba]# ps -ef|grepamoeba
root 12855 12471 0 22:24 pts/3 00:00:09 /usr/local/java/bin/java -server-Xms256m -Xmx256m -Xss228k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds-classpath /usr/local/amoeba/lib/classworlds-1.0.jarorg.codehaus.classworlds.Launcher start
第四步:在客户机上测试读集群是否生效。
在客户机上使用mysql命令登陆amoeba服务器
# mysql -utest-p123321 -h192.168.169.163 -P3307
--往emp表里插入两条数据
mysql>insert into emp values(10,"test1");
mysql>insert into emp values(11,"test11");
--再查询emp表的数据
mysql> select * from emp; --查询的时候一次查询mysql 1上面的数据,再查询一次又跳到另外一台mysql服务器上了
+------+---------------------+
| emp_id | ename |
+------+---------------------+
| 10 | test1 |
| 11 | test11 |
+------+---------------------+
mysql> select * from emp;
+------+---------------------+
| emp_id |ename |
+------+---------------------+
| 1 | ????192.168.169.166 |
| 7 | test |
| 7 | test |
| 8 | test1 |
| 10 | test1 |
| 11 | test11 |
+------+---------------------+
到此mysql读集群配置完毕。
====================================华丽的分隔线====================================
- Mysql代理软件Amoeba
- Amoeba数据库代理 实现mysql读写分离
- amoeba- mysql
- Mysql 读写分离实现及代理Amoeba的使用
- Amoeba for MySQL 测试
- Amoeba For Mysql
- mysql amoeba读写分离
- amoeba-mysql安装
- MySQL Amoeba读写分离
- Amoeba for Mysql
- 通过Amoeba连接Mysql
- mysql读写分离 amoeba
- MySQL-amoeba-读写分离
- windows 下 MySQL读写分离、主从复制、通过amoeba代理实现读写分离 配置全过程
- amoeba for mysql 0.22 发布
- Amoeba+mysql实现读写分离
- mysql amoeba安装配置步骤
- mysql采用amoeba集群搭建
- SpringMVC框架
- ES6的Promise详解
- docker学习笔记16:Dockerfile 指令 ADD 和 COPY介绍
- 洛谷10月月赛R2-T2-Chtholly Nota Seniorious
- Spring MVC参数处理
- Mysql代理软件Amoeba
- ES分布式机制的透明性,垂直扩容和水平扩容,数据rebalance,master节点,节点平等的分布式架构,shard和replica机制(学习)
- URL路径
- Tornado框架09-异步02
- 微信小程序个人开发心得
- 回文质数
- MyEclipse实用操作
- Mail邮件服务的搭建方法
- VTP配置服务器server和客户端client,客户端会学习服务器端的VLAN