榕叶 发表于 2018-12-30 09:08:20

lvs(DR)+keepalived做一个小的负载均衡+高可用

  我用前端两台服务器做一个lvs+keepalived访问到后端的两台nginx服务器,做一个简单的小测试,这里就不用ipvsadm,直接在keepalived里面配置lvs;首先简单介绍一下lvs-DR模式的工作情况吧,客户端访问到lvs,lvs会根据后端的负载情况,更改目标mac,然后直接发给一台后端服务器,后端服务器接到后会根据本地的route表将包发出去,直接以vip为source发送给客户端,而不经过lvs,所以DR要在本地配置一个vip并将该vip作为广播地址,然后将出口指向这个vip所在接口。
http://i2.运维网.com/images/blog/201711/24/60a188f55a5150d593fe556a8a8760b6.png
  lvs01:    192.168.40.10
lvs02:    192.168.40.11
nginx01:192.168.40.12
nginx02:192.168.40.13
vip:         192.168.40.100
  首先所有的服务器都开启路由转发功能:

# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
  把前端两台安装keepalived。

# yum install -y keepalived
# yum install -y keepalived
  后端的两台nginx服务器做一个简单的处理,就把nginx服务开起来,确保网页能被访问到。
接下来直接配置keepalived文件。
1、备份keepalived配置文件:

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  2、修改keepalived配置文件:

# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
sysadmin@firewall.loc
}
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.100
}
}
virtual_server 192.168.40.100 80 {
delay_loop 3
lb_algo rr                  ##使用rr算法
lb_kind DR               ##使用DR模式
protocol TCP
real_server 192.168.40.12 80 {
weight 1
HTTP_GET {                  ##设置后端服务器的健康检查
url {
path /
status_code 200            ##检查返回值
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.40.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
  这里要注意的就是健康检查的方式,有多种检查方式,其中我用的是检查网页返回状态码,相应的健康检查要对应检查的内容,否则会容易出错。
3、做好配置文件后将它scp到另一台lvs,也就是备份,然后要把备份的配置文件内容改一下:

state BACKUP             ##状态设置为backup
interface ens33
virtual_router_id 51
priority 90                ##优先等级比master低
  4、启动keepalived,查看vip。

# ip addr sh ens33
2: ens33:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:49:e5:44 brd ff:ff:ff:ff:ff:ff
inet 192.168.40.10/24 brd 192.168.40.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.40.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe49:e544/64 scope link
valid_lft forever preferred_lft forever
  现在第一台lvs也就是master拥有了vip。
5、把后端的两台web服务器配置一下,可以直接写一个快速配置的脚本:

# cat 2.sh
#!/bin/bash
Vip1=192.168.40.100
source /etc/rc.d/init.d/functions
case $1 in
start)
echo "config vip route arp" > /tmp/lvs1.txt
/sbin/ifconfig lo:0 $Vip1 broadcast $Vip1 netmask 255.255.255.255 up
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
route add -host $Vip1 dev lo:0
;;
stop)
echo "deletevip route arp" > /tmp/lvs2.txt
/sbin/ifconfig lo:0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
route del -host $Vip1 dev lo:0
;;
*)
echo"Usage: $0 (start | stop)"
exit 1
esac
  两台后端服务器运行这个脚本:
# bash 2.sh start
这里执行start会给本地lo添加一个vip,将禁止arp广播回应,添加一个路由出口指向lo口。

# ip addr sh lo
1: lo: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.40.100/32 brd 192.168.40.100 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# route -n
Kernel IP routing table
Destination   Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.40.2    0.0.0.0         UG    100    0      0 ens33
192.168.1.0   0.0.0.0         255.255.255.0   U   100    0      0 ens37
192.168.40.0    0.0.0.0         255.255.255.0   U   100    0      0 ens33
192.168.40.1000.0.0.0         255.255.255.255 UH    0      0      0 lo
  然后直接开另一台访问一下:

# curl http://192.168.40.100
nginx01
# curl http://192.168.40.100
nginx02
# curl http://192.168.40.100
nginx01
# curl http://192.168.40.100
nginx02
  6、如果停止主的keepalived,那么vip会飘到备份上面。

# systemctl stop keepalived
# ip addr sh ens33
2: ens33:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:38:e6:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.40.11/24 brd 192.168.40.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.40.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe38:e64e/64 scope link
valid_lft forever preferred_lft forever
  这时候我将主的服务再次开启那么他会抢占vip,这样可能会导致数据的丢失:

# systemctl start keepalived
# ip addr sh ens33
2: ens33:mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:49:e5:44 brd ff:ff:ff:ff:ff:ff
inet 192.168.40.10/24 brd 192.168.40.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.40.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe49:e544/64 scope link
valid_lft forever preferred_lft foreve
  7、设置不抢占模式:

vrrp_instance VI_1 {
state BACKUP            ##设置两台keepalived都为backup或者是master
nopreempt                     ##只需要在主备的配置文件都添加,就不会抢占资源。
interface ens33
virtual_router_id 51
priority 100
  然后重启keepalived。这样就可以了。



页: [1]
查看完整版本: lvs(DR)+keepalived做一个小的负载均衡+高可用