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

[经验分享] haproxy+keeaplived

[复制链接]

尚未签到

发表于 2019-1-1 10:10:33 | 显示全部楼层 |阅读模式
  一、HAProxy简介
  

  

  HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
  

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

  ————百度百科
  

  HAProxy的特点是:
  1、HAProxy是工作在网络7层之上。
  2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
  3、支持url检测后端的服务器出问题的检测会有很好的帮助。
  4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
  5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
  6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
  

  VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备,使用一定的机制保证当主机的下一跳交换机出现故障时,及时将业务切换到其它交换机,从而保持通讯的连续性和可靠性。
  

  以下是与VRRP协议相关的基本概念:
  VRRP 交换机(VRRP Router):运行VRRP的设备,它可能属于一个或多个虚拟交换机。
  虚拟交换机(Virtual Router):由VRRP管理的抽象设备,又称为VRRP备份组,被当作一个共享局域网内主机的缺省网关。它包括了一个虚拟交换机标识符和一组虚拟IP地址。
  虚拟IP地址(Virtual IP Address):虚拟 交换机的IP地址,一个虚拟交换机可以有一个或多个IP地址,由用户配置。
  IP地址拥有者(IP Address Owner):如果一个VRRP 交换机将虚拟交换机的IP地址作为真实的接口地址,则该设备是IP地址拥有者。当这台设备正常工作时,它会响应目的地址是虚拟IP地址的报文,如ping、TCP连接等。
  虚拟MAC地址:是虚拟交换机根据虚拟交换机 ID生成的MAC地址。一个虚拟交换机拥有一个虚拟MAC地址,格式为:00-00-5E-00-01-{VRID}(VRRP);00-00-5E-00-02-{VRID}(VRRP6)。当虚拟交换机回应ARP请求时,使用虚拟MAC地址,而不是接口的真实MAC地址。
  主IP地址(Primary IP Address):从接口的真实IP地址中选出来的一个主用IP地址,通常选择配置的第一个IP地址。VRRP广播报文使用主IP地址作为IP报文的源地址。
  Master 交换机(Virtual Router Master):是承担转发报文或者应答ARP请求的VRRP交换机,转发报文都是发送到虚拟IP地址的。如果IP地址拥有者是可用的,通常它将成为Master。
  Backup 交换机(Virtual Router Backup):一组没有承担转发任务的VRRP 交换机,当Master设备出现故障时,它们将通过竞选成为新的Master。
  特点:
  抢占模式:在抢占模式下,如果Backup器的优先级比当前Master的优先级高,将主动将自己升级成Master。
  主备备份:这是VRRP提供IP地址备份功能的基本方式。主备备份方式需要建立一个虚拟交换机,该虚拟交换机包括一个Master设备和若干Backup设备,这些交换机构成一个备份组。正常情况下,业务全部由Master承担。Master出现故障时,Backup接替工作。
  VRRP负载分担:负载分担方式是指多台交换机同时承担业务,单个VRRP备份组是不具备负载分担功能的,只有在多台设备上建立两个或更多的备份组,所有备份组均匀分担Master状态,此时就每台设备只承担了部分的业务,从而达到负载分担的作用。
  VRRP监视接口状态:每个VRRP备份组可以监视所有与此VRRP备份组绑定的接口的状态,从而当接口出现故障时,VRRP通过改变优先级来重新选择主备关系。
  虚拟IP地址Ping开关:提供了控制Ping通虚拟IP地址的开关命令。
  VRRP的安全功能:对于安全程度不同的网络环境,可以在报头上设定不同的认证方式和认证字。
  VRRP快速切换:VRRP通过监视BFD会话状态实现主备快速切换,主备切换时间毫秒级。
  

  实验图

  1,安装haproxy
  # yum -y install haproxy
  

  2,安装httpd
  # yum -y install httpd
  提供一个测试页
  [root@node2 www]# vim index.html
  

  node2.xy.com
  
  
  
  
  
  
  

  在另一个节点同样安装
  提供一个测试页
  [root@node1 www]# vim index.html
  

  node1.xy.com
  
  
  
  
  
  
  

  在55节点上安装nginx
  提供些图片
  [root@node55 www]# find
  .
  ./images
  ./images/3.jpg
  ./images/crystal
  ./images/crystal/spreadsheet.png
  ./images/crystal/audio.png
  ./images/crystal/interactive.png
  ./images/1.jpg
  ./images/icon-pointer-flag.png
  ./images/arrow-pointer-blue.png
  ./images/3.gif
  ./images/2.jpg
  

  

  3,配置haproxy
  打开配置文件
  # vim /etc/haproxy/haproxy.cfg
  1,配置日志
    让rsyslog帮忙记录日志
       log         127.0.0.1 local2
    编辑日志配置文件
  # vim /etc/rsyslog.conf
  $ModLoad imudp
  $UDPServerRun 514
  local2.*                                                -/var/log/haproxy.log
  2,defaults段参数
      mode                    http   跟客户端建立连接的协议
      log                     global
      option                  httplog
      option                  dontlognull
      option http-server-close服务器端关闭
      option forwardfor       except 127.0.0.0/8 用于后端记录客户端真实ip 日志格式:%{X-Forwarded-For}i
      option                  redispatch  保持会话是upstream server挂了,可以给客户端从新挑一个
      retries                 3 连接upsteran失败次数
      timeout http-request    10s  等客户端请求超时时长
      timeout queue           1m  客户端最大排队时长
      timeout connect         10s 连接upsteram超时时长
      timeout client          1m 客户端非活动超时时长
      timeout server          1m
      timeout http-keep-alive 10s
      timeout check           10s         心跳检测超时时长
      maxconn                 3000
  
  3,定义状态页和访问控制
  listen stats
      bind :8009
      stats enable
      stats uri /xy? haproxy
      stats auth centos:redhat
      acl statsadmin src 192.168.100.100
      tcp-request content accept if statsadmin
      tcp-request content reject
  

  
  

  4,配置动静分离
     frontend webs
          bind :80,:443
      acl url_static       path_beg       -i /static /images /javascript /stylesheets
      acl url_static       path_end       -i .jpg .gif .png .css .js
  

      use_backend static          if url_static
      default_backend             app
  backend app
      balance     roundrobin
      cookie SESSION_COOKIE insert  nocache
      server      node2 192.168.100.6:80 check cookie node2 maxcoon 3000
      server      node1 192.168.100.8:80 check cookie node1 maxcoon 3000
  backend static
      balance     roundrobin
      server  node55 192.168.100.55:80 check maxconn 30000
  测试一下

  

  cookie已经插入,来自这个浏览器的请求都会被调度到node2
  


  

  图片已经成功获取到,并且肯定是来自192.168.100.55,因为其他都没有图片
  

  当图片服务器下线后

  

  当192.168.100.55下线后所有的图片都没了,说以不能只有一台静态服务器
  haproxy的警告
  [root@zqy keepalived]#
  Message from syslogd@localhost at Apr 21 19:01:45 ...
  haproxy[4929]: backend static has no server available!
  

  acl写法
   格式:acl  acl名字 判断标准 判断条件
   判断标准有:1,path_beg 表示路径的开始
   2,path_end  表示路径的结束
   3,path_reg  表示对路径做正则匹配
   4,path  表示匹配这个路径一样
   5,hdr_beg(host) 表示做主机名开头匹配 如:
          acl static hdr_beg(host) -i img. download. video. mp3.
   6,url_beg
   7,src 源地址
  

  use_backend static          if url_static
  表示调度到static这一组服务器,如果匹配url_static这个acl
  default_backend             app
  表示没有匹配到的都调度到app这一组服务器
  

  backend static
      balance     roundrobin
      server  node55 192.168.100.55:80 check maxconn 30000
   定义一组服务器名字为static,使用的调度算法为roundrobin
   用server定义一个服务器,node55是自己取的名字 监听地址端口,check表示haproxy
   对这台服务器做健康状态检测,maxconn 30000表示这台服务器的最大并发
   backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server
  

    tcp-request content accept if statsadmin
        tcp-request content reject
        表示做访问控制 如果是statsadmin这个acl就允许,否则都拒接
        检查是从上往下匹配
  

      acl login_page url_beg /login
      redirect prefix https:\/\/www.xy.xom if login_page
      表示做url重写,prefix表示加前缀,比如:
      访问http://www.xy.com/login 就会跳转到
          https://www.xy.com/login
  

  配置keepalived,实现高可用
  安装keepalived
  # yum -y install keepalived
  备份一下配置文件
  主haproxy
  # cp keepalived.conf keepalived.conf.bak
  

  # vim keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}
