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服務算法