静态路由高可用,一直听说keepalived+nginx可以实现,结合反思当前参与项目使用dns做主备节点之间的切换问题,查找相关资料进行总结,本文对keepalived的原理进行简要介绍,并实际搭建keepalived主备节点以及结合主备节点部署nginx进行实际验证,在此进行记录,以便后续持续深入学习以及为后来者提供参考借鉴,文中不免疏漏之处,望读者不吝指教,感激之至!
1. Keepalived简介
Keepalived起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
2. Keepalived原理
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP来实现的。
VRRP全称Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,
VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
VRRP的工作过程:
(1)虚拟路由器中的路由器根据优先级选举出Master,Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通告给与它连接的设备。
(2)Master路由器周期性发送VRRP报文,以公布自己的配置信息(优先级等)和工作状态
(3)如果Master故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master
(4)虚拟路由器状态切换时,Master路由器由一台设备切换会另外一台设备,新的Master路由器只是简单的发送一个携带虚拟MAC地址和虚拟IP的免费ARP报文,这样就可以更新其他设备中缓存的ARP信息
(5)Backup路由器的优先级高于Master时,由Backup的工作方式(抢占式或者非抢占式)决定是否重新选举Master。
3. Keepalived部署配置
3.1 安装环境
环境:CentOS Linux release 7.2.1511 (Core)
版本:keepalived-2.2.4.tar.gz
官网:https://www.keepalived.org/download.html
3.2 安装步骤
(1)下载
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
(2)依赖安装更新
yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget gtk2-devel binutils-devel
(3)解压调整安装路径
tar -zvxf keepalived-2.2.4.tar.gz
cd /usr/local/keepalived-2.2.4/
(4)配置指定安装目录
./configure --prefix=/usr/local/keepalived
(5)编译并安装
make && make install
(6)调整配置文件
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id LVS_DEVEL_0
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
# 配置当前机器网卡
interface eno16777736
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 与当前机器配置同一网段
192.168.65.16
}
}
(7)设置linux服务
mkdir /etc/keepalived
cp /usr/local/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
(8)启动
systemctl start keepalived
systemctl status keepalived
systemctl stop keepalived
(9)验证
ps -aux | grep keepalived
systemctl status keepalived
(10)功能验证
部署两台机器 keepalived,一个master,一个backup;
两台机器各部署一个nginx,同时设置默认界面信息不同,用于区分访问到不同的机器;
同时启动两台keepalived和nginx,使用虚拟ip访问,查看是否是master节点;
关闭master节点的keepalived,继续使用虚拟ip访问,验证是否是backup节点;
恢复master节点的keepalived,继续使用虚拟ip访问,验证是否恢复到master节点访问。
3.3 配置说明
# 全局配置
global_defs {
# 邮件通知信息
notification_email {
# 定义收件人
acassen@firewall.loc
}
# 定义发件人
notification_email_from Alexandre.Cassen@firewall.loc
# SMTP服务器地址
smtp_server 192.168.200.1
smtp_connect_timeout 30
# 路由器标识,一般不用改,也可以写成每个主机自己的主机名
router_id LVS_DEVEL
# VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
vrrp_mcast_group4 224.0.0.18
vrrp_mcast_group6 ff02::12
}
# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
# 定义初始状态,可以是MASTER或者BACKUP
state MASTER
# 工作接口,通告选举使用哪个接口进行
interface ens33
# 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
# ID还是虚拟MAC最后一段地址的信息,取值范围0-255
virtual_router_id 51
# 使用哪个虚拟MAC地址
use_vmac XX:XX:XX:XX:XX
# 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
track_interface {
eth0
ens33
}
# 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
priority 100
# 通告频率,单位为秒
advert_int 1
# 通信认证机制,这里是明文认证还有一种是加密认证
authentication {
auth_type PASS
auth_pass 1111
}
# 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
virtual_ipaddress {
# IP/掩码 dev 配置在哪个网卡
192.168.200.16/24 dev eth1
# IP/掩码 dev 配置在哪个网卡的哪个别名上
192.168.200.17/24 dev label eth1:1
}
# 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
virtual_routes {
192.168.110.0/24 dev eth2
}
# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
nopreempt|preempt
# 如果是抢占默认则可以设置等多久再抢占,默认5分钟
preempt delay 300
# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
}
# 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
notify_master ""
notify_backup ""
notify_fault ""
}
4. 参考文献
[1] https://www.keepalived.org/ [2] https://www.cnblogs.com/clsn/p/8052649.html [3] https://www.cnblogs.com/rexcheny/p/10778567.html
|