vrrp_script haproxy {
script "killall -0 haproxy"    #检查haproxy健康状态
interval 1 #每秒检查
weight -2 #脚本执行失败时优先级减2
}
vrrp_instance VI_1 {
   state MASTER 主的
   interface eth0
   virtual_router_id 51      # id:虚拟mac的最后一位
   priority 100  #优先级
   advert_int 1
   authentication {
       auth_type PASS  #认证类型
       auth_pass 1111  #认证密钥
   }
   virtual_ipaddress {
       192.168.100.16/24  # 虚拟流动ip
   }
   track_script {  # 调用健康检测脚本
     haproxy
  }
# notify_master "/etc/keepalived/notify.sh master"   # 当状态发生改变时执行的脚本
# notify_backup "/etc/keepalived/notify.sh backup"  #  当状态发生改变时执行的脚本
# notify_fault "/etc/keepalived/notify.sh fault"     # 当状态发生改变时执行的脚本
}  

  

  备haproxy
  # vim keepalived.conf
  

  

! Configuration File for keepalived
global_defs {
  notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}
vrrp_instance VI_1 {
   state BACKUP
   interface eth0
   virtual_router_id 51   # 这个也要一样,mac地址
   priority 99    # 这个要小1
   advert_int 1
   authentication {
       auth_type PASS     # 这个要一样
       auth_pass 1111      #这个要一样
   }
   virtual_ipaddress {
       192.168.100.16/24   #这个肯定要一样
   }
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}  

  ~
  通知脚本
  # vim notify.sh
  

