LVS + Keepalived 高可用群集

一、准备环境

主keepalived:172.168.1.11     lvs
备keepalived:172.168.1.12     lvs
web1:172.168.1.13
web2:172.168.1.14    
vip:172.168.1.100
客户机访问
关闭防火墙 

二、配置 主keepalived 服务器

1. 安装 ipvsadm 和 keepalived

[root@localhost ~]# yum install ipvsadm.x86_64 keepalived.x86_64 -y

2. 修改 keepalived 的配置

[root@localhost ~]# cd /etc/keepalived
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# ls
keepalived.conf  keepalived.conf.bak
[root@localhost keepalived]# 

[root@localhost keepalived]# vim keepalived.conf
global_defs {
   router_id HA_TEST_R2                  ####本路由器的服务器名称 HA_TEST_R2
}
vrrp_instance VI_1 {                     ####定义VRRP热备实列
   state BACKUP                          ####热备状态,backup表示辅服务器
   interface ens33                       ####表示承载VIP地址的物理接口
   virtual_router_id 1                   ####虚拟路由器的ID号,每个热备组保持一致
   priority 99                           ####优先级,优先级越大优先级越高
   advert_int 1                          ####通告间隔秒数(心跳频率)
   authentication {                      ####认证信息,每个热备组保持一致
      auth_type PASS                     ####认证类型
      auth_pass 123456                   ####认证密码
   }
   virtual_ipaddress {                   ####漂移地址(VIP),可以是多个
      192.168.100.10
   }
}

#需要修改项
10    smtp_server 127.0.0.1    #修改邮箱指向自己(10行)
12    router_id LVS_01    #指定服务器名称主备需要不一样(12行)
14    #vrrp_strict    #14行需要注释否则服务启动有问题
20    state MASTER    #指定服务器类型MASTER为主 BACKUP为备(20行)
21    interface ens33    #修改网卡名称为ens33(21)
27    auth_pass 123    #修改验证密码,主备需要一样(27行)
30    172.168.1.100    #指定群集vip地址

virtual_server 172.168.1.100 80 {
 35     delay_loop 6    #健康间隔时间6秒
 36     lb_algo rr    #调度算法轮询
 37     lb_kind DR    #lvs模式为DR 
 38     persistence_timeout 0    #连接保持时间改为0 否则 无法体现效果
 39     protocol TCP    #采用协议
 40 
 41     real_server 172.168.1.13 80 {
 42         weight 1    #节点权重
 43             TCP_CHECK {
 44             connect_port 80    #检查目标端口
 45             connect_timeout 3    #连接超时
 46             nb_get_retry 3    #重试次数
 47             delay_before_retry 3    #重试间隔时间
 48         }
 49     }
 50 
 51     real_server 172.168.1.14 80 {
 52         weight 1
 53             TCP_CHECK {
 54             connect_port 80
 55             connect_timeout 3
 56             nb_get_retry 3
 57             delay_before_retry 3
 58         }
 59     }
 60 
 61 }

3. 开启ipvsadm

[root@localhost keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost keepalived]# systemctl start ipvsadm

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

三、配置 从keepalived 服务器

1. 安装 ipvsadm 和 keepalived

[root@localhost ~]# yum install ipvsadm.x86_64 keepalived.x86_64 -y

2. 修改 keepalived 的配置

vim keepalived.conf

12    router_id LVS_02
20     state BACKUP
23     priority 80

 3. 开启ipvsadm

[root@localhost keepalived]# systemctl start keepalived.service 
[root@localhost keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost keepalived]# 
[root@localhost keepalived]# systemctl start ipvsadm
[root@localhost keepalived]# 
[root@localhost keepalived]# ipvsadm -ln

四、配置 web1 服务器

1. 安装httpd并开启

