MySQL读写分离-amoeba
2015-10-08 22:54
549 查看
1、理论部分
[b]1.1、为什么需要MySQL读写分离[/b]
随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:
1)集中式处理,势必造成性 能瓶颈;
2)应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性 不高;
3)集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。在这种形势下,集中式数 据库将向分布式数据库发展。
[b]1.2、MySQL读写分离的架构[/b]
![](http://s3.51cto.com/wyfs02/M01/74/10/wKiom1YR7kbi-uhZAACMH5QEqK0019.jpg)
前端:
N个Application Server
后端:
Master <---> Relay Master ---> Muti Slave
[b]1.3、如何实现读写分离[/b]
通常来说有两种方式实现读写分离:
[b][b]1.3.1、应用程序层实现[/b][/b]
![](http://s3.51cto.com/wyfs02/M01/74/0F/wKioL1YSVOjwgeuNAAAbKi791Ko993.jpg)
1)应用程序层实现指的是在应用程序内部及连接器中实现读写分离。
例如:
com.mysql.jdbc.ReplicationDriver
mysqlnd_ms
2)优点:
程序内部实现读写分离,安装即可使用
减少部署难度
访问压力在一定级别以下,性能很好。
3)缺点:
架构一旦调整,代码要跟着变,不够灵活。
难以实现高级应用,如自动分库、分表。
无法适用于更大型的应用场景。
[b][b]1.3.2、中间层实现[/b][/b]
![](http://s3.51cto.com/wyfs02/M02/74/12/wKiom1YSVP3jqi4DAABMSkMEtc8370.jpg)
1)中间层实现指的是外部中间件程序实现读写分离,例如:
mysql-proxy
amoeba
Atlas(Qihoo360)
Cobar(Alibaba)
TDDL(Taobao)
2)优点:
架构设计上更加灵活。
可在程序上实现一些高级控制,如透明化水平拆分、Failover、流量控制。
依靠一些技术手段提高MySQL性能,如连接池。
3)缺点:
1)需要有一定开发实力和运维团队的支持。
[b]1.4、Amoeba实现读写分离[/b]
[b][b]1.4.1、优点[/b][/b]
1)这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。
2)座落与 Client、DB Server(s)之间,对客户端透明。
3)具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。
4)通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。
5)Amoeba目前不支持事务
[b][b]1.4.2、缺点[/b][/b]
1)目前还不支持事务
2)暂时不支持存储过程(近期会支持)
3)不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
4)暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致
[b]1.5、应用概述[/b]
1)MySQL Replication读写分离是很多企业经常使用的技术。
2)读写分离涉及到高负载环境下的MySQL架构设计。
3)读写分离发展过程:简单读写分离->水平拆分读写分离->业务逻辑分离。
4)读写分离常见框架:
M-S
M-S-Muti Slave
M-M-Muti Slave
Muti Master-Muti Master-MutiSlave
5)复杂的架构设计往往与高可用技术整合使用。
2、实验部分
[b]2.1、实验基础[/b][b][b]2.1.1、实验环境[/b][/b]以下实验需要“mysql replication(主从复制)(一)MS模式”的实验为基础,如果你没有MS环境,请参阅以下链接。/article/4214679.html[b][b]2.1.2、实验环境信息[/b][/b]
1)MySQL-node(Amoeba实现的数据库分发节点)
ipaddress=10.168.0.110hostname=sql-a2)MySQL Master(数据库节点)
ipaddress=10.168.0.103hostname=sql-m3)MySQL Slave(数据库节点)
ipaddress=10.168.0.104hostname=sql-s[b][b]2.1.3、yum的安装[/b][/b]In MysQL-node
amoeba下载:In MySQL-node:
[b]1.1、为什么需要MySQL读写分离[/b]
随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:
1)集中式处理,势必造成性 能瓶颈;
2)应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性 不高;
3)集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。在这种形势下,集中式数 据库将向分布式数据库发展。
[b]1.2、MySQL读写分离的架构[/b]
![](http://s3.51cto.com/wyfs02/M01/74/10/wKiom1YR7kbi-uhZAACMH5QEqK0019.jpg)
前端:
N个Application Server
后端:
Master <---> Relay Master ---> Muti Slave
[b]1.3、如何实现读写分离[/b]
通常来说有两种方式实现读写分离:
[b][b]1.3.1、应用程序层实现[/b][/b]
![](http://s3.51cto.com/wyfs02/M01/74/0F/wKioL1YSVOjwgeuNAAAbKi791Ko993.jpg)
1)应用程序层实现指的是在应用程序内部及连接器中实现读写分离。
例如:
com.mysql.jdbc.ReplicationDriver
mysqlnd_ms
2)优点:
程序内部实现读写分离,安装即可使用
减少部署难度
访问压力在一定级别以下,性能很好。
3)缺点:
架构一旦调整,代码要跟着变,不够灵活。
难以实现高级应用,如自动分库、分表。
无法适用于更大型的应用场景。
[b][b]1.3.2、中间层实现[/b][/b]
![](http://s3.51cto.com/wyfs02/M02/74/12/wKiom1YSVP3jqi4DAABMSkMEtc8370.jpg)
1)中间层实现指的是外部中间件程序实现读写分离,例如:
mysql-proxy
amoeba
Atlas(Qihoo360)
Cobar(Alibaba)
TDDL(Taobao)
2)优点:
架构设计上更加灵活。
可在程序上实现一些高级控制,如透明化水平拆分、Failover、流量控制。
依靠一些技术手段提高MySQL性能,如连接池。
3)缺点:
1)需要有一定开发实力和运维团队的支持。
[b]1.4、Amoeba实现读写分离[/b]
[b][b]1.4.1、优点[/b][/b]
1)这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。
2)座落与 Client、DB Server(s)之间,对客户端透明。
3)具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。
4)通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。
5)Amoeba目前不支持事务
[b][b]1.4.2、缺点[/b][/b]
1)目前还不支持事务
2)暂时不支持存储过程(近期会支持)
3)不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
4)暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致
[b]1.5、应用概述[/b]
1)MySQL Replication读写分离是很多企业经常使用的技术。
2)读写分离涉及到高负载环境下的MySQL架构设计。
3)读写分离发展过程:简单读写分离->水平拆分读写分离->业务逻辑分离。
4)读写分离常见框架:
M-S
M-S-Muti Slave
M-M-Muti Slave
Muti Master-Muti Master-MutiSlave
5)复杂的架构设计往往与高可用技术整合使用。
2、实验部分
[b]2.1、实验基础[/b][b][b]2.1.1、实验环境[/b][/b]以下实验需要“mysql replication(主从复制)(一)MS模式”的实验为基础,如果你没有MS环境,请参阅以下链接。/article/4214679.html[b][b]2.1.2、实验环境信息[/b][/b]
1)MySQL-node(Amoeba实现的数据库分发节点)
ipaddress=10.168.0.110hostname=sql-a2)MySQL Master(数据库节点)
ipaddress=10.168.0.103hostname=sql-m3)MySQL Slave(数据库节点)
ipaddress=10.168.0.104hostname=sql-s[b][b]2.1.3、yum的安装[/b][/b]In MysQL-node
yum -y install mysql[b]2.2、下载源[/b]
amoeba下载:In MySQL-node:
cd ~ wget http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz?AuthParam=1445836360_be02266de879eb81f370c5e6620e727c wget http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz/download[/code]以下是官方发布源的地址,请按照自己实际选择: href="http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html" target=_blank>http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htmlhttp://sourceforge.net/projects/amoeba/files/[b]2.3、实验步骤[/b]1)三台服务器均安装MySQL(MySQL-node可指装client)2)MySQL-node上安装Amoeba3)配置Amoeba4)MySQL Master&Slave均需授权MySQL-node可以访问5)MySQL Master&Slave上创建测试库与测试表6)测试读写分离[b][b]2.3.1、安装Amoeba[/b][/b]Amoeba基于JAVA开发。因此,安装Amoeba还需要同时安装JDKIn MySQL-nodetar zxvf jdk-7u79-linux-x64.tar.gz -C /usr/local cd /usr/local mv jdk1.7.0_79/ jdk echo 'export JAVA_HOME=/usr/local/jdk' >> ~/.bashrc . ~/.bashrc echo $JAVA_HOME mkdir -pv /usr/local/amoeba tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba cd /usr/local/amoeba/conf ls[b][b]2.3.2、Amoeba配置文件[/b][/b]
Amoeba的配置文件位于程序目录下的conf子目录。通过配置.xml文件,影响Amoeba运行1)amoeba.xml Amoeba主配置文件2)dbServers.xml 数据库节点配置文件3)functionMap.xml 函数配置文件4)ruleFunctionMap.xml 规则函数配置文件5)rule.xml 规则配置文件6)access_list.conf 访问控制[b][b]2.3.3、amoeba.xml[/b][/b]<!--port(默认监听端口)--> <property name="port">8066</property> <!--bind ipAddress(指定监听的逻辑地址)--> <property name="ipAdress">127.0.0.1</property> <property name="connectionFactory"> <bean ...> <!--缓存大小--> <property name="sendBufferSize">128</property> <property name="receiveBufferSize">64</property> </bean> </property> <property name="authenticator"> <bean ...> <!--前端应用程序通过Amoeba登录数据库时所使用的用户名和密码--> <property name="user">amofu</property> <property name="amofp">amofp</property> </bean> </property> <!--Amoeba监控报告--> <service name="Amoeba Monitor Server" ...> ... </service> <!--配置读写分离--> <queryRouter ...> <property name"defaultPool">Master</property> <property name"writePool">Master</property> <property name"readPool">Slave</property> </queryRouter>[b][b]2.3.4、dbServers.xml[/b][/b]<!-- 服务器组配置 --> <dbServer name="abstractServer" abstractive="true"> <factoryConfig ...> <!-- 后端数据库的端口号、默认所查的数据库、用户名和密码 --> <property name="port">3306</property> <property name="schema">cmdschool</property> <property name="user">amou</property> <property name="password">amop</property> </factoryConfig> </dbServer> <!-- 成员服务器1配置 --> <dbServer name="Master" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">10.168.0.103</property> </factoryConfig> </dbServer> <!-- 成员服务器2配置 --> <dbServer name="Slave" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">10.168.0.104</property> </factoryConfig> </dbServer> <!-- 服务器池配置 --> <dbServer name="multiPool" virtual="true"> <poolConfig> <!-- Load balancing stategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA --> <property name="loadbalance">1</property> <!-- Separated by commas,such as: Master,Slave --> <property name="poolNames">Master,Slave</property> </poolConfig> </dbServer>[b][b]2.3.5、授权Amoeba访问MySQL[/b][/b]
所有前端应用程序都通过Amoeba访问真实数据库。因此,每个数据库都需要创建用户并授权Amoeba访问。In Mastermysql> create database cmdschool; mysql> create table t1(id varchar(255));In Master & Slavemysql> grant all on cmdschool.* to amou@10.168.0.110 identified by'amop'; mysql> flush privileges;MySQL-nodemysql -h10.168.0.103 -uamou -pamop[b][b]2.3.6、运行或停[/b][/b][b][b]止Amoeba[/b][/b]cd /usr/src/amoeba/bin ./amoeba start& ./amoeba stop错误提示:
The stack size specified is too small, Specify at Least 160k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决方法:
vim ./amoeba
默认值:DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"变更为:DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"重启服务:./amoeba stop ./amoeba start&[b][b][b][b][b]2.3.7、[/b][/b]开启防火墙[/b][/b][/b]
vim编辑/etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT重启防火墙/etc/init.d/iptables restart[b][b]2.3.8、测试Amoeba[/b][/b]
In Slavemysql> stop slave;In MySQL-nodemysql -h10.168.0.110 -uamofu -pamofp -P 8066 use cmdschool show tables; insert into t1 values ("1"),("2"),("3"); select * from t1;In Slavemysql> start slave;In MySQL-nodeselect * from t1;参考文献:Amoeba使用指南http://docs.hexnova.com/amoeba/在Master/Slave结构下的读写分离http://docs.hexnova.com/amoeba/rw-splitting.html本文出自 “老谭linux集群博客” 博客,请务必保留此出处http://cmdschool.blog.51cto.com/2420395/1701028
相关文章推荐
- mysql基础
- mysql bug
- mac下的mysql压缩包安装
- MYSQL -- case when用法
- 查询数据
- mysql中profile用法
- mysql学习笔记(3)-其他性能优化方法
- mysql学习笔记(2)-创建MySQL索引
- mysql的collation
- 操作MySQL数据库
- Mysql创建后表的修改
- mysql 安装配置相关
- Mysql常用功能操作实现
- 应用迁移,流量切换,数据切换. mysql 同步. 同构,异构两种情况分析.
- 常见的MySQL命令大全
- mysql查询区分大小写
- WordPress无法连接MySQL数据库
- Mysql技术内幕知识点摘录
- MySql基础知识
- 设置mysql允许外部IP连接的解决方法