Keepalived+haproxy部署安装测试
本文档基于centos8 进行测试安装部署
Keepalived实现高可用作用,haproxy实现负载均衡。
1 keepalived安装
dnf install keepalived –y
安装成功后keepalived的配置文件再/etc/keepalived目录下
2 haproxy安装
dnf install haproxy –y
安装成功后haproxy的配置文件再/etc/haproxy目录下
3 配置haproxy
#---------------------------------------------------------------------
# Example configuration for a possible webapplication. See the
# full configuration options online.
#
# https://www.haproxy.org/download/1.8/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 tothe SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
#2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like thefollowing can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
#turn on stats unix socket
stats socket /var/lib/haproxy/stats
#utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
#---------------------------------------------------------------------
# common defaults that all the 'listen' and'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
optionhttp-server-close
option forwardfor except127.0.0.0/8
option redispatch
retries 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
#---------------------------------------------------------------------
# main frontend which proxys to thebackends
#---------------------------------------------------------------------
frontend main
bind *:80 ##此处可以修改端口号,默认为5000
stats uri /haproxy ##此处设置haproxy的监控界面路径
acl url_static path_beg -i /static /images /javascript/stylesheets
aclurl_static path_end -i .jpg .gif .png .css .js
use_backend static ifurl_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images,stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:80check
#---------------------------------------------------------------------
# round robin balancing between the variousbackends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 192.168.248.155:80check inter 2000 fall 3 weight 30
server app2 192.168.248.156:80check inter 2000 fall 3 weight 30
server app3 192.168.248.157:80check inter 2000 fall 3 weight 30
server app4 192.168.248.160:80 check inter 2000 fall3 weight 30
每个变量含义声明
global
# 全局参数的设置
log 127.0.0.1 local2
# log语法:log
<address_1>[max_level_1] # 全局的日志配置,使用log,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
chroot /var/lib/haproxy #改变当前工作目录
pidfile
/var/run/haproxy.pid #当前进程id文件
maxconn 4000 #最大连接数
user haproxy #所属用户
group haproxy #所属组
daemon #以守护进程方式运行haproxy
stats socket /var/lib/haproxy/stats
defaults mode http
#默认的模式mode {
tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global
#应用全局的日志配置
option httplog
# 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
option dontlognull
# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option http-server-close
#每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8
#如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。 启用 X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
retries 3
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
timeout http-request 10s
#http请求超时时间
timeout queue 1m
#一个请求在队列里的超时时间
timeout connect 10s
#连接超时
timeout client 1m
#客户端超时
timeout server 1m
#服务器端超时
timeout http-keep-alive 10s
#设置http-keep-alive的超时时间
timeout check 10s
#检测超时
maxconn 3000
#每个进程可用的最大连接数
frontend main *:80
#监听地址为80
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 my_webserver
#定义一个名为my_app前端部分。此处将对于的请求转发给后端
Backend static
#使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则访问此后端)
balance roundrobin
#负载均衡算法(#banlance roundrobin 轮询,balance
source 保存session值,支持static-rr,leastconn,first,uri等参数)
server static 127.0.0.1:80 check
#静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
backend my_webserver
#定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个
自定义名字而已,但是需要与frontend里面配置项default_backend
值相一致
balance roundrobin
#负载均衡算法
server web01 172.31.2.33:80 check inter 2000 fall 3
weight 30
#定义的多个后端
server web02 172.31.2.34:80 check inter 2000
fall 3 weight 30
#定义的多个后端
server web03 172.31.2.35:80 check inter 2000
fall 3 weight 30
#定义的多个后端
4 配置keepalived
主节点keepalived配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_fromAlexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER ##表示为主节点
interface ens33 ##表示添加虚ip的网卡信息
virtual_router_id 51
priority 100 ##表示权重信息,主从节点要不一样
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.248.158 ##表示添加的vip
}
}
从节点keepalived配置
! 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_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.248.158
}
}
扩展
提高利用率由于一个 VIPA 只能配置在一台机器上,如果共有两台机器,则浪费了 50% 的资源。如果要提高资源的利用率,可以再申请一个 VIPA。把备机配置为 Master,把主机配置为 Backup。
VIPA 争抢由于 nopreempt 只能配置在 BACKUP 上,如果 state 为 MASTER 的机器故障并恢复,则会把 VIPA 抢过去。整个过程是:
主机 A 故障
VIPA 漂移到主机B
主机 A 恢复
VIPA 漂移到主机A
这样就会导致第四步多漂移了一次。而漂移可能会对服务有很短暂的影响。如果希望主机 A 恢复后,仍然让主机 B 持有 VIPA,则要在主机的 Keepalived 启动之前修改配置中的 state,改为 BACKUP。
避免丢包在 VIPA 漂移到备机之间,短暂的时间内数据包仍然会发送到主机。如果主机能够连上,则可以使用防火墙将数据包转发到备机。然后停止 Keepalived 。
iptables -F
iptables -t nat -I PREROUTING -i eth0 -j DNAT--to-destination 192.168.1.102
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
数据库的问题数据库如果使用双主,在 VIPA 切换的时候,数据可能未同步完成,可能会造成自增 ID 冲突。可以配置 Keepalived 等一段时间后再发送 ARP 请求,以此等待同步完成。配置项是:vrrp_garp_master_delay 10 表示延迟 10 秒返送。