LINUX集群架构(2)用LVS搭建负载均衡集群,用keepalived搭建高可用负载均衡集群

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/langyue919/article/details/80935197
负载均衡集群介绍


LVS介绍



LVS的调度算法

轮询就:按次序循环分配
加权轮询:按次序循环分配的同时优先分配到权重高的服务器上
最少连接分配:哪台服务器负载最少就分配给哪台
加权最少连接分配:在最少连接分配的同时,按权重比例优先分配给权重高的服务器
目标地址散列调度:根据请求的目标地址分配到指定的服务器上
源地址散列调度:根据请求的来源地址分配到指定的服务器上,一般用于就近访问CDN


LVS NAT模式搭建

三台服务器A、B、C:
A:load balancer,(调度器dir,分发器) 在虚拟机设置里添加新网卡并设为仅主机模式连接,查看IP
内网网卡:192.168.31.128,网关保持不变(192.168.31.2)
外网网卡:192.168.229.128,不用设置,重启网络即可,此地址跟网卡设置里看到的地址保持一致


setenforce 0 关闭selinux
systemctl stop firewalld 停止firewalld
systemctl disable firewalld 关闭firewalld
yum install -y iptables-services 安装iptables
systemctl enable iptables 添加iptables服务
service iptables start 启动iptables服务
iptables -F 清空iptables规则
service iptables save 保存空规则

创建LVS的NAT规则脚本
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向,开启icmp则无法将数据包转发至real server上,也无法返回
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F 清空所有规则
iptables -t nat -X 清空所有链
iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -j MASQUERADE 增加路由转发规则
# director设置ipvsadm变量
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C 清空所有规则
$IPVSADM -A -t 192.168.229.128:80 -s wlc -p 3 保持登陆时限persistent 设为0会报错
访问规则,-A指定转发模式,-t指定分发器ip, -s指定调度算法(rr,wrr,wlc,lc)-p登陆保持时限,3秒
$IPVSADM -a -t 192.168.229.128:80 -r 192.168.31.129:80 -m -w 1
转发规则,-a指定转发规则 -t指定director ip,-r指定real server ip -m指定NAT模式(masquerade) -w指定权重为1
$IPVSADM -a -t 192.168.229.128:80 -r 192.168.31.130:80 -m -w 1
转发规则,-a指定转发规则 -t指定director ip,-r指定real server ip -m指定NAT模式(masquerade) -w指定权重为1

给脚本设权
chmod 755 /usr/local/sbin/lvs_nat.sh


执行脚本
sh /usr/local/sbin/lvs_nat.sh


