zoukankan      html  css  js  c++  java
  • 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 
  • 相关阅读:
    Day1-while and for/break and continue
    Day1-用户输入及字符串格式化输入
    Day1-python基础
    2-21-源码编译搭建LNMP环境
    2-20-使用apache搭建web网站
    2-19-mysql优化
    2-18-搭建mysql集群实现高可用
    2-17-MySQL读写分离-mysql-proxy
    2-16-2MySQL主从
    2-14-存储过程-触发器-事务
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/13182184.html
Copyright © 2011-2022 走看看