Haproxy 虽然带着ha,但它做的确是负载均衡。haproxy是工作在四层之上的,这也就意味着它可以代理的服务要比nginx更广泛,性能比nginx也要更高一些。相比较lvs,可配置性又比较好,需要的机器没有lvs那么多。因此haproxy在一定需求下使用还是不错的。比如使用haproxy来对mysql的从节点进行负载均衡。下面我们就来简单的使用haproxy来进行MySQL的负载均衡。
环境准备
IP地址 | 职能 |
192.168.111.100 | 负载均衡服务器 |
192.168.111.101 | MySQL服务器 |
192.168.111.102 | MySQL服务器 |
我们这里假设两台节点的MySQL服务器都已经安装完毕了。而且进行了如下配置
1.MySQL的端口都为3306
2.服务器开启了 3306 端口
3.创建MySQL用户 test ,密码 test ,可被 192.168.111.* 下的主机访问
4.为了显示负载到两个不同的机器,在一个机器中创建一个不同于另一个机器的数据库,用以区分。一个是MySQL1,一个是MySQL2
下面主要针对的是负载均衡节点的安装以及配置,也就是本笔记的核心。
先来下载haproxy,下载地址
解压
tar -zxvf haproxy-1.7.8.tar.gz
安装(编译的时候需要指定内核的版本,安装的时候需要指定安装的路径)
make TARGET=linux26
make install PREFIX=/usr/local/haproxy
在make的过程中需要指定linux的内核版本,可以通过下面的命令来查看内核版本
cat /proc/version
安装成功信息(下面的安装信息是不指定PREFIX的情况下的)
[root@m007 haproxy-1.7.8]# make install
install -d "/usr/local/sbin"
install haproxy "/usr/local/sbin"
install -d "/usr/local/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/share/man"/man1
install -d "/usr/local/doc/haproxy"
for x in 51Degrees-device-detection architecture close-options configuration cookie-options DeviceAtlas-device-detection intro linux-syn-cookies lua management netscaler-client-ip-insertion-protocol network-namespaces proxy-protocol SPOE WURFL-device-detection; do \
install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \
done
在这里,我先说说我的目录结构的规划,我在学习的过程中,感觉在目录结构上遇到了很多坑。在这里把我的目录结构列出来,我的haproxy是放到usr/local/haproxy下的
/usr/local/haproxy
sbin 这里放的是可执行文件,就是haproxy (安装的过程中创建的)
haproxy
logs 这里放的是记录的日志(自己创建的)
haproxy.log
conf 这里放置的是配置文件(自己创建的)
haproxy.cnf
haproxy.pid
doc 我还没用到过,看名字应该是存放的文档(安装过程中创建的)
haproxy
share 这个我也没用到过也是在安装过程中创建的
man
也就是说,我们这里要自己创建两个文件夹,一个是logs,一个是conf。在这两个文件夹下,要创建一个log文件,一个cnf主配置文件和一个pid文件。
安装成功之后就是要进行配置,配置的过程还是比较麻烦的。首先1.7.8这个版本我并没有找到它提供的配置文件。我确实找了examples下的配置文件,没有找到。于是我在网上找到的一些配置进行的拼凑出来的。下面列出haproxy最简单的配置信息。这个配置的内容是放到/usr/local/haproxy/conf/haproxy.cnf文件中的。其中这里用到了pid文件,我在pid中就保存了一个1.
global
daemon # 后台方式运行
nbproc 1
pidfile /usr/local/haproxy/conf/haproxy.pid
defaults
mode tcp #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #=心跳检测超时
log 127.0.0.1 local0 err #[err warning info debug]
########test1配置#################
listen test1 #这里是配置负载均衡,test1是名字,可以任意
bind 0.0.0.0:3306 #这里是监听的IP地址和端口,端口号可以在0-65535之间,要避免端口冲突
mode tcp #连接的协议,这里是tcp协议
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 192.168.111.101:3306 #负载的机器
server s2 192.168.111.102:3306 #负载的机器,负载的机器可以有多个,往下排列即可
这样就配置好了。下面来启动haproxy
./usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cnf
-f 是指定我们的配置文件的路径。
启动过程中没有任何日志信息打印,安静到让你怀疑没有启动成功,然后本都的你去查看日志,发现日志里没有任何信息,不知道是你的日志没有配置正确还是系统启动没有问题,茫茫然的感觉,不知该从哪里下手。但作为程序员的你思维还是敏捷的,咱先测测能不能负载均衡啊,于是使用MySQL的客户端工具,输入本地机器的ip,加上监听的端口号,发现连上了,然后再退出重新连,发现连了另外的一台机器,到这里,我们发现这个实验已经成功了。但作为程序员的你仍心有不甘,我们要监控,我们还要查看日志。下面来继续
配置监控
haproxy带有监控功能,而且配置简单,直接在主配置文件中加入一下配置即可,格式就是这么缩进的,非拷贝出现问题。这个配置中可以看到,项目的名称使用的是haproxy,访问的时候在浏览器中输入本机的IP地址加端口加上uri就可以了。例如:http://192.168.111.100:8888/haproxy
listen admin_stats
bind 0.0.0.0:8888
mode http
stats uri /haproxy
stats realm Global\ statistics
stats auth admin:admin
下面配置日志
日志暂时没还搞定(跟着网上的步骤在做,但始终就是不给我记录,我也没辙啊,研究完再单独写一个记录日志的吧)
端口检测
haproxy可以检测我们的服务是否宕机,检测的方式就是通过指定检测端口。配置非常简单
listen test1
bind 0.0.0.0:3306
mode tcp
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 192.168.111.101:3306 check port 3306
server s2 192.168.111.102:3306 check port 3306
当我们停止一个服务的时候,监控视图如下(很快把我们关掉的机器就标记为红色了)
查看haproxy的进程状态
ps -ef | grep haproxy
杀掉haproxy进程
kill -9 pid