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(读)在黄金年代台机器)

Amoeba是三个以MySQL为底层数据存款和储蓄,并对运用提供MySQL合同接口的proxy。它集聚地响应应用的恳求,依据客商优先设置的规规矩矩,将SQL央浼发送到特定的数据库上试行。基于此能够兑现负载均衡、读写分离、高可用性等须要。与MySQL官方的MySQL
Proxy相比,俺重申的是amoeba配置的低价(基于XML的配备文件,用SQLJEP语法书写法规,比基于lua脚本的MySQL
Proxy轻松)。本文就来促成两个简便的amoeba的结构

MySQL读写抽离Amoeba简要介绍

生机勃勃、 计划工作

  1. 安装java支持

1) 下载java SE 1.6

地址:

官方网址,未有找到1.6 所以逼迫下了1.7本子。

2) 安装

# mkdir /usr/local/jdk

# tar zxvf jdk-7u71-linux-x64.gz –C /usr/local/jdk

  1. 安装amoeba

1) 下载

地址:

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

实验情状:
192.168.1.121为amoeba服务器,提供读写分离
192.168.1.141为mysql的主服务器
192.168.1.142为mysql的从服务器

Amoeba介绍:

二、 配置情况

  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

  1. Amoeba

#vi /etc/profile

#for amoeba

export AMOEBA_HOME=/usr/local/amoeba

export PATH=$PATH:$AMOEBA_HOME/bin

完成后:

#source /etc/profile

  1. 测验是还是不是中标

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

1.为mysql主服务器提供配置
编辑/etc/my.cnf,提供以下的配备
log_bin=index
server_id=1
在主服务器上授权
mysql> grant replication slave,replication client on
[email protected]’192.168.1.142′
identified by “123456”;
mysql> flush privileges;
2.为mysql从劳动提供配置
编辑/etc/my.cnf,提供以下的配备
server_id=10
relay_log=relay
步入mysql命令行接口
mysql > change master to
MASTER_HOST=”192.168.1.141″,MASTER_USER=”user”,MASTER_PASSWORD=”123456″,MASTER_LOG_FILE=”index.000004″,MASTER_LOG_POS=429;
mysql > start slave;
假定能够看见Slave_IO_Running:
Yes和Slave_SQL_Running:Yes两行音讯的话,注解主从配置已经打响。
3.在192.168.1.121上安装amoeba
amoeba是java开荒的,所以首先要求装jdk.
[[email protected]
~]# chmod +x jdk-6u43-linux-x64.bin
[[email protected]
~]# ./jdk-6u43-linux-x64.bin
# vi /etc/profile.d/java.sh
export JAVA_HOME=/root/jdk1.6.0_43/bin
export PATH=$JAVA_HOME/bin:$PATH
# source /etc/profile.d/java.sh
安装amoeba
# wget

# mkdir /usr/local/amoeba
# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba

阿里Baba(Alibaba卡塔尔国的Amoeba(变形虫卡塔尔(قطر‎项目,静心
数据库proxy开拓。座落与Client、DB
Server(s卡塔尔国里头。对客商端透明。具备负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到对象数据库、可现身乞求多台数据库归并结果。

三、 配置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>

  1. 配置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>

步向amoeba目录下会看见一下多少个目录
bechmark:压力测量检验
bin:脚本文件
conf:配置文件
lib:库

架构图:

四、 测试

  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就能够,已经后台运维!

  1. 测试

在 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登陆等

  1. 测试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;

察觉刚才插入的并从未询问出来,表达读写已经分开

在conf文件下有多数配备文件,这里完毕读写分离的机能,只供给多个文件就能够amoeba.xml和dbserver.xml。在amoeba.xml文件下要求修改的构造为:

Amoeba除了读写抽离,还足以开展负荷均衡、高可用性、sql过滤。

五、 问题

  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”

  1. 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授权

  1. 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已经不准登录!)。

  1. Q: 运转amoeba时跳出了一长串

A: 检查安排文件

注:接待提出本人的提议、疑问、意见等。

Mysql主从互备之后,为了将两台(或多台)机器丰富利用,读写分离的必要性展现出来。优弱点这里不是商量的保护…

<service name=”Amoeba for Mysql”
class=”com.meidusa.amoeba.net.ServerableConnectionManager”>
<!– port –>
<property name=”port”>3306</property>
#连接amoeba时所运用的端口号

Amoeba的设置和计划

<!– bind ipAddress –>
<!–
<property name=”ipAddress”>127.0.0.1</property> #
–>
<property name=”ipAddress”>0.0.0.0</property> #监听地址
<property
name=”manager”>${clientConnectioneManager}</property>

Amoeba需要mysql-server帮忙,Amoeba服务器端供给设置Mysql-server,並且最棒不与其余数据库服务器在后生可畏道

<property name=”connectionFactory”>
<bean
class=”com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory”>
<property name=”sendBufferSize”>128</property>
<property name=”receiveBufferSize”>64</property>
</bean>
</property>

Amoeba是Java编排的,运转须求JDK蒙受,可以通过#echo
$JAVA_HOME看是还是不是安装配置了JDK,若无,则

<property name=”authenticator”>
<bean
class=”com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator”>

安装JKD

<property name=”user”>root</property>
#连接amoeba时候的账户

①.安装注重包

<property name=”password”>amoeba</property>
#连接amoeba时候的密码

yum -y install glibc*

<property name=”filter”>
<bean class=”com.meidusa.amoeba.server.IPAccessController”>
<property
name=”ipFile”>${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>

②.安装JDK

</service>

下载:jdk-6u35-linux-i586.bin 或 jdk-6u45-linux-x64.bin

<queryRouter
class=”com.meidusa.amoeba.mysql.parser.MysqlQueryRouter”>
<property name=”ruleLoader”>
<bean class=”com.meidusa.amoeba.route.TableRuleFileLoader”>
<property
name=”ruleFile”>${amoeba.home}/conf/rule.xml</property>
<property
name=”functionFile”>${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property
name=”sqlFunctionFile”>${amoeba.home}/conf/functionMap.xml</property>
<property name=”LRUMapSize”>1500</property>
<!–<property name=”defaultPool”>server1</property>–>
#没有须要暗许路由
<property name=”writePool”>test1</property>
#写路由到test1上去
<property name=”readPool”>test2</property>
#读路由到test2上去

chmod 700 jdk-6u35-linux-i586.bin

<property name=”needParse”>true</property>
</queryRouter>

在dbserver.xml文件中需求改进的计划为:
<factoryConfig
class=”com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory”>
<property name=”manager”>${defaultManager}</property>
<property name=”sendBufferSize”>64</property>
<property name=”receiveBufferSize”>128</property>

chmod 700 jdk-6u45-linux-x64.bin

<!– mysql port –>
<property name=”port”>3306</property> #后端mysql的端口
<!– mysql schema –>
<property name=”schema”>amoeba</property>
#后端mysql的暗许连接数据库
<!– mysql user –>
<property name=”user”>root</property>
#三番五次后端mysql的账户
<!– mysql password
<property name=”password”>password</property>
–>
<property name=”password”>amoebapass</property>
#连接后端mysql使用的密码
</factoryConfig>

./jdk-6u35-linux-i586.bin

<dbServer name=”test1″ parent=”abstractServer”>
<factoryConfig>
<!– mysql ip –>
<property name=”ipAddress”>192.168.1.141</property>
#后端MySQL的ip
</factoryConfig>
</dbServer>

mv jdk1.6.0_35 jdk

<dbServer name=”test2″ parent=”abstractServer”>
<factoryConfig>
<!– mysql ip –>
<property name=”ipAddress”>192.168.1.142</property>
</factoryConfig>
</dbServer>

mv jdk /usr/local/

在后端代理mysql上给amoeba授权,在192.168.1.141上实施如下操作:
grant all on *.* to ‘root’@’192.168.1.121’ identified by
‘amoebapass’;(不用在备库实施,会自行同步过去)
装有的事物配置好之后就足以起来运营amoeba了,实践:/usr/local/amoeba/bin/amoeba恐怕会碰着以下错误:
The stack size specified is too small, Specify at least 160k Could not
create the Java virtual machine.

③.改换JDK的情况变量

改进 amoeba 文件,vi /usr/local/amoeba/bin/amoeba,找到如下的公文:
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss128k”
将其改善为:
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k

vi /etc/profile.d/java.sh

再度实行/usr/local/amoeba/bin/amoeba,假设现身amoeba start|stop
就可以运营amoeba了
# /usr/local/amoeba/bin/amoeba start
起步成功今后,在安装amoeba的服务器上装三个mysql的顾客带来测量检验
# yum install mysql
# mysql -uroot -pamoeba -h192.168.1.121
如若三回九转成功,并且创办成功的言辞能够在后端的代理mysql上出示出来,注解amoeba配置成功。当然假诺想看是否曾经落实了截然的主导分离,能够团结抓包深入分析查看。

JAVA_HOME=”/usr/local/jdk”

CLASS_PATH=”$JAVA_HOME/lib:$JAVA_HOME/jre/lib”

PATH=”$PATH:$JAVA_HOME/bin”

export JAVA_HOME

source /etc/profile.d/java.sh

#测量检验安装成功

java -version

安装Amoeba

下载:amoeba-mysql-binary-2.2.0.tar.gz

①.安装Amoeba

mkdir /usr/local/amoeba

tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba

cd /usr/local/amoeba/

②.配置amoeba.xml和dbServer.xml

vi conf/amoeba.xml

8066

# 暗中认可端口是8066

# 修正连接amoeba接口的印证音讯

172.18.109.213

#访问amoeba的ip地址,amoeba服务器的地址

… …

amoeba

# 客商端连接amoeba的代办使用的顾客

mypasswd

# 客户端连接amoeba的代理使用的密码

… …

${amoeba.home}/conf/rule.xml

${amoeba.home}/conf/ruleFunctionMap.xml

${amoeba.home}/conf/functionMap.xml

1500

master# 设定私下认可节点

master # 设定可写节点,节点定义见dbServers.xml文件

slave1 # 设定只读池,可配备七个slave节点

#readPool或writePool能够是dbServers中的multiPool名称,用multiPool来安装负载均衡。

true

vi conf/dbServers.xml

# 读写抽离配置,读池和写池和dbServer.xml中安顿的节点相关

${defaultManager}

64

128

3306

chejecms

myroot

# 暗中同意连接mysql server的客商

my123

# 默许连接mysql
server的密码,以上两项如不在下文中的dbserver中独立定义,则豆蔻梢头间接轨此处定义

# 定义连接mysql服务的客户amoeba和密码my123和数据库chejecms

# 定义后端MySQL的IP地址,叁个master,一个slave

172.19.200.204

172.18.109.213

#服务组,轮询战略

1

master,slave1

#1为轮询战术,里面包车型地铁master,slaver1按央浼轮询调用

64位系统,修改:

vi /usr/local/amoeba/bin/amoeba

… …

DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”

#-Xss128k改为-Xss256k

③.开启amoeba

/usr/local/amoeba/bin/amoeba start &

开机自运转

echo “/usr/local/amoeba/bin/amoeba start &” >> /etc/rc.d/rc.local

④.验证amoeba

mysql -uamoeba -h 172.18.109.213 -pmypasswd -P8066

#在乎,那个时候登陆的客商密码为连接amoeba服务器的密码,不是接连数据库的密码!!因为老是进到的是amoeba,并未有进到mysql里面!!!

相关文章