jlthlx 发表于 2018-12-30 11:09:12

ipvs

keepalived应用案例及其ipvs-dr模型原理解释



【LVS--的调度方法】
分类:静态方法:只根据调度方法本身来调度,不关心RS的负载情况来调度。
动态方法:根据调度方法本身和RS的负载状况来调度。
【 静态方法】
RR算法 : ROUND ROBIN,轮询
WRR算法:加权轮询
SH: sourcehashing源地址的hash绑定。
实现的方式:
Session:绑定方式,无冗余能力丢失客户端要重来。实现方式;负载均衡器内部有一个会话表。他可以记录一个会话信息哈希编码记录(CIP,RS)。
session服务器,把session放在后端服务器,多个服务器共用一个后端服务器,这样就会导致无冗余,因此建议使用高可用。
session复制的方式:这是把后端对台主机,实现DLTE会话复制,多台主机都有会话的COOKIE,有冗余,但是适合的节点比较少的情况。
DH算法: destination hashing;
这种情况是针对我们是客户端的情况下,我们期望可以实现连接追踪的功能。因此就必须要让我们之前从一台防火墙出去的,报文也从哪台防火墙回来。因此调度时只要director给调度到相应的防火墙,回来时自然还是那个防火墙回来。源IP是防火墙,然后再由director调度回相应的主机即可。
【动态方法】
LC: leastconnection 最少连接接数
Active 后端主机的活动连接数
Inactive:后端主机的非活动连接数
Overhead=actconn*256+lnactionn
活动连接占用的资源多,因此*256。那台后端主机得值小,就挑中那一台。
WLC:加权最少连接
Overhead=(actconn*256+lnactionn)/weighted   结果小的会被挑中
如果是相同的值,自上而下执行。
SED:short exppection delay最短期望延迟。最小的的被选中
存在问题:这种是会导致权重大的频繁被挑中,而当连接如果较少时,导致权重小的无法分担工作。
NQ:Nerver
Queue永不排队
在执行之前安装权重从大到小,先一次分一个。之后在执行SED模式。
LBLC:动态DH算法;
LBLCR: 类似于session复制的一种工作机制。
众多的算法中,系统默认的是使用WLC算法。


【LVS-DR模型的实现】
【目的】实现后端服务器负载均衡。
【特点】这是一种基于MAC地址的转换方式。
当一个客户端发起一个请求时,为了防止不经过负载均衡器,我们通过arptables,静态绑定的方式,将前端路由器强行指向我们的director。由于这是一种基于MAC地址的转换方式,因此director和RS之间必须是同一个网络内。然后由负载均衡器,直接把报文直接丢给交换机,广播对应真实主机的MAC地址。当RS打开报文时,发现目标IP是VIP,那么就会转发回给VIP,这显然不是我们希望看到的,因此我们需要在每一个RS上也配置上VIP(这样就是多台RS和负载均衡器都有VIP了,那么如何解决一个网段相同的IP冲突呢?)其实我们是把真实主机的VIP配置在lo:0上的。然后通过修改内核参数arp_ignore,arp_announce参数,限制本机被请求和自己通告的方式。这样我们就可以RS打开报文时就看到是发送给自己的报文,并且不冲突director接受外部的报文。
RS的响应:RS在响应时根据之前的IP首部(CIP,VIP),将报文返回(VIP,CIP)。因为CIP是将报文发送给VIP的,因此回应时,想让CIP能够识别,就必须使用VIP来作为源IP地址。但是我们的VIP是配置在lo:0上的无法外部通信,因此我们还需要给予真实主机设置一个内部的路由转换,强制VIP通过lo:0-->eth0转发出去。
http://s3.运维网.com/wyfs02/M00/58/E1/wKiom1S_UJvDxpHQAAFCYgHmf6c534.jpg
####################keepalive的几个常见应用的介绍##################################################

