mysql-proxy主从服务架构下读写分离和负载均衡实现及原理
来源:互联网 发布:java gui图形界面编程 编辑:程序博客网 时间:2024/05/21 15:42
系统环境 ubuntu
假设已经配置好mysql的主从架构
主服务器:192.168.3.189
从服务器:192.168.3.104
我们的目的就是实现读取操作由192.168.3.104服务器响应,写的操作由192.168.3.189响应
首先安装mysql-proxy
1、从mysql官网上下载最新版的mysql-proxy:http://dev.mysql.com/downloads/mysql-proxy/
2、在本地的/opt/software/ (你可以换成自己的目录)解压下载的压缩文件
解压后能看到 bin、lib、include、libexc、share几个文件夹
并把bin目录添加到系统环境变量中去(在/etc/profile 文件最后添加:export PATH=$PATH:/opt/software/mysql-proxy-0.8.3-linux-glibc2.3-x86-32bit/bin)
然后source /etc/profile 让刚才设置的环境变量生效
3、在命令行下输入mysql-proxy --help 能看到帮助信息说明安装成功了
4、启动mysql-proxy服务
mysql-proxy --keepalive --proxy-read-only-backend-addresses=192.168.3.104:3306 --proxy-backend-addresses=192.168.3.189:3306 --proxy-lua-script=/opt/software/mysql-proxy-0.8.3-linux-glibc2.3-x86-32bit/share/doc/mysql-proxy/rw-splitting.lua --log-file=/opt/software/mysql-proxy-0.8.3-linux-glibc2.3-x86-32bit/var/mysql-proxy.log
--keepalive 网上解释说有时候mysql-porxy会崩溃,这个参数能让mysql-proxy崩溃后自动重启
--proxy-read-only-backend-addresses 配置只读服务器
--proxy-backend-addresses 配置可读可写服务器(主服务器master)
--proxy-lua-script 配置读写分离的lua脚本,这个脚本就在mysql-proxy解压后的share目录里面
--log-file 日志文件
这样mysql-proxy就启动了,如果想让mysql-proxy在后台运行只需要添加--daemon 参数就行了,连接mysql-proxy的命令是
mysql -h192.168.3.189 -P4040 -utest -p123456
那么mysql-proxy是如何进行读写分离的呢,关键就在读写分离的lua脚本rw-splitting.lua
为了解释读写分离的原理,打开rw-splitting.lua脚本,该脚本中有几个关键的地方,我们分别来看
1、配置
if not proxy.global.config.rwsplit thenproxy.global.config.rwsplit = {min_idle_connections = 1,--设置每个服务器所拥有的最大连接池数量(我也不知道为啥命名为min),实际的最大连接数会比这个值大1,也就是在这个配置条件下,实际上每个服务器所能拥有的最大连接数是2max_idle_connections = 1,--这个配置有啥做用还不知道is_debug = true--开启调试模式}end
2、connect_server() 每次客户端连接myql-proxy的时候都会运行一次这个函数,然后返回一个mysql连接给客户端
首先明确一件是mysql-proxy所拥有最大的连接数是确定的,假设有n台服务器,min_idle_connections=2,那么所拥有的最大连接数量就是:n*(2+1)
函数首先会判断主服务器连接数是否达到最大值,如果没有,就创建一个连接主服务器的连接,并返回;
如果主服务器连接数已满,遍历每个从服务器,看从服务器连接是否达到最大值,如果没有,就创建一个,并返回;
如果所有服务器连接数都达到最大值,就返回主服务器创建的第一个连接
3、read_query() 每次客户端做sql查询的时候都会调用这个函数,这个函数把sql传到某个服务器,得到结果后返回给客户端
那么如何做读写分离呢?在函数内有这么一个判断
if stmt.token_name == "TK_SQL_SELECT" then
这个语句的作用就是判断sql语句是不是以SELECT开始的,也就是判断是否是查询,如果是查询的话,接下来会有这么个语句
local backend_ndx = lb.idle_ro()lb.idle_ro() 是通过 local lb = require("proxy.balance") 引入的balance.lua文件
function idle_ro() local max_conns = -1local max_conns_ndx = 0for i = 1, #proxy.global.backends dolocal s = proxy.global.backends[i]local conns = s.pool.users[proxy.connection.client.username]-- pick a slave which has some idling connectionsif s.type == proxy.BACKEND_TYPE_RO and s.state ~= proxy.BACKEND_STATE_DOWN and conns.cur_idle_connections > 0 thenif max_conns == -1 or s.connected_clients < max_conns thenmax_conns = s.connected_clientsmax_conns_ndx = iendendendreturn max_conns_ndxend
这个函数的作用就是选择使用哪个读服务器,并返回服务器的index:max_conns_ndx
如何选择服务器呢? 它通过循环遍历所有服务器,然后选出一个客户端连接(s.connected_clients)最少的服务器,这样在一定程度上实现负载均衡
- mysql-proxy主从服务架构下读写分离和负载均衡实现及原理
- mysql-proxy主从服务架构下读写分离和负载均衡实现及原理
- linux 下 MySQL-Proxy 实现 MySQL 的负载均衡和读写分离实现
- web架构 之 MySQL负载均衡 主从复制 读写分离
- web架构 之 MySQL负载均衡 主从复制 读写分离
- web架构 之 MySQL负载均衡 主从复制 读写分离
- Mysql-Proxy实现mysql读写分离、负载均衡
- MySQL Proxy快速实现读写分离以及负载均衡
- MySQL配置proxy读写分离负载均衡
- .NET + 负载均衡(proxy、Amoeba) + 主从复制 + 读写分离架构
- Mysql主从数据库+Replication实现读写分离和查询负载
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
- 双机高可用,负载均衡,MySQL(读写分离、主从自动切换)架构设计
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
- 图片太大,出现OOM.
- I Hate It+纯粹的线段树+树状数组
- FTP基础命令
- Weka开发[20]——IB1源代码分析
- Intel MIC性能测试程序
- mysql-proxy主从服务架构下读写分离和负载均衡实现及原理
- Android 美化文件夹(二)
- JQuery UI - draggable参数中文详细说明
- 了解Amazon google、IBM、microsoft云计算主要平台及特点
- AfxWnd42 qq2006中怎样取得发送消息窗口中的Richedit
- Android 一个URL开启手机浏览器
- DATASET结果集导入到EXCEL
- 修改aspx文件名后出错
- 链表(一)