您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

阿里大神都在用的MySQL读写分离

时间:2022-05-16 11:31:10  来源:  作者:java猿代码

1、简介

  当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。

  其中实现读写分离的技术有很多方法,这里我们将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是我们使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此我们还需要安装一个lua解析器

2、基本环境

  三台linux虚拟主机

  Linux版本centos6.6、MySQL 5.5

  mysql-proxy-0.8.5

  lua-5.1.4

  ip:192.168.95.11(写)、192.168.95.12(读)、192.168.95.13(mysql-proxy)

3、配置主从复制

mysql主从复制与主主复制

粗略介绍一下数据库的主从复制的配置:

第一步:

在192.168.95.11中创建一个192.168.95.12主机中可以登录的MySQL用户

用户:mysql12

密码:mysql12

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql12’@’192.168.95.12’ IDENTIFIED BY ‘mysql12’;

mysql>FLUSH PRIVILEGES;

第二步:

查看192.168.95.11MySQL服务器二进制文件名与位置

mysql>SHOW MASTER STATUS;
阿里大神都在用的MySQL读写分离

 

第三步:

告知二进制文件名与位置
在192.168.95.12中执行:

mysql> change master to
    -> master_host='192.168.95.11',
    -> master_user='mysql12',
    ->  master_password='mysql12',
    ->  master_log_file='mysql-bin.000124',
    -> master_log_pos=586;

第四步:

在192.168.95.12中

mysql>SLAVE START; #开启复制

mysql>SHOW SLAVE STATUSG #查看主从复制是否配置成功

阿里大神都在用的MySQL读写分离

 

主从复制配置成功!

(注意:上面Relicate_Do_DB:aa表示主从复制只针对数据库aa【这是我之前设置的就没改了】,这里就不讲这个了,要想去了解学医这个的话可以参考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7)

4、MySQL读写分离配置

百度云下载:链接:https://pan.bAIdu.com/s/1FBW-76Ew-fOfNb0fW878ZQ 密码:?

4.1、安装lua

  官网下载:http://www.lua.org/download.html

  Lua 是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。

  一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

  1)、安装lua需要依赖很多软件包。

  可以通过rpm -qa | grep name检查以下软件是否安装:

  gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*

  若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。(我的话一般是直接在系统光盘软件库中找到直接rpm安装的,有些找不到,则先在网上下载然后在ftp传给linux再进行安装)

  2)、依赖软件安装完毕后则进行编译安装lua

  MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。

  官网下载:http://www.lua.org/download.html(下载源码包)

# wget http://www.lua.org/ftp/lua-5.1.4.tar.gz  
# tar zxvf lua-5.1.4.tar.gz 
# cd lua-5.1.4  
# make linux
# make install
# export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm" 
(我安装的时候是直接在光盘软件库中找到,直接rpm安装)

4.2、安装mysql-proxy

  1)、首先查看linux版本确认是32位还是64为系统

  查看linux内核版本

  # cat /etc/issue

  查看linux版本

  # cat /proc/version

  2)、按系统位数下载(上面百度云链接64位的文件)

  3)、安装

# tar –zxvf mysql-proxy-0.8.5- linux-rhel5-x86-64bit.tar.gz
# mkdir /usr/local/mysql-proxy
# cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy
# cd /usr/local/mysql-proxy
阿里大神都在用的MySQL读写分离

 

安装成功

5、MySQL读写分离测试

1)、修改rw-splitting.lua文件

  修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离

  #cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

阿里大神都在用的MySQL读写分离

 

  # vi rw-splitting.lua

阿里大神都在用的MySQL读写分离

 

2)、修改完成后,启动mysql-proxy

# cd /usr/local/mysql/bin
# ./mysql-proxy --proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua &

参数:

  --proxy-read-only-backend-addresses  #只读服务器地址(ip)

  --proxy-backend-addresses       #服务器地址(主服务器)

  --proxy-lua-script            #lua脚本路劲

  &                     #表示后台执行

阿里大神都在用的MySQL读写分离

 

3)、创建用于读写分离的数据库连接用户

  用户名:proxy1

  密 码:321

mysql>grant all on *.* to 'proxy1'@'192.168.95.13' identified by '321';
mysql>use aa;
mysql>create table tab1(id int auto_increment,name varchar(32) not null,primary key(id));

