四层负载均衡服务器
实现负载均衡的软件:
lvs haproxy nginx httpd varnish
四层:
传输层:lvs haproxy(tcp) 模型tcp协议
应用层:haproxy nginx(都可以做7层负载均衡)
haproxy : 可以做一个读写分离和动静分离
lvs:
全称呼:linux virtual server
linux虚拟服务器
工作在防火墙input链上,附着几个高级函数
lvs有四种模式:DR:直接路由模式 (主要是修改mac地址)
NAT:网络地址转换模式
TUNNEL:隧道模式
FULLNAT:完全的地址转换模式
编辑工具策略:
[root@server1 ~]# yum install -y ipvsadm.x86_64
[root@server1 ~]# ipvsadm -l 列出策略
[root@server1 ~]# lsmod 查看内核支持模块
[root@server1 ~]# rpm -qa | grep ipvsadm
ipvsadm-1.27-7.el7.x86_64
[root@server1 ~]# rpm -qc ipvsadm 查看
/etc/sysconfig/ipvsadm-config
[root@server1 ~]# vim /etc/sysconfig/ipvsadm-config
[root@server1 ~]# touch /etc/sysconfig/ipvsadm
[root@server1 ~]# systemctl start ipvsadm.service
[root@server1 ~]# ipvsadm -h #编辑策略的方法查询
指定一个虚拟ip:虚拟ip只是一个入口,不提供服务
指定虚拟ip的原因:这个地址为公有IP地址,外网进行访问的,用起来方便安全。对外开放的ip地址
192.168.0.90 为虚拟地址:(-s rr 表示制定调度器的方法)
[root@server1 ~]# ipvsadm -A -t 192.168.0.90:80 -s rr
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.90:http rr
添加真实主机和端口:(-g:表示使用lvs的直接路由(DR)模式)
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r 192.168.0.20:80 -g
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r 192.168.0.30:80 -g
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.90:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
[root@server1 ~]# systemctl restart ipvsadm.service #重启之后策略会自动添加到文件
[root@server1 ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.0.90:80 -s rr
-a -t 192.168.0.90:80 -r 192.168.0.20:80 -g -w 1
-a -t 192.168.0.90:80 -r 192.168.0.30:80 -g -w 1
[root@server1 ~]# ip addr add 192.168.0.90/24 dev ens33 #添加虚拟网址到网卡
数据走向:client -> vs -> rs -> client (用户到虚拟主机server1到真实主机server2,server3在到客户端)
没设置网关的其那个况下
需要给真实主机添加虚拟地址,否则虚拟ip无法跟真实ip地址之间进行数据的访问
[root@server2 ~]# ip addr add 192.168.0.90/24 dev ens33
[root@server3 ~]# ip addr add 192.168.0.90/24 dev ens33
测试:
[root@rhel8_node1 ~]# arp -d 192.168.0.90 #清理物理网卡的缓存
[root@rhel8_node1 ~]# curl 192.168.0.90
www.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
以上实验存在的问题:
返回给客户端的是由调度器srver1返回的数据,并不是由真实服务器server2,server3返回的。
问题:
[root@rhel8_node1 ~]# arp -an | grep 90
? (192.168.0.90) at 00:0c:29:65:03:25 [ether] on ens160
这个物理地址是调度器的物理地址
因为真机也添加了公网ip
解决方法:
1.通过配置内核参数的方法去解决
2.用防火墙的方法来解决
通过防火墙的方式来解决:
[root@server3 ~]# yum install -y arptables
[root@server2 ~]# yum install -y arptables
server2:
[root@server2 ~]# arptables -A INPUT -d 192.168.0.90 -j DROP #输入连接丢弃192.168.0.90这个地址
[root@server2 ~]# arptables -A OUTPUT -s 192.168.0.90 -j mangle --mangle-ip-s 192.168.0.20
在返回的数据包上告诉来源是192.168.0.90,添加到mangle这个表上,告诉真实的ip来源是
192.168.0.20
[root@server2 ~]# arptables-save > /etc/sysconfig/arptables #保存策略
server3:解释同server2
[root@server3 ~]# arptables -A INPUT -d 192.168.0.90 -j DROP
[root@server3 ~]# arptables -A OUTPUT -s 192.168.0.90 -j mangle --mangle-ip-s 192.168.0.30
[root@server3 ~]# arptables-save > /etc/sysconfig/arptables
测试:
[root@rhel8_node1 ~]# arp -d 192.168.0.90
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
www.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
查询调度器:所有的访问都在调度器上
[r
oot@server1 ~]# 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.0.90:80 rr
-> 192.168.0.20:80 Route 1 0 4
-> 192.168.0.30:80 Route 1 0 3
lvs基本工作原理:
lvs -> -> kernel space -> IP -> INPUT(ipvs) -> change -> POSTROUTING ->rs
防火墙的prerouting(路由前) 会判断ip是否为本机,是,则数据发送数据包。做一个change,发送到POSTROUTING(是后端服务器地址,发往调度器)
DR模式数据流向:(需要在同一个网络,通过二层数据链传输的)
client -> DS -> kernel space -> PREROUTING -> CIP(客户端IP):VIP(目标IP,入口) -> INPUT -> ipvs(工作在INPUT链上) ->DMAC:RMAC(把源MAC地址修改为真实MAC地址) -> POSTROUTING -> DS RS -> 二层传输 -> rs -> lo -> ens33(VIP:CIP) -> client
######隧道模式####
清除DR 模式的配置:
[root@server1 ~]# ipvsadm -C
添加隧道模式使用的模块:
[root@server1 ~]# modprobe ipip
配置隧道模式:
[root@server1 ~]# ipvsadm -A -t 192.168.0.90:80 -s rr
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r 192.168.0.20:80 -i
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r 192.168.0.30:80 -i
[root@server1 ~]# 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.0.90:80 rr
-> 192.168.0.20:80 Tunnel 1 0 0
-> 192.168.0.30:80 Tunnel 1 0 0
[root@server1 ~]# systemctl restart ipvsadm.service
server1:
[root@server1 ~]# ip addr del 192.168.0.90/24 dev ens33
[root@server1 ~]# ip addr add 192.168.0.90/24 dev tunl0
[root@server1 ~]# ip link set up tunl0 #激活IP
server2:(移动公网ip地址到隧道tunl0)
[root@server2 ~]# ip addr del 192.168.0.90/24 dev ens33
[root@server2 ~]# ip addr add 192.168.0.90/24 dev tunl0
[root@server2 ~]# ip link set up tunl0
server3:
[root@server3 ~]# ip addr del 192.168.0.90/24 dev ens33
[root@server3 ~]# ip addr add 192.168.0.90/24 dev tunl0
[root@server3 ~]# ip link set up tunl0
激活隧道模式后:
一定在真实后端server2,server3上关闭反向过滤规则
[root@server3 ~]# sysctl -a | grep rp_filter #查看反向过滤规则
见图片:
更改例子:
[root@server3 ~]# sysctl -w net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
[root@server3 ~]# sysctl -p #设置立即生效
server2 同server3
测试:
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
www.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
###健康平衡检查###
安装软件包: ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
注意:yum源包需要配置高可用的软件仓库(在yum中的addons中)
[root@server1 Downloads]# rpm -qa | grep ldire
[root@server1 ~]# rpm -qc ldirectord-3.9.6-0rc1.1.1.x86_64.rpm #查看软件包的位置
注意:由于软件包出了问题,健康检查稍后在补
####高可用###
安装软件包:keepalived-2.0.20.tar.gz
[root@server1 Downloads]# tar zxf keepalived-2.0.20.tar.gz
进行源码编译:
[
root@server1 keepalived-2.0.20]# yum install -y openssl-devel #安装二进制文件,二进制文件,大多数是以却少的文件加devel
[root@server1 keepalived-2.0.20]# ./configure --prefix=/usr/local/keepalived --with-init=systemd
[root@server1 keepalived-2.0.20]# make && make install #进行源码编译
源码编译完了以后进行配置:
root@server1 keepalived-2.0.20]# ls /usr/local/
bin etc games include keepalived lib lib64 libexec sbin share src
[root@server1 keepalived-2.0.20]# cd /usr/local/keepalived/
[root@server1 keepalived]# ls
bin etc sbin share
为方便操作,做以个软链接,把木路链接到/etc/:
[root@server1 keepalived]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 keepalived]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf samples
[root@server1 keepalived]# vim keepalived.conf #`配置文件
! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 root@localhost
6 }
7 notification_email_from keepalived@localhost
8 smtp_server 127.0.0.1
9 smtp_connect_timeout 30
10 router_id LVS_DEVEL
11 vrrp_skip_check_adv_addr
12 # vrrp_strict
13 vrrp_garp_interval 0
14 vrrp_gna_interval 0
15 }
16
17 vrrp_instance VI_1 {
18 state MASTER
19 interface ens33
20 virtual_router_id 51
21 priority 100
22 advert_int 1
23 authentication {
24 auth_type PASS
25 auth_pass 1111
26 }
27 virtual_ipaddress {
28 192.168.0.80
29 }
30 }
31
32 virtual_server 192.168.0.80 80 {
33 delay_loop 3
34 lb_algo rr
35 lb_kind DR
36 persistence_timeout 50
37 protocol TCP
38
39 real_server 192.168.0.20 80 {
40 TCP_CHECK{
41 weight 1
42 connect_timeout 3
43 retry 3
44 delay_before_retry 3
45 }
46 }
47
48 real_server 192.168.0.30 80 {
49 TCP_CHECK{
50 weight 1
51 connect_timeout 3
52 retry 3
53 delay_before_retry 3
54 }
55 }
56
57 }
发送到server4:192.168.0.40
[root@server1 local]# scp -r keepalived 192.168.0.40:/usr/local/
[`root@server1 keepalived]# scp keepalived.conf 192.168.0.40:/etc/keepalived/ #发送配之文件去备用主机`
server4:(备用的真实server)
[root@server4 local]# ls
bin etc games include keepalived lib lib64 libexec sbin share src
[root@server4 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 local]# vim /etc/keepalived/keepalived.conf 需要修改配置文件,修改内容为,更该MASKTER为BACKUP;降低优先级。
server1:
[
root@server1 ~]# systemctl start keepalived.service
server4:
[root@server4 ~]# systemctl start keepalived.service
重新启动激活健康检查:
测试:
1,先测试轮循的访问有没有问题
测试方法看轮循的测试
server1和server4同时监控日志
停掉server1 的真实server
日志会显示:
访问正常,此时自动启动了备用的server4
链接成功后会主动切换回server1
健康检查保证了用户的一直正长的访问,用户的信息暂时会被server4接管;
冲新启动其server1 时会回到优先级较高的server1,VIP进行漂移。
VRRP:虚拟路由协议,实现路由器高可用的协议