Linux学习112 基于LVS实现4层负载均衡配置和nat方式实战

一、IPVS配置

  1、安装ipvsadm

    a、yum install -y ipvsadm

    b、查看相应文件

[root@www ~]# rpm -ql ipvsadm 
/etc/sysconfig/ipvsadm-config #我们可以使用此文件来配置自动保存规则
/usr/lib/systemd/system/ipvsadm.service #他的作用是为了让你开机的时候从文件/etc/sysconfig/ipvsadm中重载规则,然后在关机前将规则保存在/etc/sysconfig/ipvsadm中
/usr/sbin/ipvsadm #规则管理工具
/usr/sbin/ipvsadm-restore #规则载入工具
/usr/sbin/ipvsadm-save #规则保存工具
/usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz

  2、ipvsadm管理几圈服务:增,改,删

    a、增、改

      ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

    b、删

      ipvsadm -D -t|u|f service-address

    c、service-address

      (1)、-t|u|f:

        -t:TCP协议的端口,VIP:TCP_PORT

        -u:UDP协议的端口,VIP:UDP_PORT

        -f:firewall MARK,是一个数字

    d、[-s scheduler]:指定集群的调度算法,默认为wlc;

  3、管理集群上的RS:增,改,删

    a、增,改:

      ipvsadm -a|-e -t|u|f  service-address -r server-address [-g|i|m] [-w weight]

    b、删

      ipvsadm -d -t|u|f  service-address -r server-address

    c、server-address

      rip[:port]

    d、选项

      (1)、lvs类型:

        -g:gateway,dr类型

        -i:ipip,tun类型

        -m:masquerade,nat类型

      (2)、-w weight:权重

  4、清空定义的所有内容:

    a、ipvsadm -C

  5、查看

    a、ipvsadm -L|l [options]

      (1)、--numeric,-n:numeric output of addresses and ports:数字格式显示地址和端口并且不反解。

      (2)、--exact:expand numbers (display exact values):精确显示计算器的值。

        对应的计数器有三种:

          1)、--connection,-c:output of current IPVS connections:用来显示连接状态,即当前我们服务器有多少个仍然在的活动或非活动连接

          2)、--stats:output of statisics information:统计数据

          3)、--rate:output of rate information:统计速率数据,比如从我们从集群启动开始到现在为止有一天了,一天中一共收到了三百万个请求,很显然stats就有三百万个连接数量,那么一天是八万六千四百秒,我们用三百万除以这么多秒平均下来每秒钟接收的连接数就叫速率。

12:00

  6、保存和重载

    a、保存:ipvsadm -S = ipvsadm-save

    b、重载:ipvsadm -R = ipvsadm-restore

  7、负载均衡集群设计时要注意的问题

    a、是否需要会话保持

    b、是否需要共享存储

      (1)、共享存储:NAS,SAN,DS(分布式存储)

      (2)、数据同步:

        课外作业:rsync+inotify实现数据同步

  8、lvs-nat

    a、设计要点

      (1)、RIP与DIP在同一IP网络,RIP的网关要指向DIP

      (2)、支持端口映射

      (3)、Director要打开核心转发功能

    b、实践作业(博客):负载均衡两个php应用(wordpress,discuzx)

      测试:

        是否需要会话保持

        是否需要共享存储

二、负载均衡集群配置

  1、nat方法设计

    a、我们现在来用三台虚拟机进行配置,一个调度器和两个RS,调度器有两张网卡,其中公网IP(VIP)为192.168.10.13,DIP我们配置为192.168.100.13。后端我们RS1网卡配置为192.168.100.14网关指向192.168.100.13。RS2网卡配置为192.168.100.15网关也指向192.168.100.13。并且我们RS1和RS2我们都配上web服务。

    b、如下:

      (1)、Director:  

        VIP:192.168.10.13

        DIP:192.168.100.13

      (2)、RS1:

        RIP:192.168.100.14   gw:192.168.100.13

      (3)、RS2:

        RIP:192.168.100.15 gw:192.168.100.13

    c、相应拓扑图

      

  2、nat配置

    a、我们配置集群中各节点时间同步

    b、我们在rs1和rs2中分别安装nginx和telnet-server

      yum install -y nginx telnet-server

    c、我们分别在rs1和rs2中配置相应的网页资源

      (1)、在RS1中查看