【因为已经开启了主从复制所以,11、12主机mysql中都创建了这个用户】

4)、测试登陆账号proxy1@192.168.95.13进行添加数据

  可以使用任意ip客户端登陆这个账号

  在192.168.95.13登陆:

  # ./mysql -u proxy1 -P4040 -h192.168.95.13 –p

阿里大神都在用的MySQL读写分离

 

在两个mysql中查看结果:一致

阿里大神都在用的MySQL读写分离

 

结果表明:账号使用

(ps:id是自增长,之前高主主复制的时候更改了配置文件,还没更改回来,就将就用着先吧)

5)、关闭12mysql的从复制

  mysql> stop slave;

阿里大神都在用的MySQL读写分离

 

6)、证明写分离

  使用proxy1@192.168.95.13账号打开多个客户端进行插入数据

  打开三个mysql客户端分别插入2条数据:

mysql> insert into tab1 (name) values('stop_slave11111');

….

mysql> insert into tab1 (name) values('stop_slave6666’);

  查看:

  分别登陆11mysql与12mysql查看aa.tab1中的数据

  主数据库:

阿里大神都在用的MySQL读写分离

 

从数据库:

阿里大神都在用的MySQL读写分离

 

结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。

7)、证明读分离

  使用proxy1@192.168.95.13账号登陆mysql,查看aa.tab1中的数据

mysql>use aa;
mysql>select*from tab1;
阿里大神都在用的MySQL读写分离

 

结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。

6、建议

为了方便启动与管理mysql-proxy可以创建mysql-proxy服务管理脚本

下面这个管理脚本仅适合以上我给出的安装路径位置

【此管理脚本需要按照自己的安装路径做出相应的修改方可使用】

 1 #!/bin/sh
 2 
 3 #
 4 # mysql-proxy This script starts and stops the mysql-proxy daemon
 5 #
 6 # chkconfig: - 78 30
 7 # processname: mysql-proxy
 8 # description: mysql-proxy is a proxy daemon to mysql
 9 
10 # Source function library.
11 . /etc/rc.d/init.d/functions
12 
13 #PROXY_PATH=/usr/local/bin
14 PROXY_PATH=/usr/local/mysql-proxy/bin
15 
16 prog="mysql-proxy"
17 
18 # Source.NETworking configuration.
19 . /etc/sysconfig/network
20 
21 # Check that networking is up.
22 [ ${NETWORKING} = "no" ] && exit 0
23 
24 # Set default mysql-proxy configuration.
25 #PROXY_OPTIONS="--daemon"
26 
27 PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua"
28 
29 PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid
30 
31 # Source mysql-proxy configuration.
32 if [ -f /etc/sysconfig/mysql-proxy ]; then
33         . /etc/sysconfig/mysql-proxy
34 fi
35 
36 PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
37 # By default it's all good
38 RETVAL=0
39 
40 # See how we were called.
41 case "$1" in
42   start)
43         # Start daemon.
44         echo -n $"Starting $prog: "
45         $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=debug --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
46         RETVAL=$?
47         echo
48         if [ $RETVAL = 0 ]; then
49                 touch /var/lock/subsys/mysql-proxy]
50                 echo "ok"
51         fi
52        ;;
53   stop)
54         # Stop daemons.
55         echo -n $"Stopping $prog: "
56         killproc $prog
57         RETVAL=$?
58         echo
59         if [ $RETVAL = 0 ]; then
60                 rm -f /var/lock/subsys/mysql-proxy
61                 rm -f $PROXY_PID
62         fi
63        ;;
64   restart)
65         $0 stop
66         sleep 3
67         $0 start
68        ;;
69   condrestart)
70        [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
71       ;;
72   status)
73         status mysql-proxy
74         RETVAL=$?
75        ;;
76   *)
77         echo "Usage: $0 {start|stop|restart|status|condrestart}"
78         RETVAL=1
79        ;;
80 esac
81 exit $RETVAL
#---我将mysql-proxy服务管理脚本放在了/usr/local/mysql-proxy/init.d/文件夹里
#---给执行权限,建立相应目录
#chmod +x /usr/local/mysql-proxy/init.d/mysql-proxy
#mkdir /usr/local/mysql-proxy/run
#mkdir /usr/local/mysql-proxy/log

