1.1Keepalived高可用软件

Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以作为其他服务(Nginx,Haproxy)的高可用软件,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,它能够保证网络的不间断、稳定的运行。所以,keepalived以方面具有LVS Cluster nodes
healthchecks功能,另一方面也具有LVS directors failover功能。

1.1.1LVS
Directors failover功能

Ha failover功能:实现LB Master主机和Backup主机之间故障转义和自动切换。

这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡的所有工作(vip资源及相应服务)一旦主负载均衡器(MASTER)故障修复,MASTER又会接管回它原来处理的工作,而备份负载均衡器(BACKUP)会释放master失效时它接管的工作,此时两者将恢复到最初各自的角色状态。

1.1.2Lvs
cluster nodes healthchecks功能

1、keepalived.conf里配置就可以实现LVS功能。

2、keeplaived可以对LVS下面的集群节点做健康检查。

Rs healthcheck功能:负载均衡定期检查RS的可用性决定是否给其分发请求。

当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的RS服务器从转发队列中清除出去,从而保证用户的访问不受影响:当故障的RS服务器被修复以后,系统又会自动地把它们加入转发队列,分发请求提供正常服务。

1.2Keeplaived故障切换转移原理介绍

Keepalived
Directors高可用对之间的故障切换转移,是通过VRRP协议(Virtual Router
Redundancy Protocol 中文虚拟路由器冗余协议)来实现的。

在Keepalived
Directors正常工作时,主Director节点会不断的向备节点广播心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身备用角色。

1.3VRRP协议简单介绍

VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为Master的负责路由工作,其他的都是Backup,Master并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是Master。Master有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的Master要负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称为VIP)。客户端主机并不需要因为Master的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),Backup不会枪占Master,除非它的优先级(priority)更高。当Master不可用时(Backup收不到广告包),多台Backup中优先级最高的这台会被枪占为Master。这种枪占是非常快速的(<1s),以保证服务的连续性。

由于安全性考虑,VRRP包使用了加密协议进行加密。

1.4Keepalived工作原理小结

1.4.1VRRP协议介绍

1、VRRP协议,全称Virtual Router Redundancy Protocol,中文名,虚拟路由器冗余协议,VRRP的出现就是为了解决静态 的单点故障。

2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器。

3、VRRP是通过IP多播的方式实现通信。

4、主发包,备接包,当备接不到主发的包的时候,就启动接管程序接管主的资源。备可以由多个,通过优先级竞选。

5、VRRP使用加密协议。

1.4.2Keepalived工作原理

Keepalived高可用之间是通过VRRP协议通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会获得所有的资源,备节点处于等待状态,当主挂了时候,备节点,接管主节点的资源,然后顶替主节点对外提供服务。

VRRP协议是通过IP多播包的方式(224.0.0.18)发送。

在keepalived之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管的速度可以小于1秒,VRRP使用加密协议加密发送广播包。

1.5Keepalived+Nginx高可用实践

1.5.1高可用环境准备

[root@lb-node1 ~]# cat /etc/redhat-release  #查看系统版本

CentOS release 6.7 (Final)

[root@lb-node1 ~]# uname -r #查看内核版本

2.6.32-573.el6.x86_64

[root@lb-node1 ~]# getenforce #确认Selinux关闭状态

Disabled

[root@lb-node1 ~]# /etc/init.d/iptables status#确认Iptables关闭状态

iptables: Firewall is not running.

1.5.2安装Nginx web服务

yum install openssl openssl-devel pcre pcre-devel
-y

mkdir -p /home/oldboy/tools

cd /home/oldboy/tools

wget -q
http://nginx.org/download/nginx-1.6.3.tar.gz

ls -l nginx-1.6.3.tar.gz

useradd nginx -s /sbin/nologin -M

tar xf nginx-1.6.3.tar.gz

cd nginx-1.6.3

./configure--user=nginx --group=nginx --prefix=/application/nginx-1.6.3
--with-http_stub_status_module--with-http_ssl_module

make

make install

ln -s /application/nginx-1.6.3 /application/nginx

1.5.3安装Keepalived高可用

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

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

1.5.4配置Master_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf  #Master
Keepalived配置文件

!
Configuration File for keepalived

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_01

}

vrrp_instance VI_1 {

state
MASTER

interface eth0

virtual_router_id 51

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

1.5.5配置Backup_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #Backup Keepalived配置文件

!
Configuration File for keepalived

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_02

}

