amoeba实现MySQL读写分离
amoeba实现MySQL读写分离
准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为192.168.131.136。三台服务器操作系统为RHEL6.4 x86_64,为最小化安装,
主从配置使用通用二进制包,版本为MySQL5.6.26。三台服务器均关闭防火墙和SELINUX。
一、主机A和主机B做主从同步
1、安装MySQL
# tar xf mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz
# useradd -M -s /sbin/nologin mysql
# yum -y install libaio-devel
# mv mysql-5.6.26-linux-glibc2.5-x86_64/ /usr/local/mysql
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/ --basedir=/usr/local/mysql/
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# service mysqld start
# chkconfig mysqld on
# mysql -uroot password
# echo "PATH=${PATH}:/usr/local/mysql/bin" >> /etc/profile
# source /etc/profile
# ss -tunlp | grep 3306
2、配置主从同步
①主机A配置
# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
log-bin-index=mysql-bin.index
max-binlog-size=100M
# service mysqld restart
# mysql -u root –p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'wdd'@'192.168.131.%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;
②主机B配置
# vim /etc/my.cnf
server-id=2
relay-log=relay-bin
relay-log-info-file=relay-log.info
# service mysqld restart
# mysql -u root –p
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.131.129',
MASTER_USER='wdd',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=405;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'wdd'@'192.168.131.%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
二、主机C作为中间件
1、搭建amoeba运行环境
# mkdir /amoeba
# tar xf jdk-7u40-linux-x64.gz -C /amoeba/
# vim /etc/profile
JAVA_HOME=/amoeba/jdk1.7.0_40
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
# source /etc/profile
# yum -y install java
# java –version
2、安装amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
# chmod -R +x /usr/local/amoeba/bin/
3、配置amoeba文件
# cd /usr/local/amoeba/conf/
# vim amoeba.xml
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
#更改的第一个区域
<server>
<!-- proxy server绑定的端口 -->
<property name="port">8066</property>
<!-- proxy server绑定的IP -->
<property name="ipAddress">192.168.131.136</property>
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">20</property>
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">30</property>
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">30</property>
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 对外验证的用户名 -->
<property name="user">root</property>
<!-- 对外验证的密码 -->
<property name="password">123456</property>
<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">60</property>
</server>
<!--
每个ConnectionManager都将作为一个线程启动。
manager负责Connection IO读写/死亡检测
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
<!--
default value is avaliable Processors
<property name="processors">5</property>
-->
</connectionManager>
</connectionManagerList>
<dbServerList>
<!--
一台mysqlServer 需要配置一个pool,
如果多台
平等的mysql需要进行loadBalance,
平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
或者自己写一个ObjectPool。
-->
#更改的第二个区域《配置master端登录的信息》
<dbServer name="server1">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.131.129</property>
<property name="schema">test</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">wdd</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">123456</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</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>
#更改的第四个区域《配置master和slave负载均衡池(pool)》
<dbServer name="master" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
#更改的第三个区域《配置slave端登录的信息》
<dbServer name="server2">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.131.130</property>
<property name="schema">test</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">wdd</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">123456</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</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>
#更改的第五个区域《配置master和slave读写分离》
<dbServer name="slave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server2</property>
注:上面可以写成<property name="poolNames">server2,server2,server2,server1</property>,也就是说server1和server2都加入读,但是server1:server2=1:3,也就是读一次server1读三次server2
</poolConfig>
</dbServer>
</dbServerList>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slave</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
4、修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满)
# vim log4j.xml
<param name="file" value="${amoeba.home}/logs/project.log"/>
改成
<param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/>
5、修改amoeba启动脚本
# vim /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
改为
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
6、启动Amoeba脚本
# nohup bash -x /usr/local/amoeba/bin/amoeba & #放入后台运行
# cat nohup.out #查看日志看是否启动成功
# ps -ef | grep amoeba | grep -v grep #查看进程是否启动成功
三、测试读写分离是否成功
1、主机C
# yum -y install mysql
# mysql -u root -p -P 8066 -h 192.168.131.136
2、主机A主服务器操作
# mysql -u root –p
mysql> use test;
mysql> create table info(
id int(10) unsigned not null auto_increment primary key,
name char(20));
mysql> show tables;
3、主机B从服务器操作
# mysql -u root –p
mysql> use test;
mysql> show tables;
mysql> STOP SLAVE; #为了看到试验结果,停止从服务器
4、主机A操作
mysql> insert into info values (1,'master');
5、主机B操作
mysql> insert into info values (2,'slave');
6、主机C进行测试
mysql> use test; #进行读操作
mysql> select * from info;
mysql> insert into info values (3,'wdd');
7、主机A进行操作
mysql> select * from info; #进行写操作查询
amoeba实现MySQL读写分离的更多相关文章
- 使用amoeba实现mysql读写分离
使用amoeba实现mysql读写分离 1.什么是amoeba? Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明. ...
- 使用Amoeba实现mysql读写分离机制
Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实 ...
- Amoeba for MySQL读写分离配置
一. 安装和运行Amoeba 1. Amoeba for MySQL 架构: 2. 验证Java的安装Amoeba框架是基于Java SE1.5开发的,建议使用Java SE1.5以上的版本 ...
- amoeba安装与实现amoeba for mysql读写分离
运行环境 l CentOS6.3 l Jdk1.6.0_30 l amoeba-mysql-binary-2.2.0 l amoeba:192.168.88.17 l master1:192 ...
- Amoeba新版本MYSQL读写分离配置
标签:mysql 数据库 读写分离 休闲 amoeba 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://skyson.blog.5 ...
- mysql中间件amoeba实现mysql读写分离
Amoeba是一个以MySQL为底层数据存储,并相应用提供MySQL协议接口的proxy.它集中地响应应用的请求,根据用户事先设置的规则.将SQL请求发送到特定的数据库上运行.基于此能够实现负载均衡. ...
- Amoeba 实现MySQL读写分离
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy,它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡. ...
- Amoeba For MySQL读写分离
Amoeba安装,参考http://hi.baidu.com/itfenqing/item/79fe989838e1e8ad83d2959c Amoeba版本为:amoeba-mysql-1.3.1- ...
- Mysql读写分离-Amoeba Proxy
参考:http://www.linuxidc.com/Linux/2015-10/124115.htm 一个完整的MySQL读写分离环境包括以下几个部分: 应用程序client database pr ...
随机推荐
- 自定义滚动控件(Pagecontrol)
// // MyPageCorol.h // lejiahui // // Created by iOS开发 on 16/4/10. // Copyright © 2016年 zhongmingwuy ...
- jquery ajax 序列化表单传参提交实体对象到后台action
========action后台我这里使用的是SpringMVC如果用ssh用法一致=============== @Controller@RequestMapping("PubjobCon ...
- ASP.NET基础之HttpModule 、HttpContext、 HttpHandler
http://www.cnblogs.com/wujy/p/3261141.html http://www.cnblogs.com/wujy/p/3264475.html http://www.cnb ...
- (剑指Offer)面试题28:字符串的排列
题目: 输入一个字符串,打印出该字符串中字符的所有排列. 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 思路: 把一个字符串看 ...
- HTML中诡异的空文本
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-03-27) 今天在写代码的时候发现了一个诡异的问题,我的HTML页面代码当中明明没有多余的行,标签书写规范,没有加任何样式( ...
- Codeforces Gym 100803C Shopping 贪心
Shopping 题目连接: http://codeforces.com/gym/100803/attachments Description Your friend will enjoy shopp ...
- 使用AutoMapper实现Dto和Model的自由转换
AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...
- JRebel_修改class后无法正确调试问题解决【2014-03-12】
原文地址:http://www.cnblogs.com/hbbbs/p/3596179.html 现象 修改了class,编译后,JRebel自动装载到Web容器中.但此时调试这个类会发现无法正常调试 ...
- Reservoir Sampling - 蓄水池抽样
问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the o ...
- Spark目录
1. Spark1.0.0 应用程序部署工具spark-submit 2. Spark Streaming的编程模型 3. 使用java api操作HDFS文件 4. 用SBT编译Spark的Word ...