你好,游客 登录 注册 搜索
背景:
阅读新闻

mysql-proxy代理加MySQL主从实现读写分离

[日期:2017-05-05] 来源:Linux社区  作者:blxueyuan [字体: ]

一:实验目标

MySQL Proxy(代理) 服务概述 

MySQL Proxy 实现读写分离 

MySQL Proxy+mysql主从实现读写分离 

二:实验环境: 

关闭防火墙

mysql-proxy服务端: linuxidc62.cn IP192.168.1.62

mysql服务器(主,负责写)服务端:linuxidc63.cn IP192.168.1.63

mysql服务器(从,负责读)客户端:linuxidc64.cn IP192.168.1.64

端口: mysql-proxy 默认端口:4040

 

三:实验概述

主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署实施的。

工作原理:

 

wKioL1kBsKWzMbHKAALLWTgSdwQ747.png

wKiom1kBsKXDbWVZAAA8veSR6hk928.png

 

1:MySQL Proxy概述

MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。

MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。

MySQL Proxy更强大的一项功能是实现读写分离,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。

Lua概述:

Lua 是一个小巧的脚本语言。Lua的速度是最快的。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。

 

2:读写分离的好处
1增加冗余

2)增加了机器的处理能力

3对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟。

3:读写分离提高性能之原因

1物理服务器增加,负荷增加
2主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
3从库可配置myisam引擎,提升查询性能以及节约系统开销
4从库同步主库的数据和主库直接写还是有区别的,通过主库发送来的binlog恢复数据,但是,最重要区别在于主库向从库发送binlog是异步的,从库恢复数据也是异步的
5读写分离适用与读远大于写的场景,如果只有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制

6可以在从库启动是增加一些参数来提高其读的性能,例如--skip-innodb、--skip-bdb、--low-priority-updates以及--delay-key-write=ALL。当然这些设置也是需要根据具体业务需求来定得,不一定能用上

7分摊读取。假如我们有1主3从,不考虑上述1中提到的从库单方面设置,假设现在1 分钟内有10条写入,150条读取。那么,1主3从相当于共计40条写入,而读取总数没变,因此平均下来每台服务器承担了10条写入和50条读取(主库不 承担读取操作)。因此,虽然写入没变,但是读取大大分摊了,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了,说白 了就是拿机器和带宽换性能。MySQL官方文档中有相关演算公式:官方文档 见6.9FAQ之MySQL复制能够何时和多大程度提高系统性能

8MySQL复制另外一大功能是增加冗余,提高可用性,当一台数据库服务器宕机后能通过调整另外一台从库来以最快的速度恢复服务,因此不能光看性能,也就是说1主1从也是可以的。

============================================================

四:实验代码

1:MySQL-proxy实现读写分离

第一块:安装mysql-proxy

1:安装mysql-proxy ---安装前需要系统支持LUA语言环境。 

[root@linuxidc62 ~]# rpm -ivh /mnt/Packages/lua-5.1.4-4.1.el6.x86_64.rpm

2:linuxidc62上安装mysql-proxy: 上传mysql-proxy

[root@linuxidc62~ ]# tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[root@linuxidc62 ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy

3:修改系统命令环境变量:

[root@linuxidc62 ~]#export PATH=$PATH:/usr/local/mysql-proxy/bin/ #或者

[root@linuxidc62 ~]# vim /etc/bashrc #在最后添加以下内容 :

PATH=$PATH:/usr/local/mysql-proxy/bin/

[root@linuxidc62 ~]#source /etc/bashrc

4:mysql-proxy 脚本配置文件位置:

[root@linuxidc62 ~]# ls /usr/local/mysql-proxy/share/doc/mysql-proxy/* #下有各种各样的脚本

rw-splitting.lua #这个就是支持读写分离的脚本

5:修改配置文件 实现:读写分离

[root@linuxidc62 ~]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy

/rw-splitting.lua

改:

40 min_idle_connections = 2,

41 max_idle_connections = 8,

为:

min_idle_connections = 1, 

max_idle_connections = 1,

#现改为最小1个最大1个。为了验证试验效果将他改成1 .就是当有一个链接的时候,就实现读写分离的功能。为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能。

 

第二块:搭建mysql服务器

1:linuxidc63上创建数据库和表,用于查看读写分离:

[root@linuxidc63 ~]#yum install mysql-server -y

[root@linuxidc63 ~]# service mysqld start

[root@linuxidc63 ~]# mysql

mysql> create database db;

mysql> use db;

mysql> create table test(id int);

mysql> insert into test values(6363);

mysql> grant all on db.* to user1@'%' identified by '123456' ;

#给普通用户 user1 登录访问数据库权限及密码

注:% 表示任意远程客户端 ,包括localhost和本地IP地址

2:linuxidc64上创建数据库和表,用于查看读写分离:

[root@linuxidc64 ~]# yum install mysql-server -y

[root@linuxidc64 ~]# service mysqld start

[root@linuxidc64 ~]# mysql

mysql> create database db;

mysql> use db;

mysql> create table test(id int);

mysql> insert into test values(6464);

mysql> grant all on db.* to user1@'%' identified by '123456' ;

 

3:客户端测试普通用户登录mysql主从数据库

[root@linuxidc61 ~]# mysql -u user1 -p123456 -h 192.168.1.63

mysql> use db

wKioL1kBsLSTLPFoAAAV8l3aavg215.png 

[root@linuxidc61 ~]# mysql -u user1 -p123456 -h 192.168.1.64

mysql> use db

wKioL1kBsL6xk0I3AAAUGF_nWi8146.png 

4:服务mysql-proxy服务

[root@linuxidc62 ~]# ls /usr/local/mysql-proxy/bin/

mysql-binlog-dump  mysql-myisam-dump  mysql-proxy

[root@linuxidc62 ~]# mysql-proxy  --proxy-read-only-backend-addresses=192.168.1.64:3306 --proxy-backend-addresses=192.168.1.63:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua & 

wKiom1kBsMiQeEfeAAA7Cbis0DE656.png 

1参数说明: 

--proxy-read-only-backend-addresses=192.168.1.64:3306 # 定义后端只读服务器

--proxy-backend-addresses=192.168.1.63:3306 #定义后端只写服务器地址

--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua & #指定lua脚本,在这里,使用的是rw-splitting脚本,用于读写分离

当有多个只读服务器时,可以写多个以下参数:

--proxy-read-only-backend-addresses=192.168.1.66:3306 # 定义后端只读服务器

--proxy-read-only-backend-addresses=192.168.1.65:3306 # 定义后端只读服务器

完整的参数可以运行以下命令查看:

[root@linuxidc62 ~]# mysql-proxy --help-all

-?, --help Show help options

--help-all Show all help options

2查看proxy是否启 

[root@linuxidc62 ~]# netstat -antup | grep proxy

tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 2991/mysql-proxy

3)关闭mysql-proxy服务

[root@linuxidc63 ~]# pkill proxy

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2017-05/143453p2.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款