vrrp_instance VI_1 {

state
Backup

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

1.5.6Keepalived主备配置比较

主从单实例keepalived.conf配置差别项

Keepalived配置参数

Master节点特殊参数

Backup节点特殊参数

route_id(唯一标识)

route_id lb01

route_id lb02

state(角色状态)

state Master

state Backup

priority(竞选优先级)

priority 150

priority 100

1.5.7启动keepalived服务

[root@lb01 ~]# /etc/init.d/keepalived start #启动lb01上Master_keepalived

[root@lb02 ~]# /etc/init.d/keepalived start #启动lb02上Master_keepalived

1.5.8检测IP地址是否漂移

[root@lb01 ~]# ip addr|grep 10.0.0.11 #查看是否有VIP地址

inet
10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived stop #停止Master上Keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #VIP已经从Master端移除

[root@lb02 ~]# ip addr|grep 10.0.0.11 #Backup上Keepalived接管资源

inet
10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived start #启动Master_keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #Master继续接管资源

inet
10.0.0.11/24 scope global secondary eth0

1.5.9Keepalived配置文件详解

1 !
Configuration File for keepalived
#注释

2

3
global_defs {

4    notification_email {

5      acassen@firewall.loc #5-7发邮件给谁

8    }

9    notification_email_from Alexandre.Cassen@firewall.lo #发邮件发件人

10    smtp_server 192.168.200.1 #邮件服务器地址

11    smtp_connect_timeout 30 #超时时间

12    router_id Nginx_01 #主备ID不能一样

13 }

15 vrrp_instance VI_1 {  #实例名称(建议不修)

16     state MASTER #服务器的状态(仅仅是傀儡)

 17     interface eth0 #通信端口

 18     virtual_router_id 51 #实例的ID

 19     priority 150 #优先级,主备之间最好相差50

20     advert_int 1 #心跳间隔(如果一秒没通信备节点马上接管)

21     authentication {

22         auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同

23         auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同

24     }

25     virtual_ipaddress { #vip(可以多个)

 26       10.0.0.11/24 #26-28配置vIP地址,绑定在eth0  因为(interface
eth0)

29     }

30 }

q全局定义块部分:主要设置Keepalived的通知机制和标识

1、第4-9行是email通知参数。作用:当LVS发生切换或RS等有故障时,会发邮件报警。这是可选配,notifucation_email指定在keepalived发生事件时,需要发给的email地址,可以有多个,每行一个。

2smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。

3、第10行是Lvs负载均衡器标示(rote_id)。在一个局域网内,它应该是唯一的。

4、大括号”{}” 用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

qVRRP定义块

1、第13行为VRRP实例vrrp_instance,每个Vrrp实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。

(1)14行实例状态state.只有MasterBackup两种状态,并且需要大写这些单词。其中MASTER为工作状态。BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUPMASTER恢复到BACKUP状态。

(2)通信接口interface。对外提供服务的网络结构,如eth0,eth1当前主流的服务器有2个或2个以上的网络接口,在选择服务器接口时,一定要搞清楚了。

(3)lvs_sync_daemon_interface。负载均衡器之间的监控接口,类似于HA
HeartBeat
的心跳线。

(4)16行为虚拟路由标示virtual_route_id是一致的,同时在整个keepalived内是唯一的。

(5)17行为优先级priority,这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级
BACKUP
。若MASTERpriority值为150,那么BACKUPpriority只能在149或者跟小的数值(官方建议相差50)

(6)18行同步通知间隔advert_intMASTERBACKUP负载均衡器之间同步检查的时间间隔,单位为秒。

(7)19-22行验证authentication.包含验证类型和验证密码。类型主要有PASSAH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTERBACKUP使用相同的密码才能正常通信,这里官方推荐用明文即可。

2、第23-27行为虚拟ip地址virtual_ipaddress。可以配置多个IP地址,每个地址占一行,需要指定子网掩码。

注意:这个ip必须与我们在lvs客户端设定的vip相一致。

1.5.10keepalived日志文件

[root@lb01 ~]#sed
-i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S
0"#g' /etc/sysconfig/keepalived #指定文件接收Keepalived服务日志

[root@lb-node1 conf]# echo -e "local0.* \t
/var/log/keepalived.log" >>/etc/rsyslog.conf  #配置至rsyslog

[root@lb-node1 conf]# tail -1 /etc/rsyslog.conf  #检查是否配置成功

local0.*/var/log/keepalived.log

[root@lb-node1 conf]# /etc/init.d/rsyslog restart  #重新启动rsyslog

Shutting down system logger:                               [  OK  ]

Starting system logger:                                [  OK  ]

1.6Keepalived+Nginx高可用多实例实践

1.6.1Master_keepalived多实例

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Master 第二个实例修改为Backup

vrrp_instance VI_1 {

state
MASTER

interface eth0

virtual_router_id 51

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id
52

priority
100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.12/24

}

}

1.6.2Backup_keepalived多实例

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Backup,第二个实例修改为Backup

vrrp_instance
VI_1 {

state
Backup

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

vrrp_instance VI_2 {

state MASTER

interface eth0

virtual_router_id
52

priority
150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.12/24

}

}

1.6.3检测多实例IP地址是否漂移

[root@lb-node1 ~]# ip addr|grep 10.0.0.11

inet
10.0.0.11/24 scope global secondary eth0

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@lb-node1 ~]# ip addr|grep 10.0.0

inet
10.0.0.11/24 scope global secondary eth0

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node1 ~]# ip addr|grep 10.0.0

inet
10.0.0.11/24 scope global secondary eth0

[root@lb-node1 ~]# tcpdump -n 'host 224.0.0.18'  抓包

