1.编译安装ipvsadm

首先从LVS官网下载tarball,解压后make && make install即可。

要注意的是LVS的依赖有:popt-static、libnl、kernel。如果yum源里有就直接安装,如果没有就自行下载,但一定要对应上已有软件如popt或Linux内核的版本。

$ tar -xzvf ipvsadm-1.26.tar.gz
$ cd ipvsadm-1.26
$ make
make -C libipvs
make[1]: Entering directory `/root/lvs/ipvsadm-1.26/libipvs'
gcc -Wall -Wunused -Wstrict-prototypes -g -fPIC -DLIBIPVS_USE_NL -DHAVE_NET_IP_VS_H -c -o libipvs.o libipvs.c
gcc -Wall -Wunused -Wstrict-prototypes -g -fPIC -DLIBIPVS_USE_NL -DHAVE_NET_IP_VS_H -c -o ip_vs_nl_policy.o ip_vs_nl_policy.c
ar rv libipvs.a libipvs.o ip_vs_nl_policy.o
ar: creating libipvs.a
a - libipvs.o
a - ip_vs_nl_policy.o
gcc -shared -Wl,-soname,libipvs.so -o libipvs.so libipvs.o ip_vs_nl_policy.o
make[1]: Leaving directory `/root/lvs/ipvsadm-1.26/libipvs'
gcc -Wall -Wunused -Wstrict-prototypes -g -DVERSION=\"1.26\" -DSCHEDULERS=\""rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq"\" -DPE_LIST=\""sip"\" -DHAVE_POPT -DHAVE_NET_IP_VS_H -c -o ipvsadm.o ipvsadm.c
ipvsadm.c: In function âprint_largenumâ:
ipvsadm.c:1383: warning: field width should have type âintâ, but argument 2 has type âsize_tâ
gcc -Wall -Wunused -Wstrict-prototypes -g -DVERSION=\"1.26\" -DSCHEDULERS=\""rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq"\" -DPE_LIST=\""sip"\" -DHAVE_POPT -DHAVE_NET_IP_VS_H -c -o config_stream.o config_stream.c
gcc -Wall -Wunused -Wstrict-prototypes -g -DVERSION=\"1.26\" -DSCHEDULERS=\""rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq"\" -DPE_LIST=\""sip"\" -DHAVE_POPT -DHAVE_NET_IP_VS_H -c -o dynamic_array.o dynamic_array.c
gcc -Wall -Wunused -Wstrict-prototypes -g -o ipvsadm ipvsadm.o config_stream.o dynamic_array.o libipvs/libipvs.a -lpopt -lnl

最后make install,安装ipvsadm、ipvsadm-save等命令,并添加ipvsadm到系统服务,方便了后续使用。

