Keepalived+Nginx实现高可用(HA)

      keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。下面分别介绍CentOS7下抢占模式和非抢占模式的配置方式:

例子1

1、方案规划

VIPIP主机名Nginx端口
192.168.1.210192.168.1.201nginx-0180
192.168.1.210192.168.1.202nginx-0280

两台服务器的VIP为:192.168.1.210

分别在两台WEB服务器安装nginx和keepalived: 
1、安装Nginx,请参考《Nginx源码安装》 
2、安装Keepalived,请参考《Keepalived安装与配置》 
3、防火墙添加arrp组播规则,或关闭防火墙 
1> iptables

  1. shell> vi /etc/sysconfig/iptables

  2. -A INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT

2> firewall

  1. firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

  2. firewall-cmd --reload

4、关闭selinux

  1. shell> vi /etc/sysconfig/selinux

  2. #修改:

  3. SELINUX=disabled

  4. #setenforce 0

2、抢占模式配置

编辑/etc/keepalived/keepalived.conf配置文件

1> MASTER(192.168.1.201):

global_defs {
    router_id nginx_01 #标识本节点的名称,通常为hostname
}

## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2 #每2秒检测一次nginx的运行状态
    weight -20 #失败一次,将自己的优先级-20
}

vrrp_instance VI_1 {
    state MASTER # 状态,主节点为MASTER,备份节点为BACKUP

    interface enp0s3 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口

    virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址

    mcast_src_ip 192.168.1.201 # 本机IP地址
    priority 100 # 节点优先级,值范围0~254,MASTER要比BACKUP高

    advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒

    # 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
        chk_nginx    # nginx存活状态检测脚本
    }
}

 

2> BACKUP(192.168.1.202)

global_defs {
    router_id nginx_02
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP

    interface enp0s3
    virtual_router_id 51

    mcast_src_ip 192.168.1.202
    priority 90

    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
        chk_nginx
    }
}

 

3> 创建nginx服务检测脚本

分别在主备服务器/etc/keepalived目录下创建nginx_check.sh脚本,并为其添加执行权限chmod +x /etc/keepalived/nginx_check.sh。用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备份机器上。

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /opt/nginx/sbin/nginx #尝试重新启动nginx

    sleep 2 #睡眠2秒

    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
    fi
fi

 

4> 启动keepalived服务

  1. shell> service keepalived start

  2. shell> ps -ef | grep keepalived

  3. [root@localhost ~]# ps -ef | grep keepalived

  4. root 865 1 0 23:36 ? 00:00:00 keepalived -D

  5. root 869 865 0 23:36 ? 00:00:00 keepalived -D

  6. root 870 865 0 23:36 ? 00:00:00 keepalived -D

 

如果看到如上进程信息,表示keepalived已经启动成功。下面用ip add命令查看vip绑定的情况,如下图所示: 



从上图可以看出,vip地址192.168.1.210绑定在MASTER(192.168.1.201)的enp0s3网卡上。

5> 测试故障转移

将MASTER上的keepalived停止,查看vip是否会漂移到192.168.2.202上。

停止201的keepalived服务:

  1. shell> service keepalived stop

  2. shell> ip addr


从上图可以看出,vip已经成功从201漂移到了202。此时再将201的keepalived服务启动后,由于201是MASTER,所以会将202的VIP抢占过来。

启动201的keepalived服务:

shell> service keepalived start

结果VIP又回到了201,如下图所示: 

3、非抢占模式

master从故障中恢复后,不会抢占备份节点的vip

1> MASTER(192.168.1.201):

global_defs {
    router_id nginx_01 #标识本节点的名称,通常为hostname
}


vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}


vrrp_instance VI_1 {
    state BACKUP

    interface enp0s3
    virtual_router_id 51

    mcast_src_ip 192.168.1.201
    priority 100

    advert_int 1
    nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
        chk_nginx # nginx存活状态检测脚本
    }
}

 