1.7keepalived列脑解决

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并

Nginx宕机keepalived是不会接管的,需要写一个脚本检测nginx是否存活 ,如果不存货就kill nginx和keepalived

1、 可以ping通主,备节点还有VIP就认为列脑  (如果停止主,脚本也会报脑裂)

[root@lb02 ~]# cat check_split_brain.sh

#!/bin/sh

lb01_vip=10.0.0.12

lb01_ip=10.0.0.7

while true

do

ping -c 2 -W 3 $lb01_ip &>/dev/null

if [ $? -eq
0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]

then

echo
"ha is split brain.warning."

else

echo
"ha is ok"

fi

sleep 5

done

1.8Keepalived常见故障解决

服务器网线松动等网络故障

服务器硬件故障发生损坏现象而崩溃

Nginx服务死掉

[root@lb01 scripts]# cat nginx_pid.sh

#!/bin/sh

while true

do

nginxpid=`ps -C nginx --no-header|wc -l`

if [ $nginxpid -eq 0 ];then

/application/nginx/sbin/nginx

sleep 5

nginxpid=`ps -C nginx --no-header|wc -l`

if [
$nginxpid -eq 0 ];then

/etc/init.d/keepalived stop

exit 1

fi

fi

sleep 5

done

高可用系列之Nginx的更多相关文章

  1. elixir 高可用系列 - 目录

    1. elixir 高可用系列(一) Agent 2. elixir 高可用系列(二) GenServer 3. elixir 高可用系列(三) GenEvent 4. elixir 高可用系列(四) ...

  2. 【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例

    [高可用HA]Nginx (1) -- Mac下配置Nginx Http负载均衡(Load Balancer)之101实例 nginx版本: nginx-1.9.8 参考来源: nginx.org [ ...

  3. (5.8)mysql高可用系列——MySQL中的GTID复制(实践篇)

    一.基于GTID的异步复制(一主一从)无数据/少数据搭建 二.基于GTID的无损半同步复制(一主一从)(mysql5.7)基于大数据量的初始化 正文: [0]概念 [0.5]GTID 复制(mysql ...

  4. Keepalived+Nginx搭建主从高可用并带nginx检测

    应用环境:部分时候,WEB访问量一般,或者测试使用,利用Keepalived给Nginx做高可用即可满足要求. 测试环境:   搭建步骤: 1. 安装软件 在Nginx-A和Nginx-B上: ~]# ...

  5. keepalived高可用系列~通用基础

    简介:今天咱们来聊聊keepalived一 keepalived 架构 1  标准架构: keepalived+lvs/haproxy+后端 real server(mysql从库,nginx.myc ...

  6. JAVAEE——宜立方商城03:Nginx负载均衡高可用、Keepalived+Nginx实现主备

    1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...

  7. 打造kubernetes 高可用集群(nginx+keepalived)

    一.添加master 部署高可用k8s架构 1.拷贝/opt/kubernetes目录到新的master上(注意如果新机上部署了etcd要排除掉) scp -r /opt/kubernetes/ ro ...

  8. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  9. elixir 高可用系列(五) Supervisor

    概述 OTP 平台的容错性高,是因为它提供了机制来监控所有 processes 的状态,如果有进程出现异常, 不仅可以及时检测到错误,还可以对 processes 进行重启等操作. 有了 superv ...

随机推荐

  1. wordPress查看站点时,显示文件目录

    1.在wordpress的代码目录中增加.htaccess文件. 2.在.htaccess文件中加入如下内容: DirectoryIndex index.php index.html# BEGIN W ...

  2. 学习笔记——Java类和对象

    今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数 ...

  3. [编织消息框架][设计协议]bit基础

    理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数 ...

  4. React Native填坑之旅 -- 使用iOS原生视图(高德地图)

    在开发React Native的App的时候,你会遇到很多情况是原生的视图组件已经开发好了的.有的是系统的SDK提供的,有的是第三方试图组件,总之你的APP可以直接使用的原生视图是很多的.React ...

  5. Python脚本收集腾讯云CDN日志,并入ELK日志分析

    负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...

  6. 【转】44款Java 网络爬虫开源软件

    原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...

  7. Laravel路由和控制器的绑定

    路由和控制器的关系 路由文件地址在\app\Http\routes.php,我们来看两种不同的路由. Route::get('/', function () { return view('welcom ...

  8. 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载

    最近公司的app上线了,在推广APP的时候出现了一个问题,因为Android和IOS的下载地址不一样,那么在推广的时候就要推广两个二维码,这样比较麻烦,如何简化我们的推广,让IOS用户扫描二维码的时候 ...

  9. HTML 5入门知识(五)

    本地存储Web Storage 使用HTML 5的Web Storage功能,可以在客户端存储更多的数据,而且可以实现数据在多个页面中共享甚至是同步. cookie存储数据的不足 cookie可用于在 ...

  10. 2953: [Poi2002]商务旅行

    2953: [Poi2002]商务旅行 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 8[Submit][Status] Desc ...