Keepalived高可用服务

Keepalived高可用服务

避免负载均衡服务出现单点问题

高可用服务原理

Keepalived的工作原理:
Keepalived高可用对之间是通过VRRP通信的,因此,我从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
3) VRRP用 IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:
Keepalived高可用之间是通过 VRRP进行通信的, VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

部署高可用服务

利用keepalived软件实现

作用:

1.为LVS服务而诞生出来的

2.实现高可用服务功能

第一个历程:准备高可用服务架构

lb01 lb02
10.0.1.5 10.0.1.6

第二个历程:安装keepalived软件

#lb01
[root@lb01 ~]# yum -y install keepalived

#lb02
[root@lb02 ~]# yum -y install keepalived

keepalived配置文件说明

/etc/keepalived/keepalived.conf 
 GLOBAL CONFIGURATION		---	全局配置部分
 VRRPD CONFIGURATION		--- VRRP协议配置部分
 LVS CONFIGURATION			--- LVS服务管理配置部分

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

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_connect_timeout 30		---	定义超时时间
   router_id LVS_DEVEL			---	高可用集群主机身份标识(集群中主机身份标识名称不能重复)
}

vrrp_instance VI_1 {			---	定义实例名称
    state MASTER				---	标识所在家族中的身份(MASTER/BACKUP)
    interface eth0				---	指定虚拟IP地址出现在什么网卡上
    virtual_router_id 51		 --- 标识家族身份信息(多台高可用服务器配置要一直)
    priority 100				---	设定优先级(优先级越高,就越有可能成为主)
    advert_int 1				---	定义组播包发送的间隔时间(秒)(主和备配置须一致)
    authentication {			---	实现通讯需要有认证功能
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {			---	配置虚拟IP地址信息
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
[root@lb01 ~]# 

第三个历程:编写keepalived配置文件

lb01

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id lb01
}

vrrp_instance test {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.3/24
    }
}

lb02

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance test {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.3/24
    }
}

第四个历程:启动keepalived服务

#lb01
[root@lb01 ~]# systemctl start keepalived

#lb02
[root@lb02 ~]# systemctl start keepalived

第四个历程:进行访问测试

高可用服务应用

高可用服务常见异常问题 --- 脑裂问题

什么是裂脑

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

导致裂脑发生的原因

一般来说,裂脑的发生,有以下几种原因

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信
  • 心跳线坏了(包括断了,老化)
  • 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
  • 心跳线之间连接的设备故障(网卡及交换机)
  • 高可用服务器上开启了iptables防火墙阻挠了心跳信息传输
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
  • 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件bug等.

解决裂脑的常见方法

在实际成产环境中,我们可以从以下几个方面来防止裂脑问题发生:

同时使用串行电缆和以太网电缆连接,同时用两条心跳线,这样一条线路坏了,另一个还是好的,依然能传送心跳信息.

当检测到裂脑时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith,fence)相当于备节点接收不到心跳信息,通过单独的线路发送命令关闭主节点的电源.

做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失.

解决keepalived裂脑的常见方案

作为互联网应用服务器的高可用,特别是前端web负载均衡器的高可用,裂脑的问题对普遍业务的影响是可容忍的,如果是数据库或者存储的业务,一般出现裂脑问题就非常严重了.因此,通过增加冗余心跳线来避免裂脑问题发生,同时加强了对系统的监控.

如果开启防火墙,一定要让心跳消息通过.一般通过允许IP段的形式解决
可以拉一条以太网网线或者串口线作为主备节点心跳线路的冗余
开发检测程序通过监控软件检测裂脑,如zabbix检测如果主备都有VIP就报警.
比较严谨的判断,备节点出现对应VIP,并且主节点及对应服务(如果能远程连接主节点看是否有VIP就更好了)还活着,就说明发生裂脑了.
开发检测keepalived裂脑的脚本"

