linux virtual server
一 . lvs
lvs 对数据进行四层转发,根据目标地址和目标端口对请求数据进行转发。
lvs 包含ipvsadm 和ipvs:
ipvsadm :用户空间的命令行工具,用于管理集群服务;
ipvs :工作在内核空间的 netfilter 模块的 INPUT 钩子函数上。
[root@localhost /]# cat /boot/config-3.10.0-862.el7.x86_64 |grep 'IPVS' #查看系统是否支持IPVS 功能 CONFIG_NETFILTER_XT_MATCH_IPVS=m # IPVS transport protocol load balancing support # IPVS scheduler # IPVS SH scheduler # IPVS application helper [root@localhost /]#
二 . IPVS
IPVS IPVS是LVS集群系统的核心软件,它的主要作用是: 安装在Load Balancer上,把发往Virtual IP的请求转发到Real Server上。 IPVS的负载均衡机制有三种,这里使用IP Tunneling机制: Virtual Server via NAT Virtual Server via IP Tunneling Virtual Server via Direct Routing
负载均衡器可以运行在以下三种模式下:
(1)Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的流量经过转换器。
(2)Virtual Server via IP Tunneling (VS-TUN):用IP隧道技术实现虚拟服务器。这种方式是在集群的节点不在同一个网段时可用的转发机制,是将IP包封装在其他网络流量中的方法。为了安全的考虑,应该使用隧道技术中的VPN,也可使用租用专线。 集群所能提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务器等等.
(3)Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此法,控制管理的计算机接收到请求包时直接送到参与集群的节点。优点是返回给客户的流量不经过控制主机,速度快开销少。
(4) Virtual Server via full-NAT : 在NAT 时同时修改源地址
IPVS 的负载调度算法有十种: 轮叫(Round Robin) 加权轮叫(Weighted Round Robin) 最少链接(Least Connections) 加权最少链接(Weighted Least Connections) 基于局部性的最少链接(Locality-Based Least Connections) 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication) 目标地址散列(Destination Hashing ) 源地址散列(Source Hashing) 最短期望延迟(Shortest Expected Delay) 无须队列等待(Never Queue)
三种IP负载均衡技术的优缺点比较: 杂项 VS/NAT VS/TUN VS/DR 服务器操作系统 任意 支持隧道 多数(支持Non-arp ) 服务器网络 私有网络 局域网/广域网 局域网 服务器数目(100M网络) 10-20 100 多(100) 服务器网关 负载均衡器 自己的路由 自己的路由 效率 一般 高 最高
三. ipvsadm命令参考
ipvsadm命令参考 为了更好的让大家理解这份命令手册,将手册里面用到的几个术语先简单的介绍 一下: 1,virtual-service-address:是指虚拟服务器的ip 地址 2,real-service-address:是指真实服务器的ip 地址 3,scheduler:调度方法 ipvsadm 的用法和格式如下: 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] ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] 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] ipvsadm --stop-daemon ipvsadm -h 命令选项解释: 有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可 以。 -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,用来说 明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的 VRRP 功能。 --stop-daemon 停止同步守护进程 -h --help 显示帮助信息 其他的选项: -t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务 [vip:port] or [real-server-ip:port] -u --udp-service service-address 说明虚拟服务器提供的是udp 的服务 [vip:port] or [real-server-ip:port] -f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。 -s --scheduler scheduler 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, 默认的调度算法是: wlc. -p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客 户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。 -M --netmask netmask persistent granularity mask -r --real-server server-address 真实的服务器[Real-Server:port] -g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) -i --ipip 指定LVS 的工作模式为隧道模式 -m --masquerading 指定LVS 的工作模式为NAT 模式 -w --weight weight 真实服务器的权值 --mcast-interface interface 指定组播的同步接口 -c --connection 显示LVS 目前的连接 如:ipvsadm -L -c --timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout --daemon 显示同步守护进程状态 --stats 显示统计信息 --rate 显示速率信息 --sort 对虚拟服务器和真实服务器排序输出 --numeric -n 输出IP 地址和端口的数字形式
四 . lvs 测试
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward #开启核心路由转发 0 [root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
Virtual Server via NAT(VS-NAT)
1.添加虚拟虚拟服务和后端服务组
[root@localhost ~]# ipvsadm -A -t 10.2.61.21:8888 -s rr [root@localhost ~]# ipvsadm -a -t 10.2.61.21:8888 -r 10.2.61.23:80 -m [root@localhost ~]# ipvsadm -a -t 10.2.61.21:8888 -r 10.2.61.22:80 -m [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.2.61.21:8888 rr -> 10.2.61.22:80 Masq 1 0 0 -> 10.2.61.23:80 Masq 1 1 0 [root@localhost ~]#
2.查看配置目录
[root@localhost ~]# cat /usr/lib/systemd/system/ipvsadm.service [Unit] Description=Initialise the Linux Virtual Server After=syslog.target network.target [Service] Type=oneshot ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" ExecStop=/sbin/ipvsadm -C RemainAfterExit=yes [Install] WantedBy=multi-user.target [root@localhost ~]#
[root@localhost ~]# ipvsadm -S >/etc/sysconfig/ipvsadm #保存配置文件 [root@localhost ~]# cat /etc/sysconfig/ipvsadm -A -t localhost.localdomain:ddi-tcp-1 -s rr -a -t localhost.localdomain:ddi-tcp-1 -r 10.2.61.22:http -m -w 1 -a -t localhost.localdomain:ddi-tcp-1 -r 10.2.61.23:http -m -w 1 [root@localhost ~]#
[root@localhost ~]# ipvsadm -C #清空配置 [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@localhost ~]#
[root@localhost ~]# ipvsadm-restore </etc/sysconfig/ipvsadm #重载配置 [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 127.0.0.1:8888 rr -> 10.2.61.22:80 Masq 1 0 0 -> 10.2.61.23:80 Masq 1 0 0 [root@localhost ~]#
[root@localhost ~]# ipvsadm -E -t 10.2.61.21:8888 -s sh #修改虚拟服务配置
[root@localhost ~]# ipvsadm -Lnc IPVS connection entries pro expire state source virtual destination TCP 00:19 SYN_RECV 10.3.120.243:63809 10.2.61.21:8888 10.2.61.23:80 TCP 00:34 SYN_RECV 10.3.120.243:63815 10.2.61.21:8889 10.2.61.23:80 TCP 00:08 SYN_RECV 10.3.120.243:63801 10.2.61.21:8889 10.2.61.23:80 TCP 00:08 SYN_RECV 10.3.120.243:63798 10.2.61.21:8889 10.2.61.23:80 TCP 00:34 SYN_RECV 10.3.120.243:63816 10.2.61.21:8889 10.2.61.23:80 TCP 00:08 SYN_RECV 10.3.120.243:63800 10.2.61.21:8888 10.2.61.22:80 TCP 00:08 SYN_RECV 10.3.120.243:63799 10.2.61.21:8889 10.2.61.23:80 TCP 00:34 SYN_RECV 10.3.120.243:63817 10.2.61.21:8889 10.2.61.23:80 TCP 00:10 SYN_RECV 10.3.120.243:63802 10.2.61.21:8889 10.2.61.23:80 [root@localhost ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.2.61.21:8888 sh -> 10.2.61.22:80 Masq 1 0 0 -> 10.2.61.23:80 Masq 1 0 1 TCP 10.2.61.21:8889 rr -> 10.2.61.23:80 Masq 1 0 4 [root@localhost ~]#
[root@localhost ~]# ipvsadm -e -t 10.2.61.21:8888 -r 10.2.61.23:8080 #编辑后端服务 [root@localhost ~]# ipvsadm -d -t 10.2.61.21:8888 -r 10.2.61.23:80 @删除后端服务 [root@localhost ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.2.61.21:8888 sh -> 10.2.61.22:80 Masq 1 0 0 TCP 10.2.61.21:8889 rr -> 10.2.61.23:80 Masq 1 0 0 [root@localhost ~]#
Virtual Server via Direct Routing(VS-DR): DR 模式不支持端口转换
一 . lvs 的DR 模式也称作三角传输模式,在LVS 中需要关闭回环地址的ARP 响应功能和ARP 请求功能。
两个内核参数: arp_ignore :
当arp_ignore参数配置为1时,网卡上收到目的IP为环回网卡IP的arp请求,发现请求的IP不是自己网卡上的IP,不会回arp响应。 为 0 时响应arp 请求 arp_announce : 确定arp 请求时的源地址 : 0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。 1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。 2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
arp_ignore = 1
arp_announce 2
修改arp_ignore 和 arp_announce 参数的两种方式:
1. 修改/etc/sysctl.conf文件,然后sysctl -p刷新到内存。 net.ipv4.conf.all.arp_ignore=1 net.ipv4.conf.lo.arp_ignore=1 net.ipv4.conf.all.arp_announce=2 net.ipv4.conf.lo.arp_announce=2 2. 使用sysctl -w直接写入内存: sysctl -w net.ipv4.conf.all.arp_ignore=1 sysctl -w net.ipv4.conf.lo.arp_ignore=1 sysctl -w net.ipv4.conf.all.arp_announce=2 sysctl -w net.ipv4.conf.lo.arp_announce=2 3. 修改/proc文件系统: 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
二. loopback 地址配置
loopback接口的功能 用于网络服务测试,避免由于远程网络接入带来的安全问题; 一般用作client/server类的网络服务的测试,在测试时,client与server运行在同一台主机上,client通过使用loopback地址访问server。最常见的例子就是web服务的测试,一般我们用http://127.0.0.1/或者http://localhost/来访问本地的web服务。 测试IP协议栈 我们通过ping loopback地址的方式来测试操作系统中IP协议栈是否正常。 在网络中,所有源地址属于loopback地址的数据包将会被丢弃 IP协议规定loopback数据包是不允许在网络中传输的。网络网络接口必须丢弃接收到的loopback数据包。
修改回环地址:
[root@nginx network-scripts]# cp ifcfg-lo ifcfg-lo:1 [root@nginx network-scripts]# vim ifcfg-lo:1 [root@nginx network-scripts]# cat ifcfg-lo:1 DEVICE=lo:1 IPADDR=10.2.61.21 NETMASK=255.255.255.255 #NETWORK=127.0.0.0 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) #BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback1 [root@nginx network-scripts]#
[root@localhost ~]# ipvsadm -A -t 10.2.61.21:8888 -s rr [root@localhost ~]# ipvsadm -a -t 10.2.61.21:8888 -r 10.2.51.22:80 -g [root@localhost ~]# ipvsadm -a -t 10.2.61.21:8888 -r 10.2.51.23:80 -g [root@localhost ~]# [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.2.61.21:8888 rr -> 10.2.51.22:8888 Route 1 0 0 -> 10.2.51.23:8888 Route 1 0 0 [root@localhost ~]#
root@localhost yum.repos.d]# ipvsadm -E -t 192.168.100.102:80 -s sh #修改负载算法为源地址哈希 [root@localhost yum.repos.d]#
[root@localhost ~]# ipvsadm -E -t 192.168.100.102:80 -s rr -p #使用会话持久性连接功能 [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.102:80 rr persistent 360 -> 192.168.100.101:80 Route 1 0 2 -> 192.168.100.103:80 Route 1 0 0 [root@localhost ~]#