#yum install keepalived
# rpm -ql keepalived   ####查看生成的配置文件
/etc/keepalived
/etc/keepalived/keepalived.conf         ####配置文件
/etc/rc.d/init.d/keepalived               ####服务脚本
/etc/sysconfig/keepalived               #####定义脚本的选项的配置文件
/usr/sbin/keepalived                      #####二进制程序查看配置文件使用帮助的命令是:
# man
keepalived.conf
配置文件:
分成三段:
全局段:
Global definitions
      global_defs         
      # Block id
      {
               notification_email    # To:      ####定义提示信息发给的主机
               {
               admin@example1.com
               ...
               }      
notification_email_from admin@example.com    //定义由谁发
      smtp_server 127.0.0.1            # IP
      smtp_connect_timeout 30      # integer, seconds
      router_id my_hostname      # string identifying the machine,
                                     # (doesn’thave to be hostname).
      vrrp_mcast_group4 224.0.0.18 #optional, default 224.0.0.18
      vrrp_mcast_group6 ff02::12   # optional, default ff02::12
      enable_traps               # enable SNMP traps
      }静态路由的定义格式
static_ipaddress
      {
      192.168.1.1/24 dev eth0 scope global
      ...
      }
      static_routes
      {
      192.168.2.0/24 via 192.168.1.100 dev
      eth0
      ...
      }#####################################【对haproxy高可用】#############################################