[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl start httpd

2. 修改主站点目录

[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo 7-3 > index.html
[root@localhost html]# systemctl restart httpd

3. 做虚拟网卡

[root@localhost html]# ifconfig lo:0 172.168.1.100/32
[root@localhost html]# 
[root@localhost html]# ip a

4. 添加ARP规则

[root@localhost html]# vim /etc/sysctl.conf 
[root@localhost html]# sysctl -p

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

5. 关闭长连接

五、配置 web2 服务器

1. 安装httpd并开启

[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl start httpd

 2. 修改主站点目录

[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo 7-4 > index.html
[root@localhost html]# systemctl restart httpd

3. 做虚拟网卡

[root@localhost html]# ifconfig lo:0 172.168.1.100/32
[root@localhost html]# 
[root@localhost html]# ip a

4. 添加ARP规则

[root@localhost html]#vim /etc/sysctl.conf 
[root@localhost html]#sysctl -p

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

5. 关闭长连接

六、客户机访问测试

关闭DR主调度器 Keepalive服务,测试备调度器是否顶替 

可以正常访问

重新开启DR主调度服务,测试主调度是否抢占VIP

七、脑裂

什么是脑裂?

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,
就分裂成为2个独立的个体。
由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享
资源”、争起“应用服务”,就会发生严重后果。共享资源被瓜分、两边“服务”都起不来了;或者两边
“服务”都起来了,但同时读写“共享存储”,导致数据损坏

都有哪些原因导致脑裂?

高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
因心跳线间连接的设备故障(网卡及交换机)
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
多组keepalive服务器造成   组播冲突    1.换组播地址   2.改成单播          
默认: 
单播:
组播: 
广播:
A   1 -127
B   128-191
C   192-223
D   224-239          224.0.0.1

如何解决keepalived脑裂问题?

在实际生产环境中,我们从以下方面防止脑裂:
#同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
#当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源

rsyslog   分割日志

#做好对脑裂的监控报警解决常见方案:
如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
开发检测程序通过监控软件检测脑裂

八、实现其它应用的高可用性 VRRP Script

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

参考配置文件:

/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck

1. VRRP Script 配置

分两步实现:

  • 定义脚本

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点

vrrp_script <SCRIPT_NAME> {
 script <STRING>|<QUOTED-STRING>   #此脚本返回值为非0时,会触发下面OPTIONS执行
 OPTIONS 
}
  • 调用脚本

track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script

track_script {
 SCRIPT_NAME_1
 SCRIPT_NAME_2
}

2. 定义 VRRP script

vrrp_script <SCRIPT_NAME> { 				#定义一个检测脚本,在global_defs 之外配置
     script <STRING>|<QUOTED-STRING> 		#shell命令或脚本路径(注意执行权限)
     interval <INTEGER> 					#间隔时间,单位为秒,默认1秒
     timeout <INTEGER> 						#超时时间
     weight  <INTEGER:-254..254> 			#默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
     fall <INTEGER>       					#执行脚本连续几次都失败,则转换为失败,建议设为2以上
     rise <INTEGER>       					#执行脚本连续几次都成功,把服务器从失败标记为成功
     user USERNAME [GROUPNAME] 				#执行监测脚本的用户或组      
     init_fail         						#设置默认标记为失败状态,监测成功之后再转换为成功状态
}

实际操作:

[root@localhost keepalived]#vim /etc/keepalived/ng.sh 
#编写脚本
#!/bin/bash
ng=$(ps -elf |grep nginx |egrep -cv "grep|$$")

if [ $ng -eq 0 ]
then
systemctl stop keealived
fi
[root@localhost keepalived]#chmod +x /etc/keepalived/ng.sh
#权限  

[root@localhost keepalived]#vim /etc/keepalived/keepalived.conf
# 全局配置下配置     
#脚本不要忘记加执行权限
vrrp_script check_down {
        script  "/etc/keepalived/ng.sh"   
        interval 1
        weight -30
        fall  3
        rise 2
        timeout 2
}


vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.168.1.100
    }
    track_script {
     check_down
 }
}


反向代理模块

upstream  反向代理模块 在  http模块下
upstream w1 {
#定义反向代理 组名  w1    
        server 172.168.91.12:80;
        #第一台代理服务器 
        server 172.168.91.13:80;
        #第二台代理服务器
        }
        
        
server  模块下        
        location / {
        proxy_pass http://w1;
        #调用  upstream  模块
 }
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值