设为首页 收藏本站
查看: 1302|回复: 0

[经验分享] Centos7-Lvs+Keepalived架构

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-30 10:45:31 | 显示全部楼层 |阅读模式
介绍
1、  LVS
LVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

2、  keepalived
Keepalived 是运行在lvs 之上,是一个用于做双机热备(HA)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。

运行原理
keepalived通过选举(看服务器设置的权重)挑选出一台热备服务器做MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可通过该ip访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的keepalived crash等),keepalived会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做MASTER并分配同样的虚拟IP,充当前一台MASTER的角色。

选举策略
选举策略是根据VRRP协议,完全按照权重大小,权重最大(0~255)的是MASTER机器,下面几种情况会触发选举。
1. keepalived启动的时候;
2. master服务器出现故障(断网,重启,或者本机器上的keepalived crash等,而本机器上其他应用程序crash不算);
3.有新的备份服务器加入且权重最大。

配置实例

lvs_vip:172.16.10.188
lvs1+keepalived主:172.16.10.102
lvs2+keepalived备:172.16.10.142
nginx1:172.16.10.162
nginx2:172.16.10.167

安装ipvsadm和keepalived
1
# yum -y install ipvsadm keepalived




修改keepalived主的配置
1
# vim/etc/keepalived/keepalived.conf



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
global_defs{
notification_email{
               ******@163.com         #报警接收人,多个写多行
        }
        notification_email_from ******@163.com    #报警发件人
        smtp_server smtp.163.com   #发送email时使用的smtp服务器地址
        smtp_connect_timeout 30   #smtp超时时间
        router_id LVS1      #表示运行keepalived服务器的一个标识,发邮件时显示在邮件主题的信息
}
#不使用SYNCGroup的话,如果路由有2个网段,一个内网,一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,VRRP会认为自己是健康的,则不会发送Master和Backup的切换,从而导致问题,SyncGroup可以把两个实例都放入SyncGroup,这样的话,Group里任何一个实例出现问题都会发生切换
vrrp_sync_grouptest {     
group{
        loadbalance
}
}

vrrp_instanceloadbalance {
        state MASTER          #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
        interface eno16777736   #指定HA监测网络的接口
        lvs_sync_daemon_inteface eno16777736    #负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线
        virtual_router_id 38    #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
        priority 100    #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
        advert_int 5   #定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication{
        auth_type PASS   #设置验证类型,主要有PASS和AH两种
        auth_pass 1111   #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress{
        172.16.10.188   #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
}
}

virtual_server172.16.10.188 80 {     #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
        delay_loop 6    #设置运行情况检查时间,单位是秒
        lb_algo rr    #设置负载调度算法,这里设置为rr,即轮询算法
        lb_kind DR   #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
        #persistence_timeout 20   #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
        protocol TCP   #指定转发协议类型,有TCP和UDP两种
        real_server 172.16.10.162 80 {    #配置服务节点1,需要指定realserver的真实IP地址和端口,IP与端口之间用空格隔开
        weight1   #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高
        TCP_CHECK {
        connect_timeout 3   #表示3秒无响应超时
        nb_get_retry 3   #表示重试次数
        delay_before_retry 3  #表示重试间隔
}
}
        real_server 172.16.10.167 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
}
}
}

virtual_server172.16.10.188 443 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        #persistence_timeout 20
        protocol TCP
        real_server 172.16.10.162 443 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
}
}
        real_server 172.16.10.167 443 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
}
}
}




修改keepalived备的配置
基本都和主一样,只需要修改几处
1
2
3
stateBACKUP
priority99
router_idLVS2




在两台lvs服务器上开启路由转发功能
1
2
3
# vim/etc/sysctl.conf
net.ipv4.ip_forward= 1
# sysctl-p




添加realserver ip地址
1
2
3
4
5
6
# ipvsadm-A -t 172.16.10.188:80 -s rr
# ipvsadm-a -t 172.16.10.188:80 -r 172.16.10.162:80 -w 1
# ipvsadm-a -t 172.16.10.188:80 -r 172.16.10.167:80 -w 1
# ipvsadm-A -t 172.16.10.188:443 -s rr
# ipvsadm-a -t 172.16.10.188:443 -r 172.16.10.162:443 -w 1
# ipvsadm-a -t 172.16.10.188:443 -r 172.16.10.167:443 -w 1




查看
1
# ipvsadm-l




启动服务
1
2
# systemctlstart keepalived
# systemctlenable keepalived




ipvsadm脚本
1
# vim /etc/init.d/ipvsadm



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash
#
#LVS script for VS/DR
#
#./etc/rc.d/init.d/functions
#
VIP=172.16.10.188
RIP1=172.16.10.162
RIP2=172.16.10.167
PORT1=80
PORT2=443
Algorithm=rr
Weight=1
#
case"$1" in
start)
#Since this is the Director we must be able to forward packets
#只是临时修改,重启机器或重启网卡失效
  echo 1 > /proc/sys/net/ipv4/ip_forward