2> BACKUP(192.168.1.202)

global_defs {
    router_id nginx_02
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {

    state BACKUP
    interface enp0s3

    virtual_router_id 51
    mcast_src_ip 192.168.1.202

    priority 90
    advert_int 1

    nopreempt  #不争抢vip

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
        chk_nginx
    }
}

 

和非抢占模式的配置相比,只改了两个地方: 
1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip 
2> 节点的state都为BACKUP 

      两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟

 

例子2

实验目标:2台Nginx+Keepalived     2台Lamp构建高可用Web集群

规划:

  1. ng1.laoguang.me 192.168.1.22 ng1  

  2. ng2.laoguang.me 192.168.1.23 ng2  

  3. lamp1.laoguang.me   192.168.1.24 lamp1  

  4. lamp2.laoguang.me   192.168.1.25 lamp2

拓扑:

 

一.基本环境准备
ng1,ng2上安装nginx
lamp1,lamp2上构建LAMP或只安装httpd,我只安装了Httpd,这里不给大家演示了,有需要请看我的其它博文,更改lamp1,lamp2的index.html的内容分别为lamp1和lamp2,以容易区分,实际集群中内容应该是一致的,由共享存储提供。

二.ng1,ng2上安装配置keepalived
下载地址:http://www.keepalived.org/download.html
2.1 安装keepalived

  1. tar xvf keepalived-1.2.7.tar.gz  

  2. cd keepalived-1.2.7  

  3. ./configure --prefix=/usr/local/keepalived      

  4. ##可能会提示安装popt-devel包,yum即可

  5. make && make install

2.2 整理配置文件与脚本

  1. mkdir /etc/keepalived  

  2. ##keepalived默认配置文件从/etc/keepalived下读取

  3. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

  4. ##就一个二进制文件,直接拷贝过去即可,多的话就更改PATH吧

  5. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

  6. ##脚本的额外配置文件读取位置  

  7. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  

  8. ##启动脚本你懂得

  9. cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

  10. ##我们关键的keepalived配置文件

2.3 修改ng1的/etc/keepalived/keepalived.conf

! Configuration File for keepalived  

global_defs {  
  notification_email {  
    ibuler@qq.com         ##出故障发送邮件给谁  
  }    

  notification_email_from keepalived@localhost ##故障用哪个邮箱发送邮件  

  smtp_server 127.0.0.1   ##SMTP_Server IP
  smtp_connect_timeout 30 ##超时时间

  router_id LVS_DEVEL     ##服务器标识  
}  

vrrp_instance VI_1 {  
   ##状态,都为BACKUP,它们会推选Master,如果你写MASTER,它就会是Master,
   ##当Master故障时Backup会成为Master,当原来的Master恢复后,原来的Master会成为Master  
   state BACKUP            

   interface eth0       ##发送VRRP的接口,仔细看你的是不是eth0
   virtual_router_id 51  ##虚拟路由标识,同一个组应该用一个,即Master与Backup同一个
   priority 100   ##重要的优先级哦  

   nopreempt      ##不抢占,一个故障时,重启后恢复后不抢占意资源
   advert_int 1   ##同步间隔时长

   authentication {             ##认证  
       auth_type PASS            ##认证方式  
       auth_pass www.laoguang.me ##密钥
   }  

   virtual_ipaddress {  
       192.168.1.18/24 dev eth0              ##VIP  
   }  
}  

##后面的删除吧,LVS上才有用

 

 

拷贝到ng2上一份,只修改priority 90 即可

  1. scp /etc/keepalived/keepalived.conf 192.168.1.23:/etc/keepalived/

  2. ##Ng2上

  3. vi /etc/keepalived/keepalived.conf  priority 90   ##其它一致

2.4 ng1,ng2上启动keepalived

  1. service keepalived start

