加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL数据库MySQL读写分离技术

发布时间:2020-12-12 00:49:33 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL数据库MySQL读写分离技术》要点: 本文介绍了MYSQL数据库MySQL读写分离技术,希望对您有用。如果有疑问,可以联系我们。 导读:当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来.然而我们有很多办法可以缓解数据库的压力.分布式

《MYSQL数据库MySQL读写分离技术》要点:
本文介绍了MYSQL数据库MySQL读写分离技术,希望对您有用。如果有疑问,可以联系我们。

导读:当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来.然而我们有很多办法可以缓解数据库的压力.分布式数据库、负载均衡、读写分离、增加缓存服务器等等.这里我 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主从复制与主主复制

http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label2

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

第一步:

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

百度云下载:链接:http://pan.baidu.com/s/1slTl18L 密码:9j0m

回到顶部
  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_slave22222');

….

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?
  1. #---我将mysql-proxy服务管理脚本放在了/usr/local/mysql-proxy/init.d/文件夹里?
  2. #---给执行权限,建立相应目录?
  3. #chmod?+x?/usr/local/mysql-proxy/init.d/mysql-proxy?
  4. #mkdir?/usr/local/mysql-proxy/run?
  5. #mkdir?/usr/local/mysql-proxy/log?
  6. ?
  7. #cd?/usr/local/mysql-proxy/init.d/?
  8. #---启动mysql-proxy?
  9. #./mysql-proxy?start?
  10. #---停止mysql-proxy?
  11. #./mysql-proxy?stop?
  12. #---重启mysql-proxy?
  13. #./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日志文件路径

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读