部署 LVS + keepalived 高可用负载均衡集群

一 LVS + keepalived 集群概述

在这个高度信息化的 IT 时代,企业的生产系统、业务运营、销售和支持,以及日常管理等环节越来越依赖于计算机信息和服务,对高可用(HA)技术的应用需求不断提高,以便提供持续的、不间断的计算机系统或网络服务。

Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。


1.1 Keepalived工具介绍

专为LVS和HA设计的一款健康检查工具

• 支持故障自动切换(Failover)

• 支持节点健康状态检查(Health Checking)

• 官方网站:http://www.keepalived.org/


1.2 工作原理

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

keepalived 采用VRRP热备份协议实现Linux服务器的多机热备功能


1.3 VRRP (虚拟路由冗余协议)

  • 是针对路由器的一种备份解决方案
  • 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
  • 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
  • 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

1.4 故障转移机制

Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。

在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。

而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。


1.5一个完善的集群的特点

一个集群要满足3个 特点,才能是一个完善的集群

负载均衡,健康检查,故障切换

对于节点服务器,健康检查 如果发现有故障的节点,就会将其隔离或者提出集群待其恢复后,在重新加入到集群中

对于负载均衡器,健康检查 会定时检查主的状态(包括主机和服务的状态),如果主故障,就自动切换到备用服务器上,待主的回复,再重新让主去承载业务请求



二 keepalive的 主配置文件介绍

2.1 全局配置

vim  /etc/keepalived.conf

