lvs模式介绍
1、DR模式【重点】
----------------------------》real server
client--------------------------》lvs----------------------------》real server
----------------------------》real server
a、dr模式是通过修改目的mac地址来进行数据包转发的
b、数据包在client的源ip是client的ip,目的ip是lvs的ip,这里叫vip
c、数据包在lvs的源ip是client的ip,目的ip是lvs的ip,这里叫vip,但是他的目的mac地址是后面real server的mac地址,这里具体要封装哪个mac地址就看负载的模式
d、数据包到real server,real server这里比较特殊,有如下特点
1、real server要可以直接访问client,或者出外网,因为dr模式不会经过lvs
2、real server是要设置vip,但是这个vip不能设置在实际的物理网口上,需要设置到loopback口上
3、real server要做arp抑制
e、数据包到real server后,real server处理后会直接转发给client,不会经过lvs
f、dr模式性能很强,realserver可以多达100台
g、不支持端口转换,也就是说你访问lvs的80端口,也只能转发到real server的80端口
2、NAT模式【很少用】
nat模式是通过修改目的ip地址来进行数据包转发的
client-------------------------------》lvs------------------------》route---------------------------》realerver{多个}
cip:vip cip:rip1 rip1:cip
a、数据包返回的时候会经过lvs,数据包的为rip1:cip,lvs会修改源ip为vip,也就是说数据包变为vip:cip,然后转发出去
b、数据包进去的时候做个DNAT,出去的时候做个SNAT
c、只需要在调度器上配置可以出外网ip,real server不需要配置可以出外网的ip
d、由于请求和响应的包都经过lvs,所以lvs会存在性能瓶颈
e、nat模式,后端的realserver最多10~20台
f、nat模式,支持端口转换,也就是说访问lvs的80端口,可以转发到realserver的8080端口
3、tunnel模式【很少用】
ip tunnel
----------------------------》real server
client--------------------------》lvs----------------------------》real server
----------------------------》real server
cip:vip cip:vip:rip1 走隧道到real server vip:cip会直接转发出去,不经过lvs
a、数据包进来走lvs,返回直接给client和dr模式一样
b、tunnel模式本身不对数据包做更改,只是在数据包进来的时候在数据包外面加个ip头,这个ip头就是real server的ip
c、在real server上解包发现目的ip是vip,默认情况下他不会解包,所有我们要在real server的loopback上配置vip,同样也要抑制arp
d、出现的时候源ip是vip。目的ip是cip,然后直接走自己的网关出去了
4、fullNAT模式【很少用】
----------------------------------------------------------------------------------------------------
lvs的调度算法
固定调度算法
rr 轮询
wrr 权重轮询
dh 目的地址hash
sh 源地址hash
动态调度算法
----------------------------------------------------------------------------------------------------
安装/配置lvs
lvs是工作在linux内核层,通过下面的命令查看服务器是否安装lvs
lsmod |grep ip_vs查看
这里需要注意,必须要先安装好keepalived,然后启动keepalived才能看到有ip_vs或者是按照好ipvsadm
1、安装keepalived
a、yum install net-snmp
b、rpm -vih /mnt/cdrom/Packages/keepalived-1.2.7-3.el6.x86_64.rpm
2、启动keepalived
[root@test1 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@test1 keepalived]# /etc/init.d/keepalived status
keepalived (pid 4531) is running...
3、查看lsmod
[root@test1 keepalived]# lsmod |grep ip_vs
ip_vs_rr 1420 3
ip_vs 115643 5 ip_vs_rr
libcrc32c 1246 1 ip_vs
ipv6 321422 142 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
3、安装ipvsadm,管理ipvs的工具
rpm -ivh /mnt/cdrom/Packages/ipvsadm-1.25-10.el6.x86_64.rpm
有如下输出就证明安装成功
[root@test3 yum.repos.d]#
[root@test3 yum.repos.d]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
4、配置一个vip
[root@test1 rpm-gpg]# ip addr add 10.87.7.195 dev eth1 label eth1:1
[root@test1 rpm-gpg]# ping 10.87.7.195
PING 10.87.7.195 (10.87.7.195) 56(84) bytes of data.
64 bytes from 10.87.7.195: icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from 10.87.7.195: icmp_seq=2 ttl=64 time=0.024 ms
[root@test1 rpm-gpg]# ifconfig
eth1 Link encap:Ethernet HWaddr FE:FC:FE:45:A2:A1
inet addr:10.87.7.190 Bcast:10.87.7.255 Mask:255.255.255.0
inet6 addr: fe80::fcfc:feff:fe45:a2a1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:76290610 errors:0 dropped:0 overruns:0 frame:0
TX packets:5689188 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10018902648 (9.3 GiB) TX bytes:1754614859 (1.6 GiB)
eth1:1 Link encap:Ethernet HWaddr FE:FC:FE:45:A2:A1
inet addr:10.87.7.195 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4126 errors:0 dropped:0 overruns:0 frame:0
TX packets:4126 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:375945 (367.1 KiB) TX bytes:375945 (367.1 KiB)
5、清空之前lvsadm的配置
ipvsadm -C
6、添加一个虚拟实例
ipvsadm -A -t 10.87.7.247:9200 -s rr
-A添加一个虚拟服务
-t 指定一个虚ip和端口
-s 指定调度算法
7、查看虚拟服务
[root@test1 nodes]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.87.7.195:9200 rr
8、添加节点
ipvsadm -a -t 10.87.7.247:9200 -r 10.87.7.190:9200 -g
-t 指定在哪个虚拟服务上添加节点
-r 指定添加的节点
-g 是默认的默认,直接路由模式
再次查看,发现190这个节点以及被挂载到195这个虚拟ip下面了
[root@test1 nodes]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.87.7.195:9200 rr
-> 10.87.7.190:9200 Local 1 0 0
9、添加其他节点
[root@test1 nodes]# ipvsadm -a -t 10.87.7.195:9200 -r 10.87.7.191:9200 -g
[root@test1 nodes]# ipvsadm -a -t 10.87.7.195:9200 -r 10.87.7.192:9200 -g
再次查看,将所有节点添加上去
[root@test1 nodes]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.87.7.195:9200 rr
-> 10.87.7.190:9200 Local 1 0 0
-> 10.87.7.191:9200 Route 1 0 0
-> 10.87.7.192:9200 Route 1 0 0
10、为虚拟服务删除节点
[root@test1 nodes]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.87.7.195:9200 rr
-> 10.87.7.190:9200 Local 1 0 0
-> 10.87.7.191:9200 Route 1 0 0
-> 10.87.7.192:9200 Route 1 0 0
[root@test1 nodes]# ipvsadm -d -t 10.87.7.195:9200 -r 10.87.7.192:9200
[root@test1 nodes]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.87.7.195:9200 rr
-> 10.87.7.190:9200 Local 1 0 0
-> 10.87.7.191:9200 Route 1 0 0
11、真实节点绑定vip并添加路由
ip addr add 10.87.7.247/32 dev lo label lo:1
route add -host 10.87.7.247 dev lo
12、在real server 上配置arp抑制
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
13、查看访问的情况
[root@test1 rpm-gpg]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.87.7.195:9200 6 21 0 1188 0
-> 10.87.7.190:9200 2 3 0 164 0
-> 10.87.7.191:9200 2 9 0 512 0
-> 10.87.7.192:9200 2 9 0 512 0
14、lvs没有健康检查功能,节点故障后,lvs会无法感知的
15、lvs配置ip包转发
echo 1 > /proc/sys/net/ipv4/ip_forward
16、设置超时设置
查看:ipvsadm -L --timeout
设置:ipvsadm --set 5 10 300
--------------------------------------------------------------------------
keepalived主要是用来监控lvs,是高可用集群
后来加入vrrp,虚拟路由冗余协议
1、failover功能,就是靠vrrp协议进行通信的
主节点工作,备节点处于备份状态,当主节点宕机,备节点接管,当主节点恢复,备节点把资源交接给主节点
2、因为他是为lvs设计的,只要在配置文件中配置,就可以实现lvs功能,所以他们非常亲密
3、keepalived可以对lvs下面的节点做健康检查
故障切换转移原理
通过vrrp协议来实现的,在正常工作的时候,keepalived的主节点周期性的不断的发送心跳消息给备节点,证明自己还活,如果备机收不到master发的心跳包,就会接管资源提供服务
vrrp协议
虚拟路由冗余协议,他的出现就是解决静态路由单点的问题
是通过竞选的机制来将任务交个某台vrrp路由器,在vrrp的路由器中可以有多台路由器,但是正常情况,就是一台工作,其他都是备节点,vrrp协议让每个路由器竞选,获胜就是master,通过优先级来确定谁是master,优先级大的就是master
master特权:要绑定ip地址,要启动一些资源,对外提供服务,响应arp请求
4、启动keepalived
[root@test2 test]# /etc/init.d/keepalived status
keepalived is stopped
[root@test2 test]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@test2 test]# /etc/init.d/keepalived status
keepalived (pid 9094) is running..
5、配置文件详解
3 global_defs {
4 notification_email {
5 [email protected]
6 [email protected]
7 [email protected]
8 }
9 notification_email_from [email protected] 邮件发件人
10 smtp_server 192.168.200.1 邮件服务器地址
11 smtp_connect_timeout 30 邮件服务器超时时间
12 router_id LVS_DEVEL serverid,在不同的keepalived服务器之间,这个id不能一样,不同的keepalived节点这个不一样
13 }
全局配置
5/6/7 keepalived出问题 告警给谁
9、邮件发件人
15 vrrp_instance VI_1 { 实例的名字,可以改,但是一般不会改
16 state MASTER 服务器的状态,仅仅是傀儡,不同的keepalived之间这个不一样
17 interface eth0 网卡
18 virtual_router_id 51 这个实例的id,可以有n多个实例,这个务必要一样
19 priority 100 vrrp的优先级,用来竞选的。对方最好比这个值小50,不同的keepalived之间这个不一样
20 advert_int 1 心跳的间隔,默认是1s
21 authentication { 服务器之间的需要通过密码来进行通信,这里不建议改
22 auth_type PASS
23 auth_pass 1111
24 }
25 virtual_ipaddress { 虚拟ip地址,就是往interface指定的网卡上绑定ip地址,可以是多个也可以是1个
26 192.168.200.16
27 192.168.200.17
28 192.168.200.18
29 }
30 }
keepalived的实例的配置或者是vrrp的实例的配置,代表一个服务
32行一下涉及到lvs,暂时不设计
32 virtual_server 192.168.200.100 443 {
33 delay_loop 6
34 lb_algo rr
35 lb_kind NAT
36 nat_mask 255.255.255.0
37 persistence_timeout 50
38 protocol TCP
39
40 real_server 192.168.201.100 443 {
41 weight 1
42 SSL_GET {
43 url {
44 path /
45 digest ff20ad2481f97b1754ef3e12ecd3a9cc
46 }
47 url {
48 path /mrtg/
49 digest 9b3a0c85a887a256d6939da88aabd8cd
50 }
51 connect_timeout 3
52 nb_get_retry 3
53 delay_before_retry 3
54 }
55 }
56 }
10、启动keepalived,查看ip地址,只能通过ip a查看,只能在一个节点上看到该ip
[root@test1 keepalived]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1:
link/ether fe:fc:fe:45:a2:a1 brd ff:ff:ff:ff:ff:ff
inet 10.87.7.190/24 brd 10.87.7.255 scope global eth1
inet 10.87.7.246/32 scope global eth1
inet6 fe80::fcfc:feff:fe45:a2a1/64 scope link
valid_lft forever preferred_lft forever
11、测试keepalived切换
a、关掉master的keepalived服务
[root@test1 keepalived]# /etc/init.d/keepalived stop
Stopping keepalived: [ OK ]
b、查看ip已经切换
[root@test2 keepalived]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1:
link/ether fe:fc:fe:29:61:b6 brd ff:ff:ff:ff:ff:ff
inet 10.87.7.191/24 brd 10.87.7.255 scope global eth1
inet 10.87.7.246/32 scope global eth1
inet6 fe80::fcfc:feff:fe29:61b6/64 scope link
valid_lft forever preferred_lft forever
c、启动master的keepalived,查看ip已经切换回去
[root@test1 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@test1 keepalived]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1:
link/ether fe:fc:fe:45:a2:a1 brd ff:ff:ff:ff:ff:ff
inet 10.87.7.190/24 brd 10.87.7.255 scope global eth1
inet 10.87.7.246/32 scope global eth1
inet6 fe80::fcfc:feff:fe45:a2a1/64 scope link
valid_lft forever preferred_lft forever
12、keepalived是监管服务器级别的故障,对于其他服务无法做到监管
我们可以自己写代码去监控服务的状态,如果服务的状态异常,则关闭keepalived服务,如果服务正常恢复,则在拉起keepalived服务