[root@node3
keepalived ]# vim keepalived.conf
1 ! Configuration File for keepalived
2
3 global_defs {
4   notification_email {
5          root@node1    //通知的邮件
6          root@node3
7    }
8   notification_email_from kanotify@stu11.com####定义发送的邮件
9   smtp_connect_timeout 3
10   smtp_server 127.0.0.1
11   router_id LVS_DEVEL
12 }
13
14 vrrp_script chk_haproxy {    #####定义检测脚本
15   script "killall -0 haproxy"####成功就是在运行,这时不管它。
16    interval 1                              ####检测的间隔
17    weight -2                               ####修改的权重
18 }
19
20 vrrp_script chk_mantaince_down {   ###定义手动控制的脚本
21   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit0" ####如果有down文件,权重.
22   interval 1
23   weight -5
24 }
25
26 vrrp_instance VI_1 {                  ####定义实例
27    interface eth0
28    state MASTER                        ####主节点
29    priority 100                               ####优先级
30    virtual_router_id 110             ####虚拟路由的ID
31    garp_master_delay 1                     
32
33    authentication {                     ####通信认证
34      auth_type PASS                   #####认证类型
35      auth_pass password         #####密码
36   }
37    track_interface {                     ###追踪的网卡
38       eth0
39   }
40    virtual_ipaddress {               ###虚拟IP
41172.16.11.1/16 dev eth0 label eth0:0   ####虚拟IP/掩码 使用的设备 应用在别名上的标签
42   }
43    track_script {
44      chk_haproxy                                                 ###定义haproxy
45      chk_mantaince_down
46   }
47
48
49notify_master"/etc/keepalived/notify.sh master"   // notifiy_master是内置参数,表示如果当前状态是master
50notify_backup"/etc/keepalived/notify.sh backup"   //notify_backup 也是内置参数,表示如果当前状态是backup
51   notify_fault "/etc/keepalived/notify.sh fault"            
52 }# scp keepalived.conf director2:/etc/keepalived/
# vim keepalived.conf
StateBACKUP
priority
99########################################提供外部的服务本##########################################
# vim notify.sh   
1 #!/bin/bash
2 #
3 #
4
5 vip=172.16.11.1
6 contact='root@localhost'
7 notify() {   //这是指定的邮件格式
8   mailsubject="`hostname` to be $1:$vip floating"   //主题:主机名变成了主还是从,vip也变了。
9   mailbody="`date '+%F %H:%M:%S'`: vrrptransition, `hostname` changed to be $1"//时间,…正在转变
10   echo $mailbody | mail -s"$mailsubject" $contact      //定义发送邮件的语句
11 }
12
13 case "$1" in
14    master)
15      notify master
16      /etc/rc.d/init.d/haproxy start
17      exit 0
18    ;;
19    backup)
20      notify backup
21      /etc/rc.d/init.d/haproxy stop
22      exit 0
23    ;;
24    fault)
25      notify fault
26      /etc/rc.d/init.d/haproxy stop
27      exit 0
28    ;;
29    *)
30      echo 'Usage: `basename $0` {master|backup|fault}'
31      exit 1
32    ;;
33 esac
34chmod a+x notify.sh//一定要给脚本文件执行权限查看我们的邮件
# mail
Heirloom Mailversion 12.4 7/29/08.Type ? for help.
"/var/spool/mail/root":2 messages 2 new
>N1 root                  Wed Jan 14 21:5918/686"node3 to be master: 172.16.11.1 floating"
N2root                   Wed Jan 14 21:5918/686   "node3 to be backup: 172.16.11.1
floating"
&http://s3.运维网.com/wyfs02/M00/58/DF/wKioL1S_YfXj8_neAAHe2y4VFJs016.jpg
# mail
Heirloom Mail version 12.4 7/29/08.Type ? for help.
"/var/spool/mail/root":2 messages 2 new
>N1 root                  Wed Jan 14 21:5918/686"node3 to be master: 172.16.11.1 floating"
N2 root                  Wed Jan 14 21:5918/686   "node3 to be backup: 172.16.11.1
floating"
&  ##################################Nginx双主模式高可用####################################
节点一配置文件
[root@node1
keepalived ]# vim keepalived.conf
1 ! Configuration File for keepalived
2
3 global_defs {
4   notification_email {
5         root@node1
6         root@node3
7    }
8   notification_email_from root@node3
9   smtp_connect_timeout 3
10   smtp_server 127.0.0.1
11   router_id LVS_DEVEL
12 }
13
14 vrrp_script chk_nginx {
15    script "killall -0 nginx"
16    interval 1
17    weight -5
18 }
19
20 vrrp_script chk_mantaince_down {
21   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit0"
22   interval 1
23   weight -5
24 }
25
26 vrrp_instance VI_1 {
27    interface eth0
28    state BACKUP
29    priority 98
30    virtual_router_id 110
31    garp_master_delay 1
32
33    authentication {
34      auth_type PASS
35      auth_pass password
36   }
37    track_interface {
38       eth0
39   }
40    virtual_ipaddress {
41      172.16.11.11/16 dev eth0 label eth0:1
42   }
43    track_script {
44      chk_mantaince_down
45      chk_nginx
46   }
47    notify_master "/etc/keepalived/notify.sh master"
48    notify_backup "/etc/keepalived/notify.sh backup"
49    notify_fault "/etc/keepalived/notify.sh fault"
50 }
51 vrrp_instance VI_2 {
52      interface eth0
53      state MASTER
54      priority 100
55      virtual_router_id 111
56      garp_master_delay 1 57
58      authentication {
59          auth_type PASS
60          auth_pass adminadmin
61      }
62      virtual_ipaddress {
63          172.16.11.12/16 dev eth0 label eth0:1
64      }
65      track_script {
66          chk_nginx
67          chk_mantaince_down
68      }
69
70
71      notify_master "/etc/keepalived/notify.sh master"
72      notify_backup "/etc/keepalived/notify.sh backup"
73      notify_fault "/etc/keepalived/notify.sh fault"
74   } 节点二配置文件                              
# vim keepalived.conf
1 ! Configuration File for keepalived
2
3 global_defs {
4   notification_email {
5         root@node1
6         root@node3
7    }
8   notification_email_from root@node3
9   smtp_connect_timeout 3
10   smtp_server 127.0.0.1
11   router_id LVS_DEVEL
12 }
13
14 vrrp_script chk_nginx {
15    script "killall -0 nginx"
16    interval 1
17    weight -5
18 }
19
20 vrrp_script chk_mantaince_down {
21   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit0"
22   interval 1
23   weight -5
24 }
25
26 vrrp_instance VI_1 {
27    interface eth0
28    state MASTER
29    priority 100
30    virtual_router_id 110
31    garp_master_delay 1
32
33    authentication {
34      auth_type PASS
35      auth_pass password
36   }
37    track_interface {
38       eth0
39   }
40    virtual_ipaddress {
41      172.16.11.11/16 dev eth0 label eth0:1
42   }
43    track_script {
44      chk_mantaince_down
45      chk_nginx
46   }
47    notify_master "/etc/keepalived/notify.sh master"
48    notify_backup "/etc/keepalived/notify.sh backup"
49    notify_fault "/etc/keepalived/notify.sh fault"
50 }
51 vrrp_instance VI_2 {
52      interface eth0
53      state BACKUP
54      priority 98
55      virtual_router_id 111
56      garp_master_delay 1
57
58      authentication {
59          auth_type PASS
60          auth_pass adminadmin
61      }
62      virtual_ipaddress {
63          172.16.11.12/16 dev eth0 label eth0:1
64      }
65      track_script {
66          chk_nginx
67          chk_mantaince_down
68      }
69
70
71      notify_master "/etc/keepalived/notify.sh master"
72      notify_backup "/etc/keepalived/notify.sh backup"
73      notify_fault "/etc/keepalived/notify.sh fault"
74   }##################################外部控制添加脚本 #################################################          
[root@node1
keepalived ]# vim notify.sh
1 #!/bin/bash
2 #
3 #
4
5 vip=172.16.11.1
6 contact='root@localhost'
7 notify() {
8    mailsubject="`hostname` to be $1: $vip floating"
9    mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname`changed to be $1"
10    echo $mailbody | mail -s "$mailsubject" $contact
11 }
12
13 case "$1" in
14    master)
15      notify master
16   
17      exit 0
18    ;;
19    backup)
20      notify backup
21      
22      exit 0
23    ;;
24    fault)
25      notify fault
26      /etc/rc.d/init.d/nginx stop
27      exit 0
28    ;;
29    *)
30      echo 'Usage: `basename $0` {master|backup|fault}'
31      exit 1
32    ;;
33 esac  ###############################IPVS+KEEPALIVE实验准备如下##############################
Master172.16.11.1
Backup
172.16.249.122
Node1:
172.16.249.106
Node2:172.16.249.141
vip: 172.16.11.11
##########################前端director的高可用准备#######################################
#######################主机名解析一致###################################################
#vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4
localhost4.localdomain4
::1         localhost localhost.localdomain
localhost6 localhost6.localdomain6
172.16.0.1server.magelinux.com server
172.16.11.1 director1
172.16.249.122 director2
#scp /etc/hosts 172.16.249.122:/etc/hosts
##########################时间保持同步###################################################
#crontab -e
*/3 * * * */usr/sbin/ntpdate 172.16.0.1 &> /dev/null
# crontab -e
*/3 * * * */usr/sbin/ntpdate 172.16.0.1 &> /dev/null
##########################基于主机间无密钥通信###########################################
# ssh-keygen -P ''
# ssh-copy-id -i ~/.ssh/id_rsa.pub director1
# ssh-keygen -P ''
#ssh-copy-id -i ~/.ssh/id_rsa.pub director2http://s3.运维网.com/wyfs02/M00/58/DF/wKioL1S_VznBTh7gAACVZvgjrps716.jpg
######################配置前端使用ipvs以及keepalived高可用################################
#######################添加ipvs脚本,便于写规则##########################################
#yum -y install keepalived ipvsadm
# yum -y install keepalived ipvsadm
#####################修改节点一配置文件#################################################
# cp keepalived.conf keepalived.conf.bak
# vim keepalived.conf
1 ! Configuration File for keepalived
2
3 global_defs {
4   notification_email {#####接受邮件地址
5   root@director1
6   root@director2
7    }
8   notification_email_from admin@stu11.com发送邮件的
9   smtp_server 127.0.0.1
10   smtp_connect_timeout 30
11   router_id LVS_DEVEL
12 }
13
14 vrrp_instance VI_1 {       ###定义实例
15    state MASTER            ###主节点
16    interface eth0          ###网卡接口
17    virtual_router_id 101   ###路由ID主备必须一致
18    priority 100            ###优先级,主高于备
19    advert_int 1
20    authentication {      ###通信认证
21      auth_type PASS
22      auth_pass password###密码使用随机字符串就可以,但是主备保持一致
23   }
24    virtual_ipaddress {
25       172.16.11.11/16 brd 172.16.11.11 dev eth0 label eth0:0##虚拟IP
26   }
27 }
28
29 virtual_server 172.16.11.11 {#####定义虚拟主机
30    delay_loop 6
31    lb_algo rr                  ###rr调度算法
32    lb_kind DR                  ###lvs的DR模型
33    nat_mask 255.255.0.0
34    persistence_timeout 50
35    protocol TCP
36
37 real_server 172.16.249.106 80 {    ###后端真实主机
38      weight 1
39      HTTP_GET {                  ###HTTP协议检测
40            url {
41               path /               ###检测请求路径
42         status_code 200            ###期望回应的状态码
43            }
44            connect_timeout 3       ###超时时长
45            nb_get_retry 3          ###重试时长
46            delay_before_retry 3    ###延迟时长
47      }
48   }
49
50
51 real_server 172.16.249.141 80 {
52      weight 1
53      HTTP_GET {
54            url {
55               path /
56         status_code 200
57            }
58            connect_timeout 3
59            nb_get_retry 3
60            delay_before_retry 3
61      }
62   }
63 }
#############################复制到第二个节点,修改如下选项##########################
# mv keepalived.conf keepalived.conf.bak
#####节点二做备份
# scp keepalived.conf director2:/etc/keepalived/
# vim keepalived.conf
StateBACKUP
priority
99
###############################确保开机自动启动#####################################
# chkconfig keepalived on ;ssh director2 "chkconfig keepalived on";
# chkconfig --list keepalived;ssh director2 "chkconfig --list
keepalived"
keepalived    0:off      1:off      2:on      3:on      4:on      5:on      6:off
keepalived    0:off      1:off      2:on      3:on      4:on      5:on      6:off
################################同时启动两个节点,观察VIP ###########################
[root@director1
keepalived]# service keepalived
start;ssh director2 "service keepalived start
###############################查看VIP,以及日志主备健康状态##########################
[root@director1
keepalived]# ifconfighttp://s3.运维网.com/wyfs02/M02/58/DF/wKioL1S_V6Oi7RkLAACtNP9lw2o814.jpg
# tail /var/log/messages
Jan 21 11:53:11director1 Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Jan 21 11:53:11director1 Keepalived_healthcheckers: Using LinkWatch kernel netlinkreflector...
Jan 21 11:53:11director1 Keepalived_vrrp: VRRP sockpool:
Jan 21 11:53:11director1 Keepalived_healthcheckers: Activating healthchecker for service:80
Jan 21 11:53:12director1 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Jan 21 11:53:13director1 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Jan 21 11:53:13director1 Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Jan 21 11:53:13director1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs oneth0 for 172.16.11.11
Jan 21 11:53:13director1 Keepalived_healthcheckers: Netlink reflector reports IP172.16.11.11 added
Jan 21 11:53:18director1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs oneth0 for 172.16.11.11
########################配置主备节点之间的路由间转发###########################################
[root@director1
keepalived]# echo 1 > /proc/sys/net/ipv4/ip_forward;ssh director2 "echo1 > /proc/sys/net/ipv4/ip_forward";
[root@director1
keepalived]# echo 1 > /proc/sys/net/ipv4/ip_forward;ssh director2 "echo1 > /proc/sys/net/ipv4/ip_forward";
后端节点
vim /var/www/html/index.html
www.stu11.1.com
vim /var/www/html/index.html
www.stu11.2.com

http://s3.运维网.com/wyfs02/M00/58/E1/wKiom1S_V6DytFYLAACNLZ1kdAU498.jpg
http://s3.运维网.com/wyfs02/M01/58/DF/wKioL1S_WIzRwCRaAACamMPKjmg979.jpg
#####################为两个后端主机配置VIP和内核参数#########################################
# vim
rs.sh
1 #!/bin/bash
2    #
3    vip=172.16.11.11
4    case $1 in
5    start)
6      echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
7      echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
8      echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
9      echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
10
11      ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
12      route add -host $vip dev lo:0
13      ;;
14      stop)
15      echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
16      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
17      echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
18      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
19
20      ifconfig lo:0 down
21      route del -host $vip dev lo:0
22      ;;
23 esac
#chmod +x rs.sh
#bash -x rs.sh start
#ifconfig
lo:0      Link encap:Local Loopback
          inet addr:172.16.11.11Mask:255.255.255.255
          UP LOOPBACK RUNNINGMTU:65536
Metric:1http://s3.运维网.com/wyfs02/M02/58/E1/wKiom1S_WBGDum2TAACgEY_ELrI155.jpg
################################查看MASTER节点的IPVS规则################################
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
ProtLocalAddress:Port Scheduler Flags
-> RemoteAddress:Port         Forward Weight ActiveConn InActConn
TCP172.16.11.11:0 rr persistent 50
-> 172.16.249.106:80            Route   1   0          0      
-> 172.16.249.141:80            Route   1   0          0##################################测试结果##########################################################
http://s3.运维网.com/wyfs02/M01/58/E1/wKiom1S_WJiRNdcmAACbpJ4etxg188.jpg
http://s3.运维网.com/wyfs02/M02/58/E1/wKiom1S_WMaC2HMgAACN1Ht3iOg901.jpg




至此IPVS+KEEPALIVED高可用全部结束!!!!!!!!







页: [1]
查看完整版本: ipvs