介绍
当lvs和若干realServer一定程度上处理了高并发的时候,便出现了新的问题
1:lvs出现问题怎么办
2:realServer其中一台出现问题怎么办
我们采用keepalived解决这些问题
问题1解决:keepalived帮助主LVS在时间间隔内向外发布数据包证明自己是存活的,致使备用LVS不启用,当备用LVS几次(自己设置)没有接收到主LVS发送的数据包的时候,备用LVS认为主LVS出现故障,自己接手(ip(vip)漂移)主LVS的工作。当主LVS修复好之后,备用LVS又接到的来自主LVS的存活数据包,便把工作又交换给主LVS
问题2解决:keepalived会监控RealServer的健康状况,如果某一台RealServer出现问题,keepalived会把这台server从LVS服务中剔除掉,当server修复好之后,再把它加会到LVS服务中
我在本地搭建了四台虚拟机分别为node01(ip:192.168.179.101),node02(ip:192.168.179.102),node03(ip:192.168.179.103),node04(ip:192.168.179.104)。其中node01做主LVS,node04做备用LVS。node02和node04做realServer。
安装配置keepalived
为node01和node04安装keepalived
yum install keepalived -y
``
[root@localhost node01]# cd /etc/keepalived/
[root@localhost keepalived]# vi keepalived.conf
配置keepalived.conf文件
node01(主要部分)
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.179.100/24
}
}
virtual_server 192.168.179.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.179.102 80 { #realserver的真实IP
weight 1 #权重
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.179.103 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
node04(主要部分)
vrrp_instance VI_1 {
state BACKUP #keepalived角色,MASTER和BACKUP
interface ens33 #通信接口,下面的virtual_ipaddress(VIP)绑定到这个网卡
virtual_router_id 51 #vrrp_instance的唯一标识
priority 100 #keepalived权重,数值越大权重越大,MASTER应大于BACKUP
advert_int 1 #发送心跳间隔,如果backup1秒收不到心跳就接管,单位是秒
authentication { #每个keepalived节点通过这里设置的验证通信,必须得设置成一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.179.100/24 #VIP
}
}
##################LVS配置##############
#添加虚拟服务器
#相当于 ipvsadm -A -t 192.168.0.89:80 -s wrr
virtual_server 192.168.179.100 80 {
delay_loop 6 #服务健康检查周期,单位是秒
lb_algo rr #调度算法
lb_kind DR #模式
nat_mask 255.255.255.0
persistence_timeout 0 #回话保持时间,单位是秒
protocol TCP #TCP协议转发
#添加后端realserver
#相当于 ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.93:80 -w 1
real_server 192.168.179.102 80 { #realserver的真实IP
weight 1 #权重
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.179.103 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置完毕我们稍等配置完RealServer再启动
配置RealServer
node02
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
绑定vip到还回接口
#ip addr add 192.168.179.100/32 dev lo label lo:1
node03
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
绑定vip到还回接口
#ip addr add 192.168.179.100/32 dev lo label lo:1
通过httpd测试
我们通过修改httpd的根目录为其创建一个index.html文件,让我们通过浏览器更直观的感受
node02
#vi /var/www/html/index.html
编辑文件为:from 192.168.179.102
node03
#vi /var/www/html/index.html
编辑文件为:from 192.168.179.103
然后启动node1-4的所有服务
node02 node03启动httpd
#systemctl start https.service
node01 nnode04启动keepalived
systemctl start keepalived.service
我们通过浏览器访问VIP:192.168.179.100来看一下情况
我们看到两次访问的是不同的realServer
验证问题
我们先来验证RealServer出问题的情况
我把node2的httpd服务关闭之后可见LVS挂载把node2踢掉了
当再次启动node02的httpd服务后,LVS又把node02加了回来
我们再来验证当lvs出问题的情况
我们来把node01的网卡关掉模拟主LVS故障,然后看node04LVS的情况
我们可以看到备用LVS已经接手了主LVS的工作。从客户端浏览器访问VIP是没有影响的
当我们霸王卡打开再次启动keepAlived服务,可以看到备用LVS把工作又交还给主LVS
我们可以看到keepAlived已经解决了开始叙述的两个问题。当然也有一些小bug。所以引出了后来的zookeeper。后面我会再写一篇文章来实验。
这样,我们就可以利用LVS连接多个Nginx,然后每个Nginx连接多个Tomcat来达到百万级并发。当然Nginx与Tomcat之间又会涉及session的一致性问题,解决这等问题又加入Redis来存储session。这些问题我们以后再说。
以上为我个人理解。如有不足请指出