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

LVS+KeepAlived

实验目的:

client通过访问漂移IP,正常由主LVS调度,获取后端web1和web2的页面

LVS+KeepAlived正常

当主宕机后,漂移地址漂到从服务器继续工作,不会影响用户访问,从会升级为主继续运行

LVS+KeepAlived主宕

实验步骤:

第一步:

搭建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 这个参数必须记住

image-20200116154459127

实际环境中必须添加

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

Haproxy+KeepAlived

实验目的:

client通过访问漂移IP,正常由主Haproxy调度,获取后端web1和web2的页面

Haproxy+KeepAlived正常

当主宕机后,漂移地址漂到从服务器继续工作,不会影响用户访问,从会升级为主继续运行

Haproxy+KeepAlived主宕

实验步骤:

第一步:

搭建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

实验成功

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0