纸上得来终觉浅,绝知此事要躬行。
1. ipvsadm 命令
ipvs
的集群服务可以使用tcp
、udp
、ah
、esp
、ah_esp
、sctp
等协议
- 一个
ipvs
主机可以同时定义多个集群服务 - 一个集群服务上至少应该一个
Real Server
1.1 语法格式
- 管理集群服务
# 添加或修改一条虚拟服务器记录
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
# 删除一条虚拟服务器记录
ipvsadm -D -t|u|f virtual-service-address
# 清除一条虚拟服务器记录
ipvsadm -C
# 恢复一条虚拟服务器记录
ipvsadm -R
# 保存一条虚拟服务器记录
ipvsadm -S [-n]
- 管理集群服务中的 RS
# 在一个虚拟服务器中增加或修改一台真实服务器记录
ipvsadm -a|e -t|u|f virutal-service-address:port -r real-server-address:port [-g|i|m] [-w weight]
# 在一个虚拟服务器中删除一台真实服务器记录
ipvsadm -d -t|u|f virutal-service-address -r server-address
- 其他选项
# 显示内核虚拟服务器表
# options的选项有的参数:-n、-c、--stats、--rate、--exact
ipvsadm -L|l [options]
# 虚拟服务表计数器清零(清空当前的连接数量等)
ipvsadm -Z [-t|u|f virutal-service-address]
# 设置连接超时值
ipvsadm --set [tcp tcpfin udp]
# 启动同步守护进程
ipvsadm --start-daemon state [--mcast-interface interface]
# 停止同步守护进程
ipvsadm --stop-daemon
# 显示帮助信息
ipvsadm -h
- 相关术语
scheduler 调度方法
real-service-address 是指真实服务器的ip地址
virtual-service-address 是指虚拟服务器的ip地址
1.2 命令选项
适用范围 | 命令选项 | 参数说明 |
---|---|---|
虚拟服务器记录 | ||
-A(--add-service ) |
在内核的虚拟服务器表中添加一条新的虚拟服务器记录,也就是新增一台虚拟服务器 | |
-E(--edit-service ) |
编辑内核虚拟服务器表中的一条虚拟服务器记录 | |
-D(--delete-service ) |
删除内核虚拟服务器表中的一条虚拟服务器记录 | |
-C(--clear ) |
清除内核虚拟服务器表中的所有记录 | |
-R(--restore ) |
恢复虚拟服务器规则 | |
-S(--save ) |
保存虚拟服务器规则,输出为-R 选项可读的格式 |
|
真实服务器记录 | ||
-a(--add-server ) |
在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录,也就是新增一台真实服务器 | |
-e(--edit-server ) |
编辑一条虚拟服务器记录中的某条真实服务器记录 | |
-d(--delete-server ) |
删除一条虚拟服务器记录中的某条真实服务器记录 | |
其他 | ||
-L/-l(--list ) |
显示内核虚拟服务器表 | |
-Z(--zero ) |
虚拟服务表计数器清零,清空当前的连接数量等 | |
–set [tcp tcpfin udp] | 设置连接超时时间 | |
–start-daemon | 启动同步守护进程;后面可以是master 、backup 或keepalived ,用来说明LVS 的Router 是master 、backup 或keepalived 模式 |
|
–stop-daemon | 停止同步守护进程 | |
-h(--help ) |
显示帮助信息 |
1.3 其他选项
命令选项 | 参数说明 |
---|---|
-t service-address(--tcp-service ) |
说明虚拟服务器提供的是tcp 的服务 |
-u service-address(--udp-service ) |
说明虚拟服务器提供的是udp 的服务 |
-f fwmark(--fwmark-service ) |
说明是经过iptables 标记过的服务类型,防火墙标记 |
-s scheduler(--scheduler ) |
使用的调度算法,默认是wlc ;还有rr 、wrr 、lc 、wlc 、lblc 、lblcr 、dh 、sh 、sed 、nq |
-p timeout(--persistent ) |
客户端连接超时时间;来自同一个客户的多次请求,将被同一台真实的服务器处理;timeout 的默认值为360 秒。 |
-M netmask(--netmask ) |
设置子网掩码 |
-w weight(--weight ) |
真实服务器的权值 |
-r server-address(--real-server ) |
真实的服务器[Real-Server:port] |
-g(--gatewaying ) |
指定LVS 的工作模式为直接路由模式,也是LVS 的默认的模式 |
-i(--ipip ) |
指定LVS 的工作模式为隧道模式 |
-m(--masquerading ) |
指定LVS 的工作模式为NAT 模式 |
-c(--connection ) |
显示 LVS 目前的连接,如ipvsadm -L -c |
-n(--numeric ) |
输出IP 地址和端口的数字形式,不反解IP 到主机名 |
–timeout | 显示tcp 、tcpfin 、udp 的timeout 值,如ipvsadm -L --timeout |
–daemon | 显示同步守护进程状态 |
–stats | 显示统计信息 |
–rate | 显示速率信息 |
–sort | 对虚拟服务器和真实服务器排序输出 |
–mcast-interface interface | 指定组播的同步接口 |
2. LVS/NAT
实例
可以将配置写成脚本,进行配置
2.1 环境配置
- Director Server
# DS有两块网卡,桥接模式的VIP、vmnet2自定义模式的DIP
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
...
BOOTPROTO=static
IPADDR=172.16.100.9
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
NAME=eno16777736
...
# 配置第二块网卡
[root@localhost ~]# cp ifcfg-eno16777736 ifcfg-eno33554992
[root@localhost ~]# vim ifcfg-eno33554992
...
IPADDR=192.168.20.1
NETMASK=255.255.255.0
NAME=eno33554992
DEVICE=eno33554992
...
# CentOS7中重启网络服务
[root@localhost ~]# systemctl restart network.service
# 如果没有的话,先安装ipvsadm工具
[root@localhost ~]# yum install -y ipvsadm
- Real Server
# RS1: vmnet2自定义模式的RIP,这里使用setup进行配置网络的
[root@localhost ~]# setup
Name
Device
Use DHCP
Static IP 192.168.20.7
Netmask 255.255.255.0
Default gateway IP 192.168.20.1
...
# CentOS6中重启网络服务
[root@localhost ~]# service network restart
# 写测试页面
[root@localhost ~]# echo 'nodeA' > /var/www/html/index.html
# RS2: vmnet2自定义模式的RIP,通过配置文件配置网络
# 如果2是通过1克隆的,默认没有eth0接口,需要修改配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
删除HWADDR和UUID
IPADDR=172.16.100.8
...
[root@localhost ~]# vim /etc/udev/rules.d/70-persistent-net.rules
注释eth0的配置,将eth1的NAME字段改为eth0
...
# 因为是虚拟网卡,需要重新加载网卡
[root@localhost ~]# modprobe -r e1000
modprobe e1000
...
# CentOS6中重启网络服务
[root@localhost ~]# service network restart
# 写测试页面
[root@localhost ~]# echo 'nodeB' > /var/www/html/index.html
2. 负载均衡配置
# 打开核心转发功能
# 方式一
[root@localhost ~]# echo '1' > /proc/sys/net/ipv4/ip_forward
# 方式二
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 添加规则
# 当请求访问172.16.100.9的80端口,标记为负载均衡集群
[root@localhost ~]# ipvsadm -A -t 172.16.100.9:80 -s rr
# 查看规则
[root@localhost ~]# ipvsadm -L -n
Forwark Weight ActiveConn InActConn
Masq 1 0 0
使用模式 权重 活动连接数 非活动连接数
# 添加RS主机
[root@localhost ~]# ipvsadm -a -t 172.16.100.9:80 -r 192.168.20.7 -m
[root@localhost ~]# ipvsadm -a -t 172.16.100.9:80 -r 192.168.20.8 -m
# 查看规则
[root@localhost ~]# ipvsadm -L -n
# 永久保存规则: 文件在/etc/sysconfig/ipvsadm,与iptables类似
[root@localhost ~]# ipvsadm -S /etc/sysconfig/ipvsadm
# 规则重载
[root@localhost ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
[root@localhost ~]# ipvsadm-save
# 规则清空
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm-restore
# 为CentOS7中的ipvsadm的Unit文件
cat /usr/lib/systemd/system/ipvsadm.service
# 测试练习: 修改调度器
[root@localhost ~]# ipvsadm -E -t 172.16.100.9:80 -s sh
# 测试练习: 删除调度器
ipvsadm -D -t 172.16.100.9:80
# 查看规则
[root@localhost ~]# ipvsadm -L -n
# 测试练习: 修改RS服务器
[root@localhost ~]# ipvsadm -e -t 172.16.100.9:80 -r 192.168.20.7:8080 -m
# 测试练习: 删除RS服务器
[root@localhost ~]# ipvsadm -d -t 172.16.100.9:80 -r 192.168.20.7:8080
# 查看规则
[root@localhost ~]# ipvsadm -L -n
3. LVS/DR
实例
可以将配置写成脚本,进行配置
3.1 难题解决
【问题描述】
- 如果只让
DS
响应访问VIP
的请求报文呢?
【方式 1】
- 在路由器的路由表上配置对于
VIP
的MAC
地址,但路由器有可能是运营商的
【方式二】
- 在
RSs
上配置arpiptables
,禁止响应arp
地址为IP
的MAC
地址的广播
【方式三】
- 网卡配置
- DS:物理网卡配置
DIP
,物理网卡别名配置VIP
- RS:物理网卡配置
RIP
,lo
网卡别名配置VIP
- DS:物理网卡配置
- 配置即使
RS
收到广播地址为VIP
的也不做处理,配置两个内核参数arp_ignore
和arp_announce
arp_ignore
(是否响应通告)0
:只要请求的地址在本机有就响应1
:只响应接口地址的请求
arp_announce
(是否接受通告且可以发送通告)0
: 所有网络都通告给物理网络1
:尽量避免通告非本网络地址2
:只会通告本网络地址
3.2 环境配置
- Director Server
# 配置DS的DIP接口,配置物理网卡
# DS: 只需要一块网卡就可以了,禁用之前添加的新网卡
# RS: 使用VM的桥接网络模式
# 配置DS的VIP接口,添加物理网卡的别名
[root@localhost ~]# ifconfig eno16777736:0 172.16.100.10/32 broadcast 172.16.100.10 up
# 配置路由,只想要哪个接口的响应请求
[root@localhost ~]# route add -host 172.16.100.10 dev eno16777736:0
- Real Server
# 配置RS的RIP接口
# A: 172.16.100.21; 网关指向同一个路由 172.16.0.1
# B: 172.16.100.22; 网关指向同一个路由 172.16.0.1
# 配置lo接口的VIP,分别配置A/B主机
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@localhost ~]# ifconfig lo:0 172.16.100.10/32 broadcast 172.16.100.10 up
[root@localhost ~]# route add -host 172.16.100.10 dev lo:0
# 查看配置结果
[root@localhost ~]# arp -a
3.3 负载均衡配置
# 配置DS虚拟服务器
[root@localhost ~]# ipvsadm -A -t 172.16.100.10:80 -s rr
[root@localhost ~]# ipvsadm -a -t 172.16.100.10:80 -r 172.16.100.21 -g
[root@localhost ~]# ipvsadm -a -t 172.16.100.10:80 -r 172.16.100.22 -g
4. 扩展练习
LVS-NAT
- 任务
NAT
模型实现HTTP
和HTTPS
两种负载均衡集群
- 注意事项
HTTPS
是长连接的尝试- 配置
SSL
的时候,RS
两台Web
服务器都要提供同一个私钥和同一个证书 - 生产环境,一般都会使用
Nginx
和Haproxy
做负载均衡,不太使用LVS
LVS-DR
- 任务
DR
模型实现HTTP
和HTTPS
的负载均衡集群DR
模型实现MySQL
的负载均衡集群- 规划拓扑实现,
DR
模型中VIP
与RIP
不在同一网络中的集群
- 注意事项
HTTPS
和MySQL
都是长连接的尝试- 配置
SSL
的时候,RS
两台Web
服务器都要提供同一个私钥和同一个证书