$ make install
make -C libipvs
make[1]: Entering directory `/root/lvs/ipvsadm-1.26/libipvs'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/root/lvs/ipvsadm-1.26/libipvs'
if [ ! -d /sbin ]; then mkdir -p /sbin; fi
install -m 0755 ipvsadm /sbin
install -m 0755 ipvsadm-save /sbin
install -m 0755 ipvsadm-restore /sbin
[ -d /usr/man/man8 ] || mkdir -p /usr/man/man8
install -m 0644 ipvsadm.8 /usr/man/man8
install -m 0644 ipvsadm-save.8 /usr/man/man8
install -m 0644 ipvsadm-restore.8 /usr/man/man8
[ -d /etc/rc.d/init.d ] || mkdir -p /etc/rc.d/init.d
install -m 0755 ipvsadm.sh /etc/rc.d/init.d/ipvsadm

最后,关闭防火墙和selinux:service iptables stop && setenforce 0

2.DR模式配置

2.1 Ipvsadm参数解释

$ ipvsadm -C
$ ipvsadm -A -t 192.168.100.20:80 -s rr
$ ipvsadm -a -t 192.168.100.20:80 -r 192.168.100.116:80 -g -p60
$ ipvsadm -a -t 192.168.100.20:80 -r 192.168.100.117:80 -g -p60

ipvsadm参数含义:

  • -C:清除已有规则。
  • -A:添加VIP服务,后跟服务的访问地址。
  • -t:TCP协议,还是UDP协议(-u)。
  • -s:负载均衡算法,rr表示RoundRobin。
  • -a:添加RealServer到VIP,后跟虚地址。
  • -r:添加RealServer到VIP,后跟实地址。
  • -g:透传模式(-g表示Direct Routing即DR模式,-i表示ipip封装即Tunneling模式,-m表示Network Access Translation即NAT模式)
  • -p:Session粘连,同一客户端的请求在一段时间内都负载到同一RealServer。

2.2 Director配置

使用DR模式必须在主机上开启IP转发。

$ vi /etc/sysctl.conf
...
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.em1.send_redirects = 0
...
$ sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.em1.send_redirects = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
vm.swappiness = 0

网络配置:

$ ifconfig em1:0 192.168.242.101 broadcast 192.168.242.255 netmask 255.255.255.0 up
[root@node12 lvs]# ifconfig
em1 Link encap:Ethernet HWaddr B0:83:FE:DB:48:DF
inet addr:192.168.242.102 Bcast:192.168.242.255 Mask:255.255.255.0
inet6 addr: fe80::b283:feff:fedb:48df/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
... em1:0 Link encap:Ethernet HWaddr B0:83:FE:DB:48:DF
inet addr:192.168.242.101 Bcast:192.168.242.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:40 Memory:95000000-957fffff lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
... $ route add -host 192.168.242.101 dev em1:0
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.242.101 * 255.255.255.255 UH 0 0 0 em1
192.168.242.0 * 255.255.255.0 U 0 0 0 em1
192.168.180.0 * 255.255.255.0 U 0 0 0 em3
link-local * 255.255.0.0 U 1002 0 0 em1
link-local * 255.255.0.0 U 1004 0 0 em3
default 192.168.180.253 0.0.0.0 UG 0 0 0 em3

接下来用ipvsadm配置LVS:

$ ipvsadm -A -t 192.168.242.101:8088 -s rr
$ ipvsadm -a -t 192.168.242.101:8088 -r 192.168.242.105:8088 -g
$ ipvsadm -a -t 192.168.242.101:8088 -r 192.168.242.106:8088 -g
$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.242.101:8088 rr
-> 192.168.242.105:8088 Route 1 0 0
-> 192.168.242.106:8088 Route 1 0 0 $ ipvsadm-save > /etc/sysconfig/ipvsadm
$ cat /etc/sysconfig/ipvsadm
-A -t 192.168.242.101:radan-http -s rr
-a -t 192.168.242.101:radan-http -r 192.168.242.105:radan-http -g -w 1
-a -t 192.168.242.101:radan-http -r 192.168.242.106:radan-http -g -w 1 $ service ipvsadm start
Clearing the current IPVS table: [ OK ]
Applying IPVS configuration: [ OK ]

2.4 RealServer配置

首先配置内核屏蔽掉Director发来的ARP消息:

$ vi /etc/sysctl.conf
...
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.em1.arp_ignore = 1
net.ipv4.conf.em1.arp_announce = 2
...
$ sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.em1.arp_ignore = 1
net.ipv4.conf.em1.arp_announce = 2
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
vm.swappiness = 0

将VIP添加到loopback接口,并且netmask必须是255.255.255.255。

$ ifconfig lo:0 192.168.242.101 broadcast 192.168.242.255 netmask 255.255.255.255 up
$ ifconfig
em1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.242.105 Bcast:192.168.242.255 Mask:255.255.255.0
inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
... lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
... lo:0 Link encap:Local Loopback
inet addr:192.168.242.102 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1 $ route add -host 192.168.242.101 dev lo:0
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.242.101 * 255.255.255.255 UH 0 0 0 lo
192.168.242.0 * 255.255.255.0 U 0 0 0 em1
192.168.180.0 * 255.255.255.0 U 0 0 0 em3
link-local * 255.255.0.0 U 1002 0 0 em1
link-local * 255.255.0.0 U 1004 0 0 em3
default 192.168.180.253 0.0.0.0 UG 0 0 0 em3

因为RealServer上不需要安装启动ipvsadm服务,所以我们要手动加载ip_vs到内核(Director上是ipvsadm自动帮我们加载的):

$ modprobe ip_vs
$ lsmod | grep ip
ip_vs 125220 0
ip6t_REJECT 4628 2
nf_conntrack_ipv6 8748 2
nf_defrag_ipv6 11182 1 nf_conntrack_ipv6
nf_conntrack 79758 2 nf_conntrack_ipv6,xt_state
ip6table_filter 2889 1
ip6_tables 18732 1 ip6table_filter
ipv6 317340 399 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
libcrc32c 1246 2 ip_vs,bnx2x

3.负载均衡测试

在两台RealServer上通过tcpdump tcp -A -ni em1 port 8088监听,不断访问VIP就会发现请求轮询转发到两台RealServer上,实现了负载均衡。注意监听的是em1而不是lo:1。

测试时犯了一个错误,我一直在VIP本机上测试,发现怎么都不通,以为LVS没配好于是就一直配啊配,结果从其他机器访问了一下VIP发现其实早就配好了…

经过这次配置学习,以及上面监听em1而非lo:1和VIP本机访问的问题,都证明了我对LVS和网络基础的不够熟悉,还要强化学习一下!

负载均衡LVS(DR模式)安装实战的更多相关文章

  1. 负载均衡 Lvs DR 模式笔记

    先来一张原理图,相当于ip-tun模式把tunl0的那块网卡配置在eth0:0的这个接口上,避免了兼容性的问题

  2. LVS负载均衡之DR模式原理介绍

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  3. LVS负载均衡之DR模式部署

      1.LVS的DR模式介绍 参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html     VS/DR利用大多数Internet服务的非对称特点,负 ...

  4. 负载均衡 Lvs nat 模式笔记

    nat技术(网络地址转换) 缺点就是进入和返回都通过调度器的服务器,未来可能会成为瓶颈 实验:nat 模式 先在调度器安装ipvsadm 后再添加网卡,后面就连不上网了(yum -y install ...

  5. LVS DR模式 负载均衡服务搭建

    LVS 负载均衡 最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡).LVS模式工作在网络层 ...

  6. CentOS下LVS DR模式负载均衡配置详解

    一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Ma ...

  7. Linux系统(五)负载均衡LVS集群之DR模式

    序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...

  8. LVS负载均衡IP隧道模式原理介绍以及配置实战

    LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...

  9. 负载均衡集群企业级应用实战—LVS

    一.负载均衡集群介绍 1.集群 ① 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技 ...

随机推荐

  1. Animations in UWP Community Toolkit - Overview

    概述 UWP Community Toolkit  中有一个 Animations 的集合,它们可以帮助开发者实现很多的动画,本篇我们先来看一下 Animations 的功能都有哪些,再后面会针对每一 ...

  2. svg 五花 元辅音 助读器

    如图,使用svg 创建5个圆,中间 辅音字母,外圈 元音字母 以及 示例单词. 可以使用  提交 按钮 进行更新

  3. Codeforces 343E Pumping Stations

    Description 题面 题目大意:求一个排列 \(P\),使得 \(\sum_{i=1}^{n-1}maxflow(P_i,P_{i+1})\) 尽量大 Solution 构造出最小割树,那么第 ...

  4. hdu2669与hdu1576(扩展欧几里德)

    模板: int Extend_Euclid(int a, int b, int &x, int &y){         if(b == 0){             x = 1; ...

  5. [Codeforces]663E Binary Table

    某变换好题.不过听说还有O(2^n*n^2)DP的…… Description 给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少. Input 第一行两个整数n,m ...

  6. bzoj 4008: [HNOI2015]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  7. bzoj1132[POI2008]Tro 计算几何

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1722  Solved: 575[Submit][Status] ...

  8. java 之 MyBatis(sql 可以执行,在eclipse执行报错问题)

    前段时间写 mybatis Sql 查询语句的时候,发现一个很奇怪的现象,我写的SQL 语句在 pl/Sql 中明明可以执行,但是放到 eclipse 中执行却报错,因为时间比较久,依稀记得是文字与字 ...

  9. of_alias_get_id 函数与设备树中aliases节点的关系【转】

    转自:https://blog.csdn.net/qq_30145093/article/details/78053823?locationNum=10&fps=1 转自http://www. ...

  10. 手机上的ROM与RAM

    ROM:read only memory翻译为只读存储器. RAM:read access memory翻译为随机存储器. 下面是一张手机的配置参数表. 简单来说,RAM就是真正意义上的内存,而ROM ...