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

[经验分享] 基于HAProxy + KeepAlived 实现高可用的WEB群集

[复制链接]

尚未签到

发表于 2018-12-30 10:44:21 | 显示全部楼层 |阅读模式
  一、概述
  1、keepalived

        Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现 。
  

  2、Haproxy
  
  HAProxy是高性能的代理服务器,其可以提供7层和4层代理,具有healthcheck,负载均衡等多种特性,性能卓越,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。
  KeepAlived是一个高可用方案,通过VIP(即虚拟IP)和心跳检测来实现高可用。其原理是存在一组(两台)服务器,分别赋予Master,Backup两个角色,默认情况下Master会绑定VIP到自己的网卡上,对外提供服务。Master,Backup会在一定的时间间隔向对方发送心跳数据包来检测对方的状态,这个时间间隔一般为2秒钟,如果Backup发现Master宕机,那么Backup会发送ARP包到网关,把VIP绑定到自己的网卡,此时Backup对外提供服务,实现自动化的故障转移,当Master恢复的时候会重新接管服务。
  


  二、实验环境

  •   实验环境:准备4台服务器,2台haproxy+keepalived服务器,分别作主备。1台动态网站服务器,一台静态网站服务器。
  •    实验目的:实现外部用户通过vip来访问web服务器,并且能够根据访问内容的不同来实现动静分离,如果前端调度器宕机,可以迅速切换,让从服务器上线接管一切事务,进而不影响用户访问!
  
服务器IP地址系统版本软件版本
前端主调度器  eth0:172.16.8.5
  vip:172.16.8.1
Centos6.5  keepalived-1.2.7-3.el6.x86_64
  haproxy-1.4.24-2.el6.x86_64
前端备调度器  eth0:172.16.8.8
  vip:172.16.8.1
Centos6.5  keepalived-1.2.7-3.el6.x86_64
  haproxy-1.4.24-2.el6.x86_64
静态服务器eth0:172.16.8.7Centos6.5httpd
动态服务器eth0:172.16.8.9Centos6.5httpd     php
  

  •   关闭每个服务器的防火墙
//关闭iptables和SELINUX
# service iptables stop
# setenforce 0
# vim /etc/sysconfig/selinux
---------------
SELINUX=disabled  

  三、haproxy与keepalived的安装配置
  1、时间同步:
[root@node1 ~]# ntpdate 172.16.0.1   //172.16.0.1为时间服务器
[root@node2 ~]# ntpdate 172.16.0.1  

  2、在2台主备服务器上安装keepalived与haproxy
[root@node1 ~]# yum -y install haproxy keepalived
[root@node2 ~]# yum -y install haproxy keepalived  

  3、keepalived安装配置
  3.1、在主调度服务器上配置:

  •   修改keepalived配置文件
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
//修改如下:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost         //配置管理员邮箱
}
notification_email_from kaadmin@localhost   //配置发件人
smtp_server 127.0.0.1    //配置邮件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down {
script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -150    //此脚本的意思是如果在/etc/keepalived/目录下有down文件,则把此主服务器的优先级降低150(可以自行设定),让别的从服务器变成主服务器
}
vrrp_instance VI_1 {
state MASTER     //配置模式 master为主服务器
interface eth0
virtual_router_id 51   //虚拟路由id号
priority 220           //优先级,各个节点优先级越高,更加有可能成为主服务器
advert_int 1
authentication {
auth_type PASS     //认证方式
auth_pass 1111
}
virtual_ipaddress {
172.16.8.1        //配置虚拟ip,vip
}
track_script {
chk_mantaince_down   //检查脚本
}
//当主服务器状态发生变化时,发送变化信息给邮件服务器,可以通过mail命令查看
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}  


  •   创建notify.sh脚本
[root@node1 ~]# vim /etc/keepalived/notify.sh
//添加如下内容:
#!/bin/bash
# Author: MageEdu
# description: An example of notify script
#
vip=172.16.8.1
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
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac  将此脚本发往从服务器:
[root@node1 ~]# scp /etc/keepalived/notify.sh root@172.16.8.8:/etc/keepalived/  

  3.2、在从服务器上配置

  •   修改keepalived配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -150
}
vrrp_instance VI_1 {
state BACKUP   //修改为BACKUP
interface eth0
virtual_router_id 51
priority 160      //优先级要低于主的
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.8.1
}
track_script {
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}  

  3.3、测试

  •   分别启动主备的keepalived
[root@node1 ~]# service keepalived start
[root@node2 ~]# service keepalived start

  •   查看ip
  
  


  •   在主服务器上创建down文件
  
