第1章 LVS集群搭建
1.1 环境准备
1.1.1 主机名及IP地址关系表
序号 | 主机名 | 主机IP地址 | 内存大小 |
1 | lb01 | 10.0.0.5 | 512MB+ |
2 | lb02 | 10.0.0.6 | 512MB+ |
3 | web01 | 10.0.0.8 | 512MB+ |
4 | web02 | 10.0.0.7 | 512MB+ |
1.1.2 lb01和lb02环境配置
[root@lb01 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@lb01 ~]# uname -r 3.10.0-327.el7.x86_64 [root@lb01 ~]# getenforce Disabled [root@lb01 ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) [root@lb01 ~]# hostname -I 10.0.0.5 172.16.1.5
1.1.3 web01和web02环境配置
[root@web01 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@web01 ~]# uname -r 3.10.0-327.el7.x86_64 [root@web01 ~]# getenforce Disabled [root@web01 ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) [root@web01 ~]# hostname -I 10.0.0.8 172.16.1.8 [root@web01 ~]# rpm -qa nginx nginx-1.12.1_e7-1.x86_64 [root@web01 ~]# curl 10.0.0.8 web01 [root@web01 ~]# curl 10.0.0.7 web02
1.2 负载均衡器服务端部署
1.2.1 安装LVS管理工具
1.2.1.1 查看系统的LVS模块。
[root@lb01 ~]# lsmod | grep ip_vs # 默认未加载ip_vs模块 [root@lb01 ~]#
1.2.1.2 安装ipvsadm管理工具
- 此时只在lb01操作即可:
[root@lb01 ~]# yum install -y ipvsadm
1.2.1.3 查看并激活ip_vs模块
[root@lb02 ~]# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
1.2.1.4 查看ip_vs内核模块是否激活
[root@lb01 ~]# lsmod | grep ip_vs ip_vs_wrr 12697 1 ip_vs 140944 3 ip_vs_wrr nf_conntrack 105745 1 ip_vs libcrc32c 12644 2 xfs,ip_vs
1.2.2 配置LVS负载均衡服务
1.2.2.1 在eth0网卡绑定VIP地址(ip)
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 [root@lb01 ~]# ip a s eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:7b:8b:0f brd ff:ff:ff:ff:ff:ff inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet 10.0.0.3/24 scope global secondary eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe7b:8b0f/64 scope link valid_lft forever preferred_lft forever
1.2.2.2 清除当前所有LVS规则(-C)
[root@lb01 ~]# ipvsadm -C
1.2.2.3 设置tcp、tcpfin、udp链接超时时间(--set)
[root@lb01 ~]# ipvsadm --set 30 5 60
1.2.2.4 添加虚拟服务(-A)
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20 [root@lb01 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.3:80 wrr persistent 20
提示:调度算法见man ipvsadm。
1.2.2.5 将虚拟服务关联到真实服务上(-a)
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 [root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
1.2.2.6 查看配置结果(-ln)
[root@lb01 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.3:80 wrr persistent 20 -> 10.0.0.7:80 Route 1 0 0 -> 10.0.0.8:80 Route 1 0 0
1.2.3 ipvsadm命令解析
SYNOPSIS ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [-b sched-flags] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] [--syncid syncid] ipvsadm --stop-daemon state ipvsadm -h
1.2.3.1 基本用法
# 第一条命令用于向LVS系统中添加一个用于负载均衡的virtual server(VS) ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options] # 第二条命令用来修改已经存在的VS的配置 ipvsadm command [protocol] service-address server-address [packet-forwarding-method] [weight options] # service address用来指定涉及的虚拟服务即虚拟地址 # server-address指定涉及的真实地址。
1.2.3.2 命令
-A, --add-service: 为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。 -E, --edit-service: 修改一个虚拟服务。 -D, --delete-service: 删除一个虚拟服务。 -C, --clear: 清除所有虚拟服务。 -R, --restore: 从标准输入获取ipvsadm命令。一般结合下边的-S使用。 -S, --save: 从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。 -a, --add-server: 为虚拟服务添加一个real server(RS) -e, --edit-server: 修改RS -d, --delete-server: 删除 -L, -l, --list: 列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。 -Z, --zero: 将所有数据相关的记录清零。这些记录一般用于调度策略。 --set tcp tcpfin udp: 修改协议的超时时间。 --start-daemon state: 设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4) --stop-daemon: 停止备服务器。 -h, --help: 帮助。
1.2.3.3 参数
-t, --tcp-service service-address: 指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。如果需要将端口设置为0,还需要加上-p选项(持久连接)。 -u, --udp-service service-address: 使用udp服务,其他同上。 -f, --fwmark-service integer: 用firewall mark取代虚拟地址来指定要被负载均衡的数据包,可以通过这个命令实现把不同地址、端口的虚拟地址整合成一个虚拟服务,可以让虚拟服务器同时截获处理去往多个不同地址的数据包。fwmark可以通过iptables命令指定。如果用在ipv6需要加上-6。 -s, --scheduler scheduling-method: 指定调度算法。调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队) -p, --persistent [timeout]: 设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器,通常用于ftp或者ssl中。 -M, --netmask netmask: 指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。 -r, --real-server server-address: 为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。 [packet-forwarding-method]: 此选项指定某个真实服务器所使用的数据转发模式。需要对每个真实服务器分别指定模式。 -g, --gatewaying: 使用网关(即直接路由),此模式是默认模式。 -i, --ipip: 使用ipip隧道模式。 -m, --masquerading: 使用NAT模式。 -w, --weight weight: 设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持(这点和直接把某个真实服务器删除时不同的)。 -x, --u-threshold uthreshold: 设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。 -y, --l-threshold lthreshold: 设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。(PS:笔者以为此设定可能是为了防止服务器在能否接收连接这两个状态上频繁变换) --mcast-interface interface: 指定使用备服务器时候的广播接口。 --syncid syncid: 指定syncid,同样用于主备服务器的同步。
# 以下选项用于list命令: -c, --connection: 列出当前的IPVS连接。 --timeout: 列出超时 --daemon: --stats: 状态信息 --rate: 传输速率 --thresholds: 列出阈值 --persistent-conn: 坚持连接 --sor: 把列表排序。 --nosort: 不排序 -n, --numeric: 不对ip地址进行dns查询 --exact: 单位 -6: 如果fwmark用的是ipv6地址需要指定此选项。
1.2.3.4 其他注意事项
- 如果使用IPv6地址,需要在地址两端加上”【】“。例如:
ipvsadm -A -t [2001:db8::80]:80 -s rr
- 可以通过设置以下虚拟文件的值来防御DoS攻击:
/proc/sys/net/ipv4/vs/drop_entry /proc/sys/net/ipv4/vs/drop_packet /proc/sys/net/ipv4/vs/secure_tcp
1.3 负载均衡器客户端部署
1.3.1 配置web服务器
1.3.1.1 在lo网卡绑定VIP地址(ip)
[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo [root@web01 ~]# ip a s lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 10.0.0.3/32 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever
1.3.1.2 修改内核参数抑制ARP响应
[root@web01 ~]# cat >>/etc/sysctl.conf<<EOF net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 EOF [root@web01 ~]# sysctl -p
1.3.1.3 配置说明
- RealServer为什么要在lo接口上配置VIP?
既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。在lo上配置vip能够完成接收包并将结果返回client,否则网卡接收到IP包后发现IP地址不在自己的网卡上会将IP包直接抛弃,所以需要在客户端配置VIP地址。
- 在eth0网卡上配置VIP可以吗?
不可以,将VIP设置在eth0网卡上,会影响RS的arp请求,造成整体LVS集群arp缓存表紊乱,以至于整个负载均衡集群都不能正常工作。
1.4 测试服务情况
LVS的轮询不像Nginx明显,在网页上刷新不会立即显示切换到另一台web服务器,但可以使用多个客户端访问(Windows和Linux)。
[root@web01 ~]# curl 10.0.0.3 web01 [root@web02 ~]# curl 10.0.0.3 web02 [root@lb02 ~]# curl 10.0.0.3 web01<img class="aligncenter wp-image-344 size-full" src="http://blog.leonshadow.com/wp-content/uploads/2017/11/21-2.png" alt="" width="730" height="86" />

我的微信
如果有技术上的问题可以扫一扫我的微信