排错:当给主规则的登陆保持时限(persistent)设为0时,执行脚本会报错
[root@test-01 ~]# /usr/local/sbin/lvs_nat.sh
invalid timeout value `0' specified
Memory allocation problem


B:real server (web服务器) 内网网卡:192.168.31.129 网关改为129.168.31.128
安装nginx,并启动,在默认主页里写入,real server 1 关闭selinux,清空防火墙规则
C: real server (web服务器) 内网网卡:192.168.31.130 网关改为129.168.31.128
安装nginx,并启动,在默认主页里写入,real server 2 关闭selinux,清空防火墙规则


测试:
浏览器里访问192.168.229.128,(A主机外网网卡地址)多刷新几次看结果,服务器的切换。
浏览器上因为有本地缓存的原因,虽已经设定了登陆保持时限为1秒,但每次刷新都会保持在real server 2主机上。可以在调度机里用 curl 192.168.229.128 测试访问,调度算法采用rr,效果更明显。

用ipvsadm命令查看转发规则

[root@test-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.229.128:80 wlc persistent 1
-> 192.168.31.129:80 Masq 1 0 0
-> 192.168.31.130:80 Masq 1 0 0

查看iptables nat 链的转发规则
[root@test-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 26 packets, 4015 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 2 packets, 404 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 1 packets, 328 bytes)
pkts bytes target prot opt in out source destination
7 532 MASQUERADE all -- * * 192.168.31.0/24 0.0.0.0/0


LVS DR模式搭建
三台服务器A、B、C:
A:load balancer,(调度器dir,分发器)
内网网卡:192.168.31.128,网关保持不变(192.168.31.2)
外网网卡:192.168.229.128,先不用理会,这里用不到

setenforce 0 关闭selinux
systemctl stop firewalld 停止firewalld
systemctl disable firewalld 关闭firewalld
yum install -y iptables-services 安装iptables
systemctl enable iptables 添加iptables服务
service iptables start 启动iptables服务
iptables -F 清空iptables规则
service iptables save 保存空规则


创建LVS的DR规则脚本
vim /usr/local/sbin/lvs_dr.sh

写入以下内容:
echo 1 > /proc/sys/net/ipv4/ip_forward 打开路由转发
ipv=/usr/sbin/ipvsadm 设置ipvsadm变量
vip=192.168.31.200 设置公用ip变量(virtual ip)
rs1=192.168.31.129 设置real server1ip的变量
rs2=192.168.31.130 设置real server2ip的变量
ifdown ens33 关闭网卡
ifup ens33 启动网卡,目的时清空临时设定的ip,避免重复设定
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡ens33:2上
route add -host $vip dev ens33:2 为ens33:2网卡添加网关
$ipv -C 清空规则
$ipv -A -t $vip:80 -s wrr -A指定转发模式,-t指定director ip,-s指定调度算法 wrr加权轮询调度
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
指定转发规则,-a指定转发规则,-t指定调度器(director)ip,-r指定real server IP,-g指定转发模式为DR(gateway) -w指定权重
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
指定转发规则,-a指定转发规则,-t指定调度器(director)ip,-r指定real server IP,-g指定转发模式为DR(gateway) -w指定权重

给脚本设权
chmod 755 /usr/local/sbin/lvs_dr.sh

执行脚本
sh /usr/local/sbin/lvs_dr.sh

查看路由上的vip
route -n

查看网卡ens33上的vip
ip addr


B:real server (web服务器) 内网网卡:192.168.31.129 网关改回129.168.31.2
安装nginx,并启动,在默认主页里写入,real server 1 关闭selinux,清空防火墙规则

创建转发脚本
vim /usr/local/sbin/lvs_rs.sh

写入以下内容:
#/bin/bash
vip=192.168.31.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡lo:0上
route add -host $vip lo:0为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

给脚本设权
chmod 755 /usr/local/sbin/lvs_rs.sh

执行脚本
sh /usr/local/sbin/lvs_rs.sh

查看路由上的vip
route -n

查看网卡lo上的vip
ip addr


C: real server (web服务器) 内网网卡:192.168.31.130 网关改回129.168.31.2
安装nginx,并启动,在默认主页里写入,real server 2 关闭selinux,清空防火墙规则


创建转发脚本
vim /usr/local/sbin/lvs_rs.sh

写入以下内容:
#/bin/bash
vip=192.168.31.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡lo:0上
route add -host $vip lo:0为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

给脚本设权
chmod 755 /usr/local/sbin/lvs_rs.sh

执行脚本
sh /usr/local/sbin/lvs_rs.sh


查看路由上的vip
route -n

查看网卡lo上的vip
ip addr


测试:
浏览器里访问192.168.31.200,(vip:vitrual ip)多刷新几次看结果,服务器的切换。
浏览器上因为有本地缓存的原因,虽已经设定了登陆保持时限为1秒,但每次刷新都会保持在real server 2主机上。可以在调度机里用 curl 192.168.31.200 测试访问,调度算法采用rr,效果更明显。

用ipvsadm命令查看转发规则

[root@test-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.31.200:80 wrr
-> 192.168.31.129:80 Route 1 0 4
-> 192.168.31.130:80 Route 1 0 5

查看iptables nat 链的转发规则
[root@test-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 89 packets, 13284 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 40 packets, 4692 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 7 packets, 2296 bytes)
pkts bytes target prot opt in out source destination
48 3648 MASQUERADE all -- * * 192.168.31.0/24 0.0.0.0/0





Keepalived+LVS DR 实现高可用+负载均衡
由于lvs的无法监控后端的real server是否宕机,故我们采用keepalived+LVS DR的方式,来监控后端real server的服务,当real server宕机时,不再将请求转发至已经宕机的real server。由于LVS的功能已经嵌套进了keepalived软件里,故我们只需要在调度器(director)上安装keepalived即可,不用安装ipvsadm包,也不需要写lvs_dr.sh脚本,只需要写keepalived的脚本即可。


为了节省时间,这里的高可用集群我只做master主机,不做backup备用机
三台服务器A、B、C:
A:load balancer,(调度器dir,分发器)
内网网卡:192.168.31.128,网关保持不变(192.168.31.2)
外网网卡:192.168.229.128,先不用理会,这里用不到

备份之前的keepalived配置脚本(nginx高可用)
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak

清空ipvsadm规则
ipvsadm -C


创建keepalived的配置脚本
vim /etc/keepalived/keepalived.conf

写入如下内容:
vrrp_instance VI_1 {
state MASTER 角色为master
interface ens33 访问接口为ens33,vip绑定的网卡名称
virtual_router_id 51 虚拟路由id为51,须和backup保持一致
priority 100 权重为100,backup稍低一些
advert_int 1
authentication {
auth_type PASS 验证类型密码
auth_pass 123456 验证密码为123456
}
virtual_ipaddress {
192.168.31.200 vip
}
}
virtual_server 192.168.31.200 80 { 绑定访问ip及端口
delay_loop 10 每隔10秒查询realserver状态
lb_algo wlc lvs 调度算法
lb_kind DR lvs转发模式
persistence_timeout 60 登陆保持时限为60秒
protocol TCP 用TCP协议检查realserver状态

real_server 192.168.31.129 80 { reala server设置
weight 100 权重
TCP_CHECK { 用tcp协议检测
connect_timeout 10 连接超时时限为10秒
nb_get_retry 3
delay_before_retry 3
connect_port 80 连接端口80
}
}
real_server 192.168.31.130 80 { 另一台real server配置,同上
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

给脚本设权
chmod 755 /etc/keepalived/keepalived.conf

查看ipvsadm转发规则
ipvsadm -ln
[root@test-01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn


启动keepalived
systemctl start keepalived

再次查看ipvsadm规则,会发现有了转发规则
ipvsadm -ln
[root@test-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.31.200:80 wlc persistent 60
-> 192.168.31.129:80 Route 100 0 0
-> 192.168.31.130:80 Route 100 0 0
[root@test-01 ~]#

查看iptables nat 链的转发规则
[root@test-01 ~]# iptables -t nat -nvL
[root@test-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 132 packets, 17691 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 15 packets, 780 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 247 packets, 18664 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 12 packets, 3936 bytes)
pkts bytes target prot opt in out source destination
250 15980 MASQUERADE all -- * * 192.168.31.0/24 0.0.0.0/0



B:real server (web服务器) 内网网卡:192.168.31.129 网关改回129.168.31.2
安装nginx,并启动,在默认主页里写入,real server 1 关闭selinux,清空防火墙规则

创建转发脚本
vim /usr/local/sbin/lvs_rs.sh

写入以下内容:
#/bin/bash
vip=192.168.31.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡lo:0上
route add -host $vip lo:0为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


给脚本设权
chmod 755 /usr/local/sbin/lvs_rs.sh

执行脚本
sh /usr/local/sbin/lvs_rs.sh

查看路由上的vip
route -n

查看网卡lo上的vip
ip addr


C: real server (web服务器) 内网网卡:192.168.31.130 网关改回129.168.31.2
安装nginx,并启动,在默认主页里写入,real server 2 关闭selinux,清空防火墙规则


创建转发脚本
vim /usr/local/sbin/lvs_rs.sh

写入以下内容:
#/bin/bash
vip=192.168.31.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡lo:0上
route add -host $vip lo:0为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


给脚本设权
chmod 755 /usr/local/sbin/lvs_rs.sh

执行脚本
sh /usr/local/sbin/lvs_rs.sh


查看路由上的vip
route -n

查看网卡lo上的vip
ip addr


测试:
测试1:
浏览器里访问192.168.31.200,(vip:vitrual ip)多刷新几次看结果,服务器的切换。
浏览器上因为有本地缓存的原因,虽已经设定了登陆保持时限为1秒,但每次刷新都会保持在real server 2主机上。可以在调度机里用 curl 192.168.31.200 测试访问,调度算法采用rr,效果更明显。
测试2:
关闭其中一台real server上的nginx,再次在浏览器上查看real server的切换。
测试3:
重启开启关闭的nginx,再次在浏览器查看real server的切换。




展开阅读全文

没有更多推荐了,返回首页