#cd /usr/local/mysql-proxy/init.d/
#---启动mysql-proxy
#./mysql-proxy start
#---停止mysql-proxy
#./mysql-proxy stop
#---重启mysql-proxy
#./mysql-proxy restart

一些相关参数:

PROXY_PATH=/usr/local/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径

--proxy-read-only-backend-addresses=192.168.95.12:3306 //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.95.11:3306 //定义后端主服务器地址
--proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua //定义lua读写分离脚本路径

PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径

--daemon //定义以守护进程模式启动
--keepalive //使进程在异常关闭后能够自动恢复【上面的管理脚本没有加上此参数】
--user=root //以root用户身份启动服务
--log-level=debug //定义log日志级别,由高到低分别有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径

(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见。



Tags:读写分离   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Nginx 大揭秘:读写分离助力您轻松征服高并发
引言在构建高性能、高可用的 Web 应用时,如何有效地处理数据库的读写负担已成为一个十分重要的考虑因素。Nginx 作为一款强大的反向代理服务器,提供了简单而灵活的负载均衡配...【详细内容】
2023-11-14  Search: 读写分离  点击:(56)  评论:(0)  加入收藏
MySQL 数据库读写分离
MySQL 是最流行的关系型数据库管理系统MySQL 配置主备模式基于一台服务器的数据复制,故得名单机热备,主-备 Active-Standby 主-备方式,即指的是一台服务器处于某种业务的激...【详细内容】
2023-03-22  Search: 读写分离  点击:(128)  评论:(0)  加入收藏
MySQL读写分离,写完读不到问题如何解决
今天我们来详细了解一下主从同步延迟时读写分离发生写后读不到的问题,依次讲解问题出现的原因,解决策略以及 Sharding-jdbc、MyCat 和 MaxScale 等开源数据库中间件具体的实现...【详细内容】
2022-11-09  Search: 读写分离  点击:(339)  评论:(0)  加入收藏
关于Linux下MySQL主备集群负载均衡之读写分离(MaxScale)
写在前面 分享一些MySQL(MariaDB)集群主从结构数据读写分离的笔记,关于读写分离: 一如果对于读密集型应用,可以容忍从库异步复制延迟导致的脏数据,读写分离是一种不错的负载均...【详细内容】
2022-10-15  Search: 读写分离  点击:(399)  评论:(0)  加入收藏
数据库读写分离详解
一、实现高性能数据库集群一般我们业务在读多写少的场景下,遇到的第一个瓶颈就是数据库这块,大量的读请求会来到数据库,这样如果你初期部署的一个数据库就会造成IO大量增加,使得...【详细内容】
2022-07-20  Search: 读写分离  点击:(481)  评论:(0)  加入收藏
阿里大神都在用的MySQL读写分离
1、简介  当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存...【详细内容】
2022-05-16  Search: 读写分离  点击:(420)  评论:(0)  加入收藏
MySQL 读写分离
一、读写分离概述读写分离,简单来说是把对数据库的读和写操作分开,当应用程序发起读操作时分配给读库,当应用程序发起写操作时分配给写库,从而达到减轻单台数据库服务器的压力。...【详细内容】
2022-04-26  Search: 读写分离  点击:(385)  评论:(0)  加入收藏
mysql搭建及主从同步+读写分离
从库生成两个线程,一个I/O线程,一个SQL线程;i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;主库会生成一个 log dump 线程,用来给从库 i/o线程传...【详细内容】
2022-04-08  Search: 读写分离  点击:(322)  评论:(0)  加入收藏
MySQL MyCAT 读写分离实战
1.MySQL读写分离概念:MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读...【详细内容】
2021-10-11  Search: 读写分离  点击:(296)  评论:(0)  加入收藏
浅谈读写分离和几种常见的开源数据库中间件
最近学习了阿里资深技术专家李运华的架构设计关于读写分离的教程,颇有收获,总结一下。1 读写分离概述 基本架构图: 2 适用场景 读写分离不是银弹,并不是一有性能问题就上读写分...【详细内容】
2021-08-19  Search: 读写分离  点击:(1529)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(10)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(18)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(14)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(29)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(15)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(33)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(54)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(56)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(56)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条