首页 > 代码库 > keepalived的高可用nginx和lvs实现负责均衡
keepalived的高可用nginx和lvs实现负责均衡
keepalived
VRRP协议
VRRP(virtual route Redundancy Protocol),虚拟路由冗余协议。因为每个设备的都只有一个默认网关指向,一旦这个默认指向的网关处理问题。我们就需要重新设定默认网关的指向。VRRP就是解决这个问题出现,VRRP协议是将一组路由划分起来。在这组路由器中只设置一个虚拟IP和虚拟MAC地址,然后根据设定的规则在这组路由器中转移。每个路由器都有各自网卡和IP地址,同时在主路由上有VIP(飘移IP)。在这组路由中,通过投票选举的方式选出主路由。在故障工作过程中会一直向备用路由器通过组播方式发送自己健康工作的信息,一旦主路由出现故障,健康信息不会在发送。这是备用路由就会将VIP启用起来,同时发送一条免费IP报文,并且采取自发自应的方式。宣告自己获取IP,这样在后端其他主机不知情的情况下,完成了IP漂移。
术语 | 解释 |
---|---|
VRID | virtual router ID,虚拟路由标识。 |
MASTER | 虚拟路由器中承担报文转发的任务的路由器。 |
BACKUP | MASTER路由器出现问题,能够代替MASTER主机承担报文转发任务的路由器。 |
虚拟IP地址 | 一个虚拟路由器可以有一个或者多个虚拟IP地址。 |
虚拟MAC地址 | 一个虚拟路由器只有一个MAC地址,虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。 |
优先级 | VRRP根据优先级来确定虚拟路由器中每台路由器的地位 |
非抢占方式 | 如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障, Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器。一旦MASTER出现问题,BACKUP承担分发任务后,即使MASTER主机恢复,也不会再抢回分发的任务。 |
keepalived简介
keepalive是Linux下一个轻量级的高可用方案解决。众所周知的LVS解决负载均衡的问题,但是因为Director是单主机存在。因此容易出现SPOF(sing point of failure:单点故障),因此keepalived最初的设计就是为了解决lvs的SPOF诞生的。在随后的发展过程中,keepalived又添加了VRRP(virtual router redundancy protocol),解决静态路由出现的单点故障问题,可以保证网络不间断的稳定运行。
keepalived的组成,如图所示
(1)WatchDog:检测Checker和VRRP进程。
(2)Checker:实现对服务器运行状态的检测和故障隔离。
(3)VRRP Stack:通过此模块再结合lvs负载均衡软件即可部署一个高性能的负载均衡的集群系统。
(4)IPVS wrapper:这是IPVS功能的一个实现。IPVS wrapper模块可以讲设置好的IPVS规则发送到内核空间,并提交给IPVS模块,最终实现IPVS模块的负载均衡功能。
(5)Netlink Reflector:用来实现高可用集群中的Failover时虚拟IP(VIP)的设置和切换。Netlink Reflector的所有请求最后都发送到内核空间层Netlink模块完成。
keepalived的安装的及配置文件详解
1.yum 安装
从CentOS 6.4开始keepalived被红帽官方收入之yum原base仓库。之前在epel源中。yum install -y keepalived
2.源码编译:
#需现在http://www.keepalived.org上获取源码。 tar xf keepalived-1.2.24.tar.gz ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/3.10.0-327.36.2.el7.x86_64/#因为lvs是工作在内核当中,keepalived中的lvs功能就需要读取内核源码的头文件。若不需要使用lvs功能此选项,省略即可。make&&make install
3.配置文件
/etc/keepalived/keepalived.conf
配置文件分为全局配置段,VRRPD配置段,LVS配置段。
全局配置段如下:
global_defs { notification_email { admin@example1.com ... } notification_email_from admin@example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id my_hostname vrrp_mcast_group4 224.0.0.18 vrrp_mcast_group6 ff02::12 enable_traps } notification_email #用于设置报警邮箱地址,可以设置多个每行一个。 notification_email_from #设置用于发送报警的邮箱地址。 smtp_server 127.0.0.1 #用于设置邮箱的IP地址 smtp_connect_timeout 30 #用于设置连接smtp server 的超时时间。 router_id #表示运行keepalived服务器的一个标识,是发送邮件时显示在邮件主机中的信息
VRRP设置段
vrrp_sync_group VG_1 { group { inside_network outside_network ... }n notify_master /path/to_master.sh notify_backup /path/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/notify.sh smtp_alert }group #同步组,此项功能不常用。notify_master #指定Keepalived进入MASTER状态时执行的脚本。notify_backup #指定Keepalived进入backup状态时执行的脚本。notify_falut #指定Keepalived进入fault状态时执行的脚本。notify_stop #指定Keepalived程序终止状态时执行的脚本。vrrp_instance <String> { state MASTER|BACKUP 当前节点在此虚拟路由器中的初始状态; interface eth0 VRRP实例工作的网络接口 virtual_router_id 虚拟路由器ID,范围0-255 priority 100 当前物理节点在此虚拟路由器中的优先级 advert_int # 用于设定MASTER与BACKUP主机之间同步检查的时间间隔,单位是秒。 mcast_src_ip 用于设置发送多播包的地址,若不设置,将使用interface设置的网卡的接口的IP地址。 garp_master_delay 用于设定在切换到MASTER状态后延时进行Gratuitous arp请求 track_interface 用于设定一些额外的网络监控接口,其中任何一个接口出现故障,keepalived都会进入fault状态。 authentication{ 认证方式 auth_type PASS 简单密码 auth_pass 1111 (改为随机,字符串.不能超过8位,openssl rand -hex 4 ) } virtual_ipaddress{(定义虚拟IP) 192.168.200.16 (虚拟路由IP,VIP,) 格式: <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> } nopreempt 非抢占模式 preempt_delay 抢占延迟,用于设置抢占延迟的时间,单位为秒。
Virtual server参数
virtual_server #设置虚拟服务器开始的标识,后面接虚拟IP地址和服务端口,IP与端口用空格隔开。lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义负责均衡调度方法delay_loop <INT> #定义服务轮询时间间隔lb_kind NAT|DR|TUN persistence_timeout <INT> #持久连接时长,有了这个功能,用户的请求会一直分发到某个服务节点persistence_granularity #此选项配合persistence_timeout一同使用,表示持久连接的粒度。默认为255.255.255.255,如果改为255.255.255.0,那么客服端IP所在的整个网段的请求都会分配到同一个Real Serverprotocol TCP #服务协议ha_suspend #节点从MASTER切换到BACKUP时,暂时不启用Real Server节点的健康检查。virtualhost 在通过HTTP_GET/SSL_GET做健康检测时,指定的Web服务器的虚拟主机地址。 sorry_server <IPADDR> <PORT> #所有RS均故障时,提供say sorry的服务器;real_server <IPADDR> <PORT>{ weight #权重 inhibit_on_failure:表示再real server节点失效后,把它的weight值设置为0,而不是从IPVS中删除。 notify_up <STRING>|<QUOTED-STRING> #当前节点上线调用的通知脚本 notify_down <STRING>|<QUOTED-STRING> #当前节点离线时调用的通知脚本 #HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK #支持的所有健康状态检测方式 HTTP_GET|SSL_GET { url { path <STRING> #健康状态检测时请求的资源的URL digest <STRING> #基于获取内容摘要码进行健康状态判定 status_code <INT> #基于状态码进行健康状态判定 } nb_get_retry <INT> #尝试的次数delay_before_retry <INT> #两次尝试之间的时间间隔connect_ip <IP ADDRESS> #向此处指定的地址发测试请求connect_port <PORT> #向此处指定的端口发送测试请求bindto <IP ADDRESS> #指定测试请求的源IP bind_port <PORT> #指定测试请求的源PORT connect_timeout <INTEGER> #连接的超时时长}
HTTP_GET和SSL_GET检测方式中参数解释
url #用来指定HTTP/SSL检查的url信息,可以指定多个URL。path #后面跟具体的URL路径digest #SSL检查摘要信息,这些摘要信息可以通过genhash命令获取。 #e.g. genhash -s 192.168.32.130 -p 80 -u /index.htmlstatus_code #指定HTTP检查返回正常状态码的类型。一般为200bindto #表示通过此地址来发送请求对服务起进行检查。
实验:
HA Cluster的配置前提: (1) 各节点时间必须同步; ntp, chrony (2) 确保iptables及selinux不会成为阻碍; (3) 各节点之间可通过主机名互相通信(对KA并非必须); 建议使用/etc/hosts文件实现; (4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)
1.单主模型
主机名 | 主机 | IP | 模式 | VIP |
---|---|---|---|---|
node1 | centos 6.8 | 192.168.32.21 | MASTEP | 192.168.32.100 |
node2 | centos 6.8 | 192.168.32.23 | BACKUP | 192.168.32.100 |
[root@localhost ~]# iptables -F#做实验建议将其清楚,不影响操作.[root@localhost ~]# setenforce 0#关闭selinux[root@localhost ~]# ssh-keygen -t rsa -P ‘‘#生成公钥和私钥[root@localhost ~]# ssh-copy-id -i .shh/id_rsa.pub root@192.168.32.23#将公钥拷贝至BACKUP主机[root@localhost ~]# ntpdate 10.1.0.1;ssh root@192.168.32.23 ntpdate 10.1.0.1#这是本地的时间服务器2 Nov 20:21:27 ntpdate[2532]: adjust time server 10.1.0.1 offset 0.231396 sec2 Nov 20:21:28 ntpdate[3633]: adjust time server 10.1.0.1 offset 0.215564 sec [root@localhost ~]# hostname ;ssh root@192.168.32.23 hostnamenode1 node2#获取MASTER和BACKUP的主机名,然后修改各种的/etc/hosts文件,将名称和各自主机IP对应,便于通过主机名通信。[root@localhost ~]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.32.21 node1 node1.localdomain#添加192这行将主机名与IP对应起来[root@localhost ~]# yum install -y keepalived;ssh root@192.168.32.23 yum install -y keepalived# 安装keepalived的程序包,一下修改配置文件操作,只需要在MASTER主机上操作,然后copy至BACKUP主机上,略作修改即可[root@localhost ~]# cd /etc/keepalived/[root@localhost ~]# cp keepalived.conf{,.bak}[root@localhost ~]# vim keepalived.conf#打开配置文件很长,但是我们这里只需要配置主备模型,virtual server配置段及其以后的配置段均无用.注释或者删除掉即可.这里也不再贴出这些配置段的参数.[root@localhost keepalived]# vim keepalived.conf#前文中出现的参数这里不再解释#这里MASTER中的配置文件 notification_email { root@localhost } notification_email_from admin.keepalived@localhost.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.24.18 #发送组播地址,默认配置文件没有,需要自行添加} vrrp_instance node1 { state MASTER interface eth3 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 04d5479b #小于等于8位的密钥,可以用#openssl rand -hex 8 } virtual_ipaddress { 192.168.32.100 } } [root@localhost keepalived]# scp 192.168.32.23:/etc/keepalived/keepalived.conf# 1.修改其中的state为BACKUP# 2.修改priority的值,不能让两个优先级别一致# 3.修改当前使用的interface
实验结果图,先启用的BACKUP主机,然后启动的MASTER主机,vip地址会从BACKUP的主机飘逸到MASTER主机上。其他故障检测操作这里就不上图片。
2.主主模型
1.主备模式存在一个缺点就浪费一台主机作为备用主机。因此我们可以用主主模型.
2.主主模型就是用两台主机,一台主机作为另外一台主机备用主机。这样两台主机都是各自的调度地址的MASTER就不会存在资源浪费的情况,同时也实现了高可用.
主机名 | 系统 | IP | VIP1 | 模式 | VIP2 | 模式 |
---|---|---|---|---|---|---|
node1 | CentOS 6.8 | 192.168.32.23 | 192.168.32.100 | MASTER | 192.168.32.200 | BACKUP |
node2 | CentOS 6.8 | 192.168.32.23 | 192.168.32.100 | BACKUP | 192.168.32.200 | MASTER |
#前期环境操作及环境设置与主备模型一直,因此这里只讲主主模型的配置文件附上。
[root@localhost keepalived]# vim keepalived.conf
global_defs { notification_email { root@localhost } notification_email_from admin.keepalived@localhost.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.24.18} vrrp_instance node1 { state MASTER interface eth3 virtual_router_id 51 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 04d5479b } virtual_ipaddress { 192.168.32.100/24 dev eth3 label eth3:0 } } vrrp_instance node11 { state BACKUP interface eth3 virtual_router_id 53 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 0as5479b } virtual_ipaddress { 192.168.32.200/24 dev eth3 label eth3:1 }
}
[root@localhost keepalived]# scp 192.168.32.23:/etc/keepalived/keepalived.conf# 1.修改其中的各自备用的state为BACKUP# 2.修改priority的值,不能让两个优先级别一致# 3.修改当前使用的interface# 4.两台主机的虚拟路由地址不能一样.即virtual_router_id 不能相同。
实验结果图,先启用的BACKUP主机,然后启动的MASTER主机,vip地址会从BACKUP的主机飘逸到MASTER主机上。其他故障检测操作这里就不上图片
3.keepalived启动,停止等脚本测试。
邮件脚本实例,用主备模型进行示例。#!/bin/bash#contact=‘root@localhost‘notify(){ mailsubject="$(hostname) to be $1,vip is removed" mailbody="$(date +‘%F %T‘):vrrp transition,$(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact}case $1 inmaster) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage : $(basename $0) {master|backup|fault}" exit 2 ;;esac接下来开始调用此脚本,只需要在全局端调用脚本即可,其他配置不需要修改。切记时间同步,不然你收不到邮件。 ]# vim /etc/keepalived/keepalived.confglobal_defs { notification_email { root@localhost } notification_email_from admin.keepalived@localhost.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.24.18 notify_master "/etc/keepalived/testmail.sh master" notify_backup "/etc/keepalived/testmail.sh backup" notify_fault "/etc/keepalived/testmail.sh fault"}
4.搭建高可用的lvs。
#下面贴出的是主路由的配置,backup的配置这里也不在描述怎么修改。和前面一样。]# yum install -y ipvsadm]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from sen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19} vrrp_instance VI_1 { state MASTER interface eth3 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass d33d5328 } notify_master "/etc/keepalived/testmail.sh master" notify_backup "/etc/keepalived/testmail.sh backup" notify_falut"/etc/keepalived/testmail.sh falut" virtual_ipaddress { 192.168.32.13/24 dev eth3 label eth3:1 } } virtual_server 192.168.32.13 80 { delay_loop 3 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.32.129 80 { weight 1 HTTP_GET { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } real_server 192.168.32.128 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } [root@node2 keepalived]# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.32.13:80 rr persistent 50 -> 192.168.32.128:80 Route 1 0 20 -> 192.168.32.129:80 Route 1 0 0
5.keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
#此实验通过高可用nginx负责均衡实现,因此需要先安装或者编译nginx。编译nginx时需要启用stream模块,因为此实验是通过调用stream模块实现的。#实现此功能分为两步:(1) 先定义一个脚本;(2) 调用此脚本;#添加如下行启用nginx反向代理# vim /etc/nginx/nginx.confstream { upstream srvs { server 192.168.32.128:80; server 192.168.32.129:80; hash $remote_addr consistent; } server { listen 192.168.32.13:80; proxy_pass srvs; } } vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from sen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.19} vrrp_scripts chk_down { scripts "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -5} vrrp_script chk_nginx { script "killall -0 nginx && exit 0 || exit 1" interval 1 weight -5} vrrp_instance VI_1 { state MASTER interface eth3 virtual_router_id 51 priority 98 advert_int 1 vrrp_script chk_down vrrp_script chk_nginx authentication { auth_type PASS auth_pass d33d5328 } notify_master "/etc/keepalived/testmail.sh master" notify_backup "/etc/keepalived/testmail.sh backup" notify_falut"/etc/keepalived/testmail.sh falut" virtual_ipaddress { 192.168.32.13/24 dev eth3 label eth3:1 } }
本文出自 “11539909” 博客,请务必保留此出处http://11549909.blog.51cto.com/11539909/1869652
keepalived的高可用nginx和lvs实现负责均衡
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。