一、keepalived简介
Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),VRRP是为了解决静态路由的高可用。VRRP的基本架构
虚拟路由器由多个路由器组成,每个路由器都有各自的IP和共同的VRID(0-255),其中一个VRRP路由器通过竞选成为MASTER,占有VIP,对外提供路由服务,其他成为BACKUP,MASTER以IP组播(组播地址:224.0.0.18)形式发送VRRP协议包,与BACKUP保持心跳连接,若MASTER不可用(或BACKUP接收不到VRRP协议包),则BACKUP通过竞选产生新的MASTER并继续对外提供路由服务,从而实现高可用。
二、配置简介
主机架构:
系统环境:CentOS6.8
前端两台主机承担负载均衡任务,ip分别为192.168.10.137和192.168.10.138,对外暴露ip代理后端nginx的内容。
后端两台主机为实际访问内容,ip分别为192.168.10.145和192.168.10.146,只允许前端两台主机对80端口的访问。
实验步骤:
1.配置keepalived
2.配置haproxy
3.配置nginx
4.配置iptables规则
三、配置keepalived
配置之前关闭selinux
# setenforce 0
为实验简洁,我这里直接采用yum安装
# yum -y install epel-release #安装epel拓展源
# yum -y install keepalived #安装keepalived
更改配置文件内容
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #更改初始设置文件,可以直接删除
# vim /etc/keepalived/keepalived.conf #更改配置内容
ip为192.168.10.137的配置内容如下:
! Configuration File for keepalived
global_defs { #global_defs区域,主要是配置故障发生时的通知对象以及机器标识
notification_email { #notification_email 故障发生时给谁发邮件通知。
[email protected]
}
notification_email_from [email protected] #notification_email_from 通知邮件从哪个地址发出。
smtp_server 127.0.0.1 #smpt_server 通知邮件的smtp地址。
smtp_connect_timeout 30 #smtp_connect_timeout 连接smtp服务器的超时时间。
router_id nginx1 #router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}vrrp_instance VI_1 { #vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
state BACKUP #可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
virtual_router_id 102 #virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。
interface eth2 #节点固有IP(非VIP)的网卡,用来发VRRP包。
mcast_src_ip 192.168.10.137 #mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
priority 100 #用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
advert_int 1 #advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
nopreempt #nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。故障恢复时不抢占。
authentication { #authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
auth_type PASS
auth_pass 1234
}virtual_ipaddress { #vip,虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
192.168.10.101
}
}
ip为192.168.10.138的配置内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id nginx2
}vrrp_instance VI_1 {
state BACKUP
virtual_router_id 102 #同一组播中的id相同
interface eth2
mcast_src_ip 192.168.10.138 #本机地址
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}virtual_ipaddress {
192.168.10.101
}
}
两台主机之间的iptables访问规则配置
192.168.10.137上
# iptables -I INPUT -s 192.168.10.138/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
# iptables -I INPUT -s 192.168.10.138/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信
192.168.10.138上
# iptables -I INPUT -s 192.168.10.137/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
# iptables -I INPUT -s 192.168.10.137/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信
如果没设置好容易脑裂,要注意哦!
设置好之后可以两台主机都启动keepalived查看配置是否正确
192.168.10.137先启动keepalived,否则另一台主机会先抢占VIP
# service keepalived start
192.168.10.137的eth2网卡已经绑定VIP
192.168.10.138的eth2网卡未抢占VIP
当192.168.10.137上关闭keepalived服务时
# service keepalived stop
192.168.10.137的eth2网卡VIP消失
192.168.10.138的eth2网卡抢占VIP
三、配置haproxy
详细参数说明请看本人的HAProxy安装与配置(实现nginx负载均衡)
两台主机安装haproxy
# yum -y install haproxy
配置文件路径为/etc/haproxy/haproxy.cfg
配置文件内容除global和defaults下的设置其余的都可以注释掉
192.168.10.137添加以下内容
############WEB服务配置##################
listen webha80 #监听名称自定义
bind 0.0.0.0:80 #监听80端口
mode http #模式为http
option httplog #记录访问日志
log global #日志记录为全局的设置
maxconn 3000 #最大的连接数为3000
balance roundrobin #负载均衡模式为轮询
server nginx1 192.168.10.145:80 weight 2 rise 2 fall 3 #nginx1权重为2, 连续2次请求正常加入负载,失败3次即判定服务器宕机
server nginx2 192.168.10.146:80 weight 1 rise 2 fall 3 #nginx2权重为1, 连续2次请求正常加入负载,失败3次即判定服务器宕机
192.168.10.138添加以下内容
############WEB服务配置##################
listen webha80 #监听名称自定义
bind 0.0.0.0:80 #监听80端口
mode http #模式为http
option httplog #记录访问日志
log global #日志记录为全局的设置
maxconn 3000 #最大的连接数为3000
balance roundrobin #负载均衡模式为轮询
server nginx1 192.168.10.145:80 weight 1 rise 2 fall 3 #nginx1权重为1, 连续2次请求正常加入负载,失败3次即判定服务器宕机
server nginx2 192.168.10.146:80 weight 2 rise 2 fall 3 #nginx2权重为2, 连续2次请求正常加入负载,失败3次即判定服务器宕机
配置差别以便在发生故障时切换辨认主机,实际生产环境配置一般情况下请保持一致。
启动haproxy
# service haproxy start
启动完毕后查看端口监听状态,确定配置正确
# netstat -tnlp #80端口被haproxy占用
四、配置nginx
# yum -y install epel-release
# yum -y install nginx
# service nginx start
nginx1上
# echo "this is nginx111111111111111" > /usr/share/nginx/html/index.html #修改index.html以便验证轮询效果
# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT #允许haproxy对80端口的访问
nginx2上
# echo "this is nginx22222222222222" > /usr/share/nginx/html/index.html
# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT
五、配置前端iptables规则
192.168.10.137和192.168.10.138上添加规则
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT #允许所有的80端口请求
前端代理主机iptables规则表:
后端nginx主机iptables规则表:
六、访问测试
当正常情况下,192.168.10.137因为优先级高于192.168.10.138,此时它的eth2网卡绑定VIP,用浏览器对VIP--192.168.10.101进行访问,每三次访问页面出现“this is nginx111111111111111”为2次,“this is nginx22222222222222”为1次。而当关闭137主机上的keepalived时(模拟服务器故障),138主机抢占VIP--192.168.10.101,则每三次访问页面出现“this is nginx111111111111111”为1次,“this is nginx22222222222222”为2次。