[root@node1 ~]# touch /etc/keepalived/down
[root@node1 ~]# ip a
[root@node1 ~]# mail  
  

  
  

  3、配置haprox
  主从服务器的haproxy配置文件都要一样
  
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
//修改如下:
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events.  This is done
#    by adding the '-r' option to the SYSLOGD_OPTIONS in
#    /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
#   file. A line like the following can be added to
#   /etc/sysconfig/syslog
#
#    local2.*                       /var/log/haproxy.log
#
//上面的注释是告诉我们怎么配置日志的
log         127.0.0.1 local2  //日志输出配置,所有日志都记录在本机,通过local2输出
chroot      /var/lib/haproxy  //改变当前工作目录,安全模式
pidfile     /var/run/haproxy.pid //pid文件
maxconn     4000                //最大连接数
user        haproxy             //用户
group       haproxy              //组
daemon                          //以后台形式运行haproxy
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults   //配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
mode                    http       //默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK(注,health已经废弃)
log                     global //采用全局定义的日志
option                  httplog  //日志类别http日志格式
option                  dontlognull  //不记录健康检查的日志信息
option http-server-close    //每次请求完毕后主动关闭http通道
option forwardfor       except 127.0.0.0/8  //不记录本机转发的日志
option                  redispatch   //serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries                 3   //3次连接失败就认为服务不可用,也可以通过后面设置
timeout http-request    10s  //请求超时
timeout queue           1m    //队列超时
timeout connect         10s    //连接超时
timeout client          1m      //客户端连接超时
timeout server          1m      //服务器连接超时
timeout http-keep-alive 10s      //长连接超时
timeout check           10s      //检查超时
maxconn                 3000     //最大连接数
listen stats    //listen是Frontend和Backend的组合体。这里定义的是haproxy监控!
mode http     //模式http
bind *:80     //绑定的监控ip与端口
stats enable   //启用监控
stats hide-version   //隐藏haproxy版本
stats uri     /haproxyadmin?stats  //定义的uri
stats realm   Haproxy\ Statistics  //统计页面密码框上提示文本
stats auth    admin:admin    //认证
stats admin if TRUE        //启用管理界面
frontend  http   //接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。这里定义的是http服务!
bind *:80  //绑定的监控ip与端口
mode http   //模式http
acl url_static       path_beg       -i /static /images /javascript /stylesheets    //acl后面是规则名称,定义访问控制
acl url_static       path_end       -i .jpg .gif .png .css .js .html
acl url_dynamic      path_end       -i .php
use_backend static          if url_static  //满足url_static这个条件,则启用static的backend
use_backend dynamic         if url_dynamic  ////满足url_dynamic这个条件,则启用dynamic的backend
default_backend             dynamic  //定义的默认backend
backend static    //static的作用域
mode http
balance roundrobin
//banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
option  httpchk /index.html
//检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1   172.16.8.7:80 check inter 2000 rise 2 fall 3
backend dynamic
mode http
balance roundrobin
option  httpchk /index.php
server web2  172.16.8.9:80 check inter 2000 rise 2 fall 3  
  3.1、修改日志文件
//修改系统日志的配置文件
[root@haproxy ~]# vim /etc/sysconfig/rsyslog
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 2 -r"  

  3.2、增加日志设备
[root@haproxy ~]# vim /etc/rsyslog.conf
#增加一行
local2.*                                                /var/log/haproxy.log  

  3.3、重新启动一下日志服务
[root@haproxy ~]# service rsyslog restart  

  3.4、检查配置文件语法
[root@haproxy ~]# haproxy -c -f /etc/haproxy/haproxy.cfg
Configuration file is valid  

  3.5、将此配置文件发往从服务器:

[root@node1 haproxy]# scp /etc/haproxy/haproxy.cfg root@172.16.8.8:/etc/haproxy/  

  4、创建haproxy+keepalived脚本:
  
  此脚本实现当haproxy挂掉后,能再次启动haproxy,若无法再次启动则彻底关闭keepalived将VIP交给
  从机处理。
  
  
[root@node1 ~]#  vim /etc/keepalived/check_haproxy.sh
//添加如下内容
---------------------
#!/bin/bash
while :
do
hapid=`ps -C haproxy --no-header |wc -l`
if [ $hapid -eq 0 ];then
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
sleep 5
if [ $hapid -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
sleep 5
done
--------------------
[root@node1 ~]#  chmod 755 /etc/keepalived/check_haproxy.sh
[root@node1 ~]#  nohup sh /etc/keepalived/check_haproxy.sh &  

  把此脚本发往从服务器

[root@node1 ~]# scp /etc/keepalived/check_haproxy.sh root@172.16.8.8:/etc/keepalived/  

  5、配置动静服务器

  •   静态服务器(172.16.8.7)

  
[root@master html]# yum -y install httpd  添加测试页面:
#vim /var/www/html/index.html
//添加如下内容
www.web1.com  


  •   动态服务器(172.16.8.9)
# yum -y install httpd php  添加测试页面:
# vim /var/www/html/index.php
//添加如下内容:
www.web2.com
  

  四、模拟故障测试
  
//主从服务器都启动keepalived与haproxy
[root@node1 ~]# service keepalived start
[root@node1 ~]# service haproxy start
[root@node2 ~]# service keepalived start
[root@node2 ~]# service haproxy start
//后端服务器启动web
[root@master ~]# service httpd start
[root@station142 ~]# service httpd start  


  •   在游览器输入 http://172.16.8.1/haproxyadmin?stats,账户密码都为admin


  

  这样我们可以通过这个stats界面来管理后端服务器了!
  


  •   动静分离测试
  访问静态页面时,跳到web1服务器上(172.16.8.7)
  
  

  访问动态页面时跳到web2上,(172.16.8.9)
  
  


  •   把主服务器的haproxy服务停止,看是否影响访问!
[root@node1 keepalived]# service haproxy stop  

  check_haproxy.sh脚本检测到haproxy服务停止,就把keepalived服务停止,从而vip从主服务器转移到从服务器,用户访问无影响!
  


  

  

  至此,基于keepalived与haproxy搭建的高可用web集群已经完成,读者如果有足够多的主机的话,后面动静页面服务器可以有多个,还可以加个缓存服务器,加速用户访问!
  






运维网声明 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-657516-1-1.html 上篇帖子: 集群 之 Nginx+keepalived双机高可用性 下篇帖子: keepalived+mysql主主配置手册
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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