lvs(LB集群的一个实现)
硬件:F5 BIG-IP
软件:
lvs(四层)
haproxy
nginx (七层)
varnish
lvs附着于netfiler
五个内置的钩子函数
PREROUTING ---> INPUT(流向内部)
PREROUTING----> FORWARD ---> POSTROUTING(转发)‘
OUTPUT---> POSTROUTING(流向外部)
1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
lvs工作于INPUT
PREROUTING ---> INPUT(lvs在此强行改变数据流向)--->POSTROUTING
lvs是由两部份组成的
ipvs(ip virrual server):一段代码(工作在内核)是真正生效实现调度的代码
ipvsadm(工作在用户空间,负责为ipvs内核框架编写规则)
ipvsadm(工作在用户空间的命令行工具 写具体的规则 用于管理集群服务)/ipvs(工作在内核中的netfilter input钩子函数上)
lvs相关术语
1. DS:Director Server。指的是前端负载均衡器节点。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。
lvs type:
lvs-nat
多目标的DNAT:通过修改请求报文的目标IP地址(同时可能会修改目标端口),至挑选出某RS的RIP地址实现转发
1.RS和DIP应该使用私网地址,且RS的网关要指向DIP
2.请求和响应报文都要经由director转发,极高负载的场景中,director可能会成为系统瓶颈
3.RS可以使用任意OS
4.RS的RIP和Director的DIP必须要在同一IP网络:RS的网关要指向DIP
LVS模式一:DR(Direct Routing)直接路由模式
1:客户端请求 VIP 时,通过因特网先到达调度器,调度器会根据调度算法 将这个请求转发给真实的服务器,
转发的过程中仅仅是修改了数据报文中的 MAC地址.
当真实服务器接受到数据请求后进行处理,然后发送响应给客户端,
但此时的源 IP 为真实的服务器 IP,即 RIP,
目标 IP 为客户端 IP,即 CIP,但是客户端并没有请求RIP,
2:所以客户端是不会接收数据响应,所以,就要修改源 IP 为 VIP,
但是不可以将 VIP 设置在出口网卡上,否则会响应客户端的 arp 请求。
失去了调度的意义,因此要在 lo 接口配置 VIP,并且将 VIP 隐蔽,
即设置 NETMASK 为255.255.255.255,这样,
数据响应从真实服务器出去的时候的源 IP 是 VIP,
目的 IP 是 CIP,客户端就会接收次数据响应,从真实服务器到客户端是通过Internet。
1.DR 模式需要调度器与真实服务器在同一个物理网络。
即通过交换机或者高速的HUB相连,中间没有隔有路由器。
2.VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见 的,
用于接收虚拟服务的请求报文。
3.所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,
它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
优点:性能最高
#############################################
实验环境
server1:172.25.78.1
server2:172.25.78.2
server3:172.25.78.3
负载调度器调度的服务器:server1,server2
调度器:server3
【server3】:
yum install ipvsadm -y
ipvsadm --help ##可以查看ipvsadm的使用方法
加载 rule
ipvsadm -A -t 172.25.78.100:80 -s rr ##172.25.78.100是虚拟ip,自定义
ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.2:80 -g
ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.1:80 -g
ip addr add 172.25.78.100/32 dev eth0
ipvsadm -Ln ##查看添加的规则
【server1,server2】(配置环境一样):
ip addr add 172.25.78.100/32 dev eth0 /32 ##广播域
yum install httpd -y
cd /var/www/html/ ----> ls
vim index.html
server1中: server1
server2中: server2
systemctl start httpd
netstat -antlp ##查看http端口80
【server1】
【server2】
【真机测试】:
curl 172.25.78.100
server2
arp -an | grep 172.25.78.100 ##对应的是server2服务器的 eth0
【server2】:ip addr show
【真机测试】:
arp -d 172.25.78.100 ##删除缓存
arp -an | grep 172.25.78.100
curl 172.25.78.100 ##再次访问
server1
arp -an | grep 172.25.78.100 ##对应的是server1服务器的 eth0
【server1,server2】
yum install arptables -y
arptables -A INPUT -d 172.25.78.100 -j DROP
##server1
arptables -A OUTPUT -s 172.25.78.100 -j mangle --mangle-ip-s 172.25.78.1
##server2
arptables -A OUTPUT -s 172.25.78.100 -j mangle --mangle-ip-s 172.25.78.2
arptables -L
【真机测试】: 多次访问
curl 172.25.78.100
【server3】
ipvsadm -L ##可以查看到各个服务器被访问的次数
ipvsadm -C ##清除规则,在规则被清除后,真机访问会失败,需要重新添加规则,才可访问
在规则被清除后,真机访问会失败,需要重新添加规则,才可访问
【server2】关闭server2的httpd服务
systemctl stop httpd
再次访问:
【真机】:
每当访问到server2的时候就会报错,访问失败
curl 172.25.78.100
【server3】:ipvsadm -L
LVS模式:DR模式下健康检查(ldirectord)
为什么需要健康检查?
如果后端真实服务器出现问题,
那么在测试端测试的时候,会返回给我们一个错误的页面,
那么我们需要对后端服务器做健康检查,
保证只返回正确的页面提供给用户。
ldirectord是后端做检查的一个工具
(1)官网下载ldirectord-3.9.5-3.1.x86_64.rpm,
将这个包传到我们LVS调度器的虚拟机,用来对后端服务器做健康检查
【server3】
安装yum install ldirectord-3.9.5-3.1.x86_64.rpm -y ##会安装失败
【真机】
cd /var/www/html/westos/addons ---> ls
HighAvailability ##高可用
更改yum文件配置
vim /etc/yum.repos.d/westos.repo
[rhel7.3]
name=rhel7.3
baseurl=http://172.25.78.250/westos
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.78.250/westos/addons/HighAvailability
gpgcheck=0
yum clean all
yum repolist
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y ##安装成功
rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm ##查看配置文件
cd /etc/ha.d/resource.d/ ---> ls
有ldirectord
cd /etc/ha.d ---> ls
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d ---> ls
vim ldirectord.cf
virtual=172.25.78.100:80 ##虚拟服务的ip
real=172.25.78.1:80 gate ##真正的服务端ip
real=172.25.78.2:80 gate ##真正的服务端ip
vim ldirectord.cf
加载 rule
ipvsadm -A -t 172.25.78.100:80 -s rr ##172.25.78.100是虚拟ip,自定义
ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.2:80 -g
ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.1:80 -g
【真机测试】: 多次访问
##server1和server1 会被轮询访问
curl 172.25.78.100
server2: systemctl stop httpd
####会一直访问到server1,访问不到server2
keepdlived
keepalived是什么:
是集群管理中保证集群高可用的一个服务软件,功能类似于heartbeat,
用来防止单点故障
实验环境
server1:172.25.78.1
server2:172.25.78.2
server3:172.25.78.3
server4:172.25.78.4
server3:yum install httpd
安装的时候是给本机的虚拟ip(172.25.20.100)添加的端口
高可用:保证服务器一直在线,每时每刻不下线
负载均衡:一个调度
virtual_server :相当于VIP
server3,server4:调度器
server1,server2:负载
server3(主)和 server4(备) :同时是调度器,
例如:server3挂的时候,server4顶替server3的服务
只要主(server3)在,备(server4)就会一直处在准备状态,当server3挂了的时候,server4才开始使用服务
SYSV:脚本
server3 和 server4 的 配置环境(server3和server4环境相同)
systemctl stop ldirectord
cd /root ---> ls
cd keepalived-2.0.6
./configure --help | grep init
./configure --prefix=/usr/local/keepalived --with-init=systemd ##安装目录
yum install openssl-devel -y
yum install gcc -y
./configure --prefix=/usr/local/keepalived --with-init=systemd
make && make install
软链接比较方便
cd /usr/local/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
vim /etc/keepalived/keepalived.conf
########【server3 中】
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhostkeepalived-2.0.6
smtp_server 127.0.0.1 ##本机
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER ##主调度器
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.20.100 ##虚拟ip
}
}
virtual_server 172.25.20.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
#persistence_timeout 50 ##保持连接,使用lftp的时候,不能注释,必须开启
protocol TCP
real_server 172.25.20.1 80 { ##真正的服务器1
TCP_CHECK {
weight 1
connect_port 80
connect_timeout 3
}
}
real_server 172.25.20.2 80 { ##真正的服务器1
TCP_CHECK {
weight 1
connect_port 80
connect_timeout 3
}
}
}
######## 【server4中】
vim /etc/keepalived/keepalived.conf
5:root@localhost
8:smtp_server 127.0.0.1 ##本机
12:#vrrp_strict ##注释
18:state BACKUP ##备的调度器
21:priority 50 ##优先级,需比主调度器小
yum install ipvsadm -y
yum install mailx -y
####################################################################### 隧道模式
优点:lb和rs可以不需要在统一 局域网
缺点:资源贵,
【server3环境】:
systemctl stop keepalived
ipvsadm -l
ip addr del 172.25.20.100/32 dev eth0
modprobe ipip ##重新加载
ip addr add 172.25.20.100/24 dev tunl0
ip addr show
ip link set up tunl0
ipvsadm -A -t 172.25.20.100:80 -s rr
ipvsadm -a -t 172.25.20.100:80 -r 172.25.20.1:80 -i
ipvsadm -a -t 172.25.20.100:80 -r 172.25.20.2:80 -i
ipvsadm -l
【server1和server2环境】:
modprobe ipip
ip addr del 172.25.20.100/32 dev eth0
ip addr show
ip addr add 172.25.20.100/24 dev tunl0
ip addr show
ip link set up tunl0
sysctl -a|grep rp_filter
##内核全部改为0(企业6可以在配置文件(vim /etc/sysctl)中改)
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -p ##生效
sysctl -a|grep rp_filter ##重新查看
真机测试:
curl 172.25.20.100
curl 172.25.20.100
作业:查什么是fullnet,优点,缺点