美文网首页
keepalived-高可用

keepalived-高可用

作者: 酷酷的伟 | 来源:发表于2019-06-15 19:34 被阅读0次

keepalived高可用原理

keepalived高可用对之间是通过VRRP协议通信
1、VRRP协议,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2、VRRP是通过一种竞选机制来将路由任务交给某台VRRP路由器的。
3、VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的。
4、工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序,接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般keepalived系统运维工作中都是一对。
5、VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐使用明文的方式配置认证类型和密码。
<meta charset="utf-8">

1.准备环境

  1. 准备机器lb01 lb02 web01 web02
  2. lb01 lb02 安装软件
    yum install keepalived -y
[root@lb01 nginx]# rpm -qa keepalived 
keepalived-1.3.5-8.el7_6.x86_64

[root@lb02 ~]# rpm -qa keepalived 
keepalived-1.3.5-8.el7_6.x86_64

2.开启服务与自启动

lb01:
[root@lb01 nginx]# systemctl start keepalived.service 
[root@lb01 nginx]# systemctl enable keepalived.service 

lb02:
[root@lb02 ~]# systemctl start keepalived.service 
[root@lb02 ~]# systemctl enable keepalived.service 

2.利用Wireshark抓包

image

随便抓个包看看:

image

3.配置文件

/etc/keepalived/keepalived.conf

image

配置文件格式:

修改前将源配置文件备份

[root@lb01 nginx]# vim  /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    router_id lb01
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.3/24 dev eth0 label eth0:1  
    }
}

4.lb01与lb02的keepalived配置文件

image.png
image

测试一下

主关闭后,备接管
主恢复后,优先级高于备,自动跳转回来

image

image

image

keepalived基于服务器,nginx挂了不会自动切换如何解决

1.检查状态

ps -ef |grep keepalived 

关闭不了nginx服务的方法

1.restart
2\. pkill nginx  
3\. restart

2.写脚本

脚本名字不要写服务的名字,如nginx.sh
检查nginx状态
nginx关闭,keepalived也关闭

[root@lb01 nginx]# vim /server/scripts/jiancha.sh 
#!/bin/bash
. /etc/profile
count=` ps -ef|grep nginx |grep -v grep |wc -l `

if [ $count -eq 0 ];then
  systemctl stop keepalived
fi

3.一定要给脚本添加执行权限

[root@lb01 nginx]# sh /server/scripts/jiancha.sh

4.添加函数

vrrp_script jiancha {   #脚本名称
script "/server/scripts/jiancha.sh"  #定义检查的脚本
interval 2  #每隔2秒执行
weight 1    #权重分配数量

track_script {  #执行脚本
jiancha     #脚本名称
}

5. 完整书写

[root@lb01 nginx]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    router_id lb01
}
vrrp_script jiancha {
script "/server/scripts/jiancha.sh"
interval 2
weight 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.3/24 dev eth0 label eth0:1
    }
    track_script {
    jiancha
    }
}

6.测试一下

[root@lb01 nginx]# systemctl is-active nginx
active
[root@lb01 nginx]# ip a|grep 0.3
    inet 10.0.0.3/24 scope global secondary eth0:1
[root@lb01 nginx]# systemctl stop nginx
[root@lb01 nginx]# ip a|grep 0.3
[root@lb01 nginx]#  \\虚拟ip跳走了
[root@lb01 nginx]# 

7.去lb02看一下是否跳过去了

[root@lb02 ~]# ip a|grep 0.3
    inet 10.0.0.3/24 scope global secondary eth0:1

8.回到lb01把nginx和keepalived开启

[root@lb01 nginx]# systemctl start nginx
[root@lb01 nginx]# ip a|grep 0.3
[root@lb01 nginx]# systemctl start keepalived.service 
[root@lb01 nginx]# ip a|grep 0.3    #间隔2秒
[root@lb01 nginx]#
[root@lb01 nginx]# ip a|grep 0.3
    inet 10.0.0.3/24 scope global secondary eth0:1
#又转到主了


keepalived双主模式

image.png

修改配置文件后重启keepalived
systemctl restart keepalived

image.png