查看日志

  1. tail /var/log/messages  

  2. Nov 27 08:07:54 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Entering BACKUP STATE  

  3. Nov 27 08:07:54 localhost Keepalived_vrrp[41871]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]  

  4. Nov 27 08:07:54 localhost Keepalived_healthcheckers[41870]: Using LinkWatch kernel netlink reflector...  

  5. Nov 27 08:07:54 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) forcing a new MASTER election  

  6. Nov 27 08:07:55 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Transition to MASTER STATE  

  7. Nov 27 08:07:56 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Entering MASTER STATE  

  8. Nov 27 08:07:56 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) setting protocol VIPs.  

  9. Nov 27 08:07:56 localhost Keepalived_healthcheckers[41870]: Netlink reflector reports IP 192.168.1.18 added  

  10. Nov 27 08:07:56 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.18  

  11. Nov 27 08:08:01 localhost Keepalived_vrrp[41871]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.18

查看vip绑定到哪台机器上了

  1. ip addr     ##ng1上  

  2. ....省略  

  3. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000  

  4.    link/ether 00:0c:29:e8:90:0b brd ff:ff:ff:ff:ff:ff  

  5.    inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0  

  6.    inet 192.168.1.18/32 scope global eth0  

  7.    inet6 fe80::20c:29ff:fee8:900b/64 scope link  

  8.       valid_lft forever preferred_lft forever  

由此可知vip绑定到ng1上了


三,Keepalived测试

3.1 关闭ng1上的keepalived或者直接关闭ng1 查看vip转移情况

  1. service keepalived stop  

  2. ip addr  

  3. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000  

  4.    link/ether 00:0c:29:e8:90:0b brd ff:ff:ff:ff:ff:ff  

  5.    inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0  

  6.    inet6 fe80::20c:29ff:fee8:900b/64 scope link  

  7.       valid_lft forever preferred_lft forever

3.2 查看ng2上是否绑定了vip

  1. ip addr  

  2. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000  

  3.    link/ether 00:0c:29:dd:00:77 brd ff:ff:ff:ff:ff:ff  

  4.    inet 192.168.1.23/24 brd 192.168.1.255 scope global eth0  

  5.    inet 192.168.1.18/32 scope global eth0  

  6.    inet6 fe80::20c:29ff:fedd:77/64 scope link  

  7.       valid_lft forever preferred_lft forever

由此可知ip转移正常,keepalived设置成功

四.配置Nginx做反向代理

