目录
一、Keepalive基础
1.1 vrrp技术
1.2 VRRP相关技术
1.3.VRRP工作过程
1.4.Keeplived、VRRP及其工作原理
1.5.Keepalived体系主要模块及其作用
1.6.配置LVS+Keepalived高可用群集
配置NFS服务器192.168.52.110
192.168.52.120web1服务器
192.168.52.130web2服务器
配置主负载调度器192.168.52.140
配置备负载调度器192.168.52.100
一、Keepalive基础
1.1 vrrp技术
VRRP 相关术语
-  虚拟路由器:Virtual Router 不是真实存在 ,虚构出来的 
-  虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器 
-  VIP:Virtual IP 192.168.91.100 路由1 路由2 
-  VMAC:Virutal MAC (00-00-5e-00-01-VRID) 
-  物理路由器: 
-  master:主设备 
-  backup:备用设备 
-  priority:优先级 
1.2 VRRP相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式,延迟抢占模式,
安全认证:
-  无认证 
-  简单字符认证:预共享密钥 
-  MD5 
工作模式:
-  主/备:单虚拟路径器 
-  主/主:主/备(虚拟路由器1),备/主(虚拟路由器2) 
#通告:
 是宣告自己的主权,不要妄想抢班夺权,不停的向外
#抢占式:
 主服务器宕机,过了一段时间修好了,再把主权抢过来
#非抢占式:
 主服务器宕机,过了一段时间修好了,原来的主就作为备了
#延迟抢占:
 主修好后,等待一定的时间(300s)后再次成为主
#抢占式好还是非抢占式好?
#安全认证:
 如没有安全认证,不在集群中的keeplive服务器设置超高的优先级,会造成事故
#主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)见下图:
 环境:
 有两台服务器
 虚拟出两台虚拟路由器
 第一台虚拟路由器中服务器1为主,服务器2为备,那么虚拟IP1就飘在服务器1上,真正工作的只有服务器1
 第二台虚拟路由器中服务器2为主,服务器1为备,那么虚拟IP2就飘在服务器2上,真正工作的只有服务器2
 优点:
 #提高了资源利用率:
 这样主,备服务器同时干活,可以同时运行两个项目
 #同样有备份功能:
 如果服务器1坏了,服务器2 将同时拥有虚拟IP1和虚拟IP2
 缺点:
 虽然有备份冗余功能但是对机器的性能要求非常高,当其中一台出现故障,本来一台运行一个任务,现在所有的业务全部压在了一台上,有十分大的风险
1.3.VRRP工作过程
选举Master,比较优先级,高的为Master,若优先级相同无Master时,比较接口IP地址,大的为Master,Master设备发送ARP报文,承担报文转发工作;
状态维持,Master设备周期发送通告报文,公布配置信息和工作状态;
Backup设备根据收到的通告报文判断Master设备是否工作正常,如果Master设备主动放弃Master地位时,会发送优先级为0的通告报文,Backup设备收到后会快速切换成Master设备或者定时器超时后Backup设备认为Master设备无法正常工作,会切换状态为Master。
1.4.Keeplived、VRRP及其工作原理
Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP。主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
1.5.Keepalived体系主要模块及其作用
keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
 vrrp模块:是来实现VRRP协议的。
 check模块:负责健康检查,常见的方式有端口检查及URL检查。
1.6.配置LVS+Keepalived高可用群集
主DR调度服务器  192.168.52.140
 备DR调度服务器  192.168.52.100
 NFS服务器      192.168.52.110
 web1服务器     192.168.52.120
 web2服务器     192.168.52.130
 VIP           192.168.52.188
 客户端         192.168.52.102
配置NFS服务器192.168.52.110
#关闭防火墙
 systemctl stop firewalld.service 
 setenforce 0
 #安装nfs服务
 yum install nfs-utils rpcbind -y
 cd /opt/
 #创建共享目录
 mkdir nfs
 cd nfs/
 mkdir my qyd
 echo "this is my" >my/index.html
 echo "this is qyd" >qyd/index.html
 #添加权限
 chmod 777 *
 #共享策略
 vim /etc/exports
 -------------------------------------------
 /opt/nfs/my 192.168.52.0/24(rw,sync,no_root_squash)
 /opt/nfs/qyd 192.168.52.0/24(rw,sync,no_root_squash)
 #开启服务发布共享
 systemctl start rpcbind
 systemctl start nfs
 systemctl enable nfs
 #查看共享策略
 showmount -e
