1. 什么是Keepalived?
keepalived是一个类似与layer3,4,5交换机制的软件,也就是我们平时说的第3,4,5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.
2. Keepalived作用
负载均衡方案
高可用性HA
实现对是小机器/服务的故障隔离
负载均衡器间的失败切换failover,是通过VRRPv2(Virtual Router Redundancy Protocol) stack实现
3. Keepalived体系结构
Keepalived大致分为两层结构: 用户空间(User space)和内核空间(kernel space)
WatchDog 负责监控checkers和VRRP进程的状况
Checkers 负责真实服务器的健康检查healthchecking,是Keepalived最主要的功能.换句话说--可以没有VRRP Stack,但健康检查healthchecking是一定要有的.
CRRP Stack 负责负载均衡器之间失败切换FailOver. 如果只用一个负载均衡器,则VRRP不是必须的.
IPVS wrapper 用来发送设定的规则到内核ipvs代码
Netlink Reflector 用来设定vrrp 的vip地址等
3. Keepalived的安装
[root@clust1 keepalived-1.2.1]# ln -s /usr/src/kernels/2.6.18-238.el5-i686/ /usr/src/linux
## 否则 Use IPVS Framework : No
[root@clust1 keepalived-1.2.1]# ./configure --prefix=/opt/keepalived121/
[root@clust1 keepalived-1.2.1]# make
[root@clust1 keepalived-1.2.1]# make install
[root@clust1 keepalived-1.2.1]# cd /opt/keepalived121/
# 设置 service 方式启动服务
[root@clust1 keepalived121]# mkdir /etc/keepalived
[root@clust1 keepalived121]# cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@clust1 keepalived121]# cp etc/sysconfig/keepalived /etc/sysconfig/
[root@clust1 keepalived121]# cp etc/keepalived/keepalived.conf /etc/keepalived/
[root@clust1 keepalived121]# cp sbin/keepalived /usr/sbin/
#启动进程
[root@clust1 keepalived121]# service keepalived start
Starting keepalived: [ OK ]
[root@clust1 keepalived121]# ps aux | grep keep
root 15417 0.0 0.2 5032 576 ? Ss 19:58 0:00 keepalived -D
root 15418 0.0 0.5 5104 1452 ? S 19:58 0:00 keepalived -D
root 15419 0.0 0.3 5104 972 ? S 19:58 0:00 keepalived -D
Keepalived正常运行时,共启动3个进程,其中一个进程是父进程,负责监控其子进程,一个是vrrp子进程,另外一个是checkers子进程.
4. Keepalived的配置文件
位置:
[root@clust1 keepalived121]# cat /etc/keepalived/keepalived.conf
Keepalived的所有配置都在一个配置文件里设置,支持的配置项也比较多,可以分为三类:
a. 全局配置(Global configuration)
就是对整个Keepalived起作用的配置,不管是否使用LVS
b. VRRPD配置
是Keepalived的核心
c. LVS配置
只在使用Keepalived来配置和管理LVS时需要使用,如果仅使用Keepalived来做HA,LVS的配置完全是不需要的
4.1 全局配置
全局配置包括两个子配置: 全局定义(global definition), 静态地址路由(static ipaddress routes)
A: 全局定义主要设置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 } notification_email : 指定Keepalived在发生事件时,需要发送Email到的对象,可以有多个,每行一个 smtp_* : 指定发送email的smtp服务器 route_id : 运行Keepalived的机器的一个标识 |
B: 静态地址和路由
所谓静态,就是说不会随vrrpd instance的开/关的变化的,VIP就不是static的,会随着vrrp而添加/删除,这个配置可以用来给服务器配置静态的IP地址/路由
静态地址和路由的配置结构:
static_ipaddress { 192.168.1.1/24 brd + dev eth0 scope global } static_routes { src $SRC_IP to $DST_IP dev $SRC_DEVICE ..... src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE } |
4.2 VRRPD配置
VRRPD的配置也包括两个部分: VRRP同步组(synchronization group), VRRP实例(VRRP instance)
A: VRRP同步组
如果机器或路由有两个网段,一个内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么外网出现问题时,VRRPD认为自己仍然健康,那么不会发送Master和Backup的切换,sync group就是为了解决这个问题,可以把两个实例都放进一个sync group. 这样group里任何一个实例出现问题都会发生切换.
VRRP同步组的配置结构:
vrrp_sync_group VG_1 { group { inside_network outside_network } notify_master /path/to/to_master.sh notify_backup /path/to/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/to/notify.sh smtp_alert } # notify_master : 指定当切换到master时,执行的脚本,这个脚本可以传入参数 # smtp_alert : 使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知 |
B: VRRP实例
VRRP实例表示在上面开启了VRRP协议,这个实例说明了VRRP的一些特性.
VRRP实例的配置结构:
vrrp_instance VI_1 { state MASTER # 实例的初始状态 interface eth0 # 实例绑定的网卡 dont_track_primary # 忽略VRRP的interface错误 lvs_sync_daemon_interface eth0 # 绑定eth0作为lvs同步的 track_interface { # 设置额外的监控,里面的任意一个出现问题,都会进入fault状态 eth0 eth1 } mcast_src_ip <IPADDR> # 发送多播包地址,默认使用绑定的网卡 garp_master_delay 10 # 在切换到master状态后,延迟进行gratuitous ARP请求 virtual_router_id 51 # VRID标记 priority 100 # 高优先级竞选为master,至少高backup 50 advert_int 1 # 检查间隔 authentication { # 设置验证 auth_type PASS # 认证方式,支持PASS和AH auth_pass 1111 # 认证的密码 } virtual_ipaddress { # 虚拟IP # <IPADDR>/<MASK>brd<IPADDR>dev<STRING>scope<SCOPT>label<LABEL> 192.168.200.16 192.168.200.17 192.168.200.18 } } |
C: 检查服务是否正常配置:
vrrp_script chk_http_port { script "killall -0 httpd" #检查httpd服务是否正常 # script "/tcp/127.0.0.1/80" interval 1 #检查时间间隔 } |
使用:
在vrrp_instance里面
track_script { chk_http_port } |
4.3 LVS配置
LVS的配置有两个部分: 虚拟主机组(virtual server group), 虚拟主机(virtual server)
A: 虚拟主机组
可选的,目的是为了让一台RealServer上的某个service可以属于多个virtual server并且只做一次健康检查
virtual_server_group <STRING> { # VIP port <IPADDR> <PORT> <IPADDR> <PORT> ..... fwmark <INT> } |
B: 虚拟主机 --虚拟服务器定义部分
virtual_server 10.10.10.3 1358 { # 设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开 delay_loop 3 # 设置健康检查时间,单位是秒 lb_algo rr # 设置负载调度算法 lb_kind NAT # 设置LVS实现负载均衡的机制,可以有NAT,TUN和DR三个模式 nat_mask 255.255.255.0 persistence_timeout 50 # 会话保持时间,单位的秒 protocol TCP # 指定转发协议类型,有tcp和udp两种 sorry_server <IPADDR> <PORT> # 备机IP端口,所有的real server失效后启用 # 节点服务器配置部分 real_server 192.168.200.4 1358 { # 配置服务节点,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开 weight 1 # 配置服务节点的权值,权值大小用数字表示,数字越大,权值越高, # 设置权值的大小可以为不同性能的服务器分配不同的负载, # 可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值 # 这样就合理的利用和分配了系统资源 inhibit_on_failure # 健康检查失败后,将weight设置为0,不从IPVS里面删除 TCP_CHECK { # realserver的状态检查设置部分,单位是秒 connect_timeout 10 # 10秒无响应超时 nb_get_retry 3 # 重试次数 delay_before_retry 3 # 重试间隔 } HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
5. 测试
clust3 -> keepalived.conf
[root@clust3 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id Haweb_1 } vrrp_sync_group VGM { group { VI_HA } } vrrp_instance VI_HA { state MASTER interface eth1 lvs_sync_daemon_interface eth1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.98.155/24 dev eth1 } } |
clust4 -> keepalived.conf
[root@clust4 keepalived-1.2.1]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id Haweb_1 } vrrp_sync_group VGM { group { VI_HA } } vrrp_instance VI_HA { state BACKUP interface eth1 lvs_sync_daemon_interface eth1 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.98.155/24 dev eth1 } } |
# 查看日志输出
[root@clust4 keepalived-1.2.1]# tail -f /var/log/messages
# stop master/backup查看IP地址变化
[root@clust4 keepalived-1.2.1]# ip a
# cluster3 -> service keepalived stop
# 浏览器输入 192.168.98.155 看现实的哪台服务器的页面内容
# cluster3 -> service keepalived start
# 浏览器输入 192.168.98.155 看现实的哪台服务器的页面内容
问题:
1. Keepalived抢占问题如何优化?
两台服务器组成高可用集群,分别处于Master和Backup状态,当Master出现故障时由Backup来接管所有任务,那么当Master恢复时,Master会抢回所有权.虽然是高可用,但是对客户来说,来回的切换是比较烦恼的事.
解决: 可将两服务器均设置成backup状态是因为 nopreempt(不抢占)只支持backup模式,而让那一台成为master,这个由优先级priority来决定
转载于:https://blog.51cto.com/bdliu/1542381