Haproxy+多台MySQL从服务器Slave实现负载均衡Word格式.docx
《Haproxy+多台MySQL从服务器Slave实现负载均衡Word格式.docx》由会员分享,可在线阅读,更多相关《Haproxy+多台MySQL从服务器Slave实现负载均衡Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
安装完毕后打开配置文件在/etc/haproxy/
haproxy.cfg,配置文件的路径可能不用,别告诉我找不到~~~!
1.global
2.
maxconn
4096
3.
daemon
4.
chroot
/var/lib/haproxy
5.
pidfile
/var/run/haproxy.pid
6.
#debug
7.
#quiet
8.
user
haproxy
9.
group
10.
11.defaults
12.
log
global
13.
mode
http
14.
option
httplog
15.
dontlognull
16.
127.0.0.1
local0
17.
retries
3
18.
redispatch
19.
2000
20.
#contimeout
5000
21.
#clitimeout
50000
22.
#srvtimeout
23.
timeout
http-request
10s
24.
queue
1m
25.
connect
10s
26.
client
1m
27.
server
28.
http-keep-alive
29.
check
30.
31.listen
admin_stats
0.0.0.0:
8888
32.
http
33.
stats
uri
/dbs
34.
realm
Global\
statistics
35.
auth
admin:
admin
36.
37.listen
proxy-mysql
23306
38.
tcp
39.
balance
roundrobin
40.
tcplog
41.
mysql-check
#在mysql中创建无任何权限用户haproxy,且无密码,这个在MySQL5.7中需要一些技巧来规避无密码的设置
42.
MySQL1
3306
weight
1
2000
43.
MySQL2
44.
tcpka
listen
这个配置是监控页面,绑定到本机8888端口,账号admin,密码admin
可以通过web的方式查看所有MySQL节点的使用情况,http:
//你的IP:
8888/dbs即可登录监控后台。
如下图:
1.listen
5.option
#在mysql中创建无任何权限用户haproxy,且无密码
代理的端口。
程序连接从库集群时就访问这个端口。
负载均衡方式。
这里是配置健康检查的,也是haproxy自带的功能,需要在mysql中创建无任何权限用户haproxy,且无密码
配置MySQL从库节点,有多少节点就配置多少server项。
有的同学可能不知道如何在MySQL中创建用户,这里也给你写好了。
用户名为haproxy且无密码(重要)否则haproxy无法检测MySQL状态。
CREATEUSER'
haproxy'
@'
%'
IDENTIFIEDBY'
'
;
配置完成后启动代理servicehaproxystart
如果用过yum方式安装,应该就能启动了,如果是其它方式安装,可能启动方式不同,需要编写脚本启动,应该不难自己研究一下~~~
然后让我们写个demo测试一下代理是否配置成功了没!
1.public
static
void
main(String[]
args)
throws
Exception
{
Class.forName("
com.mysql.jdbc.Driver"
);
Connection
conn
=
DriverManager.getConnection("
jdbc:
mysql:
23306/template?
useUnicode=true"
"
root"
sql2008"
for
(int
i
0;
<
100;
i++)
PreparedStatement
pr
null;
ResultSet
res
try
11.
conn.prepareStatement("
select
count(*)
from
sys_user"
pr.executeQuery();
if(res.next())
System.out.println(new
Date().toLocaleString()
+
->
res.getInt
(1));
}
catch
(Exception
e)
e.printStackTrace();
res.close();
pr.close();
Thread.sleep(25000);
conn.close();
26.}
输出结果如下:
可以看到代理MySQL成功了,这时你可以随机关掉一个MySQL节点的服务,程序依然能够正常的执行,说明负载均衡也成功了。
1.2015-8-28
10:
09:
27->
7
2.2015-8-28
52->
3.2015-8-28
17->
4.2015-8-28
42->
5.2015-8-28
11:
07->
小小的激动有没有~有没有~。
于是乎我们就把程序中数据源的配置改造一下,让它连接haproxy即可。
propertyname="
jdbcUrl"
value="
/>
是不是以为大功告成了,如果你就这样配置的话,等程序运行起来它就会给你一个大大的surprise
其实这里面是有坑的~~~~,且听我细细道来。
一般的情况下,我相信大家在直接连接MySQL的时候几乎都用到了连接池。
以我的配置为例:
1.<
bean
id="
dataSource"
class="
com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="
close"
>
2.<
property
name="
driverClass"
value="
/>
3.<
//IP:
23306/数据库名称?
4.<
user"
xx"
5.<
password"
yy"
6.<
initialPoolSize"
5"
7.<
minPoolSize"
8.<
maxPoolSize"
30"
9.<
maxIdleTime"
0"
10.<
idleConnectionTestPeriod"
11.<
acquireIncrement"
3"
12.<
automaticTestTable"
C3p0TestTable_NotDelete"
13.<
autoCommitOnClose"
false"
14.lt;
/bean>
其它的参数这里不解释,大家可以查询C3P0配置信息,网上很多。
这里只说一个:
idleConnectionTestPeriod=30
这个参数是配置连接池
每隔多少时间去检查池内链接的有效性,单位秒。
我这里设置成30秒,那么C3P0会每隔30秒
把连接池内所有的空闲连接拿出来挨个发一个测试SQL语句,已确定这个链接的有效性。
以前我们的数据源是直接连接MySQL数据库的,在正常的情况下MySQL是不会断开这个链接的。
但是我们现在连接的是haproxy,也就是说我们程序的连接(Connection)是与haproxy建立的,这里的坑在于这个连接是会被haproxy断掉的,这样的话你连接池内的链接就变成了无效链接,在下次需要查询数据库时还需要重新创建连接,而且程序由于拿到的连接是无效链接,还有可能报错。
那么haproxy与我们程序之间的连接超时时间在哪设置呢?
#这个参数配置程序与haproxy的链接超时时间
#这个参haproxy与mysql链接超时时间
这里的超时时间不是指连接过程的超时时间,而是指连接上以后,多少时间内没有心跳,操作这个时间就认为超时,然后断开连接。
写的可能有些啰嗦,我们看个例子开说明一下:
{
Thread.sleep(60000);
我上面配置的是
timeoutclient1m,也就是说客户端连接到haproxy后1分钟之内没有数据请求即为超时,就会断掉链接:
第一次查询没有问题
我把间隔设置为60秒,第二次查询与第一次查询间隔60秒就会报错,因为超时了。
如果把间隔改为
Thread.sleep(50000);
50秒,就不会报错。
结论就是
1.idleConnectionTestPeriod
的时间一定要小于
client的时间。
这样C3P0会在Haproxy断掉链接之前发送一次“心跳”过去,保持链接的有效性。
2.而且
client与>
尽量保持一致,已达到最佳效果。
3.文本仅供参考,感谢下载!
4.
5.