#
vip=192.168.100.20
contact='root@localhost'
notify() {
   mailsubject="`hostname` to be $1: $vip floating"
   mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
   echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
   master)
       notify master
       /etc/rc.d/init.d/haproxy start
       exit 0
   ;;
   backup)
       notify backup
       /etc/rc.d/init.d/haproxy stop
       exit 0
   ;;
   fault)
       notify fault
       /etc/rc.d/init.d/haproxy stop
       exit 0
   ;;
   *)
       echo 'Usage: `basename $0` {master|backup|fault}'
       exit 1
   ;;
esac  

  测试
  在主的上停止haproxy
  [root@node1 keepalived]# service haproxy stop
  Stopping haproxy:                                          [  OK  ]
  主的日志
  May  1 06:45:09 node1 Keepalived_vrrp[5363]: VRRP_Script(haproxy) failed
  May  1 06:45:10 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) Received higher prio advert
  May  1 06:45:10 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) Entering BACKUP STATE
  May  1 06:45:10 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) removing protocol VIPs.
  May  1 06:45:10 node1 Keepalived_healthcheckers[5362]: Netlink reflector reports IP 192.168.100.16 removed
  

  从的日志
  May  1 14:43:41 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) forcing a new MASTER election
  May  1 14:43:42 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) Transition to MASTER STATE
  May  1 14:43:43 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) Entering MASTER STATE
  May  1 14:43:43 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) setting protocol VIPs.
  May  1 14:43:43 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16
  May  1 14:43:43 node2 Keepalived_healthcheckers[37066]: Netlink reflector reports IP 192.168.100.16 added
  May  1 14:43:48 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16
  查看服务是否启动
  [root@node2 keepalived]# ss -anlp|grep haproxy
  LISTEN     0      128                       *:80                       *:*      users:(("haproxy",37270,4))
  LISTEN     0      128                       *:443                      *:*      users:(("haproxy",37270,5))
  LISTEN     0      128                       *:8009                     *:*      users:(("haproxy",37270,7))
  

  当主的haproxy重新上线时
  [root@node1 keepalived]# service haproxy start
  Starting haproxy:                                          [  OK  ]
  

  主的日志
  May  1 06:46:56 node1 Keepalived_vrrp[5363]: VRRP_Script(haproxy) succeeded
  May  1 06:46:58 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) forcing a new MASTER election
  May  1 06:46:59 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) Transition to MASTER STATE
  May  1 06:47:00 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) Entering MASTER STATE
  May  1 06:47:00 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) setting protocol VIPs.
  May  1 06:47:00 node1 Keepalived_healthcheckers[5362]: Netlink reflector reports IP 192.168.100.16 added
  May  1 06:47:00 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16
  May  1 06:47:05 node1 Keepalived_vrrp[5363]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16
  

  从的日志
  May  1 14:49:00 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) Received higher prio advert
  May  1 14:49:00 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) Entering BACKUP STATE
  May  1 14:49:00 node2 Keepalived_vrrp[37067]: VRRP_Instance(VI_1) removing protocol VIPs.
  May  1 14:49:00 node2 Keepalived_healthcheckers[37066]: Netlink reflector reports IP 192.168.100.16 removed
  

  keepalived drbd
  

  script "killall -0 mysqld"

  [mysqld]
datadir=/mnt/drbd/mysql

  

  #!/bin/bash
vip=192.168.100.108
contact='root@localhost'
notify() {
   mailsubject="`hostname` to be $1: $vip floating"
   mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
   echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
   master)
  ip addr add 192.168.100.108/24 dev eth0
  hostname=`hostname |head -1`
    if [ $hostname == node3.xy.com ];then
    ssh node4 "sh /etc/keepalived/notify.sh backup"
    elif [ $hostname == node4.xy.com ];then
      ssh node3 "sh /etc/keepalived/notify.sh backup"
    fi
  notify master
    drbdadm  primary  r0
    mount /dev/drbd0 /mnt/drbd
    service mysqld start
       exit 0
   ;;
   backup)
       notify backup
  ip addr del 192.168.100.108/24 dev eth0
  service mysqld stop
     lsof /mnt/drbd|awk '{print $2}'|xargs kill
    umount /mnt/drbd
    drbdadm   secondary  r0
       exit 0
   ;;
   fault)
       notify fault
    service mysqld stop
         lsof /mnt/drbd|awk '{print $2}'|xargs kill
        umount /mnt/drbd
        drbdadm   secondary  r0
       exit 0
   ;;
   *)
       echo 'Usage: `basename $0` {master|backup|fault}'
       exit 1
   ;;
esac
  

  当主的重新上线的时候必须手动切换

  可以在主的上写一个脚本
  [root@node3 ~]# cat mysql.sh
#!/bin/bash
ssh node4 "sh /etc/keepalived/notify.sh backup"
sh /etc/keepalived/notify.sh master

  





运维网声明 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-658170-1-1.html 上篇帖子: HAProxy 之 概念和配置介绍 下篇帖子: HAProxy负载均衡器后续篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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