Mysql集群读写分离(Amoeba)
Amoeba原理戳这里:Amoeba详细介绍
实验环境
Master、Amoeba--IP:192.168.1.5
Slave---IP:192.168.1.10
安装JDK
JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@dep5 ~]# mkdir /usr/local/JDF
[root@dep5 ~]# tar -xvf jdk-8u101-linux-x64.tar.gz -C /usr/local/JDF/
[root@dep5 ~]#vim /etc/profile
- JAVA_HOME=/usr/local/JDF/jdk1.8.0_101
- export JAVA_HOME
- PATH=$JAVA_HOME/bin:$PATH
- export PATH
- CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
- export CLASSPATH
####测试JDK是否OK
[root@dep5 ~]# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
安装Amoeba
Amoeba下载地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/
[root@dep5 ~]# mkdir /usr/local/amoeba
[root@dep5 ~]# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
[root@dep5 ~]# chmod -R +x /usr/local/amoeba/bin/
主从授权,增加用户,修改配置文件
主(192.168.1.5 vim /etc/my.cnf):
server-id = 1 #主数据库标志
从(192.168.1.10 vim /etc/my.cnf):
server-id = 2 #从数据库标志
所有参与主从分离的机器(192.168.1.5,192.168.1.10):
mysql-->grant all privileges on *.* to amoeba@'%' identified by 'amoeba';
mysql-->flush privileges;
Amoeba配置介绍
Amoeba For MySQL 的使用非常简单,所有的配置文件都是标准的XML 文件,总共有四个配置文件。分别为:
- amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了;
- rule.xml:配置所有Query 路由规则的信息;
- functionMap.xml:配置用于解析Query 中的函数所对应的Java 实现类;
- rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;
下面是一份已经修改OK的amoeba.xml配置文件
[root@dep5 ~]# vim /usr/local/amoeba/conf/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">8888</property>
- <!-- proxy server绑定的IP -->
- <property name="ipAddress">192.168.1.5</property>
- <!-- 对外验证的用户名 -->
- <property name="user">amoeba</property>
- <!-- 对外验证的密码 -->
- <property name="password">amoeba</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>
- <!-- 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。
- -->
- <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.1.5</property>
- <property name="schema">test</property>
- <!-- 用于登陆mysql的用户名 -->
- <property name="user">amoeba</property>
- <!-- 用于登陆mysql的密码 -->
- <property name="password">amoeba</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>
- <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.1.10</property>
- <property name="schema">test</property>
- <!-- 用于登陆mysql的用户名 -->
- <property name="user">amoeba</property>
- <!-- 用于登陆mysql的密码 -->
- <property name="password">amoeba</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>
- <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>
- <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>
- </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">server1</property>
- <!-- 读写分离在这里 -->
- <property name="writePool">master</property>
- <property name="readPool">slave</property>
- <property name="needParse">true</property>
- </queryRouter>
- </amoeba:configuration>
启动Amoeba
# cd /usr/local/amoeba/bin
这种启动方便看nohup.log日志.防止提示溢出
#:nohup bash -x amoeba &
常见错误:1
The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决办法:
# vim /usr/local/amoeba/bin/amoeba
#DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" 注释
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k" 增加
常见错误2:
org.xml.sax.SAXParseException; lineNumber: 406; columnNumber: 6; 注释中不允许出现字符串 "--"。
解决办法:
后来改了一大通,试了一下午,才发现。 我们的注释两边要有空格,才行。
测试是否读写分离
在(master)主上的test库建立一个los的表
Mysql->use test;
Mysql->create table los(id int(10),name char(10));
在(slave)从上查看test库是否同步了los表
Mysql-> use test;
Mysql->show tables;
在主(master)操作.插入一条数据.
mysql-->insert into alvin values(1,'master');
在从(slave)操作,插入一条数据.
mysql-->insert into alvin values(2,'slave');
注意因为从同步主的数据。所以这里有2条数据,
(1) 先验证读。我们配置文件是用的是DR轮询,注意这个IP地址要写:amoeba的IP地址,不是master也不是slave (只是实验,就把amoeba跟master放在同一个机器上面)是通过amoeba代理登陆。192.168.1.5
(2) 验证写,正常来说。如果只有全部写到主里面,两边的数据才会以致。如果其中有一个不一致的话。那么说明写到从里面去了。因为主不会同步从的数据。都是单向数据传输。
我就稍微稍微偷一下懒嘛,弄清楚读写分离的原理,弄懂原理就好办了,肯定有各种想法在里面,如果这些想法都能得到验证,那么主从就Ok了
参考度娘时好多博客文件,然后自己做实验通过OK
Mysql集群读写分离(Amoeba)的更多相关文章
- docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡
依然如此,只要大家跟着我的步骤一步步来,100%是可以测试成功的 centos6.8已不再维护,可能很多人的虚拟机中无法使用yum命令下载docker, 但是阿里源还是可以用的 因为他的centos- ...
- MySQL集群读写分离的自定义实现
基于MySQL Router可以实现高可用,读写分离,负载均衡之类的,MySQL Router可以说是非常轻量级的一个中间件了.看了一下MySQL Router的原理,其实并不复杂,原理也并不难理解, ...
- 使用mysql-proxy 快速实现mysql 集群 读写分离
目前较为常见的mysql读写分离分为两种: 1. 基于程序代码内部实现:在代码中对select操作分发到从库:其它操作由主库执行:这类方法也是目前生产环境应用最广泛,知名的如DISCUZ X2.优点是 ...
- MySQL集群系列2:通过keepalived实现双主集群读写分离
在上一节基础上,通过添加keepalived实现读写分离. 首先关闭防火墙 安装keepalived keepalived 2台机器都要安装 rpm .el6.x86_64/ 注意上面要替换成你的内核 ...
- 十四、linux-MySQL的数据库集群读写分离及高可用性、备份等
一.数据库集群及高可用性 二.mysql实现读写分离 mysql实现读写分离有多种方式: 1)代码语言(php\python\java等)层面实现读写分离,找开发进行实现. 2)通过软件工具实现读写分 ...
- linux上使用amoeba实现MySql集群,以及读写分离,主从复制
一.由于是MySql集群,所以就不可能只有一个MySql,需要多个MySql,具体安装步骤,可以参考http://www.cnblogs.com/ywzq/p/4882140.html这个地址进行安装 ...
- Mycat搭建负载均衡,读写分离的Mysql集群
Mycat搭建负载均衡,读写分离的Mysql集群 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.Mycat-server-1.6.7.4-te ...
- MySQL集群(三)mysql-proxy搭建负载均衡与读写分离
前言 前面学习了主从复制和主主复制,接下来给大家分享一下怎么去使用mysql-proxy这个插件去配置MySQL集群中的负载均衡以及读写分离. 注意:这里比较坑的就是mysql-proxy一直没有更新 ...
- 2.Mysql集群------Mycat读写分离
前言: Mycat: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一 ...
随机推荐
- go share library
http://blog.ralch.com/tutorial/golang-sharing-libraries/ Sharing Golang packages to C and Go Sun, Au ...
- Git 版本管理基本操作
Git是一个版本管理操作的工具 非常N,可以很智能的分布式管理, 本网站学习笔记 来自于廖雪峰老师的内容借鉴 安装 yum -y install git 本地设置全局 告知是谁提交代码 信息 # gi ...
- asp.net导出excel科学计数问题
方法一: 在asp.net 中 我一般都是将要导出的数据放到gridview网格里,首先对网格邦定数据时 字符串形式处理,然后再用普通的形式导出excel就把问题解决了. 我的代码非常简单:在邦定gr ...
- linux fork()函数
C语言编程创建函数fork() 执行解析 | 浏览:1842 | 更新:2013-04-22 15:12 | 标签:c语言 概述 最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思 ...
- OpenGL中glFrustum()和gluPerspective()的相互转换
OpenGL中在窗口的大小发生变化的时候会触发resize()函数,这里会传入一个新的宽和高,在resize()函数中我们会设置投影矩阵,在可以使用OpenGL基础函数glFrustum()函数和gl ...
- phpStudy环境配置多个站点,绑定域名
经常做网站的朋友,往往要在自已的电脑同时建立多个站点,而phpstudy这款软件就能很好的解决这个问题,大家看下图 点击上图中的 其它选项菜单 ,就会弹出下面的对话框,然后点击 站点域名管理 然 后在 ...
- Power oj2470/DFS
题目链接 2469: C 小Y的难题(1) Time Limit: 1000 MS Memory Limit: 65536 KB Total Submit: 9 Accepted: 7 Page Vi ...
- Android自定义XML属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-style ...
- Break on _NSLockError() to debug.
*** -[NSCondition dealloc]: condition (<NSCondition: 0x1039a450> '(null)') deallocated while s ...
- 栈的java实现和栈的应用
[例子和习题出自数据结构(严蔚敏版), 本人使用java进行实现. 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正. ] 栈的实现 栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口: ...