一、LVS DR模式搭建:准备工做:也是目前使用最多的模式:html
在生产环境中用的比较多的是DR模式,NAT模式有瓶颈,好在节省公网IP,对小公司来讲公网IP也是要花钱的:linux
若是采用DR模式是配置多台机器,天天机器都要配置公网IP也是要花钱的:而在当下的IP也愈来愈少:nginx
而另外一种方案:搭建内部的lvs,所有都用到内网,包括vip也用内网,用一个公网IP+80端口对内网的VIP地址+80端口作一个映射:git
准备三台机器:通常是调度器和RS均用内网的IP,而后只须要一个公网IP(VIP),而后作内网端口映射则能够了,公网的80端口映射到内网80端口:web
调度器(director):192.168.149.129算法
real server 1(RS1):192.168.149.131vim
real server 2(RS2):192.168.149.132浏览器
VIP : 192.168.149.254bash
1:首先编写调度器dir的配置脚本: /usr/local/sbin/lvs_dr.sh服务器
[root@localhost_02 ~]# vim /usr/local/sbin/lvs_dr.sh #! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发: ipv=/usr/sbin/ipvsadm vip=192.168.149.254 rs1=192.168.149.131 rs2=192.168.149.132 ifdown eth0 ifup eth0 #在此重启网卡的目的是避免重复设置命令行提供的IP: ifconfig eth0:2 $vip broadcast $vip netmask 255.255.255.255 up #绑定VIP到dir的虚拟网卡ens33:2 route add -host $vip dev eth0:2 #添加网关 $ipv -C $ipv -A -t $vip:80 -s wrr $ipv -a -t $vip:80 -r $rs1:80 -g -w 1 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1 #设置ipvsadm规则,-g=gateway:使用默认网关(DR模式)
注释:查看dr的网卡,发现vip地址绑定到eth0上面:
[root@localhost_02 ~]# ip addr 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:37:3b:d9 brd ff:ff:ff:ff:ff:ff inet 192.168.149.129/24 brd 192.168.149.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.149.254/32 brd 192.168.149.254 scope global eth0:2 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe37:3bd9/64 scope link valid_lft forever preferred_lft forever
二、配置real server(RS):须要分别在RS1和RS2上执行: /usr/local/sbin/lvs_rs.sh
[root@localhost_03 ~]# vim /usr/local/sbin/lvs_rs.sh #/bin/bash vip=192.168.149.254 #把vip绑定在lo上,是为了实现rs直接把结果返回给客户端 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 #如下操做为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端 #参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 第二RS: [root@localhost_04 network-scripts]# cat /usr/local/sbin/lvs_rs.sh #/bin/bash vip=192.168.149.254 #把vip绑定在lo上,是为了实现rs直接把结果返回给客户端 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 #如下操做为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端 #参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce [root@localhost_04 network-scripts]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.149.2 0.0.0.0 UG 100 0 0 eth0 192.168.149.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 192.168.149.254 0.0.0.0 255.255.255.255 UH 0 0 0 lo
注释:查看其路由网关地址:
注释:更改arp内核参数:参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
第二RS: [root@localhost_04 network-scripts]# cat /usr/local/sbin/lvs_rs.sh #/bin/bash vip=192.168.149.254 #把vip绑定在lo上,是为了实现rs直接把结果返回给客户端 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 #如下操做为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端 #参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
三、查看IP信息和VIP信息,发现其绑定在lo网卡上:
[root@localhost_03 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.168.149.254/32 brd 192.168.149.254 scope global lo:0 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever
四、测试,在浏览器上测试:192.168.149.254 访问页面会在RS1和RS2跳转:
注释:curl命令访问这个vip(curl测试vip在rs上不太好用的,由于在本机绑定了这个vip,如果访问vip,等于访问本身),可是直接在A机器上去访问vip会发现失败,只能再开一个虚拟机来测试,不过用 ipvsadm -ln 命令,会看到ActiveConn都会有变化,表示实验成功:
[root@localhost_02 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.149.254:80 wrr -> 192.168.149.131:80 Route 1 0 4 -> 192.168.149.132:80 Route 1 0 5
而后咱们再开一个虚拟机来测试:
[root@localhost_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@localhost_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@localhost_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@localhost_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@localhost_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@localhost_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@localhost_01 ~]# curl 192.168.149.254
注释:
arp_ignore:定义对目标地址为本地IP的ARP询问不一样的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应
4-7 - 保留未使用
8 -不回应全部(本地地址)的arp查询:
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,做出相应级别的限制: 肯定不一样程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽可能避免不在该网络接口子网段的本地地址作出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候颇有用.此时会检查来访IP是否为全部接口上的子网段内ip之一.若是改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送.
设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,若是接收的设备上面没有这个ip,就不作出响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址:
汇总:lvs不论是nat仍是dr模式,配置过程都不是很复杂,须要注意是修改内核参数,端口转发,另外NAT模式比较重要的是RS的网关要设置dir的IP地址:
二、keepalived+lvs dr模式的集合:
完整的架构须要两台角色为DR(分发器)的服务器,分别安装keepalived服务,目的实现高可用:
keepalived内置的ipvsadm功能,因此再也不须要安装ipvsadm这个包,也不用编写和执行lvs_dr.sh那个脚本了:
四台机器分别以下
dir_01:192.168.149.129
dir_02:192.168.149.130
rs_01:192.168.149.131
rs_02:192.168.149.132
一、编辑配置文件/etc/keepalived/keepalived.conf #keepalived配置文件:
两台rs上都须要执行/usr/local/sbin/lvs_rs.sh
keepalived有一个好的功能,能够在一台rs宕机时,再也不把请求转发过去:
注释:为何要在lvs中加入了keepalived功能:
1:由于lvs他又个关键角色,就是dir分发器,若是其中一台分发器挂了,那全部的访问请求都会终止,由于全部的流量入口都在分发器这里,因此须要给分发器作一个高可用,用keepalived实现高可用,而且keepalived还有负载均衡的功能:
2:在使用lvs时,若是其中一台RS挂了,lvs仍是会转发数据到这台挂了RS上,会出现没法访问的状况,而若是使用了keepalived的话,web还能正常访问的,通常会是两台keepalived的设备:
由于keepalived内置了ipvsadm功能,因此不须要在安装ipvsadm了,也不须要执行lvs_dir.sh这个脚本:
准备四台机器分别以下:
dir_01-A:192.168.149.129 (须要安装keepalived软件):
dir_02-B:192.168.149.130
rs_01:192.168.149.131
rs_02:192.168.149.132
在两台dir上A和B修改配置文件内容:/etc/keepalived/keepalived.conf #keepalived配置文件:
A机器修改配置并启动: systemctl start keepalived
dir_A机器修改配置: [root@localhost_01 ~]# cat /etc/keepalived/keepalived.conf vrrp_instance VI_1 { #备用服务器上为 BACKUP state MASTER #绑定vip的网卡为eth0,你的网卡可能不同,这里须要你改一下 interface eth0 virtual_router_id 50 #备用服务器上为90 priority 100 advert_int 1 authentication { auth_type PASS auth_pass aminglinux } virtual_ipaddress { 192.168.149.254 } } virtual_server 192.168.149.254 80 { #(每隔10秒查询realserver状态) delay_loop 10 #(lvs 算法) lb_algo wlc #(DR模式) lb_kind DR #(同一IP的链接60秒内被分配到同一台realserver) persistence_timeout 0 #(用TCP协议检查realserver状态) protocol TCP real_server 192.168.149.131 80 { #(权重) weight 100 TCP_CHECK { #(10秒无响应超时) connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.149.132 80 { weight 100 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
启动keepalived: systemctl start keepalived
[root@localhost_01 ~]# systemctl start keepalived [root@localhost_01 ~]# ps aux |grep keepalived root 1363 0.0 0.1 118652 1392 ? Ss 22:02 0:00 /usr/sbin/keepalived -D root 1364 0.0 0.3 127520 3336 ? S 22:02 0:00 /usr/sbin/keepalived -D root 1365 0.0 0.2 127388 2612 ? S 22:02 0:00 /usr/sbin/keepalived -D root 1383 0.0 0.0 112720 972 pts/0 R+ 22:05 0:00 grep --color=auto keepalived
B机器(bakup)修改配置:并启动keepalibved:
B机器修改配置: [root@localhost_02 ~]# cat /etc/keepalived/keepalived.conf vrrp_instance VI_1 { #主用服务器上为 MASTER state BACKUP #绑定vip的网卡为eth0,你的网卡可能不同,这里须要你改一下 interface eth0 virtual_router_id 50 #备用服务器上为90 priority 90 advert_int 1 authentication { auth_type PASS auth_pass aminglinux } virtual_ipaddress { 192.168.149.254 } } virtual_server 192.168.149.254 80 { #(每隔10秒查询realserver状态) delay_loop 10 #(lvs 算法) lb_algo wlc #(DR模式) lb_kind DR #(同一IP的链接60秒内被分配到同一台realserver) persistence_timeout 0 #(用TCP协议检查realserver状态) protocol TCP real_server 192.168.149.131 80 { #(权重) weight 100 TCP_CHECK { #(10秒无响应超时) connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.149.132 80 { weight 100 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
启动keepalived: systemctl start keepalived
[root@localhost_02 ~]# systemctl start keepalived [root@localhost_02 ~]# ps aux |grep keep root 2810 0.0 0.0 118608 1380 ? Ss 22:01 0:00 /usr/sbin/keepalived -D root 2811 0.0 0.1 127472 3336 ? S 22:01 0:00 /usr/sbin/keepalived -D root 2812 0.0 0.1 127340 2612 ? S 22:01 0:00 /usr/sbin/keepalived -D root 2833 0.0 0.0 112676 984 pts/0 S+ 22:06 0:00 grep --color=auto keep
二、分别启动RS_01和RS_02的nginx服务: systemctl start nginx
RS_01 [root@localhost_03 ~]# systemctl start nginx [root@localhost_03 ~]# ps aux |grep nginx root 1032 0.0 0.2 120752 2260 ? Ss 17:50 0:00 nginx: master process /usr/sbin/nginx nginx 1033 0.0 0.3 121136 3588 ? S 17:50 0:00 nginx: worker process root 1233 0.0 0.0 112676 984 pts/0 R+ 22:08 0:00 grep --color=auto nginx RS_02 [root@localhost_04 sbin]# systemctl start nginx [root@localhost_04 sbin]# ps aux |grep nginx root 1021 0.0 0.2 120752 2256 ? Ss 17:51 0:00 nginx: master process /usr/sbin/nginx nginx 1022 0.0 0.3 121136 3588 ? S 17:51 0:00 nginx: worker process root 1249 0.0 0.0 112676 984 pts/0 S+ 22:09 0:00 grep --color=auto nginx
注释:两台RS上须要执行: /usr/local/lvs_rs.sh
[root@localhost_03 ~]# vim /usr/local/sbin/lvs_rs.sh #/bin/bash vip=192.168.149.254 #把vip绑定在lo上,是为了实现rs直接把结果返回给客户端 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 #如下操做为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端 #参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
三、首先咱们查看dir_02(主keepalived)这台的机器的虚拟IP信息:发现192.168.149.254存在
[root@localhost_01 ~]# ip addr 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:81:f4:4b brd ff:ff:ff:ff:ff:ff inet 192.168.149.130/24 brd 192.168.149.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.149.254/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe81:f44b/64 scope link valid_lft forever preferred_lft forever
注释:查看规则:
[root@localhost_01 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.149.254:80 wlc -> 192.168.149.131:80 Route 100 0 0 -> 192.168.149.132:80 Route 100 0 0
注释:此时在dir_02(备keepalived)上是查询不到虚拟IP以及规则信息:而且默认状态下keeplived备机时不工做的,只有主keepalived宕机后才能工做:
测试:首先在另外一台测试机测试,而后下面测试再分两步:
[root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!!
一、测试keepalive的高可用性: 经过宕掉A(手动关闭主的keepalive服务),而后看是否会由B(Bkeepalive)服务:
断定标准:看虚拟IP是否切换到B(原备keepalive)上:
A(主keepalive)操做: 关闭keepalive服务: #systemctl stop keepalived
[root@localhost_01 ~]# systemctl stop keepalived [root@localhost_01 ~]# ps aux |grep keepalived root 1445 0.0 0.0 112720 976 pts/0 S+ 22:34 0:00 grep --color=auto keepalived
B(备keepalive)查看虚拟IP是否切换过来, 而后看到网站是否能够正常访问:
[root@localhost_02 ~]# ip addr 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:37:3b:d9 brd ff:ff:ff:ff:ff:ff inet 192.168.149.129/24 brd 192.168.149.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.149.254/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe37:3bd9/64 scope link valid_lft forever preferred_lft forever [root@localhost_02 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.149.254:80 wlc -> 192.168.149.131:80 Route 100 0 2 -> 192.168.149.132:80 Route 100 0 3
而后在测试机上测试:
[root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_01 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!!
注释:说明A(主keepalive)宕机后,虚拟IP会自动切换到B(备keepalive)上,正好验证可dr分发器的高可用,而且当访问网站时,也是分别向两台服务器发起请求,体现了负载均衡性,不影响正常的网站访问:
测试:测试业务的负载均衡性:当宕了一台RS服务(rs_03),也不会影响网站的正常访问:
RS_03:关闭nginx服务:
[root@localhost_03 ~]# systemctl stop nginx [root@localhost_03 ~]# ps aux |grep nginx root 1250 0.0 0.0 112676 984 pts/0 S+ 22:50 0:00 grep --color=auto nginx
而后再次访问:测试机上: curl 192.168.1449.254
[root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!! [root@ceshiji_01 ~]# curl 192.168.149.254 The is real server_02 !!!
注释:keepalive有一个比较好的功能,能够在一台rs宕机的时候,及时把他踢出 ipvsadm 集群,将再也不发送数据包给,也就很好的避免的访问无链接的状况发送:
注释:dir上:须要打开echo 1 > /proc/sys/net/ipv4/ip_forward //打开端口转发: