设为首页 收藏本站
查看: 749|回复: 0

[经验分享] Haproxy负载均衡+Keepalived高可用web群集

[复制链接]

尚未签到

发表于 2018-12-30 15:38:17 | 显示全部楼层 |阅读模式
一、HAProxy

1.haproxy简介


  •   HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

  •   HAProxy是一个使用C语言编写的自由及开放源代码软件

  •   HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

  •   HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

  •   HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制×××蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS×××的网站开发了而且已经拯救

  •   HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

  •   包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。

  • Haproxy是目前比较流行的一种集群调度工具,同类集群调度工具有很多,如LVS和Nginx,相比较而言,LVS性能最好,但是搭建相对复杂,Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,性能没有Haproxy好。

  缺点:只能支持TCP和HTTP的软件

  Haproxy官网:http://www.haproxy.org/

2.负载均衡常用调度算法
  LVS、Haproxy、Nginx最常用的调度算法有三种,如下所述


  •   RR(Round  Robin)。RR算法是最简单最常用的一种算法,即轮询调度。例如,有三个节点A、B、C,第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会被指派到节点C,第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果。此算法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求

  •   LC(Least  Connections)。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的连接数会动态释放,很难出现一样连接数的情况,因此此算法相比较RR算法有很大改进,是目前用到比较多的一种算法

  • SH(Source  Hashing)。SH即基于来源访问调度算法,此算法用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度。例如,使用基于源IP的集群调度算法,有三个节点A、B、C,第一个用户第一次访问被指派到A,第二个用户第一次访问被指派到了B,当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度。此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

3.Haproxy的日志


  •   Haproxy的日志默认是输出到系统的syslog中,查看起来不是非常方便,为了更好地管理Haproxy的日志,我们在生产环境中一般单独定义出来,定义的方法如下所述

  • 修改Haproxy配置文件中关于日志配置的选项,修改为下面的配置
    log  /dev/log    local0  info
    log  /dev/log    local0  notice
      这两行配置是将原本的log  127.0.0.1配置项修改,主要是将Haproxy的info及notice日志分别记录到不同的日志文件中
    然后重启Haproxy,完成Haproxy配置

  • 修改rsyslog配置
    为了便于管理,将Haproxy下相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件
    [root@localhost ~]# touch /etc/rsyslog.d/haproxy.conf
    [root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
  加入下面的内容:

if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
& ~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
& ~
  这部分配置是将Haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下,其中“& ~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。这里配置的语法是使用rainerscript脚本语言写的


  • 当然也可用用另一种解决方式,修改/etc/rsyslog.conf配置文件,在配置文件中加入如下两行:
    local0.info                                             /var/log/haproxy-info.log
    local0.notice                                           /var/log/haproxy-notice.log
      这样也可以实现上面相同的效果

  • 测试日志信息
    在客户端访问http://192.168.1.10/test.html后,可以使用tail  -f  /var/log/haproxy/haproxy-info.log即时查看Haproxy的访问请求日志信息
    [root@localhost ~]# tail -f /var/log/haproxy/haproxy-info.log
    Sep  9 22:30:05 localhost haproxy[2634]: 192.168.1.30:1165 [09/Sep/2015:22:30:02.202] webcluster webcluster/inst2 0/0/0/1/3255 200 256 - - CD-- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"

4.Haproxy的参数优化

  关于Haproxy的参数优化,以下列举了几个关键的参数,并对各参数的生产环境的优化建议做了说明



参数
参数说明
优化建议




maxconn
最大连接数
此参数根据应用的实际情况进行调整,推荐使用10 240


daemon
守护进程模式
Haproxy可以使用非守护进程模式启动,生产环境建议使用守护模式启动


nbproc
负载均衡的并发进程数
建议与当前服务器CPU核数相等或为其2倍


retries
重试次数
此参数主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次;在服务器节点不多的情况下,可以设置为5次或6次


option http-server-close
主动关闭http请求选项
建议在生产环境中使用此选项,避免由于timeout时间设置过长导致http连接堆积


timeout http-keep-alive
长连接超时时间
此选项设置长连接超时时间,具体参考应用自身特点设置,可以设置为10s


timeout  http-request
http请求超时时间
建议此时间设置为5~10s,增加http连接释放速度


timeout  client
客户端超时时间
如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右就可以了

二、haproxy+keepalived部署

环境
  五台服务器,两台Web、两台Haproxy,都将网卡设置为vmnet1;剩余一台为网关,需两块网卡,第一块vmnnet1、第二块桥接


HOST
OS
IP
Package




web01
Centos6.7_64
192.168.1.30
httpd


web02
Centos6.7_64
192.168.1.40
httpd


Haproxy+Keepalived-1
Centos6.7_64
192.168.1.10
haproxy、keepalived


Haproxy+Keepalived-2
Centos6.7_64
192.168.1.20
haproxy、keepalived


Gateway
Centos6.7_64
192.168.1.1
iptables

部署Web-1
  1.配置IP地址

vim /etc/sysconfig/network-scrips/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.30
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
/etc/init.d/network restart
  2.配置安装YUM

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
  3.部署httpd

yum -y install httpd && echo "This is Web1" >/var/www/html/index.html
/etc/init.d/httpd start && chkconfig --level 35 httpd on
部署Web-2
  1.配置IP地址

vim /etc/sysconfig/network-scrips/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.40
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
/etc/init.d/network restart
  2.配置安装YUM

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
  3.部署httpd

yum -y install httpd && echo "This is Web2" >/var/www/html/index.html
/etc/init.d/httpd start && chkconfig --level 35 httpd on
部署Haproxy+Keepalived-1
  1.配置IP

vim /etc/sysconfig/network-scrips/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
/etc/init.d/network restart
  2.配置YUM并安装依赖包

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
yum -y install kernel-devel openssl-devel popt-devel  pcre-devel bzip2-devel
  3.安装keepalived

tar zxvf keepalived-1.2.2.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.2.2/
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
make && make install
chkconfig --add keepalived && chkconfig --level 35 keepalived on
  4.编辑HA配置文件

vim /etc/keepalived/keepalived.conf
global_defs {
router_id HA_TEST_R1    ##本服务器的名称
}
vrrp_instance VI_1 {        ##定义VRRP热备实例
state MASTER        ##MASTER表示主服务器
interface eth0      ##承载VIP地址的物理接口
virtual_router_id 1     ##虚拟路由器的ID号
priority 100        ##优先级,数值越大优先级越高
advert_int 1        ##通告间隔秒数(心跳频率)
authentication {        ##认证信息
auth_type PASS      ##认证类型
auth_pass 123456    ##密码字串
}
virtual_ipaddress {
192.168.1.254     ##指定漂移地址(VIP)
}
}
  5.编译安装Haproxy

tar zxvf haproxy-1.4.24.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.4.24/
make TARGET=linux26                         //linux26代表为kernel2.6的版本(uname -r)
make install
  6.编辑Haproxy配置文件

mkdir /etc/haproxy    //新建软件配置文件目录
cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy    //将haproxy.cfg文件复制到配置文件目录
  Haproxy配置文件通常分为三个部分,即global、defaults和listen。global为全局配置、defaults为默认配置、listen为应用组件配置


vim /etc/haproxy/haproxy.cfg
#\ this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1   local0          //全局日志配置,并指定记录日志级别
log 127.0.0.1   local1 notice    //notice为日志级别,通常有24个级别
#log loghost    local0 info
maxconn 4096                //最大连接数
uid 99                  //运行用户,默认nobody
gid 99                  //运行组,默认nobody
daemon                  //以守护进程方式运行haproxy
#debug
#quiet
defaults
log global              //应用全局日志配置
mode    http                //默认的模式{tcp|http|health}
option  httplog             //启用日志记录HTTP请求
option  dontlognull         //启动该项,日志将不会记录空连接
retries 3               //连接后端服务器的失败重连次数
maxconn 2000                //每个进程可用的最大连接数
contimeout  5000            //连接超时时间
clitimeout      50000           //客户端超时时间
srvtimeout  50000           //服务器超时时间
listen  webcluster 192.168.1.254:80
option httpchk GET /index.html    //检查服务器的index.html文件
balance roundrobin          //制定负载均衡算法
server  inst1 192.168.1.30:80 check inter 2000 fall 3       //定义后端服务器的IP
server  inst2 192.168.1.40:80 check inter 2000 fall 3
  7.启动Haproxy服务

cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
mkdir /usr/share/haproxy
/etc/init.d/keepalived start
/etc/init.d/haproxy start
chkconfig --level 35 haproxy on
部署Haproxy+Keepalived-2
  1.配置IP

vim /etc/sysconfig/network-scrips/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.20
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
/etc/init.d/network restart
  2.配置YUM并安装依赖包

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
yum -y install kernel-devel openssl-devel popt-devel  pcre-devel bzip2-devel
  3.安装keepalived

tar zxvf keepalived-1.2.2.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.2.2/
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
make &&make install
chkconfig --add keepalived && chkconfig --level 35 keepalived on
  4.编辑HA配置文件

scp root@192.168.1.10:/etc/keepalived/keepalived.cfg /etc/keepalived/
vim /etc/keepalived/keepalived.conf
global_defs {
router_id HA_TEST_R2    ##本服务器的名称
}
vrrp_instance VI_1 {        ##定义VRRP热备实例
state BACKUP        ##MASTER表示主服务器
priority 10         ##优先级,数值越大优先级越高
  5.编译安装Haproxy

tar zxvf haproxy-1.4.24.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.4.24/
make TARGET=linux26
make install
  6.编辑Haproxy配置文件

mkdir /etc/haproxy/
scp root@192.168.1.10:/etc/haproxy/haproxy.conf /etc/haproxy/
  7.编写shell脚本

cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
mkdir /usr/share/haproxy && chkconfig --level 35 haproxy on
vim /root/haproxy.sh
#!/bin/bash
A=$(netstat -utpln | grep 80 | wc -l)
/sbin/ip a | /bin/grep 192.168.1.254 &>/dev/null
if [ $? -eq 0 ] && [ $A -eq 0 ]
then
/etc/init.d/haproxy restart
echo "Haproxy启动中"
else
/etc/init.d/haproxy stop
fi
chmod +x /root/haproxy.sh
crontab -e
*/1 * * * *  /root/haproxy.sh
scp /root/haproxy.sh root@192.168.1.10:/root
chmod +x /root/haproxy.sh (第一个调度器,192.168.1.10)
crontab -e
*/1 * * * *  /root/haproxy.sh (第一个调度器,192.168.1.10)
Gateway

  充当路由器角色

  1.配置IP

vim /etc/sysconfig/network-scrips/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
cp /etc/sysconfig/network-scrips/ifcfg-eth0 /etc/sysconfig/network-scrips/ifcfg-eth1
vim /etc/sysconfig/network-scrips/ifcfg-eth1
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp
/etc/init.d/network restart
  2.开启路由转发

vim /etc/sysctl.conf
7 net.ipv4.ip_forward = 1
sysctl -p
  3.编写防火墙规则

/etc/init.d/iptables stop
iptables -t nat -I PREROUTING -d 192.168.10.139 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.254:80
/etc/init.d/iptables save && chkconfig --level 35 iptables on
  4.访问测试

  IE → 192.168.10.139
  可以测试调度器的高可用和web群集的负载均衡

  参考的网址:
http://blog.运维网.com/painting/1693259
http://www.ttlsa.com/linux/haproxy-study-tutorial/
https://baike.baidu.com/item/haproxy/5825820




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-657704-1-1.html 上篇帖子: MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离 下篇帖子: Linux负载均衡软件LVS+keepalived
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表