lb01的keepalived双主配置文件

! Configuration File for keepalived

global_defs {
    router_id lb01
}
vrrp_script jiancha {
script "/server/scripts/jiancha.sh"
interval 2
weight 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.3/24 dev eth0 label eth0:1  
    }
    track_script {
    jiancha
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.4/24 dev eth0 label eth0:2
    }
}

lb02的keepalived双主配置文件

! Configuration File for keepalived

global_defs {
    router_id lb02
}

vrrp_instance VI_1 {   
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.3/24 dev eth0 label eth0:1  
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.4/24 dev eth0 label eth0:2
    }
}

让lb01和lb02的nginx配置文件相同

vim /etc/nginx/nginx.conf  :

     upstream  web_pools {
     server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
     server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
     }
#    include /etc/nginx/conf.d/*.conf;
     server {
     listen 80;
     server_name www.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr; 
        }
     }
     server {
     listen 80;
     server_name blog.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     } 

curl一下

保证俩边的/etc/nginx/nginx.conf配置文件一样

[root@lb01 nginx]# curl 10.0.0.3
web01 www.oldboy.com
[root@lb01 nginx]# curl 10.0.0.3
web02 www.oldboy.com
[root@lb01 nginx]# curl 10.0.0.3
web01 www.oldboy.com
[root@lb01 nginx]# 
[root@lb01 nginx]# curl 10.0.0.4
web01 www.oldboy.com
[root@lb01 nginx]# curl 10.0.0.4
web02 www.oldboy.com
[root@lb01 nginx]# curl 10.0.0.4
web01 www.oldboy.com


每个域名绑定对应ip

1.基于ip的虚拟主机

添加虚拟主机的ip就可以了
listen 10.0.0.3:80;
listen 10.0.0.4:80;

lb01和lb02的修改相同
     upstream  web_pools {
     server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
     server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
     }
#    include /etc/nginx/conf.d/*.conf;
     server {
     listen 10.0.0.3:80;  ##添加虚拟主机的ip
     server_name www.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }
     server {
     listen 10.0.0.4:80;  #添加虚拟主机的ip
     server_name blog.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }
}
------------------------------------------------------------
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

systemctl restart nginx

2.重启检查语法nginx报错问题

image
修改内核参数:net.ipv4.ip_nonlocal_bind = 1

sysctl -p #生效

[root@lb01 nginx]# tail -1 /etc/sysctl.conf 
net.ipv4.ip_nonlocal_bind = 1
[root@lb01 nginx]# sysctl -p  #生效
net.ipv4.ip_nonlocal_bind = 1

[root@lb02 ~]# tail -1 /etc/sysctl.conf 
net.ipv4.ip_nonlocal_bind = 1
[root@lb02 ~]# sysctl -p  #生效
net.ipv4.ip_nonlocal_bind = 1

再重启就可以了

[root@lb01 nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 nginx]# systemctl restart nginx

3.内核参数修改了哪些内容

net.ipv4.ip_nonlocal_bind = 1

[root@lb01 nginx]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
[root@lb01 nginx]# #cat /proc/sys/net/ipv4/ip_nonlocal_bind 
[root@lb01 nginx]# #net.ipv4.ip_nonlocal_bind = 1
[root@lb01 nginx]# cat /proc/sys/net/ipv4/ip_nonlocal_bind 
1

高可用的裂脑(脑裂)问题

image image image

while死循环语法

[root@lb02 ~]# cat /server/scripts/chk_vip.sh
#!/bin/bash
while true
do
 date
sleep 2; 
done
[root@lb02 ~]# sh /server/scripts/chk_vip.sh
Mon Jun 17 12:01:19 CST 2019
Mon Jun 17 12:01:21 CST 2019
Mon Jun 17 12:01:23 CST 2019
Mon Jun 17 12:01:25 CST 2019
Mon Jun 17 12:01:27 CST 2019
Mon Jun 17 12:01:29 CST 2019
Mon Jun 17 12:01:31 CST 2019

相关文章

网友评论

      本文标题:keepalived-高可用

      本文链接:https://www.haomeiwen.com/subject/rdibfctx.html