[root@rs1 ~]# cat /usr/share/nginx/html/test1.html
<h1>RS1,192.168.100.14</h1>
[root@rs1 ~]# systemctl restart nginx
[root@rs1 ~]# curl 192.168.100.14/test1.html
<h1>RS1,192.168.100.14</h1>

      (2)、在RS2中查看

[root@rs2 /]# cat /usr/share/nginx/html/test1.html
<h1>RS1,192.168.100.15</h1>
[root@rs2 /]# systemctl restart nginx
[root@rs2 /]# curl 192.168.100.15/test1.html
<h1>RS1,192.168.100.15</h1>

    d、在director上配置ipvsadm

      (1)、安装ipvsadm

        yum install -y ipvsadm

      (2)、定义一个集群服务

[root@driector ~]# ipvsadm -A -t 192.168.10.13:80 -s rr

        1)、上述的意思是添加一个tcp为80的集群服务,轮询方式为rr。

        2)、我们来查看集群服务

[root@driector ~]# 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.10.13:80 rr

      (3)、我们将后端的RS加入到集群服务

[root@driector ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.14 -m 
[root@driector ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.15 -m

        1)、-a是添加的意思,-t是tcp的意思,-r是rs的意思,-m是指gw类型的意思因为我们是rr轮询方法所以此处我们不设置权重,因为设置权重是没用的。

        2)、查看我们的集群

[root@driector ~]# 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.10.13:80 rr
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0 

      (4)、此时我们在外面访问192.168.10.13会发现没响应,这是因为我们没打开核心转发,因此此时我们打开director的核心转,然后我们发现就可以通过调度器进行访问了。 

[root@driector ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

      (5)、现在我们来访问

[root@driector var]# for i in {1..10};do curl 192.168.10.13/test1.html;done
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>

    e、现在我们来配置加权轮询,我们将第一台服务器权重定义为2第二台服务器权重定义为3

      (1)、我们来定义权重

[root@driector /]# ipvsadm -e -t 192.168.10.13:80 -r 192.168.100.14 -m -w 2
[root@driector /]# ipvsadm -e -t 192.168.10.13:80 -r 192.168.100.15 -m -w 3
[root@driector /]# 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.10.13:80 rr
  -> 192.168.100.14:80            Masq    2      0          0         
  -> 192.168.100.15:80            Masq    3      0          0

      (2)、此时虽然我们定义了权重但是我们的权重还是没法生效的,因为我们用的是轮询,因此我们还需要修改我们的调度算法

[root@driector /]# ipvsadm -E -t 192.168.10.13:80 -s wrr
[root@driector /]# 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.10.13:80 wrr
  -> 192.168.100.14:80            Masq    2      0          0         
  -> 192.168.100.15:80            Masq    3      0          0 

      (3)、然后我们再进行访问

[root@driector /]# for i in {1..10};do curl 192.168.10.13/test1.html;done
<h1>RS2,192.168.100.15</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS2,192.168.100.15</h1>
<h1>RS1,192.168.100.14</h1>

        1)、然后我们查看我们的连接状态发现基本是2:3

[root@driector /]# 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.10.13:80 wrr
  -> 192.168.100.14:80            Masq    2      0          8         
  -> 192.168.100.15:80            Masq    3      0          12

      (4)、假如我们有一个RS挂掉了,我们有两种方式将其从集群中干掉,第一种是直接删除这个RS的记录,第二种是将其权重设置为0。

        1)、我们来演示我们删除某个RS

[root@driector /]# 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.10.13:80 wrr
  -> 192.168.100.14:80            Masq    2      0          0         
  -> 192.168.100.15:80            Masq    3      0          0         