[root@lb01 conf.d]# vim /server/scripts/check_keepalived.sh
#!/bin/bash
lb01_vip=10.0.1.3
lb01_nginx=$(curl -x 10.0.1.5:80 -I -s -w "%{http_code}\n" -o /dev/null  blog.test.com)
if [ ${lb01_nginx} -eq 200 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
    echo "ha is bad" >> /tmp/check.txt
    systemctl stop keepalived
else
    echo "ha is ok" >> /tmp/check.txt
fi

如何实现keepalived服务自动释放vip地址资源

nginx+keepalived:nginx负载停止,keepalived也必须停止

第一个历程:编写监控nginx服务状态监控
[root@lb01 ~]# cat /server/scripts/check_web.sh 
#!/bin/bash
num=`ps -ef | grep -c nginx`
if [ $num -lt 2 ];then
  systemctl stop keepalived
fi
[root@lb01 ~]# 
第二个历程:实时监控nginx服务状态---keepalived配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb01
}

vrrp_script check_web {
    script "/server/scripts/check_web.sh"
    interval 2
    weight 2
}
vrrp_instance test {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.3/24
    }

    track_script {
        check_web
    }
}

配置解释

vrrp_script check_web {
    script "/server/scripts/check_web.sh"	---	定义需要监控脚本(脚本需要有执行权限)
    interval 2							  --- 执行脚本间隔时间(秒)
    weight 2	  --- 利用权重值和优先级进行运算,从而降低主服务优先级使之变为备服务器(建议先忽略)  
}			     求和运算:weight数值必须是整数	weight + priority 自动提升优先级,使主机可以成为主服务器
				求差运算:weight数值必须是负数 weight - priority 自动降低优先级,使主机可以成为备服务器
track_script {
    check_web							  --- 调用你执行的脚本信息
}

高可用集群双主配置

第一个历程:编写lb01的keepalived配置文件

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb01
}

vrrp_instance test {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	10.0.1.3/24
    }
}

vrrp_instance test2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	10.0.1.4/24
    }
}
[root@lb01 ~]# 

第二个历程:编写lb02的配置keepailved文件

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance test {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	10.0.1.3/24
    }
}

vrrp_instance test2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	10.0.1.4/24
    }
}
[root@lb02 ~]# 

第三个历程:配置nginx负载均衡服务

#lb01和lb02一样
[root@lb02 ~]# vim /etc/nginx/conf.d/lb.conf 
upstream test {
  server 10.0.1.7:80;
  server 10.0.1.8:80;
  server 10.0.1.9:80;
}
server {
    listen       80;
    server_name  www.test.com;
    location / {
      proxy_pass http://test;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;

    }
}
server {
    listen       80;
    server_name  bbb.test.com;
    location / {
      proxy_pass http://test;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;

    }
}

第三个历程:重启服务

#lb01
[root@lb01 ~]# systemctl restart keepalived
[root@lb01 ~]# systemctl restart nginx

#lb02
[root@lb02 ~]# systemctl restart keepalived.service
[root@lb02 ~]# systemctl restart nginx

访问测试

高可用服务安全配置(负载均衡服务)

lb01和lb02负载均衡服务器配置一样

第一个历程:修改nginx负载均衡文件

[root@lb01 conf.d]# vim lb.conf 
upstream test {
  server 10.0.1.7:80;
  server 10.0.1.8:80;
  server 10.0.1.9:80;
}
server {
    listen 10.0.1.3:80;
    server_name  www.test.com;
    location / {
      proxy_pass http://test;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;
    }
}
server {
    listen 10.0.1.4:80;
    server_name  bbb.test.com;
    location / {
      proxy_pass http://test;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;

    }
}

第二个历程:修改内核信息

[root@lb01 conf.d]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
[root@lb01 conf.d]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@lb01 conf.d]# 

第三个历程:重启nginx服务

[root@lb01 conf.d]# systemctl restart nginx
[root@lb01 conf.d]# netstat -lntup|grep nginx
tcp        0      0 10.0.1.4:80             0.0.0.0:*               LISTEN      6294/nginx: master  
tcp        0      0 10.0.1.3:80             0.0.0.0:*               LISTEN      6294/nginx: master  
[root@lb01 conf.d]# 
posted @ 2019-10-28 11:03  helloord  阅读(217)  评论(0编辑  收藏  举报