且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

mysql读写分离

更新时间:2022-09-21 23:05:04

Mysql读写分离实现水平扩展:做这个之间必须要做好主从复制才行

 

Mysql读写分离技术

方法一:基于程序代码内部实现:这类方法是目前生产环境中应用最广泛的

 

在代码中根据insertselect进行选择分类,这类方法是目前生产环境中应用最广泛的

优点:性能好,因为在程序代码中实现,不需要增加额外的设备作为硬件支持,缺点是需要开发人员来实现,运维人员无从下手

 

方法二:基于中间代理层实现  运维人员主要学习这个

代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库,目前主要有两个代表性程序

 

Mysql_proxy:mysql开源项目,通过其自带的lua脚本进行sql判断

Amoeba:由陈思儒开发,作者就职于阿里巴巴,该程序由java进行开发  这个使用比较多

Mysql-proxy实现读写分离

原理图:

mysql读写分离 

本届案例实验拓扑图:

1配置主从复制,这里略过

mysql读写分离 

2、安装mysql-proxy

实现读写分离是有lua脚本实现的,现在mysql-proxy里面已经集成,无需再安装

下载:http://dev.mysql.com/downloads/mysql-proxy/

直接解压出来就可以使用

 

主从服务器创建mysql client连接到mysql server的用户  //这个账号不是用来连接proxy的,因为验证都是后端mysql来验证的,因为我们做好了主从关系,所以只需要在主服务器上建账号就可以了。

Grant all on *.* to admin@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

mysql读写分离 

 

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

mysql读写分离

1

mysql> grant all on *.* to 'proxy'@'192.168.0.204' identified by '123.com';

2>.使用客户端连接mysql-proxy

Shell

mysql读写分离

1

mysql -u proxy -192.168.0.204 -4000 -p123.com

创建数据库和表,这时的数据只写入主mysql,然后再同步从slave,可以先把slave的关了,看能不能写入,这里我就不测试了,下面测试下读的数据!

Shell

mysql读写分离

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

mysql读写分离

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

mysql读写分离

1

2

3

4

5

6

7

8

9

mysql -u proxy -192.168.0.204 -4000 -p123.com

mysql> use test;

mysql> select * from user;

+--------+----------+

| number | name |

+--------+----------+

| 1 | zhangsan |

| 2 | lisi |

+--------+----------+

5>.登陆从服务器关闭mysql同步进程,这时再登陆mysql-proxy肯定会查询不出数据

Shell

mysql读写分离

1

slave stop;

6>.登陆mysql-proxy查询数据,下面看来,能看到表,查询不出数据

Shell

mysql读写分离

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读写分离 

实验拓扑:

mysql读写分离 

主从服务器创建mysql client连接到mysql server的用户  //这个账号不是用来连接amoeba的,因为验证都是后端mysql来验证的,因为我们做好了主从关系,所以只需要在主服务器上建账号就可以了。

Grant all on *.* to admin@192.168.10.% identified by tianyun;

Flush privileges;

从客户端端测试主备服务器的连接

 

安装amoeba

首先必须配置Java环境,建议在1.61.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-----------------------------------

 

本文转自    探花无情   51CTO博客,原文链接:http://blog.51cto.com/983865387/1917427