1.域名不能绑定在两个IP上 我们把域名绑定在VIP上 2.如何实现切换? 负载均衡的高可用 keepalived **注意:**任何软件都可以使用keepalived来做高可用 keepalived如何实现高可用 **VRRP:**虚拟路由冗余协议 比如公司的网络是通过网关进行上网的,那么如果该路
这种方法会把Keepalived进程结束掉,在教育机构学习到的方法,我个人对这种方法不认可。参考:
1.域名不能绑定在两个IP上
- 我们把域名绑定在VIP上
2.如何实现切换?
负载均衡的高可用
keepalived
注意:任何软件都可以使用keepalived来做高可用
keepalived如何实现高可用
VRRP:虚拟路由冗余协议
比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?
通常做法是给路由器增加一台北街店,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。
问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?
其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)
VIP:虚拟IP地址
VMAC:虚拟mac地址
如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。
安装配置keepalived
环境准备
作用 | IP | 角色 | VIP |
---|---|---|---|
lb01 | 10.0.0.5 | Master | 10.0.0.3 |
lb02 | 10.0.0.6 | Backup | 等master挂了VIP会过来 |
web01 | 10.0.0.7 | web | 没有VIP |
部署web
部署MySQL
部署lb01
部署lb02
部署 keepalived
# 1.安装keepalived [root@lb01 ~]# yum install -y keepalived [root@lb02 ~]# yum install -y keepalived # 2.MASTER配置文件 global_defs { #全局配置 router_id lb01 #标识身份->名称 } vrrp_instance VI_1 { state MASTER #标识角色状态 interface eth0 #网卡绑定接口 virtual_router_id 50 #虚拟路由id priority 150 #优先级 advert_int 1 #监测间隔时间 authentication { #认证 auth_type PASS #认证方式 auth_pass 1111 #认证密码 } virtual_ipaddress { 10.0.0.3 #虚拟的VIP地址 } } # 3.BACKUP配置文件 global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
我们需要把keepalived和nginx关联起来
抢占式和非抢占式
1、两个节点的state都必须配置为BACKUP 2、两个节点都必须加上配置 nopreempt 3、其中一个节点的优先级必须要高于另外一个节点的优先级。 两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。 Master配置 vrrp_instance VI_1 { state BACKUP priority 150 nopreempt } Backup配置 vrrp_instance VI_1 { state BACKUP priority 100 nopreempt }
关联nginx和keepalived
vim /etc/keepalived/keepalived.conf global_defs { #全局配置 router_id lb01 #标识身份->名称 } vrrp_script xxx { script "/root/nginx_keep.sh" interval 5 } vrrp_instance VI_1 { state MASTER #标识角色状态 interface eth0 #网卡绑定接口 virtual_router_id 50 #虚拟路由id priority 150 #优先级 advert_int 1 #监测间隔时间 authentication { #认证 auth_type PASS #认证方式 auth_pass 1111 #认证密码 } virtual_ipaddress { 10.0.0.3 #虚拟的VIP地址 } } track_script { xxx } [root@lb01 ~]# cat /root/nginx_keep.sh #!/bin/sh nginx_status=$(ps -C nginx --no-header|wc -l) #1.判断Nginx是否存活,如果不存活则尝试启动Nginx if [ $nginx_status -eq 0 ];then systemctl start nginx sleep 3 #2.等待3秒后再次获取一次Nginx状态 nginx_status=$(ps -C nginx --no-header|wc -l) #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本 if [ $nginx_status -eq 0 ];then systemctl stop keepalived fi fi # 想让VIP漂移,不重启nginx #!/bin/sh nginx_status=$(ps -C nginx --no-header|wc -l) if [ $nginx_status -eq 0 ];then systemctl stop keepalived fi ## 注意:如果是抢占式,脚本只需要放在MASTER上,如果是非抢占式,脚本必须放在MASTER和BACKUP上 [root@lb01 ~]# chmod +x /root/nginx_keep.sh [root@lb01 ~]# vim /etc/keepalived/keepalived.conf global_defs { #全局配置 router_id lb01 #标识身份->名称 } vrrp_script xxx { script "/usr/local/nginx_keep.sh" interval 5 } vrrp_instance VI_1 { state MASTER #标识角色状态 interface eth0 #网卡绑定接口 virtual_router_id 50 #虚拟路由id priority 150 #优先级 advert_int 1 #监测间隔时间 authentication { #认证 auth_type PASS #认证方式 auth_pass 1111 #认证密码 } virtual_ipaddress { 10.0.0.3 #虚拟的VIP地址 } track_script { xxx } }
网站访问脚本
#!/bin/bash while true;do code_status=$(curl -I -m 10 -o /dev/null -s -w %{http_code} www.wp.com) if [ $code_status -eq 200 ];then echo "$(date +%F-%T)_网站访问成功" >> /tmp/web.log else echo "$(date +%F-%T)_网站访问失败,状态码是: $code_status" >> /tmp/web.log fi sleep 1 done
高可用会存在的问题:
1、如何确定谁是主节点谁是备节点?
- MASTER(主节点)
- BACKUP(备节点)
- priority(优先级,主节点的优先级要大于备节点的优先级)
2、如果Master故障,Backup自动接管,那么Master回复后会夺权吗?
- 如果配置的是抢占式,MASTER会抢回VIP
- 如果配置的是非抢占式,两个都BACKUP,额外加一个参数:nopreempt,非抢占式不会抢VIP
3、如果两台服务器都认为自己是Master会出现什么问题
两台机器上面都有VIP,两台机器都认为自己是主节点,如果都有VIP,会导致网站访问不了
1、服务器网线松动等网络故障
2、服务器硬件故障发生损坏现象而崩溃
3、主备都开启firewalld防火墙
#!/bin/sh vip=10.0.0.3 lb01_ip=10.0.0.5 #while true;do ping -c 2 $lb01_ip &>/dev/null if [ $? -eq 0 ];then lb01_vip_status=$(ssh $lb01_ip "ip add|grep $vip|wc -l") lb02_vip_status=$(ip add|grep $vip|wc -l) if [ $lb01_vip_status -eq 1 -a $lb02_vip_status -eq 1 ];then echo '主节点和备节点都有VIP,开始关闭备节点的VIP...' systemctl stop keepalived fi else echo '主节点无法通信' fi #sleep 5 #done
注意:
负载均衡:lvs harproxy nginx
1.如果企业中用的是物理服务,机房。我们可以做keepalived的高可用
2.如果企业中用的是云服务器,(阿里云...)不能做keepalived.... slb