lvs+keepalived

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: 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: 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



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: 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: 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: 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: 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



12、keepalived是监管服务器级别的故障,对于其他服务无法做到监管


我们可以自己写代码去监控服务的状态,如果服务的状态异常,则关闭keepalived服务,如果服务正常恢复,则在拉起keepalived服务

 

你可能感兴趣的:(lvs+keepalived)