4.1 修改nginx配置文件

  1. vi /etc/nginx/nginx.conf  

  2. user  nginx nginx;   ##运行nginx的用户和组

  3. worker_processes  2; ##启动进程数

  4. error_log /var/log/nginx/error.log  notice; ##错误日志记录

  5. pid        /tmp/nginx.pid;                   ##pid存放位置

  6. worker_rlimit_nofile 65535;                  ##线程最大打开文件数,须配合ulimit -SHn使用  

  7. events {  

  8.    use epoll;                 ##工作模型  

  9.    worker_connections  65536; ##单进程最大连接数

  10. }  

  11. http {                        ##http模块      

  12.    include       mime.types;  ##包含进来

  13.    default_type  application/octet-stream; ##默认类型  

  14.    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  

  15.                      '$status $body_bytes_sent "$http_referer" '  

  16.                      '"$http_user_agent" "$http_x_forwarded_for"';  

  17. ##日志格式

  18.    access_log  /var/logs/nginx/http.access.log  main; ##访问日志

  19.    client_max_body_size 20m;  ##最大请求文件大小

  20.    client_header_buffer_size 16k; ##来自客户端请求header_buffer大小

  21.    large_client_header_buffers 4 16k; ##较大请求缓冲个数与大小

  22.    sendfile       on;                 ##内核空间直接发送到tcp队列  

  23.    tcp_nopush     on;  

  24.    tcp_nodelay    on;  

  25.    keepalive_timeout  65;    ##长连接时长  

  26.    gzip  on;                 ##启用压缩

  27.    gzip_min_length 1k;        ##最小压缩大小

  28.    gzip_buffers 4 16k;        ##压缩缓冲  

  29.    gzip_http_version 1.1;     ##支持协议  

  30.    gzip_comp_level 2;         ##压缩等级  

  31.    gzip_types text/plain application/x-javascript text/css application/xml;      ##压缩类型  

  32.    gzip_vary on;              ##前端缓存服务器可以缓存压缩过的页面

  33.    upstream laoguang.me {     ##用upstream模块定义集群与RS

  34.        server 192.168.1.24:80 max_fails=3fail_timeout=10s;   ##RS的地址,最大错误数与超时时间,超过了自动剔除  

  35.        server 192.168.1.25:80 max_fails=3fail_timeout=10s;  

  36. }  

  37. server {  

  38.        listen       80;           ##监听端口

  39.        server_name  192.168.1.18; ##servername

  40.        root   html;               ##根目录  

  41.        index  index.html index.htm; ##你懂得

  42.        #charset koi8-r;  

  43.        access_log  logs/192.168.1.18.access.log  main;  

  44.  ##这个server的访问日志

  45.        location / {    

  46.                proxy_pass http://laoguang.me;  ##反向代理

  47.                proxy_redirect off;  

  48.                proxy_set_header X-Real-IP $remote_addr;  

  49. ##真实客户ip告诉后端

  50.                proxy_set_header X-Forwarded-For Proxy_add_x_forwarded_for;  

  51.        }  

  52.        location /nginx {  

  53.                access_log off;    

  54.                stub_status on; ##状态页面

  55.        }  

  56.        error_page   500 502 503 504  /50x.html;  

  57. location = /50x.html {  

  58.            root   html;  

  59.        }  

  60.    }  

  61. }

4.2 拷贝到ng2上一份

  1. scp /etc/nginx/nginx.conf 192.168.1.23:/etc/nginx/

4.3 测试反向代理能否负载均衡

lamp1,lamp2启动httpd

  1. service httpd start

ng1重启nginx

  1. service nginx restart  

用RealIp访问测试能否轮询
http://192.168.1.22

同样测试ng2,如果都能实现负载均衡,那么继续

五.测试keepalived与nginx配合运行

现在192.168.1.18在 ng2上,        访问 http://192.168.1.18 测试能否轮询
ng2上 service keepalived stop     访问测试 http://192.168.1.18 能否轮询
关闭lamp1上的service httpd stop   访问测试http://192.168.1.18 是否会报错

到此高可用webserver构建完毕,没有单点故障,任何一点故障不影响业务。

 

例子3

前言

Keepalived 是集群管理中保证集群高可用的一个服务软件,其功能类似于 heartbeat,用来防止单点故障。 本例演示 CentOS 7 下安装和配置 Keepalived 的基本步骤。

Keepalived 是以 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)协议为实现基础的,这个协议可以认为是实现了路由器高可用的协议,将多台提供相同功能的路由器组成一个路由器组。

  1. 这里面有一个 MASTER 和多个 BACKUP;
  2. MASTER 上面有一个对外提供服务的 Virtual IP(VIP);
  3. MASTER 会发组播,当 BACKUP 收不到 VRRP 包时就认为 MASTER 宕机
  4. 这时需要根据 VRRP 优先级来选举一个 BACKUP 为 MASTER,这样就保证路由器的正常使用了。

环境说明

CentOS 7(Minimal Install)

$ cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 

本例演示环境如下

NameIP AddrDescprition
VIP10.0.0.10虚拟 IP
MASTER10.0.0.11主服务器 IP
BACKUP10.0.0.12备服务器 IP

本例安装 Nginx,使用浏览器查看效果。

步骤

步骤 1: 安装

Keepalived 可以使用 yum 直接安装,在 master 服务器和 backup 服务器执行:

$ sudo yum install keepalived

安装 Nginx, 参考 Install Nginx Binary Releases 。

步骤 2: 配置 Master 服务器

