首页 > 代码库 > mysql读写分离
mysql读写分离
Mysql高级集群-读写分离Amoeba
Amoeba相当于一个SQL请求的路由器,
目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的
Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来
替代作者的实现。这个程序总体上比较符合KISS原则的思想。
2优势
Amoeba主要解决以下问题:
a). 数据切分后复杂数据源整合
b). 提供数据切分规则并降低数据切分规则给数据库带来的影响
c). 降低数据库与客户端连接
d). 读写分离路由
3不足
a)、目前还不支持事务b)、暂时不支持存储过程(近期会支持)
c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
d)、暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致:
读写 数据同步
Master-->Slave
一、环境介绍
Master-IP:10.0.0.201
Slave- IP:10.0.0.202
Amobea-IP:10.0.0.203
二、安装JDK
1)# mkdir /Amoeba
# tar -xvf jdk-7u40-linux-x64.tar.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
2)# source /etc/profile
# java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
三、安装Amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba/
# chmod -R +x /usr/local/amoeba/bin/
四、在主机和从机上进行授权
>grant all privileges on *.* to ‘amobea‘@‘%‘ identified by ‘amoeba123‘;
>flush privileges;
五、配置Amoeba文件
# cd /usr/local/amoeba/conf
解决配置文件乱码:iconv -f gbk -t utf8 amoeba.xml -o amoeba.xml.bak
mv amoeba.xml.bak amoeba.xml
# vim amoeba.xml
更改的第一个区域修改port和ip 在第8,12,30,34行
#========================================================
<!-- proxy server绑定的端口 -->
更改port: <property name="port">9006</property>
<!-- proxy server绑定的IP -->
解开注释改ip: <property name="ipAddress">10.0.0.203</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>
更改的第二个区域《配置master端登录的信息》
dbserverlist下master的port和ip和amoeba的用户名和密码 在第74,78,83行
#========================================================
<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">10.0.0.201</property>
<property name="schema">test</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">amoeba</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">amoeba123</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>
更改的第三个区域《配置slave端登录的信息》
从64行起复制35行后修改第110行slave的ip
#========================================================
<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">10.0.0.202</property>
<property name="schema">test</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">amoeba</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">amoeba123</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>
将上面的9行复制下来:
<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">server1,server2</property>
<!-- 此处可以进行一主多从的修改 -->
</poolConfig>
</dbServer>
更改的第五个区域《配置master和slave读写分离》
#=======================================================
<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>
<!-- 配置master和slave读写分离 Begin-->
<property name="defaultPool">master</property>
解开注释: <property name="writePool">master</property>
<property name="readPool">slave</property>
<!-- 配置master和slave读写分离 End-->
<property name="needParse">true</property>
</queryRouter>
六、修改Amoeba启动脚本
# vim /usr/local/amoeba/bin/amoeba
#DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" 将此行注释掉,增加一下行
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k" 增加这一行
七、启动Amoeba脚本
source /etc/profile
cd /usr/local/amoeba/bin
# nohup bash -x amoeba &
# cat nohup.out 日志是否成功?
# ps -ef | grep amoeba 查看进程是否启动成功
root 1896 1637 1 03:28 pts/3 00:00:06
/Amoeba/jdk1.7.0_40/bin/java -server -Xms256m -Xmx256m -Xss256k
-Damoeba.home=/usr/local/amoeba
-Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath
/usr/local/amoeba/lib/classworlds-1.0.jar
org.codehaus.classworlds.Launcher
# mysql -uroot -p123456 -h 10.0.0.203 -P 9006
重新实验时要kill -9 杀掉进程再nohup bash -x amoeba &