一、读写分离概述
1. 基本的原理
让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
数据内部交换过程:
2. 作用
面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
3. 实现读写分离的方式
一般有两种方式实现:
1. 应用层实现,网站的程序实现
应用程序层实现指的是在应用程序内部及连接器中实现读写分离
优点:
A:应用程序内部实现读写分离,安装既可以使用
B:减少一定部署难度
C:访问压力在一定级别以下,性能很好
缺点:
A:架构一旦调整,代码要跟着变
B:难以实现高级应用,如自动分库,分表
C:无法适用大型应用场景
2.中间件层实现
中间件层实现是指在外部中间件程序实现读写分离
二、oneproxy介绍
OneProxy平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单(防SQL注入)及IP白名单功能的SQL防火墙软件。采用与MySQL Proxy一致的反向协议输出模式,对应用非常简单和透明易用,让用户畏惧的数据库故障切换(Failover)、读写分离(Read/Write Split)、分库分表(Horizontal Partitioning)等复杂方案变得极其简单可控!基于Libevent机制实现,单个实例可以实现25万的SQL转发能力,用一个OneProxy节点可以带动整个MySQL集群,为业务发展贡献一份力量。
三、配置安装
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安装路径
[root@test3 oneproxy]# cp oneproxy.service /etc/init.d/ //复制到启动路径下
修改主配置文件,填写读写分离相关信息
[root@test3 bin]# ./mysqlpwd 123456 //bin下的mysqlpwd对密码加密
7BB117405D00844054AE596932FA71DED27A0FA0
[root@test3 conf]# vim proxy.conf
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
测试读负载
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的数据库上
从而达到数据库的读写分离的效果