mysql读写分离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql读写分离相关的知识,希望对你有一定的参考价值。
mysql读写分离实现水平扩展:做这个之间必须要做好主从复制才行
Mysql读写分离技术
方法一:基于程序代码内部实现:这类方法是目前生产环境中应用最广泛的
在代码中根据insert,select进行选择分类,这类方法是目前生产环境中应用最广泛的
优点:性能好,因为在程序代码中实现,不需要增加额外的设备作为硬件支持,缺点是需要开发人员来实现,运维人员无从下手
方法二:基于中间代理层实现 运维人员主要学习这个
代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库,目前主要有两个代表性程序
Mysql_proxy:mysql开源项目,通过其自带的lua脚本进行sql判断
Amoeba:由陈思儒开发,作者就职于阿里巴巴,该程序由java进行开发 这个使用比较多
Mysql-proxy实现读写分离
原理图:
本届案例实验拓扑图:
1配置主从复制,这里略过
2、安装mysql-proxy
实现读写分离是有lua脚本实现的,现在mysql-proxy里面已经集成,无需再安装
下载:http://dev.mysql.com/downloads/mysql-proxy/
直接解压出来就可以使用
主从服务器创建mysql client连接到mysql server的用户 //这个账号不是用来连接proxy的,因为验证都是后端mysql来验证的,因为我们做好了主从关系,所以只需要在主服务器上建账号就可以了。
Grant all on *.* to [email protected]’192.168.10.%’ identified by ‘tianyun’;
Flush privileges;
从客户端端测试主备服务器的连接
3配置mysql proxy
注意事项:这台电脑上一定不能有mysql,即使有也一定要停止掉,因为待会proxy会调用3306端口去连接后端mysql服务器。如果这台电脑上也在运行mysql这是不可以的
在192.168.10.137上操作
Service mysqld stop
Chkconfig mysqld off
Rpm -qa |grep lua //必须确保lua安装好,6以上的是自动安装好的
Tax xzf mysql_proxy_0.8.4-linux-el6-x86-64bit.tar.gz -C /usr/local/
Cd /usr/lcoal
Mv mysql_proxy_0.8.4-linux-el6-x86-64 mysql-proxy //改名
Vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
4启动mysql proxy(璞瑞森)
Lsof -i tcp:3306 //确保3306端口没有被占用
/usr/local/mysql-proxy/bin/mysql-proxy --help-proxy
-P 指定proxy服务器工作的地址和端口
-b指定写服务器的地址和端口
-r指定读服务器的地址和端口
-s指定判断的脚本
--daemon以后台进程的方式启动
/usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.10.137:3306 -b 192.168.10.6:3306 -r 192.168.10.37:3306 -r 192.168.10.158:36 -s usr/local/mysql-proxy/sahre/doc/mysql-proxy/rw-splitting.lua --daemon
查看 cat /etc/hosts
5测试效果
1>.在主服务器创建proxy用户用于mysql-proxy使用,从服务器也会同步这个操作
Shell
1 | mysql> grant all on *.* to ‘proxy‘@‘192.168.0.204‘ identified by ‘123.com‘; |
2>.使用客户端连接mysql-proxy
Shell
1 | mysql -u proxy -h 192.168.0.204 -P 4000 -p123.com |
创建数据库和表,这时的数据只写入主mysql,然后再同步从slave,可以先把slave的关了,看能不能写入,这里我就不测试了,下面测试下读的数据!
Shell
1 2 3 | mysql> create table user (number INT(10),name VARCHAR(255)); mysql> insert into test values(01,‘zhangsan‘); mysql> insert into user values(02,‘lisi‘); |
3>.登陆主从mysq查看新写入的数据如下,
Shell
1 2 3 4 5 6 7 8 9 | mysql> use test; Database changed mysql> select * from user; +--------+----------+ | number | name | +--------+----------+ | 1 | zhangsan | | 2 | lisi | +--------+----------+ |
4>.再登陆到mysql-proxy,查询数据,看出能正常查询
Shell
1 2 3 4 5 6 7 8 9 | mysql -u proxy -h 192.168.0.204 -P 4000 -p123.com mysql> use test; mysql> select * from user; +--------+----------+ | number | name | +--------+----------+ | 1 | zhangsan | | 2 | lisi | +--------+----------+ |
5>.登陆从服务器关闭mysql同步进程,这时再登陆mysql-proxy肯定会查询不出数据
Shell
1 | slave stop; |
6>.登陆mysql-proxy查询数据,下面看来,能看到表,查询不出数据
Shell
1 2 3 4 5 6 7 8 9 10 | mysql> use test; Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | user | +----------------+ mysql> select * from user; ERROR 1146 (42S02): Table ‘test.user‘ doesn‘t exist |
配置成功!真正实现了读写分离的效果
Amoeba(二米吧)实现读写分离 也是基于主备的基础上
http:sourceforge.net/projects/amoeba/files/
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能
优点:
a). 数据切分后复杂数据源整合
b). 提供数据切分规则并降低数据切分规则给数据库带来的影响
c). 降低数据库与客户端连接
d). 读写分离路由
缺点
a)、目前还不支持事务
b)、暂时不支持存储过程(近期会支持)
c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
d)、暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致:
Amoeba:阿米巴原虫
原理图:
实验拓扑:
主从服务器创建mysql client连接到mysql server的用户 //这个账号不是用来连接amoeba的,因为验证都是后端mysql来验证的,因为我们做好了主从关系,所以只需要在主服务器上建账号就可以了。
Grant all on *.* to [email protected]’192.168.10.%’ identified by ‘tianyun’;
Flush privileges;
从客户端端测试主备服务器的连接
安装amoeba
首先必须配置Java环境,建议在1.6或1.7以上,在6.4以上的系统自身就已经安装好了java环境
Java -version //查看java是否安装,通常默认是安装的
Vim /etc/profile //配置java环境变量
JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.9.x86_64/
Export JAVA_HOME
保存退出
Source /etc/profile
Env|grep JAVA //查看保障java环境变量是存在的,必须要保障java变量配置ok的,才能启动amoeba
JAVA_HOME=/usr/lib/kvm/java-1.7.0-openjdk-1.7.0.9.x86_64/
在安装amoeba之前同样保障3306端口没有被占用
Lsof -i TCP:3306
Mkdir /usr/local/amoeba
Tar xzf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ //直接解压就可以使用
Cd /usr/local/amoeba
Ls //查看一下里面的文件
配置amoeba
需要配置两个文件
/usr/local/amoeba/conf/dbServers.xml
/usr/local/amoeba/conf/amoeba.xml
Vim /usr/local/amoeba/conf/dbServers.xml //配置它去连接数据库的用户名和密码等
Vim /usr/local/amoeba/conf/amoeba.xml //配置客户端怎么去连接amoeba
启动测试 ----------------------------end-----------------------------------
本文出自 “快乐学习” 博客,请务必保留此出处http://983865387.blog.51cto.com/9838888/1917427
以上是关于mysql读写分离的主要内容,如果未能解决你的问题,请参考以下文章