#全局配置,针对整个keepalived 生效的配置
global_defs {
   notification_email {  #设置 keepalived 在发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
   acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc   ##设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值。
   smtp_server 192.168.200.1    #指定发送邮件的smtp服务器。
   smtp_connect_timeout 30      #设置smtp连接超时时间,单位为秒。
   router_id LVS_DEVEL          #是运行keepalived的一个表示,多个集群router_id设置不同。
}


2.2 VRRPD 配置

#VRRPD 配置,主要有vrrp 同步组合 vrrp 实例两个部分组成。想要使用vrrp 高可用选举,就必须配置vrrp 实例,在实例中定义vip,服务器角色等


#用来做健康检查,当时检查失败时会将vrrp_instance的priority减少相应的值。
vrrp_script  checkha {
    script "/home/check.sh"       #一句指令或者一个脚本文件,需返回0(成功)或非0(失败),keepalived以此为依据判断其监控的服务状态。如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    interval 1    #健康检查周期
    weight -10   # 优先级变化幅度,如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。 一个节点在集群中的角色,是由”weight“ 值和  ”priority“值控制。如果不设置weight值,集群优先级的选择将由Keepalived配置文件中的“priority“值决定
}

-------------------------------------------------------------------------

#VRRP同步组。 当服务器有两个网段,一个内网,一个外网 ,每个网段开启一个VRRP实例。当VRRP检测为内网,但是当外网出现故障,VRRPD 任然认为自己健康,就不会进行主备切换。所以把两个实例都加入到一个同步组中,当任何一个实例出现问题,都会进行主备切换
vrrp_sync_group  VG_1 {   #监控多个网段的实例
		group {
		 VI_1    #实例名
     VI_2 
      .......
		}
		notify_master  "/path/xx.sh"     #keepalived进入master状态时需要执行脚本
		netify_backup  "/path/xx.sh"     # keepalived进入backup状态时需要执行脚本
		notify_fault   "path/xx.sh VG_1"    #keepalived进故障时执行的脚本
		notify_stop    "/path/xx.sh"        # keepalived程序终止时需要执行脚本
		smtp_alert   #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}




#Vrrp 实例配置,用来定义对外提供服务的vip 区域及相关属性
vrrp_instance VI_1 {
    state MASTER           #指定设立初始状态,实际的master 和 backup 时选举决定的
    interface eth0         #指定承载VIP地址的物理接口
    virtual_router_id 51   #设置vrid 标记,多个集群不可以重复(1..255),同集群主备必须保持一致,否则会发生脑裂现象
    priority 100           #设置优先级。优先级最高的成为master
    nopreempt              #设置为不抢占
    advert_int 1           #设置检测的时间间隔,默认1s
    authentication {       #定义认证信息,每个热备组保持一致
        auth_type PASS     #认证方式,支持PASS和AH,官方建议使用PASS
        auth_pass 1111     #认证的密码,主备服务器保持一致
    }    
    
     virtual_ipaddress {    #定义集群vip 地址
          192.168.200.100
   
     }
}

1 “weight”值为正数时

在vrrp_script中指定的脚本如果检测成功,那么Master节点的权值将是“weight值与”priority“值之和,如果脚本检测失败,那么Master节点的权值保持为“priority”值,因此切换策略为:

Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。

Master节点“vrrp_script”脚本检测成功时,如果Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。

2 “weight”值为负数时

在“vrrp_script”中指定的脚本如果检测成功,那么Master节点的权值仍为“priority”值,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差,因此切换策略为:

Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。

Master节点“vrrp_script”脚本检测成功时,如果Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。


2.3 LVS 配置介绍

#LVS 配置,这里的配置是用来管理lvs的,实现keepalived 和 lvs 的结合的模块。ipvsadm 命令的功能,这里都可以实现

virtual_server 192.168.200.100 443 {   #vip 地址,和vrrp_insttance 模块中的virtual_ipaddress地址一致
    delay_loop 6   #健康检查时间间隔
    lb_algo rr     #lv 调度算法(wrr|rr | lc |wlc | sh | dh | )
    lb_kind NAT    #指定集群工作模式  ( NAT | DR | RUN
    persistence_timeout 50   #连接保持时间(秒)
    protocol TCP         #应用服务采用协议TCP

    real_server 192.168.201.100 443 {
        weight 1   #设置为1,0失效
        inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除 
        TCP_CHECK {        #常用,TCP检查, 配置项还有HTTP_GET | SSL_GET ,SMTP_CHECK MISC_CHECK
            connect_port 80    #TCP 检查的端口
            connect_timeout 3  #连接超时时间
            nb_get_retry 3      #连接重试次数
            delay_before_retry 3   #重试的间隔时间
        }
     }
}


三:部署 keepalived + LVS 的高可用集群

keepalived + LVS 集群

主DR服务器: 192.168.23.103

备用DR 服务器: 192.168.23.104

节点服务器: 192.168.23.12 ; 192.168.23.13

vip :192.168.23.100

共享存储服务器:192.168.23.11

3.1 部署负载调度器

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

 yum -y install ipvsadm keepalived
 modprobe  ip_vs
 cat /proc/net/ip_vs


3.1.1 配置keepalived

修改 global_defs 部分

cd /etc/keepalived/
cp keepalived.conf{,.bak}
vim keepalived.conf 
global_defs {
   ......
  smtp_server 127.0.0.1        #第10行 修改邮件服务指向本地
  router_id LVS_01             #第 12 行,修改服务器(路由器)名称,主备服务器名称不可以相同
  # vrrp_skip_check_adv_addr    #第13 到 第16 行注释。
  # vrrp_strict
  # vrrp_garp_interval 0
  # vrrp_gna_interval 0

}

image-20210821194109896


修改 vrrp_instance 部分

vrrp_instance VI_1 {
 20     state MASTER         # 修改主服务器为MASTER,备服务器为BACKUP
 ----- 第20 行 stat 设置, 备用服务器设置为BACKUP --------‘
 
 21     interface ens33      #修改承载vip 的网卡为 ens33
 22     virtual_router_id 10   #修改ID 号,主备必须一致
 23     nopreempt              #添加设置为非抢占模式,防止脑裂,主备都要设置
                               #如果要设置为非抢占模式,主备的state都必须设置为BACKUP
 24     priority 100           #设置优先级,优先级高的为主
 ------ 第 24 行,priority 设置,备用设置优先级为 90 ---------
 
 25     advert_int 1
 26     authentication {
 27         auth_type PASS
 28         auth_pass abc123     #修改密码为abc123,主备要相同
 29     }
 30     virtual_ipaddress {
 31         192.168.23.100      #指定集群vip 地址
 32     }
}

image-20210821194937058


virtual_server 部分设置

virtual_server 192.168.23.100 80 {   #指定虚拟服务器地址和端口
    delay_loop 6
    lb_algo rr                #使用轮询rr 调度算法
    lb_kind DR                #集群工作模式为DR
    #persistence_timeout 50     #长连接保持,实验时候需要注释,否则会在一段时间内连续访问同一台后端服务器
    protocol TCP

    real_server 192.168.23.12 80 {     #添加第一个web 服务器的地址端口
        weight 1                    #权重设置为1
        TCP_CHECK {                #删除原来的SSL_GET所有设置吗,使用TCP_CHECK
            connect_port 80        #健康检查,检查80端口
            connect_timeout 3      #连接超时时间 3 秒
            nb_get_retry 3          #重试次数3
            delay_before_retry 3   #重试间隔时间 3 秒
            }
    }

     
     real_server 192.168.23.13 80 {    #添加第二个web 服务器的地址和端口
         weight 1
         TCP_CHECK {
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
             }
     }       
 }   

#删除后面所有的多余配置

image-20210822001931378


重启服务,查看网卡

systemctl restart keepalived
#吐槽,有时候keepalived 配置不对,比如说少个大括号,启动也不报错。

ip addr    #注意,必须使用 ip addr  的命令,使用 ifconfig 查看不到 ens33 上面的虚拟ip

image-20210821214721896

image-20210821214823018


#主服务器 192.168.23.103 停止 keepalived 服务,然后再分别查看网卡
systemctl stop keepalived


ip  addr 

image-20210821215028446

image-20210821215126710


3.1.2 启动 ipvsadm 服务

ipvsadm-save  > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm  -ln
#查看有没有分发策略,如果没有则重启keepalived
#systemctl restart keepalived
#ipvsadm  -l

image-20210821225657229


3.1.3 关闭调度器proc 响应参数

vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

sysctl -p  #加载参数

image-20210821230011962


3.2 配置NFS 共享存储

systemctl stop firewalld 
systemctl disable  firewalld 
setenforce  0
yum -y install rpcbind nfs-utils

 mkdir /opt/{mynet,benet}
  echo "this is mynet web" > /opt/mynet/index.html
 echo "this is benet web" > /opt/benet/index.html
 chmod  777 /opt/{mynet,benet}


vim /etc/exports
/opt/mynet  192.168.23.0/24(ro,sync)
/opt/benet  192.168.23.0/24(ro,sync)


systemctl start rpcbind
systemctl start nfs
exportfs -rv

image-20210821223336795


3.3 配置节点服务器

systemctl stop firewalld
systemctl disable  firewalld
setenforce  0
yum -y install httpd
 yum -y install rpcbind nfs-utils
 systemctl start rpcbind


-------- 192.168.23.12------
mount.nfs 192.168.23.11:/opt/mynet  /var/www/html

---------------------------------------------------’

------- 192.168.23.13 ------------------
mount.nfs 192.168.23.11:/opt/benet  /var/www/html

-----------------------------------------------
df -h


vim /etc/sysconfig/network-scripts//ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.23.100
NETMASK=255.255.255.255

systemctl restart network

route add -host 192.168.23.100 dev lo:0

vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

sysctl -p 

3.4 访问测试

#再客户端访问 测试
curl  http://192.168.23.100 

image-20210822005531216


#在调度器上 使用ipvsadm -ln 命令查看
ipvsadm -ln

image-20210822005453550


posted @ 2021-08-22 21:26  知己一语  阅读(234)  评论(0编辑  收藏  举报