概述:
在之前的内容中,我们了解了当一个网站并发量大时,可以利用前端负载均衡器将用户请求调度到后端的多个real server上,实现分散服务压力,横向扩展的方式,形成LB集群,但是试想一下,作为前端负载均衡器:
如果是LVS,万一作为前端调度器的Director故障,则会导致所有服务器不可用,还有LVS无法对后端的各个Real Server做健康状况检测,无论后端Real Server是否故障,作为LVS调度器而言,都会将请求调度到根据算法指定的Real Server上,也就是如果某个Real Server故障,那么调度到该Real Server上的请求将会无法正常响应。
如果是Nginx作为前端调度器,虽然Nginx可以对后端的Upstream Server做健康状况探测,当某个节点故障时,不会将请求调度到该节点上;但是,万一Nginx调度器的节点本身发生故障,也会造成所有的服务不可用,也就是Nginx自身就是单点故障所在。
针对以上的情况,我们有必要对服务器进行高可用,当某个节点故障时,不会让整个服务不可用,本篇就介绍一下利用keepalived实现对前端调度器的高可用的实现方案,具体分为以下几个部分:
1、keepalived的相关概念简介
2、keepalived实现vrrp(实现虚拟IP资源的转移)
3、keepalived实现对LVS负载均衡调度器的高可用(主/备模型)
4、keepalived实现对Nginx服务的高可用(主/备模型)
5、keepalived实现双主模型的高可用实现方案(主/主模型)
第一章 keepalived的相关概念简介
1、VRRP协议,virtual redundant route protocol,虚拟冗余路由协议
能够把多个物理路由器虚拟为一个虚拟路由器对外提供服务,vrrp协议能够自动的识别当前哪个是活动节点,当活动节点故障后,能够自动的将另一个作为活动节点对外提供服务
vrrp对外提供服务是,是利用虚拟出来一个地址,包括mac也是虚拟出来的,对外提供服务
2、VRRP协议的相关术语解释
虚拟路由器:由一个主路由器和多个备份路由器组成,将其虚拟为一个路由器向外提供服务(注意,可能虚拟出来的不止一个虚拟路由器)
VRID:虚拟路由器标识,当虚拟出来多个虚拟路由器时,用来唯一标识某个虚拟路由器的ID号,0-255之间的有效数字
Master路由器:物理路由器中的主路由器,ACTIVE,用来承担报文转发任务的路由器,一般一个虚拟路由器集群只有一个Master路由器
Backup路由器:当Master路由器发生故障时,能够代替Master路由器工作的路由器
虚拟IP地址(VIP):虚拟路由器向外提供服务的IP地址,一个虚拟路由器可以有一个或多个IP地址
IP地址拥有者:物理路由器的接口的IP地址与虚拟IP地址相同的路由器,称为IP地址拥有者,也就是Master路由器
虚拟MAC(VMAC):虚拟路由器的虚拟MAC地址,虚拟MAC地址的格式为00-00-5E-00-01-{VRID},因此,VRID范围就是0-255,VMAC前5段是固定的,后面是VRID
优先级:VRRP是根据优先级来决定谁是Master路由器,谁是Backup路由器,优先级由数字表示,可用范围为0-254
3、VRRP的工作模式:
抢占方式:仅根据优先级来判断哪个路由器作为Master路由器。当原来的Master故障后,Backup路由器会作为新的Master路由器,但是当原来的Master恢复后,由于其优先级高,会又变回Master路由器,从新将资源抢占回来
非抢占方式:当原来的Master故障后,Backup路由器会作为新的Master路由器,当原来的Master恢复后,不会抢占成为Master路由器,而是作为Backup路由器
为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:
<1>Master路由器的选举
<2>Master路由器的状态通告(传递心跳信息,优先级等)
<3>为了提高安全性,还需要提供认证功能(防止外来的路由器随意加入到集群中),支持的认证方式有:
无认证
简单字符串认证,预共享秘钥
md5认证
4、keepalived简介
keepalived最初的设计目标是为了实现lvs设备的高可用,keepalived能够根据配置文件中的定义生成ipvs规则,并能够对各个real server的健康状态进行检测(LVS实际上按照高可用的角度来讲,只有两个资源,一个是VIP,一个是内核上的ipvs规则)
keepalived的功能主要是:
<1> vrrp协议的软件实现,原生设计的目的是为了高可用ipvs服务
<2> vrrp协议完成地址流动
<3> 为vip地址所在的地址生成ipvs规则(在keepalived配置文件中预先定义)
<4> 为ipvs集群的各RS做健康状态检测
<5> 基于脚本调用接口,通过执行脚本完成脚本中定义的功能(如对其他服务的高可用),进而影响集群事物
5、keepalived的软件结构
一般启动keepalived之后,会启动一个主进程(读取和分析配置文件,并根据配置文件,指挥两个子进程完成相关工作),两个子进程,其中一个子进程用来实现VRRP协议,另一个是checkers进程,用来监控lvs后端的各个real server的健康状况,还有一些外围其他服务的监控脚本的实现
主进程还能利用内核提供的watchdog模块,实现对两个子进程的健康性检查,当发现某个子进程故障后,主进程会kill掉这个子进程,然后再从新启一个子进程
watchdog能够让两个子进程每隔一段时间,向主进程的socket套接字上发送信息,当某一时刻,主进程无法收到子进程的信息,就判断子进程故障,然后就杀掉,重启子进程
两个节点之间哪个为主,哪个为备用节点,是由优先级来决定的,当初始时,优先级高的为主节点,当其中某一个节点故障,无法启动,则另一个节点会替换上来,作为主的,向外提供服务。另一种情况,当节点本身正常,但是节点上的某服务,也就是某资源不正常时,这时keepalived的子进程checkers就会将当前节点的优先级降级,从而实现了另一个备用节点的优先级要高于该节点,当下次节点间相互通告信息时,备用节点就会发现自己的优先级比当前活动节点的优先级要高,然后就提升为主节点,启动资源,对外提供服务
优先级的数字是0-255,值越大,优先级越高,0和255被系统自身占用,不能作为可用的优先级的数字进行调整
第二章 keepalived实现vrrp(实现虚拟IP资源的转移)
1、实验环境
2、实验前准备工作
<1> 各个节点的时间同步
在某个节点(本例中为10.1.32.68主机)上安装ntp服务,作为时间服务器,修改其配置文件中server相关的参数,将server修改为127.127.1.0,从本机同步时间,启动ntpd服务
其他keepalived向该服务器同步时间
验证各个keepalived节点的时间是否一致
<2> 节点之间可基于ssh秘钥进行认证
<3> 各节点解析的主机名与实际主机名保持一致
在各个节点上的/etc/hosts文件中编辑主机名与IP的对应关系,实现解析结果与实际主机名的一致性
<4> 确保iptables和selinux不会阻碍实验的正常进行
3、配置实验环境
4、安装keepalived
5、配置node72的keepalived服务
[root@node72 ~]# ######## 备份配置文件 ######## [root@node72 ~]# cp /etc/keepalived/keepalived.conf{,.bak} [root@node72 ~]# ######## 编辑修改配置文件 ######## [root@node72 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost ######## 定义节点状态发生变化时发送通知的目标邮箱地址 ######## } notification_email_from keepalived_test@nwc.com ######## 定义发件人的信息 ######## smtp_server 127.0.0.1 ######## 定义邮箱服务器地址 ######## smtp_connect_timeout 30 ######## 定义邮箱服务器的链接超时时间 ######## router_id node72 ######## 定义本机的路由器ID,自定义即可 ######## vrrp_mcast_group4 224.0.32.18 ######## 定义心跳信息通告的组播地址,同一个集群的组播地址一样 ######## } vrrp_instance VI_1 { ######## 定义一个虚拟路由器的实例,实例名称为VI_1 ######## state MASTER ######## 定义本节点在该虚拟路由器实例中的初始角色,MASTER还是BACKUP ######## interface eno16777736 ######## 虚拟路由器的工作的接口 ######## virtual_router_id 32 ######## 虚拟路由器ID(也就是VRID),用以区别不同的虚拟路由器实例 ######## priority 100 #####定义当前节点在该虚拟路由器实例中的优先级,MASTER要比BACKUP节点的优先级高##### advert_int 1 ######## 定义通告信息发送的时间间隔 ######## authentication { ######## 定义认证机制和认证的秘钥 ######## auth_type PASS ######## PASS为简单字符认证,建议使用PASS即可 ######## auth_pass 12345678 ######## 认证的秘钥,最大有效值为8位长度 ######## } virtual_ipaddress { ######## 定义该虚拟路由器的VIP ######## 10.1.32.1/16 dev eno16777736 label eno16777736:0 ######## VIP为10.1.32.1/16,定义在eno16777736接口的 eno16777736:0别名上 ######## } } track_interface { ###定义要监控的接口,一旦接口出现故障,则节点会转为FAULT状态,触发重新选举,实现资源转移### eno16777736 }
6、配置node73的keepalived服务
[root@node73 ~]# ######## 备份配置文件 ######## [root@node73 ~]# cp /etc/keepalived/keepalived.conf{,.bak} [root@node73 ~]# ######## 编辑修改配置文件 ######## [root@node73 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost ######## 定义节点状态发生变化时发送通知的目标邮箱地址 ######## } notification_email_from keepalived_test@nwc.com ######## 定义发件人的信息 ######## smtp_server 127.0.0.1 ######## 定义邮箱服务器地址 ######## smtp_connect_timeout 30 ######## 定义邮箱服务器的链接超时时间 ######## router_id node73 ######## 定义本机的路由器ID,自定义即可 ######## vrrp_mcast_group4 224.0.32.18 ######## 定义心跳信息通告的组播地址,同一个集群的组播地址一样 ######## } vrrp_instance VI_1 { ######## 定义一个虚拟路由器的实例,实例名称为VI_1 ######## state BACKUP ######## 定义本节点在该虚拟路由器实例中的初始角色,MASTER还是BACKUP ######## interface eno16777736 ######## 虚拟路由器的工作的接口 ######## virtual_router_id 32 ######## 虚拟路由器ID(也就是VRID),用以区别不同的虚拟路由器实例 ######## priority 95 ######## 定义当前节点在该虚拟路由器实例中的优先级 ######## advert_int 1 ######## 定义通告信息发送的时间间隔 ######## authentication { ######## 定义认证机制和认证的秘钥 ######## auth_type PASS ######## PASS为简单字符认证,建议使用PASS即可 ######## auth_pass 12345678 ######## 认证的秘钥,最大有效值为8位长度 ######## } virtual_ipaddress { ######## 定义该虚拟路由器的VIP ######## 10.1.32.1/16 dev eno16777736 label eno16777736:0 ######## VIP为10.1.32.1/16,定义在eno16777736接口的 eno16777736:0别名上 ######## } } track_interface { ###定义要监控的接口,一旦接口出现故障,则节点会转为FAULT状态,触发重新选举,实现资源转移### eno16777736 }
7、验证VRRP的高可用性
8、利用自定义脚本,在keepalived中调用自定义的脚本实现节点状态转移时的通知机制
实现当节点状态发生转移时,发送邮件给当前系统的root用户
编写脚本: [root@node72 ~]# [root@node72 ~]# vim /etc/keepalived/notify.sh #!/bin/bash # Author:nwc # Time:2016-11-01 12:56:17 # contact='root@localhost' ##定义变量contact,其值为root@localhost,指明通告给谁,也就是邮件发送给谁 vip="10.1.32.1" ##定义变量vip,其值为VIP的地址 notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1" echo $mailbody | mail -s "$mailsubject" $contact } ##定义一个notify函数,用于发送邮件,定义了邮件的主题和邮件的正文部分,函数可以接受函数自身的位置参数 case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: `basename $0` master|backup|fault" ;; esac ##定义一个循环,当脚本的位置参数$1为对应值时,调用函数发送邮件
第三章 keepalived实现对LVS负载均衡调度器的高可用(主/备模型)
1、实验环境
2、准备实验环境、各节点时间同步,ssh秘钥登录,节点解析与主机名一致配置过程省略
3、根据实验环境,配置LVS-DR模型各个Real Server对应的配置(本例中利用脚本实现)
脚本为: #!/bin/bash case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 10.1.32.1 netmask 255.255.255.255 broadcast 10.1.32.1 route add -host 10.1.32.1 dev lo:0 ;; stop) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 down ;; *) echo "error" exit ;; esac
4、在各个Real Server上提供httpd服务,提供测试页面,以供测试之用
5、在Director1上安装配置keepalived,实现对LVS调度器的高可用
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived_test@nwc.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node72 vrrp_mcast_group4 224.0.32.18 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 32 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.32.1/16 dev eno16777736 label eno16777736:0 } track_interface { eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 10.1.32.1 80 { ####将哪个ip的哪个端口定义为LVS的负载均衡集群服务#### delay_loop 6 ### 定义服务轮询时间间隔,单位秒 ### lb_algo rr ### 定义集群调度算法 ### lb_kind DR ### 定义LVS的工作模型 NAT|DR|TUN ### # nat_mask 255.255.255.0 ### 当工作模型是NAT时,NAT的掩码 ### # persistence_timeout 50 ### 定义LVS的是否启用持久连接,不加此选项,代表不启用,如果启用,定义时长 ### protocol TCP ### 定义集群的服务的协议类型,keepalived只支持TCP的 ### sorry_server 10.1.32.72 80 ###定义当LVS后端的real sever全部不可用后的错误页面的服务器### real_server 10.1.32.68 80 { ### 定义一个后端real server ### weight 1 ### 指明权重 ### HTTP_GET { ### 指明检测健康状况的方法 ### url { ## 表示请求某个URL进行检查,要求响应状态码为200 ### path / status_code 200 } connect_timeout 3 ###检测时,对方无响应的超时时间### nb_get_retry 3 ### 检测重试次数 ### delay_before_retry 3 ### 每次检测的间隔时间 ### } } real_server 10.1.32.168 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
6、在Director2上安装配置keepalived,实现LVS调度器的高可用
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived_test@nwc.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node73 vrrp_mcast_group4 224.0.32.18 } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 32 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.32.1/16 dev eno16777736 label eno16777736:0 } track_interface { eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } sorry_server 10.1.32.73 80 virtual_server 10.1.32.1 80 { delay_loop 6 lb_algo rr protocol TCP real_server 10.1.32.68 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.1.32.168 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
7、在两台Director上提供httpd服务,用于实现提供当所有Real Server都不可用时的错误页面
8、在两台Director上启动keepalived服务,客户端访问VIP,验证是否正常
停掉某个Real Server,验证对后端的real server的健康性检测是否生效
停掉keepalived的主节点后的Director后,验证服务是否可用
停掉两个Real Server,验证错误页面服务器的配置是否生效
停掉两个节点的keepalived服务后,服务就无法正常访问了
第四章 keepalived实现对Nginx服务的高可用(主/备模型)
1、实验环境
2、在两个nginx节点上yum安装keepalived,rpm安装nginx;在两个web服务器上安装httpd,提供测试页面
3、配置网络环境
4、启动后端两台web服务器,验证服务是否正常
5、配置nginx将用户请求反代到两台web服务器,验证服务是否正常
6、在ngx1上配置keepalived,实现对nginx服务的高可用
7、在ngx2主机上配置keepalived对nginx服务进行高可用
8、启动两个节点的keepalived,验证高可用是否生效
9、利用状态转移时的通知脚本机制,定义当节点状态发生变化时,后续的动作。
本例以:当节点变为主节点时不做任何操作,当节点变为备用节点时,停止nginx
脚本为 #!/bin/bash # Author:nwc # Time:2016-11-01 12:56:17 # contact='root@localhost' ##定义变量contact,其值为root@localhost,指明通告给谁,也就是邮件发送给谁 vip="10.1.32.1" ##定义变量vip,其值为VIP的地址 notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1" echo $mailbody | mail -s "$mailsubject" $contact } ##定义一个notify函数,用于发送邮件,定义了邮件的主题和邮件的正文部分,函数可以接受函数自身的位置参数 case $1 in master) notify master ;; backup) notify backup nginx -s reload ;; fault) notify fault ;; *) echo "Usage: `basename $0` master|backup|fault" ;; esac ##定义一个循环,当脚本的位置参数$1为对应值时,调用函数发送邮件
在keepalived配置文件中进行引用
第五章 keepalived实现双主模型的高可用实现方案(主/主模型)
1、实验环境
2、利用上个实验的环境,实现将前端nginx做成双主模型
在上个实验的基础上,只需要配置定义两个vrrp实例,其中一个vrrp实例的ngx1节点上是主节点,在ngx2节点上是备用节点,另一个vrrp实例在ngx1上是备用节点,在ngx2上是主节点
3、启动keepalived服务,验证配置
原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/56546