Haproxy+keepalived架构实践
2.1 VRRP介绍
VRRP中的角色
VRRP路由器
VRRP路由器就是一台路由器,只不过上面运行了VRRP协议的程序,比如我们等下要安装的Keepalived就是运行了VRRPD这样的程序来实现VRRP协议,我们可以理解为一台物理路由器,需要注意的是一台VRRP路由器可以位于多个虚拟路由器。
VRRP虚拟路由器
VRRP虚拟路由器通常有多台物理的VRRP路由器组成,这多台物理路由器组成一个Pool,虚拟路由器在生产环境中可以有多个,通过VRID进行标示。
MASTER和BACKUP
在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台路由器并不同时工作,而是由一台称之为MASTER的负责路由工作,其它的都是BACKUP。MASTER并不是一成不变的,VRRP协议让每个VRRP路由器参与竞选,竞选成功的就可以成为MASTER。MASTER拥有虚拟路由器的IP地址,我们把这个IP地址称之为VIP,MASTER负责转发发送给网关地址的数据包和响应ARP请求。
VRRP是如何工作的?
VRRP通过竞选协议来实现虚拟路由器的功能,协议报文通过IP多播(多播地址:224.0.0.18)方式进行发送。虚拟路由器有VRID(范围0-255)和一组IP地址组成,对外表现为一个MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC地址和IP地址。如果其中一台虚拟路由器Down机,角色发送切换,那么客户端并不需要因为Master的变化修改自己的路由设置,可以做到透明的切换。这样就实现了如果一台机器宕机,那么备用的机器会拥有MASTER上的IP地址,实现高可用功能。
VRRP是如何通信的?
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广播包,BACKUP的路由器会被动接收数据库,不会抢占MASTER。当MASTER不可用时,这个时候BACKUP就收不到广播包,多台BACKUP中优先级最高的这台会抢占成为MASTER。这个抢占的速度非常快小于1s,几乎不会影响生产应用。为了安全考虑VRRP的数据包使用了加密协议进行加密。
2.2 Keepalived部署
[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
[root@linux-node1 src]# tar zxf keepalived-1.2.19.tar.gz
[root@linux-node1 src]# cd keepalived-1.2.19
[root@linux-node1 keepalived-1.2.19]# ./configure --prefix=/usr/local/keepalived-1.2.19
[root@linux-node1 keepalived-1.2.19]# make && make install
[root@linux-node1 keepalived-1.2.19]# cp keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
[root@linux-node1 keepalived-1.2.19]# chmod +x /etc/init.d/keepalived
[root@linux-node1 keepalived-1.2.19]# cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
[root@linux-node1 keepalived-1.2.19]# cp keepalived/etc/keepalived/keepalived.conf /etc
2.3 Keepalived配置详解
Keepalived的所有配置都在一个配置文件里面,主要分为三大类:
- 全局配置
- VRRPD配置
- LVS配置
配置文件是以配置块的形式存在,每个配置块都在一个闭合的{}范围内,所有编辑的时候注意大括号的闭合问题。#和!开头的都是注释。
2.3.1 全局配置
全局配置是对整个Keepalived生效的配置,一个典型的配置如下:
global_defs {
#设置keepalived再发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
notification_email {
shundong.zhao@dianjoy.com
}
#设置通知邮件发送来自于哪里
notification_email_from keepalived@dianjoy.com
#指定发送邮件的smtp服务器
smtp_server 127.0.0.1
#设置smtp连接超时事件,单位是秒
smtp_connect_timeout 30
#设置route_id,是运行keepalived的一个标示,多个集群设置为不同的。
router_id nginx_ha
}
下面我们拿几个具体的实例来讲解Keepalived配置文件
2.3.2 VRRPD配置
VRRPD的配置是Keepalived比较重要的配置,主要分为两个部分VRR同步组合VRRP实例,我们先说VRRP实例,也就是要想使用VRRP进行高可用选举,那么就一定需要配置一个VRRP实例,在实例中来定义VIP、服务器角色等。
vrrp_instance NGINX_HA {
#指定实例初始状态,实际的MASTER和BACKUP是选举决定的
state MASTER
#指定实例绑定的网卡
interface eth0
#设置VRID标记,多个集群不同重复(0…255)
virtual_router_id 51
#设置优先级,优先级高的会被竞选为Master,Master要高于BACKUP至少50
priority 150
#检查的时间间隔,默认是1s。
advert_int 1
#设置验证的类型和密码。
authentication {
auth_type PASS
auth_pass nginx
}
#设置VIP,可以设置多个,用于切换时的地址绑定。
virtual_ipaddress {
192.168.99.176
192.168.99.170
}
}
可选的选项:
#设置路由,可以设置多条,用于切换时执行。
virtual_routes{
#src to / via | gw dev scope
}
#track_interface 设置额外的监控网卡,如果任何一个出现故障,就会进入FAULT状态
#mcast_src_ip 设置发送多播的地址,默认是绑定的网卡的primary IP
2.3.3 配置案例
! Configuration File for keepalived
global_defs {
notification_email {
saltstack@example.com
}
notification_email_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id 150
}
vrrp_instance haproxy_ha {
state Master
interface eth0
virtual_router_id 36
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.20
}
}