#Clear all ipvsadm rules/services.
  /usr/sbin/ipvsadm -C
#Add an IP virtual service for VIP
  /usr/sbin/ipvsadm -A -t $VIP:$PORT1 -s$Algorithm
#Now direct packets for this VIP to
#the real server IP (RIP) inside the cluster
  /usr/sbin/ipvsadm -a -t $VIP:$PORT1 -r $RIP1-g -w $Weight
  /usr/sbin/ipvsadm -a -t $VIP:$PORT1 -r $RIP2-g -w $Weight
#Add an IP virtual service for VIP
  /usr/sbin/ipvsadm -A -t $VIP:$PORT2 -s$Algorithm
#Now direct packets for this VIP to
#the real server IP (RIP) inside the cluster
  /usr/sbin/ipvsadm -a -t $VIP:$PORT2 -r $RIP1-g -w $Weight
  /usr/sbin/ipvsadm -a -t $VIP:$PORT2 -r $RIP2-g -w $Weight
  /bin/touch /var/lock/subsys/ipvsadm &>/dev/null
;;
stop)
#Stop forwarding packets
  echo 0 > /proc/sys/net/ipv4/ip_forward
#Reset ipvsadm
  /usr/sbin/ipvsadm -C
# Bringdown the VIP interface
  /usr/sbin/route del $VIP
  /bin/rm -f /var/lock/subsys/ipvsadm
  echo "ipvs is stopped..."
;;
status)
  if [ ! -e /var/lock/subsys/ipvsadm ]; then
    echo "ipvsadm is stopped ..."
  else
    echo "ipvs is running ..."
    ipvsadm -L -n
  fi
;;
*)
  echo "Usage: $0{start|stop|status}"
;;
esac




添加开机启动
1
2
3
# vim/etc/rc.d/rc.local
/etc/init.d/ipvsadmstart
# chmod+x /etc/rc.d/rc.loca




relearserver端配置(nginx)

修改内核参数
1
# vim/etc/sysctl.conf



1
2
3
4
5
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.ip_forward=0



1
# sysctl -p




配置虚拟IP地址
临时添加
1
# ifconfiglo:0 172.16.10.188 netmask 255.255.255.255 broadcast 172.16.10.188



永久添加
1
# vim /etc/sysconfig/network-scripts/ifcfg-lo:0



1
2
3
4
5
6
7
8
9
10
11
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.10.188
NETMASK=255.255.255.255




配置路由
临时添加
1
# routeadd -host 172.16.10.188 dev lo:0



永久添加
1
2
# vim /etc/sysconfig/network-scripts/route-lo:0
172.16.10.188dev lo:0




到此配置完成

测试
停止keepalived主,查看vip是否漂移到备,并测试是否可以正常访问

查看日志信息
1
# tail-f /var/log/messages




查看LVS当前设置
1
# watch ipvsadm -Ln




查看转发情况
1
# watch ipvsadm -Lnc




在测试中我发现,使用rr算法,一个用户的请求会被分发到两台nginx上,这并不是我想要的结果,大概看了一下lvs的八种算法,最后将rr替换为了sh(源地址散列),具体介绍自行百度,之后,同一个用户的请求可以被分发在同一台nginx上面了。
但是我又发现keepalived配置中有调度算法和权重,ipvsadm中也有调度算法和权重,这是不是会有冲突呢,会使用谁的算法。
经过测试,手动配置完keepalived和ipvsadm之后,例如:keepalived算法为sh,权重为3。ipvsadm算法为rr,权重为1。启动keepalived,ipvsadm-l 查看,发现算法替换为sh,权重为3。
手动将ipvsadm的配置修改,算法为rr,权重为1,keepalived不重启,ipvsadm-l 查看,配置生效,经测试,使用的是手动改动过后的配置。
所以这两个的配置要一样。

LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义
1
2
3
4
5
6
7
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询



1
2
3
4
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.




