Keepalived和Haproxy
一、Keepalived
1、keepalived概念
调度器的高可用
vip地址主备之间的切换,主在工作时,vip地址值在主上,主停止工作,vip飘移到备服务器
在主备的优先级不变的情况下,主恢复工作,vip会飘回到主服务器
1、配优先级
2、配vip地址和真实服务器
3、主备的id要一致
4、主备的id要区分
keepalive是专门为lvs打造的,但是不是为lvs专门服务的
keepalive也可以使用nginx,haproxy
2、keepalive+nginx实现高可用
实验
nginx1 192.168.100.11 keepalive
nginx2 192.168.100.12 keepalive
客户端 192.168.100.13
监控脚本,来监控nginx1的状态,如果nginx1挂了,nginx1的keepalive也要停止,实现vip的飘移
#nginx1和nginx2#
systemctl stop firewalld
setenforce 0
yum -y install keepalived#nginx1#
cd /opt
vim check_nginx.sh#!/bin/bash
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ]
thensystemctl stop keepalived
fi
wq!systemctl restart keepalived
systemctl status keepalived
systemctl restart nginx
chmod 777 check_nginx.sh
# ls查看是否生成check_nginx.sh的文件cd /etc/keepalived
vim keepalived.conf
#修改smtp_server 192.168.200.1如下
smtp_server 127.0.0.1
#修改router_id LVS_DEVEl如下
router_id LVS_01
#新增一行
vrrp_iptables
}#修改interface eth0如下
interface ens33
#virtual_router_id 51保持不变(主备保持相同)
#priority 100修改如下
priority 120#virtual_ipaddress修改为vip地址如下
virtual_ipaddress {192.168.100.100
}
# 以下全部删除
# 在虚拟地址结束的新增一行track_script {check_nginx}# 在vrrp_iptables
#}下新增
vrrp_script check_nginx {script "/opt/check_nginx.sh"# 调用脚本内容,检测nginx的状态interval 5# 检测的时间间隔是5秒,如果业务敏感可以改成3秒
}wq!systemctl status keepalived.service
# 此时状态是开启
systemctl stop nginx
# 等待5秒
systemctl status keepalived.service
# 此时状态是关闭#nginx2#
systemctl restart nginx
cd /etc/keepalived
cp keepalived.conf keepalived.conf.bak.2024.07.12
scp root@192.168.100.11:/etc/keepalived/keepalived.conf /etc/keepalived/
vim keepalived.conf#修改router_id LVS_01如下
router_id LVS_02
#修改state MASTER如下
state BACKUP
#priority 120修改如下
priority 100
wq!#nginx1#
systemctl start nginx
systemctl start keepalived.service
# 一定要先启动nginx,因为脚本检测的是nginxvim /usr/local/nginx/html/index.html
# 修改为this is nginx1
wq!#nginx2#
systemctl restart nginx
systemctl restart keepalived
ip addr
vim /usr/local/nginx/html/index.html
# 修改为this is nginx2
wq!主备切换
#客户机#
页面访问vip地址:curl 192.168.100.100,此时访问的是nginx1的页面#nginx1#
systemctl stop nginx#nginx2#
ip addr
vip地址切换到nginx2#客户机#
页面访问vip地址:curl 192.168.100.100,此时访问的是nginx2的页面#nginx1#
页面访问vip地址:curl 192.168.100.100,此时页面又切换回来,是nginx1的页面
3、脑裂是什么?
是什么:HA 高可用架构中的一个特殊现象,只要使用vip地址代理的冗余模式的高可用,都有可能出现脑裂的问题
现象:主和备同时都有vip地址,主和备无法确定各自的身份,同时出现了vip地址,两边都起来了,但是两边都无法使用。
原因:
3.1 keepalive的配置文件出现问题
3.2 心跳线(网线)断了、老化
3.3 网卡出现问题(硬件),ip地址出现问题
3.4 防火墙的策略,iptables的策略,屏蔽了组播的地址广播,屏蔽了vrrp的协议的报文
3.5 两台服务器的时间不同步也可能导致
3.6 其他的服务配置对心跳线的检测造成了干扰
4、怎么解决?
lvs中碰见、nginx中碰见如何解决?
4.1 查看keepalive的配置文件是否配置有误
4.2 更换新的网线,或者同时使用两条心跳线,用来预防其中一条挂掉导致出现脑裂
4.3 检查网卡和ip地址是否出现问题
4.4 关闭防火墙,关闭iptables策略,或者在配置文件里增加vrrp_iptables
4.5 保持两台服务器的时间同步,设置NTP
nginx、lvs、lvs+keepalive、keepalive单独配置
二、Haproxy
1、Haproxy的概念
1.1 Haproxy负载均衡:
nginx(四层转发、七层代理)、lvs(四层转发)、Haproxy(四层转发 、七层转发)
1.2 Haproxy的作用和使用场景:
场景:主要用于高并发的web场景,可以支持一万个以上的并发请求,是高性能的tcp和http的负载均衡器
工作原理:提供一个代理地址用来访问集群
作用:
• 可以进行四层和七层转发
• 支持https协议
• Haproxy本身不自带缓存功能,请求当中添加cookie,使用缓存功能
• 支持主备切换(keepalived)
1.3 特点:
• 可靠性高、稳定性好
• 可以同时维护40000~50000个并发,单位时间内可以处理的最大请求数20000个(3秒)
• 支持负载均衡算法,虽然不带缓存,但是可以支持会话保持
权重:rr、wrr、leastconn
2、实验:七层代理
nginx1 192.168.100.11
nginx2 192.168.100.12
客户端 192.168.100.13
#客户端#
yum install -y pcre-devel bzip2-devel gcc gcc-c++ maketar -xf haproxy-1.5.19.tar.gz
uname -r
cd haproxy-1.5.19
make TARGET=linux2628 ARCH=x86_64
# target使用的版本要大于linux2.60以上的版本
mkdir /etc/haproxy
cd examples
#haproxy.cfg是主配置文件
cp haproxy.cfg /etc/haproxy
cd /etc/haproxyvim haproxy.cfg
set nu
#第四行五行改为 注释第八行
log /dev/log local0 info
log /dev/log local1 notice
maxconn 4096
# 最多连接数,推荐10240
# 在daemon下新增
nbproc 6
# haproxy的并发线程数,设置的数量最后是cpu的2倍或者和cpu保持一致defaults
# 这是是默认参数配置,连接配置,监听配置以及代理配置retries 3
# 检查节点服务器3次,连续3次失败,就任务节点服务器不可用
redispatch
# 服务器负载很高时,自动结束当前队列中处理比较久的连接
maxconn 2000
# 最大连接数,这个数值可以和global里面的maxconn的保持一致,但是不能超过它,一般设置成一致
下面三行注释掉
#
#
#
在注释的三行下新增
timeout http-request 10s
# http请求的默认超时时间
timeout queue 1m
# 在队列当中请求的超时时间
timeout connect 10s
# 连接超时时间
timeout client 1m
# 客户端超时时间
timeout server 1m
# 服务端超时时间
timeout http-keep-alive 10s
# 默认长连接的超时时间
timeout check 10s
# 检查后端服务器超时时间# 删除listen appli2-insert 0.0.0.0:10002下面的所有行
# 修改listen appli1-rewrite 0.0.0.0:10001为七层配置的格式# 转发请求的设置,既可以是四层也可以是七层
# 七层的配置:
listen xy102 0.0.0.0:80option httpchk GET /index.html# 设置转发请求的内容balance static-rr# 默认轮询算法server rs01 192.168.11:80 check inter 2000 fall 3 weight 2server rs02 192.168.12:80 check inter 2000 fall 3 weight 3# server 指定真实服务器 rs01 自定义后台服务器的名称 checkinter 2000 启动对后端服务器进行检查,检查间隔是2000毫秒 fall 3 连续cd三次检测不到,则检测失败wq!cd /opt/haproxy-1.5.19/examples
cp haproxy.init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
systemctl restart haproxy.service
3、实验:四层配置
#客户端#
yum install -y pcre-devel bzip2-devel gcc gcc-c++ maketar -xf haproxy-15.19.tar.gz
uname -r
make TARGET=linux2628 ARCH=x86_64
# target使用的版本要大于linux2.60以上的版本
mkdir /etc/haproxy
#haproxy.cfg是主配置文件
cp haproxy.cfgvim haproxy.cfg
set nu
第四行五行
log /dev/log local0 info
log /dev/log local1 notice
maxconn 4096
# 最多连接数,推荐10240
# 在daemon下新增
nbproc 6
# haproxy的并发线程数,设置的数量最后是cpu的2倍或者和cpu保持一致
defaults
# 这是是默认参数配置,连接配置,监听配置以及代理配置retries 3
# 检查节点服务器3次,连续3次失败,就任务节点服务器不可用
redispatch
# 服务器负载很高时,自动结束当前队列中处理比较久的连接
maxconn 2000
# 最大连接数,这个数值可以和global里面的maxconn的保持一致,但是不能超过它,一般设置成一致
下面三行注释掉
#
#
#
在注释的三行下新增
timeout http-request 10s
# http请求的默认超时时间
timeout-queue 1m
# 在队列当中请求的超时时间
timeout connect 10s
# 连接超时时间
timeout client 1m
# 客户端超时时间
timeout server 1m
# 服务端超时时间
timeout http-keep-alive 10s
# 默认长连接的超时时间
timeout check 10s
# 检查后端服务器超时时间.....删除# 转发请求的设置,既可以是四层也可以是七层
# 四层的配置:
frontend test
bind *:80
mode tcp
default_backend testbackend test
mode tcp
balance roundrobin
server server1 182.168.100.11:80 check inter 2000 fall 3 weight 2
server server1 182.168.100.12:80 check inter 2000 fall 3 weight 3wq!cp haproxy,init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
keepalive+haproxy
ode tcp
default_backend test
backend test
mode tcp
balance roundrobin
server server1 182.168.100.11:80 check inter 2000 fall 3 weight 2
server server1 182.168.100.12:80 check inter 2000 fall 3 weight 3
wq!
cp haproxy,init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
keepalive+haproxy