1.读写分离的实现方式

Mysql中可以实现读写分离的插件有mysql-proxy / Mycat / Amoeba ,mysql-proxy是系统自带的一个插件,此次实验主要用它来实现读写分离
mysql-proxy是实现"读写分离(Read/Write Splitting)"的一个软件(MySQL官方提供 ,也叫中间件),基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现

MySQL-proxy 它能实现读写语句的区分主要依靠内部的一个lua脚本(能实现读写语句的判断)
如果只在主服务器(写服务器)上完成数据的写操作,此时从服务器上没有执行写操作,是没有数据的
这个时候需要使用另外一个技术来实现主从服务器的数据一致性,这个技术叫做 主从复制技术, 所以说主从复制是读写分离的基础
读写分离(MySQL- Proxy)是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力
使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上
因为数据库的写操作相对读操作是比较耗时的,所以数据库的读写分离,解决的是数据库的写入,影响了查询的效率

2.实验环境

server1(172.25.254.1)master(mysqld)
server2(172.25.254.2)slave(mysqld)
server3(172.25.254.3)代理端(mysql-proxy)
server4(172.25.254.4)测试端(mariadb-server)

3.实验

3.1 在server1和server2先配置gtid主从复制

gtid主从复制上篇博客已经说明,这里不再赘述,只展示最终效果
可以看到server1上建立一个westos数据库,对应的server2上会同步过来

3.2 配置server3代理端(mysql-proxy)

在server3上搭建mysql-proxy代理服务器(实现客户端写在server1上、读server2上的数据)
(1) 从物理机获取mysql-proxy安装包到server3

(2)在server3上进行配置

