Hapraxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如LVS 和Nginx。相 比较而言,LVS.性能最好,但是搭建相对复杂:Nginx的 upstream 模块支持群集功能,但是对群集节 点健康检查功能不强,性能没有Haproxy好。Heproxy官方网站是http://www.haproxy.org/
索例前置知识点
(1)HTTP请求
通过URL访问网站使用的协议是HTTP协议,此类请求一般称为HTTP请求。HTTP请求的方式分 为GET方式和 POST方式。当使用浏览器访问某一个URL,会根据请求URL返回状态码,通常正常的 状态码为2xx.3xx(如200、301),如果出现异常会返回4xx、5xx(如400,500).
例如,访问http://www.test.com/a.php?ld=123,就是一个GET请求,如果访问正常,会从服 务器的日志中获取200状态码.假如此请求使用POST方式,那么传递给a.php的Id参数依旧是123, 但是浏览器的URL将不会显示后面的Id=123字样,因此表单类或者有用户名,密码等内容提交时建 议使用POST方式。不管使用哪种方式,最终a.php获取的值是一样的。
(2)负载均衡常用调度算法
LVS, Haproxy. Nginx最常用的调度算法有三种,如下所述,
1.RR(Round Robin)。RR算法是最简单最常用的一种算法,即轮询调度。例如,有三个节点A、B、C.第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会 被指派到节点C,第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果。此算 法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求。
2.LC (Least Comections).LC 算法即最小连接数算法,根据后端的节点连接数大小动态分配 前端请求。例如,有三个节点A、B.C,各节点的连接数分别为A:4.B:5.C:6,此时如果有第一 个用户连接请求,会被指派到A上,连接数变为A:5.B:5.C:6,第二个用户请求会继续分配到A 上,连接数变为A:6.B:5.C:6:再有新的请求会分配给B,每次将新的请求指派给连接數最小的 客户端。由于实际情况下A.B.C的连接数会动态释放,很难会出现一样连接数的情况,因此此算 法相比较爪算法有很大改进,是目前用到比较多的一种算法。
3.SH (Source Hashing).SH即基于来源访问调度算法,此算法用于一些有Session 会话记录在 服务器端的场景,可以基于来源的P.Cookie 等做群集调度。例如,使用基于源P的群集调度算法, 有三个节点A.B.C.第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B. 当第一个用户第二次访问时会被继续指派到A.第二个用户第二次访问时依旧会被指派到B.只要负 载均衡调度髁不重启,第一个用户访问都会被指派到A.第二个用户访问都会被指派到B,实现群集 的调度。此调度算法好处是实现会话保持,但某些尸访问最非常大时会引起负载不均衡,部分节点 访问量超大,影响业务使用。
(3)常见的Web群集调度器
目前常见的Web群集调度器分为软件和硬件,软件通常使用开源的LVS. Haproxy, Nginx,硬件 一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等.
案例环境
本案例使用三台服务器模拟搭建一套Web群集,拓扑图如下所示:
案例实施
关闭防火墙:systemctl disable firewalld --now
关闭Selinux:setenforce 0
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
配置IP DNS 网关:nmtui
1.编译安装Nginx服务器
(1)搭建Nginx1,使用nginx-1.12.0.tar.gz安装包进行编译安装。
[root@Nginx1 ~]# mount /dev/cdrom /mnt/mount: /dev/sr0 写保护,将以只读方式挂载[root@Nginx1 ~]# yum -y install pcre-devel zlib-devel //挂载后在本地yum仓库安装[root@Nginx1 ~]#useradd -M -s /sbin/nologin nginx //创建nginx用户[root@Nginx1 ~]# rz -E //把源码包nginx-1.24.0.tar.gz拉进来rz waiting to receive.[root@Nginx1 ~]# tar zxf nginx-1.24.0.tar.gz //解压文件[root@Nginx1 ~]# cd nginx-1.24.0/ //执行编译安装[root@Nginx1 nginx-1.24.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module[root@Nginx1 nginx-1.24.0]# make && make install
[root@Nginx1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ //创建主程序链接文件[root@Nginx1 ~]# echo "<h1>This is nginx Server 192.168.55.49</h1>" > /usr/local/nginx/html/test.html //建立测试页面[root@Nginx1 ~]# /usr/local/nginx/sbin/nginx //启动Nginx[root@Nginx1 ~]# netstat -anpt | grep nginxtcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11121/nginx: master [root@Nginx1 ~]# systemctl stop firewalld.service
为了方便实验,网站没有配置域名,直接使用IP地址。在客户端访问http://192.168.55.49/ test.huml测试。
(2)搭建Nginx2.
编译安装的步骤与Nginx1相同,不同之处在于建立测试页面。
[root@Nginx2 ~]# echo "<h1>This is nginx Server 192.168.55.50</h1>" > /usr/local/nginx/html/test.html
2.编译安装Haproxy
使用 haproxy-1.5.19.tar.gz安装包进行编译安装
[root@Haproxy ~]# yum -y install pcre-devel bzip2-devel //组件[root@Haproxy ~]# rz -Erz waiting to receive. //将源码包haproxy-1.5.19.tar.gz上传拉进来[root@Haproxy ~]# tar zxf haproxy-1.5.19.tar.gz [root@Haproxy ~]# cd haproxy-1.5.19/[root@Haproxy haproxy-1.5.19]# make TARGET=linux26 //64位系统[root@Haproxy haproxy-1.5.19]# make install
3.Haproxy服务器配置
(1)建立Haproxy的配置文件。
[root@Haproxy haproxy-1.5.19]# mkdir /etc/haproxy //创建主配置文件[root@Haproxy haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/ //将haproxy.cfg文件复制到配置文件目录
(2)Haproxy配置项介绍。
(3)根据目前的群集设计,将haproxy.cfg配置文件的内容修改如下。
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg
4.创建自启动脚本
[root@Haproxy haproxy-1.5.19]# mkdir /usr/share/haproxy //创建群集根目录添加haproxy系统服务:[root@Haproxy haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/haproxy [root@Haproxy haproxy-1.5.19]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy[root@Haproxy haproxy-1.5.19]# chmod +x /etc/init.d/haproxy[root@Haproxy haproxy-1.5.19]# chkconfig --add haproxy启动服务:[root@Haproxy haproxy-1.5.19]# /etc/init.d/haproxy startStarting haproxy (via systemctl): [ 确定 ]启动服务:[root@Haproxy haproxy-1.5.19]# systemctl start haproxy关闭防火墙浏览器可以进入:[root@Haproxy haproxy-1.5.19]# systemctl stop firewalld
5.测试Web群集
通过上面的步骤,已经搭建完成Haproxy 的Web群集,接下来需要验证群集是否工作正常。一 个群集一般需要具备两个特性,第一个是高性能,第二个是高可用,
(1)测试高性能
在客户端使用浏览器打开http://192.168.55.47/test.html,浏览器显示信息
再次打开一个新的浏览器页面访问http://192.168.55.47/test.html,浏览器显示信息
(2)测试高可用
现在将 192.168.55.49的Nginx服务停用,在客户端使用浏览器打开http://192.168.55.47/ test.html,浏览器显示信息
从中可以看出,当一台节点故障,不会影响群集的使用,这祥就满足了群集的高可用性。也可 以将192.168.1.62的Nginx服务恢复,再将192.168.1.61的Nginx服务停用,测试高可用性。