zeromax 发表于 2018-12-30 06:10:50

keepalived实现lvs双主架构及状态切换的通知

  理论部分:
  keepalived:为lvs开发的(director: HAipvs rules, health check),能够为LVS生成规则,并检测后部real server的健康状态。主要是在两个或多个节点上实现vrrp协议选举机制。主节点称为Master,从节点称为Backup。它也可以为其它服务做高可用。
  
  vrrp 虚拟冗余路由协议 (virtual redundent routing protocol),在两台或多台设备上配置同一个虚拟IP地址和虚拟MAC地址,在实际工作时,这些设备根据某种法则选举出一个主设备,当主设备故障时,其它设备会再根据某种法则选举出另一个主设备。这样在一台节点挂掉后,会有从节点设备顶上,就实现了路由设备的高可用。客户端需要把网关配置成虚拟IP就可以。
  Keepalived在配置好所的节点同时启动时,所有节点都工作在从节点模式,这时都无法响应请求,所有节点会根据事先定义的优先级来计算出那个节点是主节点。优先级从1到255间的数值,数据越大优先级越高。当选举了主节点后,主节点才可以响应用户的请求。不过只有主节点才可以响应用户的请求。在选举主节点的过程中,如果大家的优先级一样,就会根据各自的IP来比较,IP大的优先级高。选举出主节点后,主节点会每隔一定的时间向其它备节点通告心跳信息,通告时会带有优先级。从节点在收到通告后,会拿到通告中的优先级和自己的优先级做比较,一但发现自己的优先级比心跳信息中的优先级高,就会取而代之成为主节点。当挂掉的主节点重新上线,这时是否会把主节点抢过来,就需要事先定义Keepalived是否为抢占模式preempt 抢占模式和nopreempt 非抢占模式。在虚拟IP切换时会有切换时间,切换过程中会造成无法响应客户端的请求。因为一个虚拟IP同时只能让一台设备工作,从设备只能做备份,为了让从也备也分摊一部分流量可以做多组虚拟IP。每个设备都是主节点,所有节点间相互做备份。每组虚拟路由间用虚拟路由器标示(VRID)。VRID用数据标识,1到255之间的数字。
  Keepalived软件的组件
  IPVS:用来和ipvs接口交互的工具,为ipvs应用生成的规则。
  NETLINK:通过NETLINK组件来配置网络接口,和监控网络接口。
  IPVS wrapper:为ipvs生成规则,并借助Checkers监视后端的real server。
  Nnetlink Reflector:向其它节点发送通告信息
  VRRP Stack:Keepalived的VRRP实现
  Checkers:用来为ipvs生成的规则中的各real server健康状态检测的。可以基于tcp检测,可以根据应用层协议检测。
  WatchDog:用来检测Keepalive各个工作组件的健康状态。各个组件会每隔一定的时间向WatchDog通告下自己,如果长时间没有收到通告,WatchDog会重启这个没有发送通告的组件。它存在的主要是用来实现不会因为Keepalived内部问题导致集群不正常。
  

  Keepalived 是一个轻量级调度器,适用场景:lvs , nginx代理,haproxy代理。
  

  节点的状态:
  master      主节点状态
  backup      从状态
  Initialized初始化状态,keepalived服务刚启动时的状态。
  -------------------------------------------------------------------------------------------
  操作部分
  -------------------------------------------------------------------------------------------
  实验拓扑图
http://blog.运维网.com/e/u261/themes/default/images/spacer.gifhttp://s3.运维网.com/wyfs02/M00/49/DE/wKiom1Qc_mii0qPQAAHEO_5QUxY750.jpg
  实验环境:
  1,4台服务器操作系统为centos6.5。
  2,两台webserver为httpd,使用yum安装。并且测试可以正常访问web服务。
  3,两台lvs节点keepalived使用yum安装。
  4,lvs使用dr模式工作。
  5,客户机是一台win8。
  6,每个lvs节点定义sorry server为本机。
  实验目标:
  1,使用keepalived实现lvs的高可用,并且监测后端real server的健康状态。
  2,了解keepalived的工作原理和适用场景。
  -------------------------------------------------------------------------------------------
  配置大体过程:
  1,为两台web服务器安装启动httpd服务,并配置vip。
  2,为两台lvs服务器安装并配置keepalived。
  3,测试各个配置是否正常工作

  4,为两台keepalived配置状态切换后的报警机制

  -------------------------------------------------------------------------------------------
  首先保证两台服务器web访问正常,sorry server也可以正常作。
  为两台web服务器分别配置vip,先定义linux内核对于arp协议的响应方式。

# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore            
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce  配置虚拟ip,并且指定请求是那个Ip,响应时就使用那个ip响应。
# ifconfig lo:0 192.168.1.16 netmask 255.255.255.255 broadcast 192.168.1.16
# ifconfig lo:1 192.168.1.18 netmask 255.255.255.255 broadcast 192.168.1.18
# route add -host 192.168.1.16 dev lo:0 # route add -host 192.168.1.18 dev lo:1      注意: 为了重启后配置生效,需要把这些写到配置文件中。或都写一个脚本,开机自动设定配置信息也可。
  为两台lvs服务器分别安装keepalived,并且编辑配置文件。
# yum -y install keepalived  第一个lvs的主配置文件内容如下。
! Configuration File for keepalived
global_defs {
   notification_email {
admin@wukui.com
   }
   notification_email_from lvsadmin@wukui.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DIRECTOR
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 1
    priority 99
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
192.168.1.16/24
    }
}
virtual_server 192.168.1.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0
    real_server 172.16.2.10 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
    real_server 172.16.2.17 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 2
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
192.168.1.18/24
    }
}
virtual_server 192.168.1.18 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 1
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0
    real_server 172.16.2.10 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
    real_server 172.16.2.17 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
}第二个lvs节点配置内容如下
! Configuration File for keepalived
global_defs {
   notification_email {
admin@wukui.com
   }
   notification_email_from lvsadmin@wukui.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DIRECTOR
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
192.168.1.16/24
    }
}
virtual_server 192.168.1.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0
    real_server 172.16.2.10 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
    real_server 172.16.2.17 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 2
    priority 99
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
192.168.1.18/24
    }
}
virtual_server 192.168.1.18 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 1
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0
    real_server 172.16.2.10 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
    real_server 172.16.2.17 80 {
      weight 1
      HTTP_GET {
            url {
            path /
      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
      }
    }
}LVS两台节点配置好Keepalived后分别启动。启动命令:
# service keepalived start       注:keepalived启动后的详细工作日志都记录在/var/log/messages中。可以使用tail -f /var/log/messages 监视。
keepalived启动后开启做相应的测试工作:    1,关闭其中一台keepalived服务,到另一台节点上查看是否把资源转移到了本机上。查看方法:      使用:ip addr show 命令来查看vip是否配置在本地,或查看日志的详细记录    2,在客户端浏览器分别访问 192.168.1.16 和 192.168.1.18 ,确定可以访问到。按上面的配置,lvs负载均衡有持久会话,所以大概在一分钟以内同一个客户端会一直打开一个real server的页面。    3,把后端所有real server 服务器的httpd进程关闭,然后再访问vip,测试 sorry server是否可以正常工作。
在上面的配置中还没有加入keepalived主从切换或都出现错误的报警通知。需要再两台节点的主配置文件中每个实例中加入以下配置。这个配置根据实际情况是否需要来配置。很多情况下,监控软件定义发送邮件报警级别设置不当,导致我们运维人员收到的邮件过多,看不过来还不如不报警呢!下面为示例:vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 2
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      192.168.1.18/24
    }
    notify_master "/bin/echo '节点1状态切换到master' | mail -s '节点1状态切换' root@localhost"
    notify_backup "/bin/echo '节点1状态切换到backup' | mail -s '节点1状态切换' root@localhost"
    notify_fault "/bin/echo '节点1状态切换到fault' | mail -s '节点1状态切换'root@localhost"
}    测试,在命令行中使用mail命令查看邮件是否收到。这里只是发给本机。
    根据节点状态切换可以触发某一个操作,就可以定义自己的脚本来完成很多任务,想向空间无限大!!!






  




页: [1]
查看完整版本: keepalived实现lvs双主架构及状态切换的通知