一、概述
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.7 | Centos6.5 | httpd | |
动态服务器 | eth0:172.16.8.9 | Centos6.5 | httpd 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 <linuxedu@foxmail.com> # 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 /p_w_picpaths /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 //添加如下内容 <h1>www.web1.com</h1>
动态服务器(172.16.8.9)
# yum -y install httpd php
添加测试页面:
# vim /var/www/html/index.php //添加如下内容: <h1>www.web2.com</h1> <?php phpinfo(); ?>
四、模拟故障测试
//主从服务器都启动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集群已经完成,读者如果有足够多的主机的话,后面动静页面服务器可以有多个,还可以加个缓存服务器,加速用户访问!