利用amoeba实现mysql读写分离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用amoeba实现mysql读写分离相关的知识,希望对你有一定的参考价值。
参考:
http://my.oschina.net/u/1169079/blog/390726
http://douya.blog.51cto.com/6173221/1607493
一 安装环境:
三台centos6.7 64位的系统
192.168.127.130 从数据库
192.168.127.131 主数据库
192.168.127.134 amoeba
二 安装过程 (下面的1-3的所以操作都在amoeba服务器上面)
1 首先安装jdk环境,下载,安装,设置环境变量
vim /etc/profile export JAVA_HOME=/usr/local/jdk (java安装路径) export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin export AMOEBA_HOME=/usr/local/amoeba (amoeba安装路径) export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
查看 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)
java 环境配置成功
2 安装并配置amoeba软件
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ chmod -R 755 /usr/local/amoeba/ /usr/local/amoeba/bin/amoeba amoeba start|stop
启动的时候会报错
The stack size specified is too small,
Specify at least 228k Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决办法是:
定义amoeba内存参数,我这里定义了最大2G的并发占用连接
# vim /usr/local/amoeba/bin/amoeba
将 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
修改为 DEFAULT_OPTS="-server -Xms1024m -Xmx2048m -Xss512k"
然后再次启动就成功了
启动文件,最好以后台方式启动
nohup /usr/local/amoeba/bin/amoeba start &
3 更改配置文件 dbServers.xml和amoeba.xml两个配置文件
amoeba.xml配置
amoeba本地配置或者对外的配置:
<!-- 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> 默认是8066,可以更改 <!-- bind ipAddress --> <property name="ipAddress">192.168.127.134</property> 对外提供程序访问的IP地址,也就是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>
amoeba对外连接验证配置:
<property name="authenticator"> <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <property name="user">amoeba</property> **** 对外提供访问的用户 <property name="password">123</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>
amoeba.xml读写分离配置:
<property name="defaultPool">server1</property> <property name="writePool">server1</property> <property name="readPool">readPool</property>
##这里的server1,readpool和dbsever.xml里面配置有关
注意:默认的下面两行是注释掉的,需要把注释去掉
defaultPool:配置了默认的数据库节点,一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行。
writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。
readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的readpool数据库池。
dbServers.xml文件配置:
<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">zabbix</property> ##必须是一个存在的database主和从上面都有的 <!-- mysql user --> <property name="user">amoeba</property> ##用户名 <!-- mysql password --> <property name="password">123</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.127.131</property> ** master-IP </factoryConfig> </dbServer> <dbServer name="Slave1" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.127.130</property> ****slave1的 </factoryConfig> </dbServer> <dbServer name="readPool" virtual="true"> ##这里的readpool要和amoeba.xml里面相同 <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">server1,server2</property> ##读和写的比例是1:1,也可以写成只读server2 </poolConfig> </dbServer>
此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码 就是上面的
abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限 ,这里是先安装,完了在授权
4 在主从数据库上面同时授权
grant all on *.* to ‘amoeba‘@‘192.168.127.%‘ identified by "123";
5 验证 在任意客户端登录amoeba
mysql -uamoeba -p -h 192.168.127.134 -P 8066 (端口的这个P是大写的)回车,密码就是123
然后show databases;看能否查看
如果出现ERROR 2013 (HY000): Lost connection to MySQL server during query,这个错误,可以查看日志 /usr/local/amoeba/logs/root.log
经过排查发现密码被注释了 查看dbServer.xml配置文件,改成下面这样子,把 -->去掉即可
- <!-- mysql password -->- <property name="password">123</property>
再次查看,正常了。
6 读写分离验证
接下来,进行简单测试,验证以上配置是否能够正确运行。
登录master主数据库。[root@chenllcentos ~]# mysql -uroot -pyourpassword -h192.168.127.134 -P8066
额外说明下,此处的yourpassword是连接Amoeba的密码,也就是在amoeba.xml配置文件中配置的密码,与Mysql密码不同,需要注意。
登陆后,此时会提示以下信息。Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA Source distribution
说明已经成功连接Mysql代理Amoeba。
为了验证Amoeba读写分离配置是否生效,我们做一个简单的测试。
先在134服务器master服务器上创建一个表。mysql> create table sxit (id int(10) ,name varchar(10));
而后,停止从数据库上面的主从复制,便于数据库操作观察。
登陆服务器从数据库。[root@chenllcentos ~]# mysql -uroot -pyourpassword
停止从数据库主从复制。
mysql> slave stop;
在主数据库插入。mysql> insert into sxit values(‘1‘,‘zhangsan‘);
在从数据库插入。
mysql> insert into sxit values(‘2‘,‘lisi‘);
登陆到amoeba服务器,进行读写分离的测试:
[[email protected] ~]# mysql -uroot -pyourpassword -h192.168.127.134 -P8066
mysql> use test;
mysql> select * from sxit;
+------+------+| id | name |
+------+------+| 2 | lisi |
+------+------+mysql> select * from sxit;
+------+------+| id | name |
+------+------+| 3 | john |
+------+------+重复执行多次,发现始终只显示从数据库的数据,说明如果进行数据库读操作,Amoeba只将读数据SQL命令路由至从数据库。
登录主数据库。[[email protected] ~]# mysql -uroot -pyourpassword
mysql> use test;
mysql> select * from sxit;
+------+----------+| id | name |
+------+----------+| 1 | zhangsan |
+------+----------+那么在amoeba服务器上插入一条数据,再次验证
insert into sxit values(‘3‘,‘hu‘);
然后分别登陆到master和slave上面查看,主上面有,从上面没有,说明写的是主数据库(前提是主从复制没有打开)
可以验证,使用Amoeba对Mysql读写分离成功。若此时开启从数据库主从复制,则可以进行Mysql集群和负载均衡。
本文出自 “渐行渐远” 博客,请务必保留此出处http://825536458.blog.51cto.com/4417836/1775309
以上是关于利用amoeba实现mysql读写分离的主要内容,如果未能解决你的问题,请参考以下文章