192.168.52.120web1服务器
#关闭防火墙
 systemctl stop firewalld.service 
 setenforce 0
 #查看NFS服务器共享策略
 showmount -e 192.168.52.110
 #安装apache服务
 yum install httpd -y
 #挂载共享目录
 mount 192.168.52.110:/opt/nfs/my /var/www/html/
 df -h
 cd /var/www/html/
 cat index.html
 #重启服务
 systemctl restart httpd.service 
 输入网址测试
  
 #配置网关
 cd /etc/sysconfig/network-scripts/
 cp ifcfg-lo ifcfg-lo:0
 vim ifcfg-lo:0
 -------------------------------------------------------------
 DEVICE=lo:0
 IPADDR=192.168.52.188
 NETMASK=255.255.255.255
 # If you're having problems with gated making 127.0.0.0/8 a martian,
 # you can change this to something else (255.255.255.255, for example)
 ---------------------------------------------------------------------------
 #重启网卡
 systemctl restart network
 ifconfig
 #设置路由
 route add -host 192.168.52.188 dev lo:0
 route -n
 #将设置路由命令添加到开机执行配置文件内相当于开机自启并给配置文件添加执行权限
 vim /etc/rc.d/rc.local 
 -----------------------------------------------
 #!/bin/bash
 # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
 #
 # It is highly advisable to create own systemd services or udev rules
 # to run scripts during boot instead of using this file.
 #
 /usr/sbin/route add -host 192.168.52.188 dev lo:0
 ---------------------------------------------------
 chmod +x /etc/rc.d/rc.local
 #调整 proc 响应参数
 #添加系统只响应目的IP为本地IP的ARP请求
 #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
 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
 #开启web服务
 systemctl restart httpd
192.168.52.130web2服务器
#关闭防火墙
 systemctl stop firewalld.service 
 setenforce 0
 #查看NFS服务器共享策略
 showmount -e 192.168.52.110
 #安装apache服务
 yum install httpd -y
 #挂载共享目录
 mount 192.168.52.110:/opt/nfs/qyd /var/www/html/
 df -h
 cd /var/www/html/
 cat index.html
 #重启服务
 systemctl restart httpd.service 
 输入网址测试
  
 #配置网关
 #此地址仅用作发送We响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。
 #因此使用虚接口lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱。
 cd /etc/sysconfig/network-scripts/
 cp ifcfg-lo ifcfg-lo:0
 vim ifcfg-lo:0
 -------------------------------------------------------------
 DEVICE=lo:0
 IPADDR=192.168.52.188
 NETMASK=255.255.255.255 #必须全为1
 # If you're having problems with gated making 127.0.0.0/8 a martian,
 # you can change this to something else (255.255.255.255, for example)
 ---------------------------------------------------------------------------
 重启网卡
 
 systemctl restart network
 ifconfig
 #设置路由
 route add -host 192.168.52.188 dev lo:0
 route -n
 #将设置路由命令添加到开机执行配置文件内相当于开机自启并给配置文件添加执行权限
 vim /etc/rc.d/rc.local 
 -----------------------------------------------
 #!/bin/bash
 # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
 #
 # It is highly advisable to create own systemd services or udev rules
 # to run scripts during boot instead of using this file.
 #
 /usr/sbin/route add -host 192.168.52.188 dev lo:0
 ---------------------------------------------------
 chmod +x /etc/rc.d/rc.local
 #调整 proc 响应参数
 #添加系统只响应目的IP为本地IP的ARP请求
 #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
 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
 #开启web服务
 systemctl restart httpd
