1.什么是高可用?
通常情况下,都是启动2台相同的业务系统,一台故障,另外一台自动接管
2.高可用实现的工具?
服务高可用,keepalived软件实现
3.keepalived如何实现高可用?
keepalived基于VRRP协议,虚拟路由冗余协议
4.keepalived的使用和安装
状态 IP 角色
节点1 10.0.0.5 Master
节点2 10.0.0.6 Backup
VIP 10.0.0.3
yum install keepalived -y
| global_defs { |
| router_id lb01 |
| } |
| |
| vrrp_instance VI_1 { |
| state MASTER |
| interface eth0 |
| virtual_router_id 50 |
| priority 150 |
| advert_int 1 |
| authentication { |
| auth_type PASS |
| auth_pass 1111 |
| } |
| virtual_ipaddress { |
| 10.0.0.3 |
| } |
| } |
| 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的master与backup配置的区别
| Keepalived配置区别 Master配置 Backup节配置 |
| route_id(唯一标识) lb01 lb02 |
| state(角色状态) Master Backup |
| priority(竞选优先级) 150 100 |
| [root@lb01 ~] |
| [root@lb01 ~] |
| 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 |
| } |
1.主和备都配置一样的角色,一样的优先级??
| keepalived虚拟地址漂移与Nginx服务进行关联 |
| 1.Nginx默认监听在所有的IP地址上 |
| 2.用户将域名解析到VIP上面即可 |
2.由于下面的原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
- 服务器网线松动等网络故障
- 服务器硬件故障发生损坏现象而崩溃
- 主备都开启firewalld防火墙
此时就发发生脑裂,如果发生脑裂,则随机kill掉一台即可。
我们接下来,可以在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
| [root@lb02 ~] |
| |
| lb01_vip=10.0.0.3 |
| lb01_ip=10.0.0.5 |
| while true;do |
| ping -c 2 -W 3 $lb01_ip &>/dev/null |
| if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then |
| echo "ha is split brain.warning." |
| else |
| echo "ha is ok" |
| fi |
| sleep 5 |
| done |
3.如果Nginx服务死掉,会出现啥原因?
| 1.会导致用户无法正常的访问到网站。 |
| 2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件) |
解决手段:
写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived
| [root@lb01 ~] |
| [root@lb01 ~] |
| |
| |
| nginxpid=$(ps -C nginx --no-header|wc -l) |
| |
| |
| if [ $nginxpid -eq 0 ];then |
| systemctl start nginx |
| sleep 3 |
| |
| nginxpid=$(ps -C nginx --no-header|wc -l) |
| |
| if [ $nginxpid -eq 0 ];then |
| systemctl stop keepalived |
| fi |
| fi |
| |
| |
| [root@lb01 ~] |
注意,上述的脚本,我们需要在keepalived的配置文件中, 进行配置,才能定时执行
| [root@lb01 ~] |
| global_defs { |
| router_id LVS_01 |
| } |
| |
| |
| vrrp_script check_web { |
| script "/server/scripts/check_web.sh" |
| interval 5 |
| } |
| |
| vrrp_instance VI_1 { |
| nopreempt |
| state MASTER |
| interface eth0 |
| virtual_router_id 50 |
| priority 150 |
| advert_int 1 |
| authentication { |
| auth_type PASS |
| auth_pass 1111 |
| } |
| virtual_ipaddress { |
| 10.0.0.3 |
| } |
| |
| |
| track_script { |
| check_web |
| } |
| } |
注意:公有云不支持keepalived, 一般都是银行、金融、证券、国企才会使用