LVS 使用手册


LVS 使用手册 Author:dipsey Date:2014-08-21 目录 1 概述 ............................................................................................................................................... 2 1.1 代码源站............................................................................................................................ 2 2 LVS 概念介绍 ................................................................................................................................. 2 2.1 缩略语说明 ......................................................................................................................... 2 2.2 负载均衡模式 ..................................................................................................................... 3 2.3 调度算法............................................................................................................................. 6 3 安装 ............................................................................................................................................... 7 3.1 阿里 LVS 安装 .................................................................................................................... 8 3.1.1 编译内核支持 fullnat 和 SYNPROXY ....................................................................... 8 3.1.2 安装 lvs 工具包 ....................................................................................................... 9 3.1.3 编译 real server 支持 TOA 的内核 ....................................................................... 10 3.2 标准安装........................................................................................................................... 10 3.2.1 编译安装内核 ........................................................................................................ 10 3.2.2 安装 ipvsadm ......................................................................................................... 11 3.2.3 安装 keepalived ..................................................................................................... 11 4 配置 ............................................................................................................................................ 11 4.1 系统优化配置 .................................................................................................................. 11 4.2 keepalived 配置 ................................................................................................................ 12 4.3 RealServer 配置 ................................................................................................................ 14 5 常用命令介绍 ............................................................................................................................. 15 5.1 ipvsadm ............................................................................................................................. 15 5.2 keepalived ......................................................................................................................... 16 附:相关知识点 ............................................................................................................................. 17 1 概述 本手册为 LVS(Linux virtual Server)实践总结,涵盖 LVS 内核编译,以及 keepalived、 ipvsadm 和 quagga 的安装使用。 1.1 代码源站 1、阿里 LVS http://kb.linuxvirtualserver.org/wiki/IPVS_FULLNAT_and_SYNPROXY 2、 LVS 源站 http://www.linuxvirtualserver.org/ 3、keepalived 源站 http://keepalived.org/ 4、quagga 源站 http://www.nongnu.org/quagga/ 2 LVS 概念介绍 2.1 缩略语说明 LVS ——linux virtual server VS ——virtul server VIP ——virtul server IP CIP ——client IP RS —— real server RIP ——real server IP 2.2 负载均衡模式 LVS 默认支持 3 种负载均衡模式 DR、NAT 和 TUN,官方文档说明详见下面链接。使用阿 里版本 LVS 可以支持第 4 种 FNAT 模式。 http://www.linuxvirtualserver.org/VS-DRouting.html http://www.linuxvirtualserver.org/VS-NAT.html http://www.linuxvirtualserver.org/VS-IPTunneling.html 1、DR(Direct Routing)模式 DR 模式 LVS 将数据包转发给 RS,由 RS 处理后直接返回数据给用户。由于 LVS 转发 时只修改了目标 MAC 地址,要求 LVS 和 RS 在同一网段内。示意图如下。 2、TUN 模式 与 DR 模式类似,通过建立 tunnel 连接 RS 和 LVS,因此 RS 和 LVS 可以不在同一网段。 3、NAT 模式 RS 不需要外网 IP,RS 网关要指向 LVS 的内网 IP,RS 与 LVS 的内网要在同一网段内。 进出所有流量都经过 LVS,LVS 性能可能成为瓶颈。 4、FNAT 模式 增加了 LIP(本地 IP),在 LVS 做 FNAT 将 CIP--VIP 转换为 LIP--RIP,LIP 和 RIP 都 是内网地址,实现跨网段访问。 2.3 调度算法 LVS 共支持 10 种调度算法。 1、静态调度: (1)rr(Round Robin):轮询调度,轮叫调度 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从 1 开始,直 到 N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有 连接的状态,所以它是一种无状态调度。 (2)wrr:weight,加权(以权重之间的比例实现在各主机之间进行调度) 由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服 务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。 (3)sh:source hashing,源地址散列。 主要实现会话绑定,能够将此前建立的 session 信息保留了源地址散列调度算法正好与目标 地址散列调度算法相反,它根据请求的源 IP 地址,作为散列键(Hash Key)从静态分配的 散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器, 否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址 散列调度算法的基本相似,除了将请求的目标 IP 地址换成请求的源 IP 地址,所以这里不一 个一个叙述。 (4)dh:destination hashing:目标地址散列。 把同一个 IP 地址的请求,发送给同一个 server。目标地址散列调度算法也是针对目标 IP 地 址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标 IP 地址映 射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key) 从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服 务器,否则返回空。 2、动态调度 (1)lc(Least-Connection):最少连接 最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度 是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度 器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加 1, 当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为 0 时,表 示该服务器不可用而不被调度。 简单算法:active*256+inactive(分给值最小的) (2)wlc(Weighted Least-Connection Scheduling):加权最少连接。 加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理 性能。服务器的缺省权值为 1,系统管理员可以动态地设置服务器的权限,加权最小连接调 度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。 简单算法:(active*256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑 谁) (3)sed(Shortest Expected Delay):最短期望延迟 基于 wlc 算法,简单算法:(active+1)*256/weight 【(活动的连接数+1)*256/除以权 重】 (4)nq(never queue):永不排队(改进的 sed) 无需队列,如果有台 realserver 的连接数=0 就直接分配过去,不需要在进行 sed 运算。 (5)LBLC(Locality-Based Least Connection):基于局部性的最少连接 基于局部性的最少连接算法是针对请求报文的目标 IP 地址的负载均衡调度,不签主要 用于 Cache 集群系统,因为 Cache 集群中客户请求报文的布标 IP 地址是变化的,这里假设 任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下, 将相同的目标 IP 地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主 存 Cache 命中率,从而调整整个集群系统的处理能力。基于局部性的最少连接调度算法根据 请求的目标 IP 地址找出该目标 IP 地址最近使用的 RealServer,若该 Real Server 是可用的且 没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一 半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。 (6)LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性 最少链接。 带复制的基于局部性最少链接调度算法也是针对目标 IP 地址的负载均衡,该算法根据 请求的目标 IP 地址找出该目标 IP 地址对应的服务器组,按“最小连接”原则从服务器组中 选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小 连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该 服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除, 以降低复制的程度。 3 安装 注:LVS 是基于 linux 内核实现的,在 2.6.x 内核中默认以及集成了 LVS 的模块 IPVS。 3.1 阿里 LVS 安装 3.1.1 编译内核支持 fullnat 和 SYNPROXY 注:阿里 LVS 补丁目前只支持 rhel6.2 内核。 1、安装编译所需要的软件,Redhat 源有些包没有要手动安装或使用 centos 源。 # yum -y install @development-tools kernel-devel rpm-build redhat-rpm-config asciidoc hmaccalc binutils-devel elfutils-libelf-devel newt-devel zlib-devel xmlto python-devel perl- ExtUtils-Embed rpmdev-setuptree libnl-devel 2、下载所需的 kernel 源码包和淘宝 LVS patch 包 # wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/kernel-2.6.32- 220.23.1.el6.src.rpm # wget http://kb.linuxvirtualserver.org/images/a/a5/Lvs-fullnat-synproxy.tar.gz 3、安装源码包 # rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm # cd /root/rpms/SPECS # rpmbuild -bp kernel.spec 4、解压阿里 LVS patch 包 解压 lvs-fullnat-synproxy.tar.gz 包,拷贝其中的 lvs-fullnat-synproxy/lvs-2.6.32- 220.23.1.el6.patch 到源码如下目录。 # cd /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64 # cp /data/sourcecode/lvs-fullnat-synproxy/lvs-2.6.32-220.23.1.el6.patch . 添加 ipvs patch # patch -p1 < ./lvs-2.6.32-220.23.1.el6.patch 6、编辑 kernel.spec 文件添加 buildid %define buildid .lvs 7、编译 rpm 包 # cd /root/rpmbuild/ # rpmbuild -bb --with baseonly --with firmware --without debuginfo SPECS/kernel.spec 编译后生成的 rpm 目录为:/root/rpmbuild/RPMS/x86_64 8、安装编译好的 rpm 包 #rpm -ivh kernel-firmware-2.6.32-220.23.1.el6.x86_64.rpm ——kernel 安装依赖包 #rpm -ivh kernel-2.6.32-220.23.1.el6.x86_64.rpm #rpm -ivh kernel-devel-2.6.32-220.23.1.el6.x86_64.rpm ——编译 keepalived 需要 #rpm -ivh kernel-heads-2.6.32-220.23.1.el6.x86_64.rpm ——编译 keepalived 需要 3.1.2 安装 lvs 工具包 阿里 lvs-fullnat-synproxy.tar.gz 解压后的目录里 lvs-tools.tar.gz 包含下面 3 个 lvs 工具 ipvsadm keepalived ——为阿里修改版,默认不支持 fullnat 和 synporxy 参数 quagga ——路由器软件,集群模式实现 OSPF。 1、安装 keepalived cd tools/keepalived; ./configure --with-kernel-dir="/lib/modules/`uname -r`/build"; make; make install; 2、安装 ipvsadm # cd /home/pukong/tools/ipvsadm; # make; # make install; 3、安装 quagga #cd tools/quagga; # ./configure --disable-ripd --disable-ripngd --disable-bgpd --disable-watchquagga --disable-doc - -enable-user=root --enable-vty-group=root --enable-group=root --enable-zebra -- localstatedir=/var/run/quagga # make # make install 3.1.3 编译 real server 支持 TOA 的内核 1、重复 3.1.1 的 1、2、3 步 2、解压阿里 LVS patch 包 解压 lvs-fullnat-synproxy.tar.gz 包 , 拷 贝 其 中 的 lvs-fullnat-synproxy/lvs-2.6.32- 220.23.1.el6.patch 到源码如下目录。 # cd /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64 # cp /data/sourcecode/lvs-fullnat-synproxy/rs-2.6.32-220.23.1.el6.patch . 3、添加 toa patch # patch -p1 < ./toa-2.6.32-220.23.1.el6.patch 编辑 kernel.spec 文件添加 buildid %define buildid .toa 4、编译 rpm 包 # cd /root/rpmbuild/ # rpmbuild -bb --with baseonly --with firmware --without debuginfo SPECS/kernel.spec 编译后生成的 rpm 目录为:/root/rpmbuild/RPMS/x86_64 5、安装编译好的 rpm 包 #rpm -ivh kernel-firmware-2.6.32-220.23.1.el6.x86_64.rpm ——kernel 安装依赖包 #rpm -ivh kernel-2.6.32-220.23.1.el6.x86_64.rpm 3.2 标准安装 3.2.1 编译安装内核 注:由于内核默认 hash table size 为 4096,详见附:知识点部分介绍,需修改配置重新 编译内核。 1、重复 3.1.1 的 1、2、3 步,安装内核源码包。 2、修改源码目录 config 文件(rpmbuild/SOURCES/kernel-2.6.32-x86_64.config)。 sed -i 's/CONFIG_IP_VS_TAB_BITS=12/CONFIG_IP_VS_TAB_BITS=20/g' ./*config 3、重复 3.1.1 的 6、7、8 步,编译安装内核 3.2.2 安装 ipvsadm 使用 yum 直接安装,Redhat 和 centos 源都包括 ipvsadm 的 rpm 包。 3.2.3 安装 keepalived 1、rpm 包安装 Centos 源包含 keepalived 的 rpm 包,可以使用 yum 安装或下载安装,目前 centos 源版本 为 1.2.7。 2、使用源码包安装 源站最新版本为 1.2.9,从此版本开始支持 VRRP 使用 unicast,可以替代原来的 multicast, 减少网络中的组播包。 4 配置 4.1 系统优化配置 1、内核启动参数 编辑/etc/grub.conf,启动项参数添加“nohz=off ” 注:如果不关闭 nohz,大压力下 CPU0 可能会消耗过高,压力不均匀;针对 2.6.32 以上 版本内核。 2、sysctl 配置及优化 编辑 sysctl.conf 文件,在文件最后添加如下内容。 ### lvs config net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries =2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 # tweak for lvs 网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列 的数据包的最大数目。 net.core.netdev_max_backlog = 50000 4.2 keepalived 配置 下面以 DR 模式为例,介绍 keepalived.conf 配置。该配置文件包括全局配置、VRRPD 配置和 LVS 配置 3 部分。 ####全局配置, ##设置邮件通知,keepalived 状态变化时发邮件到指定邮箱。 ##route_id 是主备一组服务器的标识。 global_defs { notification_email { } notification_email_from yuanhy@mail.51.com smtp_server 192.168.58.100 smtp_connect_timeout 30 router_id LVS1 } ####VRRPD 配置 ##vrrp 同步组配置,组里面任意一个 instance 出现问题,都会进行切换。VG_1 为 sync_group 名,VI_1 为 vrrp instance 名称。 vrrp_sync_group VG_1 { group { VI_1 } } ##vrrp 实例配置 vrrp_instance VI_1 { state BACKUP //主备状态设置,默认优先级高的为主,即使 state 设置为 BACKUP 启动后仍会成为 MASTER。经测试可以不设置。 nopreempt //不抢占,切换到 BACKUP 后,MASTER 恢复不再切换。 该参数只能在 BACKUP 上设置,公司 LVS 服务器 state 主备 都设置为 BACKUP,通过 priority 来确定主备。 interface eth0 // instance 绑定的端口 track_interface { eth0 //监控的端口,可设置多个。 eth1 } #单播配置,1.2.9 及以上版本支持 unicast_peer { 192.168.52.72 } #组播使用的源 IP,默认为组播配置,使用 instance 绑定端口 IP,可以不设置。 mcast src ip 192.168.52.72 virtual_router_id 55 // 虚拟路由器 ID,取值范围(0~255,可用值 1-254) priority 150 // 优先级,取值范围(0~255,可用值 1-254),值越大优先 级越高。建议主高于备 50。优先级 0 为系统保留给路由器放弃 master 位置时候使用,255 则 是系统保留给当前 master 使用。 advert_int 1 // 检查默认间隔 1s authentication { // 设置认证方式及密码 auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.52.231/24 dev eth0 // 配置 VIP } } ####LVS 配置 virtual_server 192.168.52.231 80 { // VIP 及监听端口 delay_loop 3 //检测时间间隔 lb_algo wrr //设置调度算法 lb_kind DR //设置负载均衡模式 persistence_timeout 1200 //设置会话保持时间 protocol TCP //设置协议,也支持 UDP ha_suspend //如果 VS 的 IP 没有设置,挂起 RS 的健康检查 real_server 192.168.52.226 80 { weight 3 //设置权重 TCP_CHECK { //监控检查 TCP 端口 connect_timeout 3 } } } 4.3 RealServer 配置 1、绑定 VIP 到 lo 接口 # ifconfig lo:0 192.168.52.231 netmask 255.255.255.255 注:掩码为 32 位。 2、调整内核 arp 相关参数 参数含义详见附:相关知识点部分。 echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore ##注:RHEL6.0 以上版本,使用内网调度时,还需要再增加下面一行 echo '0' > /proc/sys/net/ipv4/conf/eth1/rp_filter 或者将下列配置添加到 sysctl.conf 文件中 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 5 常用命令介绍 5.1 ipvsadm ipvsadm 命令行具有管理 LVS 的全部功能,我们实际使用 keepalived 进行管理,ipvsadm 主用用于查看配置是否生效,查看命令及参数介绍如下。 # ipvsadm -L|l [options] 参数说明如下: 1、 -n: 数字格式显示主机地址和端口,示例如下。 # ipvsadm -ln IP Virtual Server version 1.2.1 (size=1048576) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 61.130.109.101:80 wrr persistent 1200 -> 61.130.109.79:80 Route 3 0 0 -> 61.130.109.80:80 Route 3 237 62777 2、--stats:统计数据 # ipvsadm -l --stats IP Virtual Server version 1.2.1 (size=1048576) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP ppp101-109.hu.zj.zninfo.net: 65077 18131327 0 1249M 0 -> ppp79-109.hu.zj.zninfo.net:h 0 0 0 0 0 -> ppp80-109.hu.zj.zninfo.net:h 65077 18131335 0 1249M 0 3、--rate: 速率 ipvsadm -l --rate IP Virtual Server version 1.2.1 (size=1048576) Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:Port TCP ppp101-109.hu.zj.zninfo.net: 0 63455 0 4384465 0 -> ppp79-109.hu.zj.zninfo.net:h 0 0 0 0 0 -> ppp80-109.hu.zj.zninfo.net:h 0 63455 0 4384465 0 4、--timeout: 显示 tcp、tcpfin 和 udp 的会话超时时长 ipvsadm -l --timeout Timeout (tcp tcpfin udp): 900 120 300 5、-c: 显示当前的 ipvs 连接状况 注:服务器连接数多的时候,系统资源消耗较大,慎用。 ipvsadm -lc IPVS connection entries pro expire state source virtual destination TCP 01:55 FIN_WAIT ppp78-109.hu.zj.zninfo.net:11468 ppp101-109.hu.zj.zninfo.net:http ppp80-109.hu.zj.zninfo.net:http TCP 01:59 FIN_WAIT ppp78-109.hu.zj.zninfo.net:54870 ppp101-109.hu.zj.zninfo.net:http ppp80-109.hu.zj.zninfo.net:http TCP 01:55 FIN_WAIT ppp78-109.hu.zj.zninfo.net:10426 ppp101-109.hu.zj.zninfo.net:http 5.2 keepalived 1、服务管理命令 启动:service keepalived start 停止:service keepalived stop 重启:service keepalived restart 更新:service keepalived reload 状态:service keepalived status 注:service keepalived restart 会导致主备切换,修改配置文件后,使用 reload 更新配置。 2、查看服务 log Keepalived 的 log 默认保存在系统 log 中,通过查看 log 检查服务是否启动正常。 正常启动 log 如下: Dec 6 19:55:32 rhel62-lvs-1 Keepalived_vrrp[8312]: Opening file '/etc/keepalived/keepalived.conf'. Dec 6 19:55:32 rhel62-lvs-1 Keepalived_vrrp[8312]: Configuration is using : 67361 Bytes Dec 6 19:55:32 rhel62-lvs-1 Keepalived_vrrp[8312]: Using LinkWatch kernel netlink reflector... Dec 6 19:55:32 rhel62-lvs-1 Keepalived_vrrp[8312]: VRRP sockpool: [ifindex(2), proto(112), unicast(1), fd(10,11)] 异常启动 log 如下: Dec 7 19:38:07 rhel62-lvs-1 Keepalived_vrrp[6463]: Opening file '/etc/keepalived/keepalived.conf'. Dec 7 19:38:07 rhel62-lvs-1 Keepalived_vrrp[6463]: } no match, ignoring... Dec 7 19:38:07 rhel62-lvs-1 Keepalived_vrrp[6463]: unicast_peer no match, ignoring... Dec 7 19:38:07 rhel62-lvs-1 Keepalived_vrrp[6463]: 192.168.52.222 no match, ignoring... 注:keepalived.conf 配置错误,也可以 start/reload 成功,修改后要使用 ipvsadm 查看命 令检查配置是否生效。 附:相关知识点 1、hash table size 默认为 4096,使用命令 ipvsadm -ln 可以查看,显示如下。 IP Virtual Server version 1.2.1 (size=4096) 修改下面的内核配置参数,重新编译内核,可以增大该值到 20,阿里内核补丁值为 22(阿 里服务器为万兆网卡)。 CONFIG_IP_VS_TAB_BITS=12 (2 的 12 次方,4096)为 CONFIG_IP_VS_TAB_BITS=20 2、MAC 地址广播 在 DR 模型中,由于每个节点均要配置 VIP,因此存在 VIP 的 MAC 广播问题,可以修改系 统参数屏蔽此问题,参数具体说明如下。 arp_ignore: 定义接收到 ARP 请求时的响应级别; 0:只要本地配置的有相应地址,就给予响应; 1:仅在请求的目标地址配置在到达的接口上的时候,才给予响应;DR 模型使用 arp_announce:定义将自己地址向外通告时的通告级别; 0:将本地任何接口上的任何地址向外通告; 1:试图仅向目标网络通告与其网络匹配的地址; 2:仅向与本地接口上地址匹配的网络进行通告;DR 模型使用
还剩16页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

dipsey

贡献于2015-06-18

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf