首页 > 代码库 > 9. mysql (linux) 读写分离
9. mysql (linux) 读写分离
Mysql主从互备之后,为了将两台(或多台)机器充分利用,读写分离的必要性凸显出来。优缺点这里不是讨论的重点!
Mysql读写分离有三种方法:
1. Mysql-proxy
2. Amoeba(变形虫)
3. 另一种用的很少
这里所用的是amoeba,第一种用到lua语言,而且听说性能上有些许不好!
所需机器:
写:192.168.1.111
读:192.168.1.112 (此两台机器已经设置了主从,否则读写分离就失去了意义)
Amoeba:192.168.1.112(本人这里,amoeba安装的机器和mysql(读)在一台机器)
一、 准备工作
1. 安装java支持
1) 下载java SE 1.6
地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html
官网,没有找到1.6 所以勉强下了1.7版本。
2) 安装
# mkdir /usr/local/jdk
# tar zxvf jdk-7u71-linux-x64.gz –C /usr/local/jdk
2. 安装amoeba
1) 下载
地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz/download
2) 安装
# mkdir /usr/local/amoeba
# tar zxvf amoeba-mysql-binary-2.1.0-RC5.tar.gz–C /usr/local/amoeba
# chmod –R +x /usr/local/amoeba/bin
二、 配置环境
1. Java
#vi /etc/profile
#for java
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
2. Amoeba
#vi /etc/profile
#for amoeba
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
完成后:
#source /etc/profile
3. 测试是否成功
Java:
#java –version //显示如下
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
Amoeba:
#amoeba //显示如下
amoeba start|stop
三、 配置amoeba
需要配置两个文件:dbServer.xml 和 amoeba.xml
1. 配置dbServer.xml,直接贴出我的配置
# vi dbServer.xml
修改26行
原 <property name="user">root</property>
改 <property name="user">amoeba</property>//连接两个服务器(读写)都要用,即这个账户可以连接读服务器,也可以连接写服务器,如果没有需要都添加这个用户,并且给这个ip授权(需要理解)
修改28,29,,30行
28 <property name="password">amoeba</property>//mysql服务器的通用用 户密码
复制一下代码,并在此代码下面粘贴两次
42 <dbServer name="server1" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">127.0.0.1</property>
46 </factoryConfig>
47 </dbServer>
修改后的效果如下:添加两个db服务器定义,并且分别设置三个mysql server的ip地址,ip地址使用的是mysql-mmm的虚拟IP。
42 <dbServer name="Master" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">192.168.1.111</property>
46 </factoryConfig>
47 </dbServer>
48
49 <dbServer name="Slave1" parent="abstractServer">
50 <factoryConfig>
51 <!-- mysql ip -->
52 <property name="ipAddress">192.168.1.112</property>
53 </factoryConfig>
54 </dbServer>
修改配置文件的最下方
64 <dbServer name="ReadPool" virtual="true"> //定义虚拟节点池的名字
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
67 <property name="loadbalance">1</property> //负载均衡算法
68
69 <!-- Separated by commas,such as: server1,server2,server1 -->
70 <property name="poolNames">Slave1 </property> //虚拟节点池的成员
71 </poolConfig>
72 </dbServer>
2. 配置amoeba.xml
11 <propertyname="port">8066</property> //amoeba监听端口,不用修改
修改第30行
原 <property name="user">root</property>
改 <property name="user">amoeba</property>//修改amoeba的用户名为amoeba
修改第32行
原 <property name="password"></property>
改 <property name="password">amoeba</property>//修改amoeba的用户名为amoeba
115行 –120行
115 <property name="defaultPool">Master</property>
116
117 <property name="writePool">Master</property>
118 <property name="readPool">Slave1</property>
119 <propertyname="needParse">true</property>
120 </queryRouter>
四、 测试
1. 启动amoeba
# amoeba start &
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2015-01-08 11:20:15,858 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
2015-01-08 11:20:16,061 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2015-01-08 11:20:16,066 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:37064.
跳出这些以后,自己ctrl+c即可,已经后台启动!
2. 测试
在 192.168.1.112
a. mysql –u amoeba –P8806 –h 192.168.1.112 –pamoeba //测试amoeba是否正常启动
b. mysql –u amoeba –h192.168.1.111 –pamoeba //测试能否登录写数据库
c. mysql –u amoeba –h192.168.1.112 –pamoeba//测试能否登录读服务器
如果三个都能登录成功,在继续以下测试,不能成功,需要检验:a.是否有此用户 b.是否授权此IP登录等
3. 测试amoeba的读写
在 192.168.1.112(读)上,mysql>stop slave;//关闭主从复制
# mysql –u amoeba –P8806 –h 192.168.1.112–pamoeba //登录amoeba
Mysql> use test;
Mysql> insert into test1 (a)values (123);
Mysql> select *from test1;
发现刚才插入的并没有查询出来,说明读写已经分离
五、 问题
1. Q: amoeba start 跳出
The stack size specified too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
修改: vi /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS=”-server -Xms256m -Xmx256m –Xss128k”改为
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”
2. Q : 登录了amoeba后做一些数据操作是弹出以下:
Could not create a validatedobject, cause: ValidateObject failed
A: 在192.168.1.112上测试
mysql –u amoeba –h192.168.1.111 –pamoeba
mysql –u amoeba –h192.168.1.112 –pamoeba
有一个或都不能登录,创建用户,并给此ip授权
3. Q: 连接MySQL失败出错信息:Host XXX is blocked because of many connectionerrors, unblock with ‘mysqladmin flush-hosts‘。
原因:MySQL服务器已经从某个host接收了大量中途终止的连接,于是决定终止继续接收来自该host的连接,允许最大的连接错误数为max_connect_errors,通过showvariables命令可以查询,一般为10。
A:登录进mysql执行flush hosts(本机host已经不允许登录!)。
4. Q: 启动amoeba时跳出了一长串
A: 检查配置文件
注:欢迎提出自己的建议、疑问、意见等。
9. mysql (linux) 读写分离