小树不倒我不倒 2013-11-28
mysql-proxy
MySQLProxy是一个处于你的client端和MySQLserver端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。[1]
MySQLProxy就是这么一个中间层代理,简单的说,MySQLProxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQLProxy是完全透明的,应用则只需要连接到MySQLProxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。
MySQLProxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。
附mysql-proxy的所有语法命令:
$mysql-proxy--help-all
Usage:
mysql-proxy[OPTION...]-MySQLProxy
HelpOptions:
-?,--helpShowhelpoptions
--help-allShowallhelpoptions
--help-adminShowoptionsfortheadmin-module
--help-proxyShowoptionsfortheproxy-module
adminmodule
--admin-address=<host:port>listeningaddress:portofinternaladmin-server(default::4041)
proxy-module
--proxy-address=<host:port>listeningaddress:portoftheproxy-server(default::4040)
--proxy-read-only-backend-addresses=<host:port>address:portoftheremoteslave-server(default:notset)
--proxy-backend-addresses=<host:port>address:portoftheremotebackend-servers(default:127.0.0.1:3306)
--proxy-skip-profilingdisablesprofilingofqueries(default:enabled)
--proxy-fix-bug-25371fixbug#25371(mysqld>5.1.12)forolderlibmysqlversions
--proxy-lua-script=<file>filenameoftheluascript(default:notset)
--no-proxyDon'tstartproxy-server
ApplicationOptions:
-V,--versionShowversion
--daemonStartindaemon-mode
--pid-file=<file>PIDfileincasewearestartedasdaemon
amoeba
概述
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQLProxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQLProxy简单)。
Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS的思想。
优势
Amoeba主要解决以下问题:
a).数据切分后复杂数据源整合
b).提供数据切分规则并降低数据切分规则给数据库带来的影响
c).降低数据库与客户端连接
d).读写分离路由
f).支持分库,分表,事务
不足
a)、目前还不支持事务b)、暂时不支持存储过程(近期会支持)
c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
d)、暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致:
Amoeba:阿米巴原虫
haproxy
简介
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。[1]
安装
tarzxvfhaproxy-1.4.8.tar.gz
cdhaproxy-1.4.8
uname-a//查看linux内核版本
makeTARGET=linux26PREFIX=/usr/local/haproxy
makeinstallPREFIX=/usr/local/haproxy
配置
配置HAProxySession亲缘性的三种方式
haproxy负载均衡保持客户端和服务器Session亲缘性的三种方式:
1用户IP识别
haroxy将用户IP经过hash计算后指定到固定的真实服务器上(类似于nginx的IPhash指令)
配置指令balancesource
2cookie识别
haproxy将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIEID。
配置指令例举cookieSESSION_COOKIEinsertindirectnocache
用firebug可以观察到用户的请求头的cookie里有类似"Cookiejsessionid=0bc588656ca05ecf7588c65f9be214f5;SESSION_COOKIE=app1"SESSION_COOKIE=app1就是haproxy添加的内容
3session识别
haproxy将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。
配置指令例举appsessionJSESSIONIDlen64timeout5hrequest-learn
配置举例:
#vi/usr/local/haproxy/haproxy.cfg
backendCOOKIE_srv
modehttp
cookieSESSION_COOKIEinsertindirectnocache
serverREALsrv_70184.82.239.70:80cookie11checkinter1500rise3fall3weight1
serverREALsrv_120220.162.237.120:80cookie12checkinter1500rise3fall3weight1
backendSOURCE_srv
modehttp
balancesource
serverREALsrv_70184.82.239.70:80cookie11checkinter1500rise3fall3weight1
serverREALsrv_120220.162.237.120:80cookie12checkinter1500rise3fall3weight1
backendAPPSESSION_srv
modehttp
appsessionJSESSIONIDlen64timeout5hrequest-learn
serverREALsrv_70184.82.239.70:80cookie11checkinter1500rise3fall3weight1
serverREALsrv_120220.162.237.120:80cookie12checkinter1500rise3fall3weight1[2]
启动
#启动haproxy
/usr/local/haproxy/haproxy-f/usr/local/haproxy/haproxy.cfg
#查看是否启动
[zhangy@BlackGhosthaproxy]$ps-e|grephaproxy
4859?00:00:00haproxy
4860?00:00:00haproxy
测试
[root@BlackGhosthaproxy]#/usr/local/bin/webbench-c100-t30http://localhost:1080/phpinfo.php
说明
HAProxy监听的端口是1080,代理192.168.18.2:10000,127.0.0.1:10000
统计监听的是8888端口http://localhost:8888/haproxy-stats