oneproxy实现Mysql读写分离

一、读写分离概述

1. 基本的原理

让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

oneproxy实现Mysql读写分离_第1张图片

数据内部交换过程:

oneproxy实现Mysql读写分离_第2张图片

2. 作用

面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载

  1. 主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
  2. 从库可配置myisam引擎,提升查询性能以及节约系统开销
  3. 增加冗余,提高可用性

3. 实现读写分离的方式

一般有两种方式实现:

     1. 应用层实现,网站的程序实现

         应用程序层实现指的是在应用程序内部及连接器中实现读写分离

oneproxy实现Mysql读写分离_第3张图片

优点:

A:应用程序内部实现读写分离,安装既可以使用

B:减少一定部署难度

C:访问压力在一定级别以下,性能很好

缺点:

A:架构一旦调整,代码要跟着变

B:难以实现高级应用,如自动分库,分表

C:无法适用大型应用场景

    2.中间件层实现

      中间件层实现是指在外部中间件程序实现读写分离

oneproxy实现Mysql读写分离_第4张图片

二、oneproxy介绍

OneProxy平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单(防SQL注入)及IP白名单功能的SQL防火墙软件。采用与MySQL Proxy一致的反向协议输出模式,对应用非常简单和透明易用,让用户畏惧的数据库故障切换(Failover)、读写分离(Read/Write Split)、分库分表(Horizontal Partitioning)等复杂方案变得极其简单可控!基于Libevent机制实现,单个实例可以实现25万的SQL转发能力,用一个OneProxy节点可以带动整个MySQL集群,为业务发展贡献一份力量。

oneproxy实现Mysql读写分离_第5张图片

三、配置安装

1.服务器配置

ip 角色 安装
192.168.0.31 mysql-master mysql
192.168.0.32 mysql-slave mysql
192.168.0.33 读写分离

oneproxy

 

2.做好两台mysql的主从

https://blog.csdn.net/litebty/article/details/81034300(主从配置链接)

不做主从复制,也可以做读写分离,但是这样后端两台数据库节点数据就不一致了,会导致数据不一致,所以往往读写分离是建立在主从复制的基础上,做读写分离之前确保主从复制没问题,才进行下面的操作

3.安装oneproxy

[root@test3 ~]# tar -xf oneproxy-rhel6-linux64-v6.0.0-ga.tar.gz -C /opt/

[root@test3 oneproxy]# vim oneproxy.service  //修改oneproxy安装路径
oneproxy实现Mysql读写分离_第6张图片

[root@test3 oneproxy]# cp oneproxy.service /etc/init.d/          //复制到启动路径下

 修改主配置文件,填写读写分离相关信息

[root@test3 bin]# ./mysqlpwd 123456           //bin下的mysqlpwd对密码加密
7BB117405D00844054AE596932FA71DED27A0FA0

[root@test3 conf]# vim proxy.conf

 

oneproxy实现Mysql读写分离_第7张图片


mysql> grant all privileges on *.* to 'root'@'192.168.0.%' identified by '123456' with grant option;
mysql> flush privileges;

#要确保后端数据库有ksidc(名字根据实际情况来定)这个库,oneproxy就是靠这个库的存在来判断后端数据库的存活状态

proxy-part-template     = conf/template.txt

proxy-part-tables.1     = conf/part.txt

proxy-charset            = gbk_chinese_ci

从上面的配置文件中可以看出,oneproxy的安全要求还是比较高的,对后端数据库的密码进行了加密,密码安全得到保障

启动服务

[root@test3 conf]# /etc/init.d/oneproxy.service restart

浏览数据库状态

192.168.0.33:8080

oneproxy实现Mysql读写分离_第8张图片
四、测试

 

测试读负载

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test1      |
+------------+
1 row in set (0.00 sec)

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test2      |
+------------+
1 row in set (0.00 sec)

测试写

mysql> begin;select @@hostname;commit;
Query OK, 0 rows affected (0.00 sec)

+------------+
| @@hostname |
+------------+
| test1      |
+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

 

mysql> begin;select @@hostname;commit;
Query OK, 0 rows affected (0.00 sec)

+------------+
| @@hostname |
+------------+
| test1      |
+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

创建一个表,测试插入数据:

mysql> create table test(id int,name varchar(20));

在代理端执行插入:

mysql>insert into test values(1,'lidada');

在后端数据库查看,数据已经插入到test1的数据库上

从而达到数据库的读写分离的效果

 

你可能感兴趣的:(oneproxy实现Mysql读写分离)