配置主负载调度器192.168.52.140
#关闭防火墙
 systemctl stop firewalld
 setenforce 0
  
 #安装keepalived和ipvsadm
 yum install -y ipvsadm keepalived
  
 #开启ip_vs并查看服务是否开启
 modprobe ip_vs
 cat /proc/net/ip_vs
 #配置keepalived 
 rpm -qc keepalived          #查看配置文件位置
 cd /etc/keepalived/         #切换到配置文件目录
 cp keepalived.conf{,.bak}   #备份原先的配置文件
 vim keepalived.conf         #修改配置文件
 --------------------------------------------------
 global_defs {   ##定义全局参数
    notification_email {
      acassen@firewall.loc
      failover@firewall.loc
      sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 127.0.0.1    #第10行修改,邮件服务指向本地
    smtp_connect_timeout 30
    router_id LVS_01         #第12行指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
                 
 #删除剩余行
 }
  
 vrrp_instance VI_1 {     #定义VRRP热备实例参数
     state MASTER         #第20行指定热备状态,主为MASTER,备为BACKUP
     interface ens33      #第21行修改,指定承载vip地址的物理接口
     virtual_router_id 51 #修改,指定虚拟路由器的ID号,每个热备组保持一致
     #nopreempt           #如果设置非抢占模式,两个节点state必须为bakcup,并加上配置 nopreempt
     priority 100         #23行修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
     advert_int 1         #通告间隔秒数(心跳频率)
     authentication {         #定义认证信息,每个热备组保持一致
         auth_type PASS      #认证类型
         auth_pass 123123    #第27行修改,指定验证密码,主备服务器保持一致
     }
     virtual_ipaddress {      #指定群集vip地址
         192.168.52.188
     }
 }
 #修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
 virtual_server 192.168.52.188 80 {
     delay_loop 6                      #健康检查的间隔时间(秒)
     lb_algo rr                        #指定调度算法,轮询(rr)
     lb_kind DR                        #第39行修改,指定群集工作模式,直接路由(DR)
     persistence_timeout 0             #连接保持时间(秒)
     protocol TCP                      #应用服务采用的是 TCP协议
 real_server 192.168.52.120 80 {       #43行修改,指定第一个Web节点的地址、端口
 weight 1                              #节点的权重
 #45行删除,添加以下健康检查方式                       
           TCP_CHECK {
               connect_port 80         #添加检查的目标端口
               connect_timeout 3       #添加连接超时(秒)
               nb_get_retry 3          #添加重试次数
               delay_before_retry 3    #添加重试间隔
           }
       }
  
       real_server 192.168.52.130 80 {     #添加第二个 Web节点的地址、端口
           weight 1
           TCP_CHECK {
               connect_port 80
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
           }
       }
 ##删除后面多余的配置#
  }
 ----------------------------------------------------------
 systemctl start keepalived.service   #重新启动服务
 ip addr      #查看虚拟网卡vip
   
 #启动 ipvsadm 服务
 ipvsadm-save > /etc/sysconfig/ipvsadm
 systemctl start ipvsadm
 ipvsadm -ln
 #如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalived
 #调整 proc 响应参数,关闭Linux 内核的重定向参数响应
 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 #加载参数
 scp keepalived.conf 192.168.52.100:`pwd`  #远程传输文件到备负载调度器
配置备负载调度器192.168.52.100
#关闭防火墙
 systemctl stop firewalld
 setenforce 0
  
 #安装keepalived和ipvsadm
 yum install -y ipvsadm keepalived
  
 #开启ip_vs并查看服务是否开启
 modprobe ip_vs
 cat /proc/net/ip_vs
 #配置keepalived 
 rpm -qc keepalived          #查看配置文件位置
 cd /etc/keepalived/         #切换到配置文件目录
 cp keepalived.conf{,.bak}   #备份原先的配置文件
 vim keepalived.conf         #修改配置文件
 --------------------------------------------------
 global_defs {   ##定义全局参数
    notification_email {
      acassen@firewall.loc
      failover@firewall.loc
      sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 127.0.0.1    #第10行修改,邮件服务指向本地
    smtp_connect_timeout 30
    router_id LVS_02         #第12行指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
                 
 #删除剩余行
 }
  
 vrrp_instance VI_1 {     #定义VRRP热备实例参数
     state BACKUP         #第20行指定热备状态,主为MASTER,备为BACKUP
     interface ens33      #第21行修改,指定承载vip地址的物理接口
     virtual_router_id 51 #修改,指定虚拟路由器的ID号,每个热备组保持一致
     #nopreempt           #如果设置非抢占模式,两个节点state必须为bakcup,并加上配置 nopreempt
     priority 90         #23行修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
     advert_int 1         #通告间隔秒数(心跳频率)
     authentication {         #定义认证信息,每个热备组保持一致
         auth_type PASS      #认证类型
         auth_pass 123123    #第27行修改,指定验证密码,主备服务器保持一致
     }
     virtual_ipaddress {      #指定群集vip地址
         192.168.52.188
     }
 }
 #修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
 virtual_server 192.168.52.188 80 {
     delay_loop 6                      #健康检查的间隔时间(秒)
     lb_algo rr                        #指定调度算法,轮询(rr)
     lb_kind DR                        #第39行修改,指定群集工作模式,直接路由(DR)
     persistence_timeout 0             #连接保持时间(秒)
     protocol TCP                      #应用服务采用的是 TCP协议
 real_server 192.168.52.120 80 {       #43行修改,指定第一个Web节点的地址、端口
 weight 1                              #节点的权重
 #45行删除,添加以下健康检查方式                       
           TCP_CHECK {
               connect_port 80         #添加检查的目标端口
               connect_timeout 3       #添加连接超时(秒)
               nb_get_retry 3          #添加重试次数
               delay_before_retry 3    #添加重试间隔
           }
       }
  
       real_server 192.168.52.130 80 {     #添加第二个 Web节点的地址、端口
           weight 1
           TCP_CHECK {
               connect_port 80
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
           }
       }
 ##删除后面多余的配置#
  }
 ----------------------------------------------------------
 systemctl start keepalived.service   #重新启动服务
 ip addr      #查看虚拟网卡vip
   
 #启动 ipvsadm 服务
 ipvsadm-save > /etc/sysconfig/ipvsadm
 systemctl start ipvsadm
 ipvsadm -ln
 #如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalived
 #调整 proc 响应参数,关闭Linux 内核的重定向参数响应
 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 #加载参数
 scp keepalived.conf 192.168.52.100:`pwd`  #远程传输文件到备负载调度器