[root@server3 ~]# systemctl status mysqld   ##查看mysqld服务状态
[root@server3 ~]# systemctl stop mysqld    ##关闭mysqld服务,因为代理服务器要用3306端口
[root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-glibc2-x86-64bit.tar.gz -C /usr/local/   ##解压到/usr/local/目录下


做一个软连接以便管理

ln -s mysql-proxy-0.8.5-linux-glibc2-x86-64bit mysql-proxy


mysql-proxy目录下是没有配置文件的,所以需要自行建立一个配置文件的目录,创建配置文件

使用下面两条命令可以查配置文件中写入的参数

[root@server3 bin]# ./mysql-proxy --help
[root@server3 bin]# ./mysql-proxy --help-proxy
[mysql-proxy]    ##指定语句块
proxy-address=0.0.0.0:3306 ##指定proxy访问的主机和端口,3306是一个对外的通用端口
proxy-read-only-backend-addresses=172.25.254.2:3306    ##读主机的ip和端口
proxy-backend-addresses=172.25.254.1:3306  ##执行写主机的ip和端口
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##指定读写分离操作使用的lua文件路径
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid    ##pid存放路径
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log    ##日志存放路径
plugins=proxy  ##指定使用的插件
log-level=debug    ##日志的等级
keepalive=true ##开启守护进程
daemon=true    ##使用后台方式运行


保存后需要将配置文件的权限改为660,需要创建 log 目录

修改数据库发生读写分离时的最大和最小连接数

[root@server3 mysql-proxy]# find . -name *.lua
./share/doc/mysql-proxy/rw-splitting.lua
[root@server3 mysql-proxy]# cd share/doc/mysql-proxy
[root@server3 mysql-proxy]# ls
[root@server3 mysql-proxy]# vim rw-splitting.lua       ##将lua脚本里原本启动机制的最小4个最大8个连接,改为1和2
min_idle_connections = 1, 最小连接数
max_idle_connections = 2, 最大连接数




(3)启动mysql-proxy

/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf ##启动
cat /usr/local/mysql-proxy/log/mysql-proxy.log  ##查看日志

3.3 测试读写分离

(1)在server1上创建新的用户并且授权

mysql> grant insert,update,select on *.* to kkxili@'%' identified by 'Red1hat*';
mysql> FLUSH PRIVILEGES; ##刷新授权表
mysql> USE westos;
Database changed
mysql> CREATE TABLE linux (-> username varchar(10) not null,-> password varchar(15) not null);
mysql>DESC linux;


(2)server3安装lsof


(3)在用户端虚拟机server4上第一次连接数据库代理server3


在server3上面:lsof -i:3306


(4)在用户端虚拟机server4上第二次连接数据库代理server3
在server3上面:lsof -i:3306


(5)在用户端虚拟机server4上第三次连接数据库代理server3
在server3上面:lsof -i:3306
开始读写分离

上面是读写分离的读访问测试
写测试
在用户端插入数据

use westos;
insert into linux values('user1','123');


server1和server2都可以看到插入的数据


在server2中关闭主从复制
用户端再次写入数据,看不到刚刚写的数据

写在server1上,可以查看到数据

在server2上实现了读写分离

server2重新开启主从复制可以看到数据

客户端读的是server2,server2只能读,不能写,因此看不到刚才写进去的东西,server1可以看到
实现了客户端(虚拟机)对server1的写,对server2的读

当访问数据库的用户数量很多时,数据库的代理就把后端的数据库实现读写分离
server1是写的数据库、server2是读的数据库
当server1和server2满足gtid的主从复制时,用户往数据库写入的数据其实是写入了server1,并没有写入server2,server2上面的数据是复制过去的,因此server1、server2、客户机上面都能查到刚刚写进去的数据,其实客户机查的是server2(读)
当关闭server1和server2的异步复制时,客户机往数据库写入的数据只写进了server1,没有写进去server2,server2也没有复制一份
因此server1可以查看到,server2和客户机上面都查不到刚刚写进去的数据,此时的客户机读的是server2

Mysql数据库读写分离的实现相关推荐

  1. mybatis获取mysql源数据类型_spring集成mybatis实现mysql数据库读写分离

    前言 在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈.幸运的是目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台服务器上. ...

  2. mysql数据库字段变形_详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    摘要:这篇MySQL栏目下的"详解如何利用amoeba(变形虫)实现mysql数据库读写分离",介绍的技术点是"MySQL数据库.数据库读写分离.amoeba.MySQL ...

  3. Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...

    作者 | Pythonicc 责编 | 王晓曼 出品 | CSDN博客 简介 1.什么是数据库读写分离 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELET ...

  4. ceph集群和数据库到底是储存数据_Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...

    作者 | Pythonicc责编 | 王晓曼出品 | CSDN博客简介1.什么是数据库读写分离读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从 ...

  5. 利用mycat实现mysql数据库读写分离

    1.这里是在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下: 2.Demo 2.1 在mysql master上创建数据库创建db1 2.2 在数据库db1创建表student ...

  6. mycat定时向mysql存储数据_【实战演练】Linux操作系统20-MyCat实现Mysql数据库读写分离与自动切换...

    #本文欢迎转载,转载请注明出处和作者. 理论部分,详见:繁星亮与鲍包包:[理论研究]业务系统高可用及负载均衡​zhuanlan.zhihu.com 本篇主要实现"8.Mysql读写分离&qu ...

  7. amoeba mysql exists_Amoeba实现MySQL数据库读写分离

    一 环境以及软件版本: 系统:CentOS Linux release 7.2.1511 (Core) MySQL:Server version: 5.6.33 Amoeba:amoeba-mysql ...

  8. Linux安装Mycat1.6.7.6实现Mysql数据库读写分离

    1.Mycat简介 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个 ...

  9. 你如何理解mysql的读写分离_面试官:谈谈你对Mysql数据库读写分离的了解,并且有哪些注意事项?...

    这篇文章讲述的不是Mysql具体的如何实现读写分离,而是指什么时候需要上读写分离,及其相关的注意事项. 因为用户的增多,数据的增多,单机的数据库往往支撑不住快速发展的业务,所以数据库集群就产生了!今天 ...

  10. yii2 mysql in_yii2 mysql数据库读写分离配置

    复制和读写分离(Replication and Read-Write Splitting) 许多数据库支持数据库复制来获得更好的数据库可用性, 以及更快的服务器响应时间.通过数据库复制功能, 数据从所 ...

最新文章

  1. 计算机组成原理 — IPMI/BMC
  2. WebBrowser内核指定
  3. php设置表单的字体,php表单标题怎么设置字体
  4. MySQL相关日志介绍
  5. drupal 迁移_关于如何迁移到Drupal的4个技巧
  6. 十大实用linux脚本,5个超实用的Shell脚本 - 米扑博客
  7. 房贷提前还款怎么还?
  8. LFS chroot后装glibc时编译出错/bin/sh: command substitution: line 3: syntax error near unexpected token `)
  9. 大数据技术原理与应用学习笔记(八)
  10. 计算机系统 I 第二章 逻辑门与逻辑函数化简 学习笔记
  11. html中div中文字如何上下居中,div中文字各种垂直居中的方法
  12. Bandicam班迪录屏 高清录制视频软件
  13. ★★★Win10切换本地账户(最全版本)
  14. Ninja构建系统入门--GN与Ninja构建过程
  15. 使用D2D出现的错误
  16. android布局空格以及首行缩进表示符
  17. A-Level经济真题(7)
  18. kerberos详解
  19. 软件分享系列之【Office 2010下载安装】并持续分享中...
  20. java pdf转jpg 多张图片合成一张

热门文章

  1. cf黑机器多久解除_[CF]黑机器码过无限提示一分钟强制踢出游戏的方法
  2. 终端使用sopcast例子
  3. 高等数学上册 第一讲 极限与连续(1)
  4. 基于MFC对话框的qq游戏连连看外挂
  5. 迅雷漫画下载工具II beta3 v1.2.3.204
  6. linux内核定时器
  7. 技嘉服务器主板是什么型号,技嘉主板小型号字母代表什么意思?
  8. java如何对一个表达式开根号_java实现开根号的运算
  9. 数据结构——中国邮递员问题
  10. 体检预约系统软件测试计划书,体检中心-管理软件需求分析.doc