[root@driector /]# ipvsadm -d -t 192.168.10.13:80 -r 192.168.100.15
[root@driector /]# 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.10.13:80 wrr
  -> 192.168.100.14:80            Masq    2      0          0 

        2)、这样我们的请求就只能访问到192.168.100.14上了。

      (5)、我们也可以在Director上装一个nginx,假如后端的RS都挂了就用我们Director响应。不过我们就算在Director上装一个nginx也没有用,因为你的80的请求是被INPUT上的规则链直接劫走并且被当做集群服务了。但是如果我们后端的RS都挂了肯定就都连不上了。此时我们可以把我们Director上的回环地址当做RS。注意此处我们需要用到-g才行

[root@www ~]# ipvsadm -a -t 192.168.10.13:80 -r 127.0.0.1 -g
[root@www ~]# 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.10.13:80 wrr
  -> 127.0.0.1:80                 Masq    1      0          0         
[root@www ~]# curl 192.168.10.13
Director

    f、相应命令

      现在我们把相应的规则加回来

[root@www ~]# ipvsadm -C
[root@www ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@www ~]# ipvsadm -A -t 192.168.10.13:80 -s rr
[root@www ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.14 -m
[root@www ~]# ipvsadm -a -t 192.168.10.13:80 -r 192.168.100.15 -m
[root@www ~]# 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.10.13:80 rr
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0 

      (1)、现在我们使用sh算法,即把来自于同一个客户端的请求都送往相同的RS。

[root@www ~]# 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.10.13:80 rr
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0         
[root@www ~]# ipvsadm -E -t 192.168.10.13:80 -s sh
[root@www ~]# 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.10.13:80 sh
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0         
[root@www ~]# for i in {1..5};do curl 192.168.10.13/test1.html;done
<h1>RS1,192.168.100.14</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS1,192.168.100.14</h1>
<h1>RS1,192.168.100.14</h1>

      (2)、我们现在在后端的RS各启动telnet服务,然后再创建相应的用户并设定密码

        1)、在192.168.100.14上

[root@rs1 ~]# systemctl start telnet.socket
[root@rs1 ~]# useradd centos; echo "wohaoshuai"|passwd --stdin centos
Changing password for user centos.
passwd: all authentication tokens updated successfully.

        2)、在192.168.100.15上

[root@rs2 ~]# systemctl start telnet.socket 
[root@rs2 ~]# useradd centos; echo "wohaoshuai"|passwd --stdin centos
useradd: user 'centos' already exists
Changing password for user centos.
passwd: all authentication tokens updated successfully.

      (3)、我们定义lvs服务负载均衡我们后端的telnet

        1)、定义服务并且添加

[root@www ~]# ipvsadm -A -t 192.168.10.13:23 -s wlc
[root@www ~]# ipvsadm -a -t 192.168.10.13:23 -r 192.168.100.14 -m -w 1
[root@www ~]# ipvsadm -a -t 192.168.10.13:23 -r 192.168.100.15 -m -w 1
[root@www ~]# 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.10.13:23 wlc
  -> 192.168.100.14:23            Masq    1      0          0         
  -> 192.168.100.15:23            Masq    1      0          0         
TCP  192.168.10.13:80 sh
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0 

        2)、现在我们来telnet我们的VIP

          使用我们的centos账号telnet即可

      (4)、我们可以通过--stats查看当前集群的连接数统计,conns表示分给某个RS的请求数量统计,InPkts表示入栈的报文数量,OutPkts表示出栈的报文的数量,同理InBytes和OutBytes分别表示入栈和出栈的字节的数量。