ipvsadm参数详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# ipvsadm-h
ipvsadmv1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-sscheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-bsched-flags]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -rserver-address [options]
  ipvsadm -d -t|u|f service-address -rserver-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state[--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h

Options:
  --tcp-service -t service-address  service-address is host[:port]
  --udp-service -u service-address  service-address is host[:port]
  --fwmark-service  -f fwmark         fwmark is an integer greater than zero
  --ipv6        -6                   fwmark entryuses IPv6
  --scheduler   -s scheduler         one ofrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
                                      thedefault scheduler is wlc.
  --pe            engine              alternate persistence engine maybe sip,
                                      not setby default.
  --persistent  -p [timeout]         persistentservice
  --netmask     -M netmask           persistentgranularity mask
  --real-server -r server-address   server-address is host (and port)
  --gatewaying  -g                   gatewaying(direct routing) (default)
  --ipip        -i                   ipip encapsulation (tunneling)
  --masquerading -m                   masquerading (NAT)
  --weight      -w weight            capacity ofreal server
  --u-threshold -x uthreshold        upperthreshold of connections
  --l-threshold -y lthreshold        lowerthreshold of connections
  --mcast-interface interface         multicast interface for connectionsync
  --syncid sid                        syncid for connectionsync (default=255)
  --connection  -c                   output ofcurrent IPVS connections
  --timeout                           output of timeout(tcp tcpfin udp)
  --daemon                            output of daemoninformation
  --stats                             output ofstatistics information
  --rate                              output of rateinformation
  --exact                             expand numbers(display exact values)
  --thresholds                        output of thresholdsinformation
  --persistent-conn                   output of persistentconnection info
  --nosort                            disable sortingoutput of service/server entries
  --sort                              does nothing, forbackwards compatibility
  --ops         -o                   one-packet scheduling
  --numeric     -n                   numericoutput of addresses and ports
  --sched-flags -b flags             schedulerflags (comma-separated)


--add-service     -A        add virtual service with option  
  在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器  
  --edit-service    -E        edit virtual service with options  
  编辑内核虚拟服务器表中的一条虚拟服务器记录  
  --delete-service  -D        delete virtual service  
  删除内核虚拟服务器表中的一条虚拟服务器记录  
  --clear           -C        clear the whole table  
  清除内核虚拟服务器表中的所有记录  
  --restore         -R        restore rules from stdin  
  恢复虚拟服务器规则  
  --save            -S        save rules to stdout  
  保存虚拟服务器规则,输出为-R 选项可读的格式  
  --add-server      -a        add real server with options  
  在内核虚拟服务器表的一条记录里添加一条新的真实服务器  
  --edit-server     -e        edit real server with options  
  编辑一条虚拟服务器记录中的某条真实服务器记录  
  --delete-server   -d        delete real server  
  删除一条虚拟服务器记录中的某条真实服务器记录  
  --list            -L|-l     list the table  
  显示内核虚拟服务器表  
  --zero            -Z        zero counters in a service or all services  
  虚拟服务表计数器清零  
  --set tcp tcpfin udp        set connection timeout values  
  设置连接超时值  
  --start-daemon              start connection sync daemon  
  启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采keepalived 的VRRP 功能。  
  --stop-daemon               stop connection sync daemon  
  停止同步守护进程  
  --help            -h        display this help message  
  显示帮助信息


Options:  
  --tcp-service  -t service-address   service-address is host[:port]  
  说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]  
  --udp-service  -u service-address   service-address is host[:port]  
  说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]  
  --fwmark-service  -f fwmark         fwmark is an integer greater than zero  
  说明是经过iptables 标记过的服务类型。  
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the default scheduler is wlc.  
  使用的调度算法,有这样几个选项,默认的调度算法是: wlc.  
  --persistent   -p [timeout]         persistent service  
  持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒  
  --netmask      -M netmask           persistent granularity mask  

  --real-server  -r server-address    server-address is host (and port)  
  真实的服务器[Real-Server:port]  
  --gatewaying   -g                   gatewaying (direct routing) (default)  
  指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式  
  --ipip         -i                   ipip encapsulation (tunneling)  
  指定LVS 的工作模式为隧道模式  
  --masquerading -m                   masquerading (NAT)  
  指定LVS 的工作模式为NAT 模式  
  --weight       -w weight            capacity of real server  
  真实服务器的权值  
  --u-threshold  -x uthreshold        upper threshold of connections  

  --l-threshold  -y lthreshold        lower threshold of connections  

  --mcast-interface interface         multicast interface for connection sync  
  指定组播的同步接口  
  --syncid sid                        syncid for connection sync (default=255)  

  --connection   -c                   output of current IPVS connections  
  显示LVS 目前的连接 如:ipvsadm -L -c  
  --timeout                           output of timeout (tcp tcpfin udp)  
  显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout  
  --daemon                            output of daemon information  
  显示同步守护进程状态  
  --stats                             output of statistics information  
  显示统计信息  
  --rate                              output of rate information  
  显示速率信息  
  --thresholds                        output of thresholds information  

  --persistent-conn                   output of persistent connection info  

  --sort                              sorting output of service/server entries  
   对虚拟服务器和真实服务器排序输出  
  --ops          -O                   one-packet scheduling  

  --numeric      -n                   numeric output of addresses and ports  
  输出IP 地址和端口的数字形式





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-321564-1-1.html 上篇帖子: LB集群之LVS/keepalived 下篇帖子: Linux LVS+Keepalived+Httpd配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表