KeepAlived负载均衡
相关概念
Keepalived是针对LVS设计的一款强大的辅助工具,主要用来提供故障切换和健康检查功能——判断LVS负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后,重新加入群集
KeepAlived保证集群的高可用
高并发:能够同时供多台客户端访问
高可用:防止集群中因为某个节点坏掉,而导致整个集群不能正常提供服务
作用
KeepAlived一开始为了搭配LVS,配合LVS对后端的集群进行健康检查,当后端的集群中有一个服务器宕机,它将会将这个服务器从后端节点当中剔除,来保证集群的可用性,当后端的这个服务器能够支持提供服务的时候,再将该服务加入到后端的集群中
再后来,KeepAlived实现了VRRP(虚拟路由冗余)协议
后期KeepAlived对LVS负载均衡服务器时用作节点检查的,避免单点故障,如果主LVS故障,KeepAlived会在LVS集群中选出一个主LVS,来代替主的位置,主和从之间会发送特定的消息(这个时间一般为1s),当从服务器接收不到主给的消息,就意味着主服务器宕机,然后从将接替主来工作,从而保证高可用
当主LVS重新上线,就会继续主的位置
漂移ip
LVS中的虚拟ip在KeepAlived中被叫做漂移IP,用来供客户端访问,所以部署LVS时,不需要做虚拟ip,在做KeepAlived时,做漂移IP即可
LVS(DR)+KeepAlived负载均衡web
实验环境:
client:192.168.1.1
LVS1+KeepAlived:192.168.1.4
LVS2+KeepAlived:192.168.1.6
web1:192.168.1.7
web2:192.168.1.8
漂移IP:192.168.1.10
实验目的:
client通过访问漂移IP,正常由主LVS调度,获取后端web1和web2的页面
当主宕机后,漂移地址漂到从服务器继续工作,不会影响用户访问,从会升级为主继续运行
实验步骤:
第一步:
搭建web页面,由于实验环境,使用yum搭建即可
web1:192.168.1.7
[root@web1 ~]# yum -y install httpd*
[root@web1 ~]# echo "web1" >> /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
web2:192.168.1.8
[root@web2 ~]# yum -y install httpd*
[root@web2 ~]# echo "web2" >> /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
第二步:
搭建LVS
LVS1:192.168.1.4
[root@LVS1 ~]# modprobe ip_vs # 加载ip_vs模块
[root@LVS1 ~]# yum -y install ipvsadm # 安装ipvsadm管理工具
[root@LVS1 ~]# ipvsadm -A -t 192.168.1.10:80 -s rr # 创建集群,1.10为漂移ip
[root@LVS1 ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.7:80 -g -w 1 # 集群中添加web1节点
[root@LVS1 ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.8:80 -g -w 1 # 集群中添加web2节点
LVS2:192.168.1.6(与LVS1相同的操作)
[root@LVS2 ~]# modprobe ip_vs
[root@LVS2 ~]# yum -y install ipvsadm
[root@LVS2 ~]# ipvsadm -A -t 192.168.1.10:80 -s rr
[root@LVS2 ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.7:80 -g -w 1
[root@LVS2 ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.8:80 -g -w 1
第三步:
配置web虚拟ip
调整两台web,配置调整内核参数对arp的限制 (相同操作或者scp)
[root@web1 ~]# vim /etc/sysctl.conf
添加:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
[root@web1 ~]# sysctl -p
设置回环网卡的虚拟接口(两台相同)
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
修改:
DEVICE=lo:0
IPADDR=192.168.1.10 # 漂移ip
NETMASK=255.255.255.255
NAME=web1 # 第二台改为web2
[root@web1 ~]# systemctl restart network
web1和web2分别设置本地访问路由(临时)
[root@localhost ~]# route add -host 192.168.1.10 dev lo:0
永久
添加vip本地访问路由
vim /etc/rc.local
添加
route add -host 192.168.1.11 dev lo:0
第四步:
搭建KeepAlived
LVS1:192.168.1.4
[root@LVS1 ~]# yum -y install popt-devel kernel-devel openssl-devel # 解决依赖关系
[root@LVS1 ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src
[root@LVS1 ~]# cd /usr/src/keepalived-1.2.13/
[root@LVS1 keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
LVS2:192.168.1.6
[root@LVS2 ~]# yum -y install popt-devel kernel-devel openssl-devel # 解决依赖关系
[root@LVS2 ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src
[root@LVS2 ~]# cd /usr/src/keepalived-1.2.13/
[root@LVS2 keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
第五步:
修改KeepAlived主配置文件
/etc/keepalived/keepalived.conf
配置文件释义\
global_defs { # KeepAlived的全局配置
notification_email { # 检测到节点故障时,给管理员发送邮件
acassen@firewall.loc # 这里需要些管理员的邮箱地址
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 邮件的发送者,方便管理员辨别
smtp_server 192.168.200.1 # 邮件服务器IP
smtp_connect_timeout 30 # 邮件服务器超时时间
router_id LVS_DEVEL # 节点的标识,相当于hostname
}
vrrp_instance VI_1 { # vrrp组,组名为VI_1
state MASTER # 节点状态为MASTER(主)
interface eth0 # 使用联系备份KeepAlived的网卡接口
virtual_router_id 51 # 主和被要一样
priority 100 # 优先级 1-255
advert_int 1 # 当前发送vrrp的时间
virtual_server 192.168.1.10:80 { # 访问虚拟ip的配置
delay_loop 6 # 健康检查的间隔时间
lb_algo rr # 调度算法RR轮询
lb_kind DR # LVS的工作模式
nat_mask 255.255.255.0
persistence_timeout 0 # 会话保持时间(实验环境)
protocol TCP # tcp传输
LVS1:192.168.1.4
[root@LVS1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER # 第二台修改为backup
interface ens33 # 修改为当前使用网卡名
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.1.10 # 修改为漂移IP地址
}
virtual_server 192.168.1.10:80 { # 修改漂移IP地址
delay_loop 6
lb_algo rr
lb_kind DR # 修改为LVS使用的工作模式
nat_mask 255.255.255.0
persistence_timeout 0 # 实验环境为0,方便验证
protocol TCP
# 删除到和以下内容相同
real_server 192.168.1.7:80 { # 真实web1节点
weight 1 # 权重为1
connect_port 80 # 连接的端口
connect_timeout 3 # 超时时间
nb_get_retry 3 # 与节点失败后的连接次数
delay_before_retry 3 # 多久尝试重连
} # 之后的内容可以删除,然后复制一份做第二台web的信息配置
real_server 192.168.1.8:80 { # 真实web2节点
weight 1
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
LVS2:192.168.1.6(与LVS1的配置文件几乎相同,使用scp传输即可)
[root@LVS2 ~]# vim /etc/keepalived/keepalived.conf(这是在与LVS完全相同的基础下更改)
vrrp_instance VI_1 {
state BACKUP # 修改为备份
interface ens33 # 检查网卡名称
virtual_router_id 51
priority 50 # 优先级降低
启动服务
service keepalived start
:仅支持此命令
第六步:
验证:
验证时,关闭LVS和web的所有防火墙,或者开端口
验证LVS
client访问:
[root@client ~]# curl 192.168.1.10
web1
[root@client ~]# curl 192.168.1.10
web2
验证KeepAlived
要将主KeepAlived的服务停掉,在继续访问
[root@LVS1 ~]# service keepalived stop # 注意主机名,停掉的是LVS的KeepAlived(主)
client重新访问:
[root@client ~]# curl 192.168.1.10
web1
[root@client ~]# curl 192.168.1.10
web2
实验成功
最后需要说一点:当某一台为LVS主时,在查看ip是可以在联系的网卡接口中看到漂移ip,停掉主时,会重新漂移到另一台选举的从作为主\
KeepAlived常见报错
keepalived脑裂:keepalived 出现两个主的情况
1.state MASTER 节点的状态都是主
2.防火墙没有放行
3.priority 100 优先级一致
4.vrrp_instance VI_1 组名不一致
5.virtual_router_id 51 不一致
6.当主恢复后 漂移ip转移需要时间
在生产环境中 要关闭主恢复后不会转移
nopreempt 这个参数必须记住
实际环境中必须添加
Haproxy + KeepAlived负载均衡web
实验环境:
client:192.168.1.1
Haproxy1+KeepAlived:192.168.1.4
Haproxy2+KeepAlived:192.168.1.6
漂移IP:192.168.1.10
web1:192.168.1.7
web2:192.168.1.8
实验目的:
client通过访问漂移IP,正常由主Haproxy调度,获取后端web1和web2的页面
当主宕机后,漂移地址漂到从服务器继续工作,不会影响用户访问,从会升级为主继续运行
实验步骤:
第一步:
搭建web页面,由于实验环境,使用yum搭建即可
web1:192.168.1.7
[root@web1 ~]# yum -y install httpd*
[root@web1 ~]# echo "web1" >> /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
web2:192.168.1.8
[root@web2 ~]# yum -y install httpd*
[root@web2 ~]# echo "web2" >> /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
第二步:
搭建Haproxy
Ha1:192.168.1.4
[root@Ha1 ~]# yum -y install pcre-devel bzip2-devel
[root@Ha1 ~]# tar zxf haproxy-1.4.24.tar.gz -C /usr/src
[root@Ha1 ~]# cd /usr/src/haproxy-1.4.24/
# 进行编译时,需要对应系统的内核版本号
[root@Ha1 haproxy-1.4.24]# uname -r
3.10.0-862.el7.x86_64
[root@Ha1 haproxy-1.4.24]# make TARGET=linux310 PREFIX=/usr/local/haproxy
# linux310就是3.10
[root@Ha1 haproxy-1.4.24]# make install PREFIX=/usr/local/haproxy
install -d /usr/local/haproxy/sbin
install haproxy /usr/local/haproxy/sbin
install -d /usr/local/haproxy/share/man/man1
install -m 644 doc/haproxy.1 /usr/local/haproxy/share/man/man1
install -d /usr/local/haproxy/doc/haproxy
for x in configuration architecture haproxy-en haproxy-fr; do \
install -m 644 doc/$x.txt /usr/local/haproxy/doc/haproxy ; \
done
优化命令路径
[root@Ha1 ~]# ln -s /usr/local/haproxy/sbin/* /usr/sbin
建立配置文件和启动脚本
[root@Ha1 ~]# mkdir /etc/haproxy # 创建配置文件存放目录
[root@Ha1 ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/ # 复制配置文件
[root@Ha1 ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy # 复制启动脚本
[root@Ha1 ~]# chmod +x /etc/init.d/haproxy # 启动脚本添加执行权限
修改配置文件
[root@Ha1 ~]# vim /etc/haproxy/haproxy.cfg
# 注释全局配置中这一行
#chroot /usr/share/haproxy # 安装路径
# 注释默认配置中这一行
#redispatch # 客户端访问时产生cookie的对应节点坏掉,就会直接定向到另一台web,影响轮询效果,生成环境中不需要注释
这行以下内容全部清空,自行写入
listen appli1-rewrite 0.0.0.0:10001
在最后进行添加:
listen webservers 0.0.0.0:80 # web集群的名称为webservers,监听所有主机的80端口
balance roundrobin # 轮询方式为动态轮询
option httpchk GET /index.html # 给后端节点进行后端进行健康检查,以GET方式
server web_one 192.168.1.7:80 check inter 2000 rise 3 fall 3
server web_two 192.168.1.8:80 check inter 2000 rise 3 fall 3
添加haproxy为系统服务,方便使用systemctl进行管理
[root@localhost ~]# chkconfig --add /etc/init.d/haproxy #添加为系统服务
[root@localhost ~]# systemctl start haproxy # 启动服务
Ha2:192.168.1.6和Ha1中的配置完全一样
第三步:
配置web虚拟ip
调整两台web,配置调整内核参数对arp的限制 (相同操作或者scp)
[root@web1 ~]# vim /etc/sysctl.conf
添加:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
[root@web1 ~]# sysctl -p
设置回环网卡的虚拟接口(两台相同)
[root@web1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
修改:
DEVICE=lo:0
IPADDR=192.168.1.10 # 漂移ip
NETMASK=255.255.255.255
NAME=web1 # 第二台改为web2
[root@web1 ~]# systemctl restart network
web1和web2分别设置本地访问路由(临时)
[root@localhost ~]# route add -host 192.168.1.10 dev lo:0
永久
添加vip本地访问路由
vim /etc/rc.local
添加
route add -host 192.168.1.10 dev lo:0
第四步:
搭建KeepAlived
Ha1:192.168.1.4
[root@LVS1 ~]# yum -y install popt-devel kernel-devel openssl-devel # 解决依赖关系
[root@LVS1 ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src
[root@LVS1 ~]# cd /usr/src/keepalived-1.2.13/
[root@LVS1 keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
Ha2:192.168.1.6
[root@LVS2 ~]# yum -y install popt-devel kernel-devel openssl-devel # 解决依赖关系
[root@LVS2 ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src
[root@LVS2 ~]# cd /usr/src/keepalived-1.2.13/
[root@LVS2 keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
修改KeepAlived主配置文件
/etc/keepalived/keepalived.conf
Ha1:192.168.1.4
[root@LVS1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER # 第二台修改为backup
interface ens33 # 修改为当前使用网卡名
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.1.10 # 修改为漂移IP地址
}
Ha2:192.168.1.6(与LVS1的配置文件几乎相同,使用scp传输即可)
[root@Ha2 ~]# vim /etc/keepalived/keepalived.conf(这是在与LVS完全相同的基础下更改)
vrrp_instance VI_1 {
state BACKUP # 修改为备份
interface ens33 # 检查网卡名称
virtual_router_id 51
priority 50 # 优先级降低
启动服务
service keepalived start
:仅支持此命令
第六步:
验证:
验证时,关闭Haproxy和web的所有防火墙,或者开端口
验证Haproxy
client访问:
[root@client ~]# curl 192.168.1.10
web1
[root@client ~]# curl 192.168.1.10
web2
验证KeepAlived
要将主KeepAlived的服务停掉,在继续访问
[root@Ha1 ~]# service keepalived stop # 注意主机名,停掉的是LVS的KeepAlived(主)
client重新访问:
[root@client ~]# curl 192.168.1.10
web1
[root@client ~]# curl 192.168.1.10
web2
实验成功