[root@www ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.13:23                    2       84       69     4586     3868
  -> 192.168.100.14:23                   1       44       36     2400     2015
  -> 192.168.100.15:23                   1       40       33     2186     1853
TCP  192.168.10.13:80                    9       48       28     3209     3360
  -> 192.168.100.14:80                   7       40       24     2682     2880
  -> 192.168.100.15:80                   2        8        4      527      480
[root@www ~]# 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.10.13:23 wlc
  -> 192.168.100.14:23            Masq    1      0          0         
  -> 192.168.100.15:23            Masq    1      0          0         
TCP  192.168.10.13:80 sh
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0

      (5)、我们可以使用--rate参数查看速率。CPS表示每秒钟建立的连接数,InPPS表示每秒钟入栈的报文数,同理OutPPS表示每秒钟出栈的报文数。InBPS和OutBPS分别表示每秒钟入栈和出栈的字节数

[root@www ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.10.13:23                    0        0        0        0        0
  -> 192.168.100.14:23                   0        0        0        0        0
  -> 192.168.100.15:23                   0        0        0        0        0
TCP  192.168.10.13:80                    0        0        0        0        0
  -> 192.168.100.14:80                   0        0        0        0        0
  -> 192.168.100.15:80                   0        0        0        0        0

      (6)、我们还可以使用ipvsadm -Z命令来清空--rate和--stats中显示的相应的统计值。

[root@www ~]# ipvsadm -Z
[root@www ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.13:23                    0        0        0        0        0
  -> 192.168.100.14:23                   0        0        0        0        0
  -> 192.168.100.15:23                   0        0        0        0        0
TCP  192.168.10.13:80                    0        0        0        0        0
  -> 192.168.100.14:80                   0        0        0        0        0
  -> 192.168.100.15:80                   0        0        0        0        0
[root@www ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.10.13:23                    0        0        0        0        0
  -> 192.168.100.14:23                   0        0        0        0        0
  -> 192.168.100.15:23                   0        0        0        0        0
TCP  192.168.10.13:80                    0        0        0        0        0
  -> 192.168.100.14:80                   0        0        0        0        0
  -> 192.168.100.15:80                   0        0        0        0        0

      (7)、我们查看谁在访问可以使用 -c选项

[root@www ~]# ipvsadm -Ln -c
IPVS connection entries
pro expire state       source             virtual            destination
TCP 14:58  ESTABLISHED 192.168.10.13:37120 192.168.10.13:23   192.168.100.15:23

      (8)、我们要保存规则的话可以使用-S选项,如果不需要做反解(即IP转换为相应的域名或别名等)的话加上-n即可。

        1)、我们来查看

[root@www ~]# ipvsadm -S
-A -t node1.wohaoshuai.com:telnet -s wlc
-a -t node1.wohaoshuai.com:telnet -r 192.168.100.14:telnet -m -w 1
-a -t node1.wohaoshuai.com:telnet -r 192.168.100.15:telnet -m -w 1
-A -t node1.wohaoshuai.com:http -s sh
-a -t node1.wohaoshuai.com:http -r 192.168.100.14:http -m -w 1
-a -t node1.wohaoshuai.com:http -r 192.168.100.15:http -m -w 1
[root@www ~]# ipvsadm -S -n
-A -t 192.168.10.13:23 -s wlc
-a -t 192.168.10.13:23 -r 192.168.100.14:23 -m -w 1
-a -t 192.168.10.13:23 -r 192.168.100.15:23 -m -w 1
-A -t 192.168.10.13:80 -s sh
-a -t 192.168.10.13:80 -r 192.168.100.14:80 -m -w 1
-a -t 192.168.10.13:80 -r 192.168.100.15:80 -m -w 1

        2)、我们可以将我们的规则保存下来

[root@www ~]# ipvsadm -S -n > /etc/sysconfig/ipvsadm

        3)、然后我们可以进行清空并重载

[root@www ~]# ipvsadm -C
[root@www ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@www ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
[root@www ~]# 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.10.13:23 wlc
  -> 192.168.100.14:23            Masq    1      0          0         
  -> 192.168.100.15:23            Masq    1      0          0         
TCP  192.168.10.13:80 sh
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0

        4)、我们也可以通过service进行重载,不过前提是你需要将规则保存在/etc/sysconfig/ipvsadm中。

[root@www ~]# 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@www ~]# ipvsadm -C
[root@www ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@www ~]# systemctl restart ipvsadm
[root@www ~]# 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.10.13:23 wlc
  -> 192.168.100.14:23            Masq    1      0          0         
  -> 192.168.100.15:23            Masq    1      0          0         
TCP  192.168.10.13:80 sh
  -> 192.168.100.14:80            Masq    1      0          0         
  -> 192.168.100.15:80            Masq    1      0          0 
原文地址:https://www.cnblogs.com/Presley-lpc/p/13182184.html