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: 检查配置文件


注:欢迎提出自己的建议、疑问、意见等。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。