Keepalived服务器

Keepalived高可用与裂脑解析

Keepalived介绍

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。   

Keepalived高可用原理

搭建主、备服务器一样的配置,在Keepalived中配置相同的VIP;主服务器发送“心跳消息”给备服务器,那么备服务器的VIP配置就不生效,一旦主服务器宕机,“心跳消息”停止发送,备份服务器会让VIP生效,产生“IP漂移”,备服务器就会变成主服务器;

  • 注意不能同时有两个主服务器;

  • 抢占模式(默认模式):主服务器优先级高于备份服务器,主服务器恢复后会重新“抢回”VIP;

  • 非抢占模式:(加上nopreempt参数才能开启):主服务器恢复后成为新的备份服务器,只有当原备份服务器宕机时,才会发生IP漂移;

keepalived通过vrrp协议实现高可用架构,vrrp是路由灾备的实现基础。

Keepalived三大功能

  • 高可用:VIP漂移,基于VRRP协议

  • 健康检测:通过执行检测脚本或网络请求等方式检测服务是否正常;

  • 负载均衡:内置LVS管理器,通过Keepalived配置LVS负载均衡功能;

Keepalived是基于VRRP协议来实现高可用的:

VRRP协议(Virtual Router Redundancy Protocol虚拟路由冗余协议)是一种解决局域网网关单点故障的标准化协议(IETF标准,RFC5798)。

其核心作用是:将多台物理路由器“虚拟”成一个统一的“虚拟路由器”,让终端设备(如PC、服务器)仅需配置该虚拟路由器的IP作为网关,即可实现网关的“无缝冗余”——即使其中一台物理路由器故障,网络也能自动切换到备用路由器,避免断网。

Keepalived高可用实验:

## 两个服务器的准备工作
# 首先先给主从设置默认页面的内容
yum install httpd -y
echo "<h1>这是192.168.221.30!!</h1>" > /var/www/html/index.html
systemctl start httpd
# 然后安装Keepalived
# CentOS7
yum install -y keepalived
# Ubuntu
apt install -y keepalived
​
## 以下是可以省略的步骤(省略)
# 查看keepalived版本
keepalived -v
会出现Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
# 启动keepalived
systemctl start keepalived.service
或者
service keepalived start
# 重启:
systemctl restart keepalived
# 停止:
systemctl stop keepalived
# 状态:
systemctl status keepalived
# 开机重启:
systemctl enable keepalived
# 查看keepalived状态
systemctl status keepalived
# 查看keepalived进程
ps -ef | grep keepalived
# 查看ip列表
ip add show

主节点(192.168.221.30)

vim /etc/keepalived/keepalived.conf
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! Configuration File for keepalived
​
global_defs {
  router_id server~30 # 标识本节点的字符串,设置为hostname即可
}
​
vrrp_instance VI_1 {
   state MASTER    # 标识主节点服务(只有MASTER和BACKUP两种,大写)
   interface ens33      # VIP板顶的网卡接口
   virtual_router_id 51  # 虚拟路由id,和备节点保持一致
   priority 100        # 优先级,高于备节点的即可。
   # nopreempt         # 禁止MASTER宕机恢复后抢占服务
   # smtp_alert        # 激活故障时发送邮件告警
   mcast_src_ip 192.168.221.30   # 本机IP地址
   advert_int 1    # MASTER和BACKUP节点之间的同步检查时间间隔,单位为秒
   authentication {    # 验证类型和验证密码
       auth_type PASS  # PAAS(默认),HA
       auth_pass 1234  # MASTER和BACKUP使用相同明文才可以互通
   }
   virtual_ipaddress { # 虚拟IP地址池,可以多个IP
       192.168.221.100 # 虚拟IP1(VIP)
   }
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

从节点(192.168.221.40)

vim /etc/keepalived/keepalived.conf
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! Configuration File for keepalived
​
global_defs {
  router_id server~40 # 标识本节点的字符串,设置为hostname即可
}
​
vrrp_instance VI_1 {
   state BACKUP    # 标识主节点服务(只有MASTER和BACKUP两种,大写)
   interface ens33
   virtual_router_id 51
   priority 99    # 优先级,低于主节点的即可。
   mcast_src_ip 192.168.221.40   # 本机IP地址
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1234
   }
   virtual_ipaddress {
       192.168.221.100
   }
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

最后用浏览器访问192.168.221.100即可出现主服务器的页面
主服务器宕机后,从服务器的ip a 会多一个192.168.221.100/32,然后再从浏览器就可以访问到从服务器的页面了。

配置文件说明

[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {                   #全局配置
   notification_email {        #指定keepalived在发生切换时需要发送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         #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {        #虚拟路由的标识符
   state MASTER            #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
   interface eth0          #通信所使用的网络接口
  virtual_router_id 51  #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
  priority 100          #此节点的优先级,主节点的优先级需要比其他节点高
  advert_int 1          #通告的间隔时间
  authentication {      #认证配置
               auth_type PASS      #认证方式
       auth_pass 1111      #认证密码
   }
   virtual_ipaddress {     #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
       192.168.200.16
       192.168.200.17
       192.168.200.18
   }
}
​
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
   delay_loop 6                    #健康检查间隔,单位为秒
   lb_algo rr                      #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
   nat_mask 255.255.255.0          #VIP掩码
   lb_kind NAT                     #负载均衡转发规则。一般包括DR,NAT,TUN 3种
   persistence_timeout 50          #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了
   protocol TCP                    #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
   real_server 192.168.200.100 443 { #真实服务器,包括IP和端口号
       weight 1                    #权重
       TCP_CHECK {                 #通过tcpcheck判断RealServer的健康状态
           connect_timeout 3       #连接超时时间
           nb_get_retry 3          #重连次数
           delay_before_retry 3    #重连间隔时间
           connect_port 23         #健康检查的端口的端口
           bindto <ip>  
       }
​
       HTTP_GET  {     #健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
           url {                   #检查url,可以指定多个
             path /        #检查的url路径
             digest ff20ad2481f97b1754ef3e12ecd3a9cc  #需要检查到的内容。检查后的摘要信息。
           }
           url {
             path /mrtg
             digest 9b3a0c85a887a256d6939da88aabd8cd
           }
           url {
             path /testurl3/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
​
           connect_timeout 3       #连接超时时间
           nb_get_retry 3          #检测尝试几次
           delay_before_retry 3    #检测的时间间隔
       }
   }
}

Keepalived高可用裂脑

什么是裂脑

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。

裂脑的原因

1)高可用服务器对之间心跳线链路故障,导致无法正常通信。

2)高可用服务器对上开启了iptables防火墙阻挡了心跳消息传输。

3)高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败。

4)keepalived配置问题。

解决裂脑的常见方案

1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路

2)当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith 、fence)。相当于备节点接收不到心跳消息,发送关机命令通过单独的线路关闭主节点的电源。 fence和Stonith设备其实就是一个智能电源。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值