高可用群集Haproxy+keepalived

1.Haproxy

1.1Haproxy与LVS比较

LVS在企业应用中抗负载能力很强,但存在不足

  • LVS不支持正则处理,不能实现动静分离
  • 对于大型网站,LVS的实施配置复杂,维护成本相对较高
    Haproxy是一款提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件
  • 适用于负载大的Web站点
  • 运行在硬件上可支持数以万计的并发连接的连接请求

1.2Haproxy调度算法及原理

1.RR
RR算法是最简单最常用的一种算法,即轮询调度
理解举例
有三个节点A、B、C
第一个用户访问会被指派到节点A
第二个用户访问会被指派到节点B
第三个用户访问会被指派到节点C
第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

2.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算法有很大改进,是目前用到比较多的一种算法

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

2.Haproxy+keepalived实验

环境:
两台调度服务器:
主调度器:真实IP:192.168.20.80,虚拟IP:192.168.20.220
备调度器:真实IP:192.168.20.20,虚拟IP:192.168.20.220
两台节点服务器:
真实IP:192.168.20.100,192.168.20.40
一台NFS共享存储服务器:
地址192.168.20.10
一台客户机

2.1 NFS共享存储服务器配置

yum -y install nfs-utils rpcbind
mkdir -p /opt/web1
mkdir -p /opt/web2
vi /etc/exports
/opt/web1 192.168.20.100/32(ro)
/opt/web2 192.168.20.40/32(ro)

systemctl start nfs
showmount -e	#查看本机共享存储发布情况

2.2节点服务器配置

web1

yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx		#启动nginx
netstats -napt | grep nginx	#检查80号端口是否开启
showmount -e 192.168.20.10		#查看nfs共享目录发布情况
mount 192.168.20.10:/opt/web1 /usr/local/nginx/html/

web2

yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx		#启动nginx
netstats -napt | grep nginx	#检查80号端口是否开启
showmount -e 192.168.20.10		#查看nfs共享目录发布情况
mount 192.168.20.10:/opt/web2 /usr/local/nginx/html/

2.3调度服务器配置

2.3.1主调度服务器

安装依赖包

yum -y install gcc gcc-c++ make pcre-devel bzip2-devel

编译安装haproxy

tar -zxvf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=linux26		#定义内核
make install

编辑主配置文件

mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
vi /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
        log /dev/log    local0 info
        log /dev/log    local0 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy		#注释此项
        uid 99
        gid 99
        daemon		#守护进程模式
        #debug
        #quiet
        #nbproc 2		#负载均衡并发连接数

defaults
        log     global		#定义日志为global配置中的日志定义
        mode    http		#模式为http
        option  httplog		#采用http日志格式记录日志
        option  dontlognull		#
        #option http-server-close	#主动关闭http请求选项,建议在生产环境中使用
        retries 3	#重试次数,用于对群集节点的检查
        #redispatch			#注释此项
        maxconn 2000		#最大连接数,根据应用实际情况进行调整
        contimeout      5000	#连接超时时间(ms)
        clitimeout      50000	#客户端超时时间(ms)
        srvtimeout      50000	#服务器超时时间(ms)

listen webcluster 0.0.0.0:80	#定义一个应用为webcluster
        option httpchk GET /index.html	#检查服务器的index.html文件
        balance roundrobin		#负载均衡调度算法为轮询rr
        server web1 192.168.20.100:80 check inter 2000 fall 3	#定义节点1
        server web2 192.168.20.40:80 check inter 2000 fall 3	#定义节点2

配置haproxy服务启动

cd haproxy-1.4.24
cp examples/haproxy.init /etc/init.d/haproxy
vi /etc/init.d/haproxy
# chkconfig: 35 85 15

chmod +x /etc/init.d/haproxy
chkconfig --add haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
systemctl start haproxy

日志定义

vi /etc/haproxy/haproxy.cfg
log /dev/log    local0 notice
log /dev/log    local0 info

touch /etc/rsyslog.d/haproxy.conf
vi /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
&~

/var/log/haproxy/haproxy-info.log		#调度信息日志
/var/log/haproxy/haproxy-notice.log		#启动信息日志

配置统计页面

vi /etc/haproxy/haproxy.cfg
##最后添加
listen admin_stats		
	bind 0.0.0.0:1080	##设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
	mode http		#http7层模式
	option httplog		#采用http日志格式
	#log 127.0.0.1 local0 err		#错误日志记录
	maxconn 10		#默认最大连接数
	stats refresh 30s		#统计页面自动刷新时间
	stats uri /stats		#统计页面url
	stats realm XingCloud\ Haproxy		#统计页面密码框上提示文本		
	stats auth admin:admin			#设置监控页面的用户名和密码:admin,可以设置多个用户名
	stats auth Frank:Frank		#设置监控页面的用户和密码:Frank
	stats hide-version		#隐藏统计页面上haproxy的版本信息
	stats admin if TRUE		#设置手工启动/禁用,后端服务器

浏览器访问http://192.168.20.80:1080/stats
用户名admin,密码admin

配置keepalived

yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
tar -zxvf keepalived-1.4.2.tar.gz
cd keepalived-1.4.2/
./configure --prefix=/
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d/
##将keepalived加入系统服务,可用systemctl管理
vi /etc/keepalived/keepalived.conf		#编辑配置文件
! Configuration File for keepalived

vrrp_script chk_http_port {		#定义调度服务检查脚本
script "/etc/keepalived/check_haproxy.sh"	#定义检测haproxy调度服务脚本路径
interval 2
weight -10	#当脚本生效时将优先级降10
}

global_defs {
   router_id LVS_1
}

vrrp_instance v1 {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 105
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {		#健康检查使用的脚本
        chk_http_port		
    }
    virtual_ipaddress {
        192.168.20.220
    }
}

配置keepalived服务健康检查脚本

#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ]		#如果haproxy进程数小于等于0
then	
haproxy -f /etc/haproxy/haproxy.cfg		
sleep 3			#则执行重启haproxy
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ]	#再次检查haproxy进程数如果小于等于0
then
/etc/init.d/keepalived stop		#则关闭keepalived服务
fi
fi

2.3.2备调度服务器

与主调度服务器不同点:
修改keepalived主配置文件

router_id LVS_2
state BACKUP
 priority 100

2.4测试效果

2.4.1正常状态

主调度器获得虚拟地址,备调度器未获得虚拟地址

ip addr ##查看ip地址信息


在这里插入图片描述

在这里插入图片描述

2.4.2当主调度器关闭haproxy服务时

查看keepalived日志信息
tail -f /var/log/messages

keepalived利用脚本持续健康检查检测到haproxy进程小于等于0,即主调度器haproxy服务关闭,先将优先级下调,再继续执行脚本重启haproxy,脚本执行成功,将优先级恢复,主调度器继续承载服务
在这里插入图片描述

2.4.3当主调度器故障时

主调度器关闭网络,模拟主调度器故障时,虚拟地址漂移,备调度服务器获得虚拟地址
在这里插入图片描述

2.4.4测试期间,web服务访问情况

客户机访问虚拟地址192.168.20.220,web服务正常运行,无间断及异常情况
在这里插入图片描述
客户机再次访问(测试调度轮询rr算法)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值