LVS基础及LVS+Keepalived实现双主高可用负载均衡
LB集群:
(Load Balancing)即负载均衡集群,其目的是为了提高访问的并发量及提升服务器的性能,其 实现方式分为硬件方式和软件方式。
硬件实现方式:
常用的有 F5公司的BIG-IP系列、A10公司的AX系列、Citrix公司的 NetScaler系列等
软件实现方式:
LVS工作于传输层、nginx工作于应用层、haproxy工作于传输层和应用层
本文主要讲解LVS。
一、什么是LVS ?
1. LVS:(Linux Virtual Server)Linux虚拟服务,工作于前端调度器内核的netfilter模块上,根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机,其转发是依赖于四层协议的特征进行转发的,因此需要在内核的TCP/IP协议栈进行过滤筛选,这样的过滤转发规则由系统管理员进行定义。
2. LVS两段式组成:
ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的主机(RS)。
ipvs:工作与内核上的netfilter的INPUT钩子之上的程序,可根据用户定义的集群实现请求转发。
工作原理图解如下:
LVS集群专用术语:
CIP:发送请求的客户端IP地址。
VIP:lvs调度器的IP地址,也是向客户端提供服务的IP地址。
DIP:lvs调度器与后端real server之间通信使用的IP地址。
RIP:提供真正服务的real server的IP地址。
vs:虚拟服务器,调度器,
rs: 后端提供真实服务的服务器
3.LVS集群的类型:
1)lvs-nat:
多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发
2)lvs-dr:
通过为请求报文的重新封闭一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是挑选出某RS的RIP所在接口的MAC地址;IP首部不会发生变化(CIP<-->VIP)
3)lvs-tun:
不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是原IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出的RS的RIP)
4)lvs-fullnat:
通过同时修改请求报文的源IP地址(CIP-->DIP)和目标IP地址(VIP-->RIP)进行转发
4.LVS集群的调度算法(Scheduler):
根据其调度时是否考虑后端主机的当前负载,可分为静态方法和动态方法两类
静态算法:仅根据算法自身进行调度
动态算法:根据算法及后端主机当前的负载状态进行调度
5.ipvsadm管理工具用法
管理集群:ipvsadm -A|E -t|u|f service_address [-s scheduler]
A:增 -E:修改
-t:tcp -u:udp -f:firewall mark
-s scheduler:调度算法,默认为wlc
ipvsadm -D -t|u|f service_address 删除集群
管理集群上的RS:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增
-e:改
-r server-address :RS的地址;rip[:port]
-g, gateway, dr,默认
-i, ipip, tun
-m, masquerade, nat
-w weight
查看:
ipvsadm -L|l [options]
-n, --numeric:数字格式显示IP和PORT;
--exact:精确值,不做单位换算;
-c, --connection:显示IPVS连接;
--stats:统计数据;
--rate:速率;
清空: ipvsadm -C:clear
保存和重载:
保存:
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvsadm-save > /PATH/TO/SOME_RULE_FILE
重载:
ipvsadm -R < /PATH/TO/SOME_RULE_FILE
ipvsadm-restore < /PATH/TO/SOME_RULE_FILE
清空计数器:
ipvsadm -Z [-t|u|f service-address]
二、LVS-NAT工作模型及原理
1.lvs-nat原理
多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发;
(1)RIP和DIP必须在同一IP网络,且应该使用私有地址;RS的网络要指向DIP(保证响应报文必须经由VS);
(2)请求报文和响应报文都经由Director转发,较高负载下,Director易于成为系统性能瓶颈;
(3)支持端口映射;
(4)VS必须是Linux,RS可以是任意OS
2.lvs-nat测试
测试环境:3台虚拟机
Director主机(两张网卡)IP:
外网:172.18.123.14
内网:192.168.100.254
RS1主机IP:192.168.100.20
RS2主机IP:192.168.100.21
注:Director内网ip及RS主机网卡均设置为仅主机模式,RS主机的网关需指向192.168.100.254,安装apache服务且处于开启状态。
1).在Director主机上安装ipvsadm并配置集群服务。
2).测试
三、LVS-DR工作模型及原理
1.lvs-dr:
Direct Routing:通过为请求报文的重新封闭一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是挑选出某RS的RIP所在接口的MAC地址;IP首部不会发生变化(CIP<-->VIP);
1)确保前端路径器将目标IP为VIP的请求报文发往Director:
解决方案:
在路由器上静态绑定VIP和Director的MAC地址;
禁止RS响应VIP的ARP请求,禁止RS的VIP进行通告
(a) arptables
(b) 修改RS的内核参数,并把VIP绑定lo的别名上;
arp_ignore, arp_announce
2)RS的RIP可以使用私有地址,也可以使用公网地址;
3)RS跟Director必须在同一物理网络;RS的网关必须不能指向DIP;
4)请求报文必须由Directory调度,但响应报文必须不能经由Director;
5)不支持端口映射;
6)RS可以使用大多的OS;
2.lvs-dr测试
测试环境(CentOS 7)在director上安装ipvsadm
Director:
DIP:172.18.123.14
VIP:172.18.123.15
RS1:
RIP:172.18.123.50
VIP:172.18.123.15
RS2:
RIP:172.18.123.51
VIP:172.18.123.15
1.关闭RS1、RS2的arp响应:分别在RS1和RS2主机上执行以下命令
2.分别在三台主机上配置VIP;
分别在RS1及RS2上设置VIP
3.增加路由
在Director:
RS1及RS2:
4.在Director上添加集群列表
5.测试
注:arp响应限制
1)arp_ignore:
定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
2)arp_announce:
对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
四、基于Keepalived实现lvs双主高可用集群及部署应用
1.实验拓扑结构图
2.部署环境
3.安装软件
1)保证LVS1及LVS2时间同步,并能够通信,并在两台主机上安装keepalived及ipvsadm
2)配置LVS1的keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MY_LVS
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 123
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.22
}
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 223
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.23
}
}
virtual_server 172.18.123.22 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 172.18.123.50 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.18.123.51 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 172.18.123.23 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 172.18.123.50 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.18.123.51 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3) scp LVS1的keepalived.conf到LVS2的/etc/keepalived/下,并修改下述标识内容,其他内容不变。
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 123
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.22
}
}
vrrp_instance VI_2 {
state MASTER
interface eno16777736
virtual_router_id 223
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.23
}
}
4)在RS1及RS2上安装httpd、php及php-mysql
准备测试页
配置内核及VIP,运行下面脚本:bash
#/bin/bash
#
VIP1=172.18.123.22
VIP2=172.18.123.23
interface1="lo:0"
interface2="lo:1"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $interface1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
route add -host $VIP1 dev $interface1
ifconfig $interface2 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
route add -host $VIP2 dev $interface2
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $interface1 down
ifconfig $interface2 down
;;
status)
if ifconfig lo:0 | grep $VIP1 &> /dev/null && ifconfig lo:1 | grep $VIP2 &> /dev/null;then
echo "ipvs is running"
else
echo "ipvs is stopped"
fi
;;
*)
echo "Usage: `basename $0` {start|stop|status}"
exit 1
esac
查看Rs主机的ip信息:
5)测试,启动LVS1及LVS2主机上的keepalived服务,查看两节点的ip信息及ipvs规则
通过浏览器访问172.18.123.22及172.18.123.23
停掉LVS2的keepalived服务,查看LVS1的ip及测试访问均正常。
6)在SQL1主机上安装Mariadb数据库,并授权用户
在两台RS上配置测试是否连通Mariadb
四、部署phpwind
1.在RS1及RS2主机上下载phpwind_v9.0.1.141223_utf8.zip,解压到/var/www/html目录下,更改解压后目录的属主属组为apache用户
出现下述错误,安装php-xml即可
安装成功
测试OK。