lvs模式介绍
一、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这里比较特殊,有以下特色
一、real server要能够直接访问client,或者出外网,由于dr模式不会通过lvs
二、real server是要设置vip,可是这个vip不能设置在实际的物理网口上,须要设置到loopback口上
三、real server要作arp抑制
e、数据包到real server后,real server处理后会直接转发给client,不会通过lvs
f、dr模式性能很强,realserver能够多达100台
g、不支持端口转换,也就是说你访问lvs的80端口,也只能转发到real server的80端口
二、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端口
三、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,而后直接走本身的网关出去了
四、fullNAT模式【不多用】
----------------------------------------------------------------------------------------------------
lvs的调度算法
固定调度算法
rr 轮询
wrr 权重轮询
dh 目的地址hash
sh 源地址hash
动态调度算法
----------------------------------------------------------------------------------------------------
安装/配置lvs
lvs是工做在linux内核层,经过下面的命令查看服务器是否安装lvs
lsmod |grep ip_vs查看
这里须要注意,必需要先安装好keepalived,而后启动keepalived才能看到有ip_vs或者是按照好ipvsadm
一、安装keepalived
a、yum install net-snmp
b、rpm -vih /mnt/cdrom/Packages/keepalived-1.2.7-3.el6.x86_64.rpm
二、启动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...
三、查看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
三、安装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
四、配置一个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)
五、清空以前lvsadm的配置
ipvsadm -C
六、添加一个虚拟实例
ipvsadm -A -t 10.87.7.247:9200 -s rr
-A添加一个虚拟服务
-t 指定一个虚ip和端口
-s 指定调度算法
七、查看虚拟服务
[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
八、添加节点
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
九、添加其余节点
[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
十、为虚拟服务删除节点
[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
十一、真实节点绑定vip并添加路由
ip addr add 10.87.7.247/32 dev lo label lo:1
route add -host 10.87.7.247 dev lo
十二、在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
1三、查看访问的状况
[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
1四、lvs没有健康检查功能,节点故障后,lvs会没法感知的
1五、lvs配置ip包转发
echo 1 > /proc/sys/net/ipv4/ip_forward
1六、设置超时设置
查看:ipvsadm -L --timeout
设置:ipvsadm --set 5 10 300
--------------------------------------------------------------------------node
keepalived主要是用来监控lvs,是高可用集群
后来加入vrrp,虚拟路由冗余协议
一、failover功能,就是靠vrrp协议进行通讯的
主节点工做,备节点处于备份状态,当主节点宕机,备节点接管,当主节点恢复,备节点把资源交接给主节点
二、由于他是为lvs设计的,只要在配置文件中配置,就能够实现lvs功能,因此他们很是亲密
三、keepalived能够对lvs下面的节点作健康检查
故障切换转移原理
经过vrrp协议来实现的,在正常工做的时候,keepalived的主节点周期性的不断的发送心跳消息给备节点,证实本身还活,若是备机收不到master发的心跳包,就会接管资源提供服务
vrrp协议
虚拟路由冗余协议,他的出现就是解决静态路由单点的问题
是经过竞选的机制来将任务交个某台vrrp路由器,在vrrp的路由器中能够有多台路由器,可是正常状况,就是一台工做,其余都是备节点,vrrp协议让每一个路由器竞选,获胜就是master,经过优先级来肯定谁是master,优先级大的就是master
master特权:要绑定ip地址,要启动一些资源,对外提供服务,响应arp请求
四、启动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..
五、配置文件详解
3 global_defs {
4 notification_email {
5 acassen@firewall.loc
6 failover@firewall.loc
7 sysadmin@firewall.loc
8 }
9 notification_email_from Alexandre.Cassen@firewall.loc 邮件发件人
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出问题 告警给谁
九、邮件发件人
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的实例的配置,表明一个服务linux
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 }
十、启动keepalived,查看ip地址,只能经过ip a查看,只能在一个节点上看到该ip
[root@test1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
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
十一、测试keepalived切换
a、关掉master的keepalived服务
[root@test1 keepalived]# /etc/init.d/keepalived stop
Stopping keepalived: [ OK ]
b、查看ip已经切换
[root@test2 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
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: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
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
十二、keepalived是监管服务器级别的故障,对于其余服务没法作到监管
咱们能够本身写代码去监控服务的状态,若是服务的状态异常,则关闭keepalived服务,若是服务正常恢复,则在拉起keepalived服务算法