前言
Keepalived 是一个基于 VRRP 协议来实现的 LVS 服务高可用方案,可以解决静态路由出现的单点故障问题。
原理
在一个 LVS 服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但
是对外表现为一个虚拟 IP,主服务器会发送 VRRP 通告信息给备份服务器,当备份服务器收不到 VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性。解决单点故障问题
一、实验拓扑
准备4台主机确保互相通信
二、配置web节点
1、在web节点上安装配置nginx服务
1. yum -y install epel-release.noarch 2. yum -y install nginx
2、配置nfs服务
在192.168.115.128上我们创建一个共享目录mkdir /opt/put
##创建共享目录 mkdir /opt/pub ##设置 vim /etc/exports ##插入 /opt/pub 192.168.115.0/24(rw,sync,no_root_squash) ##使它生效 exportfs -arv ##启动nfs并查看 systemctl start nfs showmount -e
3、将共享目录挂载到两台web节点的/usr/share/nginx/html目录下
[root@localhost yum.repos.d]# systemctl start nfs [root@localhost yum.repos.d]# showmount -e 192.168.115.128 Export list for 192.168.115.128: /opt/pub 192.168.115.0/24 [root@localhost yum.repos.d]# mount 192.168.115.128:/opt/pub /usr/share/nginx/html/
4、启动2个nginx并访问
systemctl start nginx
在任意一台web节点书写网页测试内容
echo hello > /usr/share/nginx/html/index.html
5、访问测试
三、配置双机热备
1、在web节点按照要求配置主备,首先先安装keepalived
yum -y install keepalived
2、keepalived文件配置解析
安装yum install -y keepalived 配置文件/etc/keepalived/keepalived.conf 配置项 router_id 1 定义节点id state MASTER|BACKUP 定义节点主从状态 interface ens33 配置监听的网卡 virtual_router_id 51 同一个热备组要保持一致 priority 100 节点优先级 advert_int 1 多少秒进行一次心跳检测 authentication { auth_type PASS auth_pass 1111 } keepalived节点的认证方式,同一个keepalived双机热备组一定要保持一致 virtual_ipaddress 配置VIP,即漂移地址 ####vrrp vrrp_script chk_nginx_server { script "/etc/keepalived/chk_nginx.sh " interval 1 weight -2 } vrrp_instance VI_1 { #虚拟路由器名称,在一个keepalived可以启多个虚拟路由器,每个虚拟路由器的名字都不一样 state MASTER #当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP,一般都是配置backup,该值无法决定身份,最终还是通过比较priority interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:ens32,eth0,bond0,br0 virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,同一组虚拟路由器的vrid必须一致 priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepalived主机节点此值不同 advert_int 1 #vrrp通告的时间间隔,默认1s nopreempt #当master宕机恢复之后不抢占master authentication { #认证机制 auth_type PASS #AH(不推荐)或PASS auth_pass 1111 #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样 } virtual_ipaddress { #虚拟IP 10.0.0.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认为/32 10.0.0.101/24 dev eth1 #指定VIP的网卡 10.0.0.102/24 dev eth2 label eth2:1 #指定VIP的网卡label } track_script { chk_nginx_server } }
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地址。 smtp_connect_timeout 30 ##连接smtp服务器的超时时间 router_id LVS_DEVEL #标识这台机器ID,默认情况下是主机名,可以配置成主机名 vrrp_skip_check_adv_addr #所有报文都检查比较消耗性能,此配置为如果收到的报文和上一个报文是同一个路由器则跳过检查报文中的源地址 vrrp_strict #严格遵守VRRP协议,不允许状况:1,没有VIP地址,2.配置了单播邻居,3.在VRRP版本2中有IPv6地址 vrrp_garp_interval 0 #ARP报文发送延迟 vrrp_gna_interval 0 #消息发送延迟 #vrrp_mcast_group4 224.0.0.18 #指定组播IP地址,默认值:224.0.0.18 范围:224.0.0.0到239.255.255.255 #vrrp_iptables #避免生成iptables input链 规则,sip any 拒绝 dip any }
功能模块:
core
主进程启动
vrrp
vrrp协议:热备份路由协议
check
健康状态检测
3、下面开是配置
先配置主节点192.168.115.131
#####打开keepalived的配置文件 #####在主上这样配置 global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } router_id NGINX1 ###组名 } vrrp_instance VI_1 { state MASTER ###身份 interface ens33 virtual_router_id 51 ###ID必须一致 priority 100 ###优先级越大越优先 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { ####虚拟地址,可用来访问,设多个是为了防止ip被占用 192.168.115.100 192.168.115.101 192.168.115.102 } }
配置从节点192.168.115.134
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } router_id NGINX2 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.115.100 192.168.115.101 192.168.115.102 } }
4、启动web节点的keepalived并查看ip
systemctl start keepalived
四、测试
1、三个虚拟ip都可以访问
2、宕掉web主节点,模拟故障
把主节点关机,此时我问继续访问我们的网站结果如下
查看备用web节点的IP,发现IP漂移过来了,双机热备生效了
3、此时我们的web主节点修好了并上线了,让我们看看IP发生了什么变化
主:上线后IP漂移回到了主
备:ip恢复了原样
总结
补充一下:
1、双机热备的脑裂现象的原因: Keepalived配置里同一 VRRP实例
如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
vrrp实例名字不一致、优先级一致
防火墙打开,导致心跳无法正常通信
网卡故障
网卡进行多路复用
2、VIP无法通信
注释:vrrp_strict