先确认网卡

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 80:18:44:e8:b3:18 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.11/24 brd 10.0.0.255 scope global em1
       valid_lft forever preferred_lft forever
    inet6 fe80::8218:44ff:fee8:b318/64 scope link 
       valid_lft forever preferred_lft forever
3: em2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 80:18:44:e8:b3:19 brd ff:ff:ff:ff:ff:ff

本例使用 em1 这块网卡。

$ sudo vi /etc/keepalived/keepalived.conf

如下配置

! Configuration File for keepalived

global_defs {
   notification_email {
     # email 接收方
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   # email 发送方
   notification_email_from Alexandre.Cassen@firewall.loc
   # 邮件服务器, smtp 协议
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id app2
   vrrp_skip_check_adv_addr
   # 使用 unicast_src_ip 需要注释 vrrp_strict,而且也可以进行 ping 测试
   #vrrp_strict 
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# vrrp实例
vrrp_instance VI_1 {
    # 指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备用服务器
    state MASTER

    # 指定网卡
    interface em1

    # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。
    # 即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    virtual_router_id 51

    # 定义优先级,数字越大,优先级越高(0-255)。
    # 在同一个vrrp_instance下,MASTER 的优先级必须大于 BACKUP 的优先级
    priority 100

    # 设定 MASTER 与 BACKUP 负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1

    # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
    unicast_src_ip 10.0.0.11
    unicast_peer {
        10.0.0.12
    }

    # 设置验证类型和密码
    authentication {
        #设置验证类型,主要有PASS和AH两种
        auth_type PASS
        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }

    #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    virtual_ipaddress {
        # 虚拟 IP
        10.0.0.10/24 brd 10.0.0.255
    }
}

# 虚拟服务器端口配置
virtual_server 10.0.0.10 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 10.0.0.11 80 {
        weight 1
    }
}

本配置中,最后设置了虚拟 IP 的 80 端口,指向了本地的 80 端口。

步骤 3: 配置 BACKUP 服务器

BACKUP 配置基本跟 MASTER 一致,主要有部分变动

$ sudo vi /etc/keepalived/keepalived.conf

注意以下几点

  1. state 角色为 BACKUP
  2. interface 为网卡的 ID,要根据机器确认
  3. virtual_route_id 要与 MASTER 一致,默认为 51
  4. priority 要比 MASTER 小
  5. unicast_src_ip 要设置正确,组播地址设置之后,要注释 vrrp_strict 选项

变动如下

! Configuration File for keepalived

...
...

# vrrp实例
vrrp_instance VI_1 {
    # 指定 keepalived 的角色,BACKUP 表示此主机是备用服务器
    state BACKUP 

    # 确认网卡的 ID
    interface em1 

    # 即同一vrrp_instance下,MASTER 和 BACKUP 必须是一致的
    virtual_router_id 51 

    # 比 MASTER 小
    priority 99 

    ...
    ...
    # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
    unicast_src_ip 10.0.0.12
    unicast_peer {
        10.0.0.11
    }
    ...
    ...
}

# 虚拟服务器端口配置
virtual_server 10.0.0.10 80 {
    ...
    ...

    real_server 10.0.0.12 80 {
        weight 1
    }
}

步骤 4: 配置并启动服务

配置 IP 转发

$ sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
$ sudo sysctl -p

防火墙添加规则,因为 VRRP 使用 224.0.0.18 这个组播地址

$ sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
success
$ sudo firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
success
$ sudo firewall-cmd --reload
success

可以查看一下这两条规则

$ sudo firewall-cmd --direct --get-rules ipv4 filter INPUT
0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
$ sudo firewall-cmd --direct --get-rules ipv4 filter OUTPUT
0 --out-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

启动 MASTER 和 BACKUP 的 keepalived 服务

$ sudo systemctl start keepalived

设置开机启动

$ sudo systemctl enalbe keepalived

