LVS实战篇
第1章 环境准备
1.1 系统环境
1.1.1 系统版本
[root@lb01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@lb01 ~]# uname -r 2.6.32-696.el6.x86_64 [root@lb01 ~]# uname -m x86_64
1.1.2 关闭安全机制
[root@lb01 ~]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux [root@lb01 ~]# setenforce 0 [root@lb01 ~]# /etc/init.d/iptables stop
1.1.3 更换yum源并添加epel源
[root@lb01 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak [root@lb01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo [root@lb01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
1.2 主机及IP地址规划
主机名 |
IP地址 |
说明 |
lb01 |
10.0.0.5 |
负载1 |
lb02 |
10.0.0.6 |
负载2 |
web02 |
10.0.0.7 |
web服务1 |
web01 |
10.0.0.8 |
web服务2 |
第2章 安装ipvsadm
2.1 yum安装
[root@lb01 ~]# yum install -y ipvsadm ==》四台服务器都要执行 [root@web02 ~]# rpm -qa ipvsadm ==》四台服务器都要执行 ipvsadm-1.26-4.el6.x86_64
2.2 做软连接并查看是否加载内核模块
[root@lb01 ~]# ln -s /usr/src/kernels/`uname -r` /usr/src/linux ==》只需在负载上执行即可 [root@lb01 ~]# ll /usr/src/ [root@lb01 ~]# lsmod |grep ip_vs ==》四台服务器都要执行 ip_vs 126705 0 libcrc32c 1246 1 ip_vs ipv6 336368 272 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6,ib_ipoib,ib_addr
注意:若用lsmod |graep ip_vs没出现上述内容,则执行ipvsadm或者modprobe ip_vs命令即可 然后在执行lsmod |graep ip_vs即可出现上述内容
2.3 在负载上添加VIP
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0 或者 [root@lb02 ~]# ifconfig eth0:0 10.0.0.3/24 up
2.4 在负载上添加节点
[root@lb01 ~]# ipvsadm -C ==》清空 [root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr ==》增加vserver [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 [root@lb01 ~]# ipvsadm --set 30 5 60 ==》优化 [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 -> 10.0.0.7:80 Route 1 0 0 -> 10.0.0.8:80 Route 1 0 0
2.5 在RS上绑定VIP和一直ARP
[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0 ==》绑定VIP 或者 [root@web01 ~]# ifconfig lo:0 10.0.0.3/32 up [root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore ==》抑制ARP [root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce [root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore [root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ## [root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore [root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce [root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore [root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ## [root@web01 ~]# route add -host 10.0.0.3 lo ==》增加一条路由 不是必须的
2.6在RS上搭建Web服务
详细搭建过程在前面的nginx基础篇已经介绍过,可以点击下面的连接进行查看
https://blog.51cto.com/lzhnb/2095335
2.7 测试
在浏览器中输入10.0.0.3进行访问
可以在命令行输入下面的命令进行监视
[root@lb01 ~]# watch -n 1 ipvsadm -Ln Every 1.0s: ipvsadm -Ln Sat May 26 21:15:56 2018 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 -> 10.0.0.7:80 Route 1 1 0 -> 10.0.0.8:80 Route 1 2 0
第3章 ipvsadm常用参数总结
[root@lb01 ~]# ipvsadm --help ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1) Usage: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] 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 [options] 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 sid] ipvsadm --stop-daemon state ipvsadm -h 命令: 允许长或短选项。 --add-service -A添加具有选项的虚拟服务 --edit-service -E使用选项编辑虚拟服务 --delete-service -D删除虚拟服务 --clear -C清除整个表 --restore -R从stdin恢复规则 --save -S将规则保存到stdout --add-server -a添加带有选项的实服务器 --edit-server -e编辑带有选项的实服务器 --delete-server -d删除真实服务器 --list -L | -l列出表 --zero -Z零计数器在服务或所有服务 --set tcp tcpfin udp设置连接超时值 --start-daemon启动连接同步守护程序 --stop-daemon停止连接同步守护程序 --help -h显示此帮助消息 选项: --tcp-service -t service-address service-address是host [:port] --udp-service -u service-address service-address是host [:port] --fwmark-service -f fwmark fwmark是一个大于零的整数 --scheduler -s调度程序rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq默认调度程序是wlc。 --persistent -p [timeout]持久服务 --netmask -M netmask持久粒度掩码 --real-server -r服务器地址服务器地址是主机(和端口) --gatewaying -g网关(直接路由)(默认) --ipip -i ipip encapsulation(tunneling) --masquerading -m伪装(NAT) --weight -w实服务器的权重 --syncid sid syncid用于连接同步(默认值= 255) --ipip -i ipip encapsulation(tunneling) 指定LVS的工作模式为隧道模式 --masquerading -m伪装(NAT) 指定LVS的工作模式为NAT模式 --u-threshold -x连接的阈值上限阈值 --l-threshold -y lthreshold连接的下限阈值 --mcast-interface接口用于连接同步的组播接口 指定组播的同步接口 --syncid sid syncid用于连接同步(默认值= 255) --connection -c当前IPVS连接的输出 显示LVS目前的连接如:ipvsadm -L -c 超时输出超时(tcp tcpfin udp) 显示tcp tcpfin udp的超时值如:ipvsadm -L --timeout --daemon输出守护进程信息 显示同步守护进程状态 统计信息的统计输出 显示统计信息 速率信息的速率输出 显示速率信息 阈值输出阈值信息 --persistent-conn输出持久连接信息 服务/服务器条目的排序输出 对虚拟服务器和真实服务器排序输出 --ops -O单分组调度 --numeric -n地址和端口的数字输出 输出IP地址和端口的数字形式 -numeric -n输出IP地址和端口的数字形式 --stat选项是统计自那条转发规则生效以来的包 Conns(connections scheduled)已经转发过的连接数 InPkts(incoming packets)入包个数 OutPkts(outgoing packets)出包个数 InBytes(传入字节)入流量(字节) OutBytes(outgoing bytes)出流量(字节) --rate选项是显示速率信息 CPS(current connection rate)每秒连接数 InPPS(当前包速率)每秒的入包个数 OutPPS(当前输出包速率)每秒的出包个数 InBPS(字节速率)每秒入流量(字节) OutBPS(current out byte rate)每秒入流量(字节)
第4章keepalived+lvs
4.1 安装keepalived服务
[root@lb01 ~]# yum install keepalived -y == 》在负载上安装
4.2 配置keepalived
[root@lb01 keepalived]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } 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 { 10.0.0.3 } } virtual_server 10.0.0.3 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 10.0.0.7 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.0.0.8 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
4.3 在RS节点执行下面的脚本
[root@web02 init.d]# cat /etc/init.d/lvs
#!/bin/bash #description Config LVS to realserver lo and apply noarp #Written by LZH VIP=10.0.0.3 . /etc/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP #/sbin/route add -host $SNS_VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down # route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
注意需要给该脚本加上可执行权限!!!
[root@web02 init.d]# chmod +x /etc/init.d/lvs
keepalived+lvs 是生产中常用的实现lvs负载均衡的方法
第5章 lvs故障排错思路
5.1 导致负载不均衡的原因
q LVS自身的会话保持参数设置(-p 300),优化:大公司常用cookies代替session
q LVS调度算法设置,如rr、wrr、wlc、lc
q 后端RS节点的会话保持参数,如apache的keepalived参数
q 用户发送请求时间短,请求资源的大小
5.2 排错思路
q 调度器上LVS调度规则及IP的正确性
q RS节点上VIP绑定和arp的抑制检查
vip绑定处理方案:
对RS绑定的VIP做实时监控
把RS绑定的VIP 做成配置文件,/etc/sysconfig/network-scripts/ifcfg-lo:0
arp抑制处理方案:
如果是单个VIP,则可以用stop传参设置0
若果RS有多个VIP绑定,即使stop也一定不要设置为0
q RS节点上自身提供服务的检查(DR不能进行端口转换)
q 利用辅助工具tcpdump、ping等进行排查