此时查看 MASTER 的网卡

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 80:18:44:e8:b3:18 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.11/24 brd 10.0.0.255 scope global em1
       valid_lft forever preferred_lft forever
    inet 10.0.0.10/24 brd 10.0.0.255 scope global secondary em1
       valid_lft forever preferred_lft forever
    inet6 fe80::8218:44ff:fee8:b318/64 scope link 
       valid_lft forever preferred_lft forever
3: em2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 80:18:44:e8:b3:19 brd ff:ff:ff:ff:ff:ff

可以发现 MASTER 服务器的 em1 网卡上多了 10.0.0.10 这个虚拟 IP 地址。

漂移规则如下:

  1. 默认使用 MASTER 服务器(10.0.0.11),虚拟 IP 为 10.0.0.10,此时 MASTER 服务器会有 2 个IP。
  2. 当 MASTER 出问题时,IP 会漂移到 BACKUP 服务器(10.0.0.12),此时 BACKUP 服务器会有 2 个IP。
  3. 当 MASTER 重新启动后,虚拟 IP 又会漂移回 MASTER 服务器。

步骤 5: 服务测试

查看 IP 的变化可用如下命令(MASTER 和 BACKUP 都在线):

在 MASTER 服务器上执行

$ sudo tcpdump -i em1 vrrp -n
02:16:07.739305 IP 10.0.0.11 > 10.0.0.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
02:16:08.740362 IP 10.0.0.11 > 10.0.0.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
02:16:09.741401 IP 10.0.0.11 > 10.0.0.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
...
...

这表明 MASTER 在向 BACKUP 广播,MASTER 在线。此时虚拟 IP 时挂在 MASTER 上的,如果想退出, 按 Ctrl+C

如果 MASTER 停止 keepalived,虚拟 IP 会漂移到 BACKUP 服务器上。
我们可以测试一下:

首先,停止 MASTER 的 keepalived

$ sudo systemctl stop keepalived

然后,在 MASTER 服务器上查看 VRRP 服务

$ sudo tcpdump -i em1 vrrp -n
02:19:08.874676 IP 10.0.0.12 > 10.0.0.11: VRRPv2, Advertisement, vrid 51, prio 99, authtype simple, intvl 1s, length 20
02:19:09.875710 IP 10.0.0.12 > 10.0.0.11: VRRPv2, Advertisement, vrid 51, prio 99, authtype simple, intvl 1s, length 20
02:19:10.876742 IP 10.0.0.12 > 10.0.0.11: VRRPv2, Advertisement, vrid 51, prio 99, authtype simple, intvl 1s, length 20
...
...

这表明 MASTER 收到 BACKUP 的广播,此时虚拟 IP 时挂在 BACKUP 服务器上。

步骤 6: 配置日志

注意

此配置为可选步骤。

keepalived 默认将日志输出到系统日志/var/log/messages中,因为系统日志很多,查询问题时相对麻烦。

我们可以将 keepalived 的日志单独拿出来,这需要修改日志输出路径。

修改 Keepalived 配置

$ sudo vi /etc/sysconfig/keepalived

更改如下:

# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-D -d -S 0"

把 KEEPALIVED_OPTIONS=”-D” 修改为 KEEPALIVED_OPTIONS=”-D -d -S 0”,其中 -S 指定 syslog 的 facility

修改 /etc/rsyslog.conf 末尾添加

$ sudo vi /etc/rsyslog.conf 
local0.*                                                /var/log/keepalived.log

重启日志记录服务

$ sudo systemctl restart rsyslog

重启 keepalived

$ sudo systemctl restart keepalived

此时,可以从 /var/log/keepalived.log 查看日志了。

结论

本文演示了 CentOS 7 下 Keepalived 的安装,配置虚拟 IP 地址,,启动服务等。

参考资料

keepalived实现双机热备
centos7 keepalived以及防火墙配置
Keepalived日志

 

转自:https://qizhanming.com/blog/2018/05/17/how-to-config-keepalived-on-centos-7

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值