欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 36_03 _Linux集群系列之三——LVS调度方法及NAT模型的演示 有大用

image.png


LB

HA

HP


LB:

        Hardware:

                FS BIG-IP

                Citrix NetScaler

                A10

         Software

                四层:

                        LVS      

                七层:

                        nginx

                        haproxy


LVS:    Linux Virtual Server

        NAT:

                    类似于iptables的DNAT

        DR:

        TUN:

image.png


LVS调度方法:

        固定调度(静态调度)    有下面几种算法 为什么叫静态,因为在调度的时候,是不考虑当前服务器是空闲还是繁忙的,

                rr: (round robin)轮叫,轮询,轮调

                wrr:(weight round robin)加权,以权重的比例作为轮询标准;谁权重高,real server被director调度的机会就越多

                sh:(source hash)源地址hash,只要是来自同一个客户端的用户请求,都给它发至同一个real server,


                dh:(destination hash)将同样的请求发送给同一个ip地址,它hash的是目标地址,以目标地址为标准进行挑选,将来自于同一个地址的请求发送给同一个服务器,与sh在挑选标准算法上有所不同,后面再解释,与sh功能近似,与sh适合应用的场景不同,dh最常用的场景就是缓存服务器

                        

        动态调度:    考虑活动连接数和非活动连接数来进行请求调度

                lc: (lease connection) 最少连接,计算real server的活动连接数和非活动连接数的总数,看哪个小,就挑选哪个     active*256+inactive 比较几个 real server,谁的小,就挑谁,,,,,, 目的是挑选最空闲的服务器,把请求发给它

                wlc: (weight lease connection) 加权最少连接,此时考虑到权重了, (active*256+inactive)/weight 仍然是谁的小,就挑谁

                sed: (Shortest Expection Delay)最短期望延迟,sed不考虑非活动连接了,是对wlc一点点的改进的算法,   (active+1) *256/weight   不考虑非活动连接;

                nq:  (never queue) 基于 sed 算法的 ,也不考虑非活动连接;;永不排队,只要来了请求,就是若有三个real server,C有了连接,B也有了连接,那么不管A的权重有多大,就给A一个连接,,,,所以nq是改进了的 sed

                lblc:(locality-based least connection)基于本地的最少连接

                        可以理解为lc,wlc算法,它有个特点,就是主要实现目标是跟dh一样的,但是dh不考虑当前每个cache的连接数,lblc考虑cache的连接数,不是从上往下挑选,而是挑选一个空闲的服务器(来一个新的连接,尽可能找一个空闲的服务器来响应,但是它有可能破坏命中率的)(既想提高命中率,又不破坏负载均衡效果,,,两者之间很难找到完美的结合点,,,,,,lblc是一个动态的dh,仍然尽可能保证对同一个资源的请求发给同一个real server)

                lblcr:(locality-based least connection with replication scheduing)基于本地的带复制功能的最少连接,,,,,,,,,,,,既提高命中率,又不破坏负载均衡效果,,,,,它和lblc的区别在于,lblc就是一个dh,并不会真正去考虑连接数状况的,,,,,,,lblcr,无论你这个请求是谁发来的,只要是新请求,一定会分发给连接数最少的那个real server,lblcr带复制功能,(这两个cache real server之间可以通过内容交换协议(内容分发协议),实现缓存共享的)(第一个缓存 real server的内容可以共享给第二个缓存 real server的内容),所以无论你请求哪一台主机,只要本缓存real server没有,它都到另一台 缓存 real server中去找,如果有就返回给第一台缓存主机,没有就到真正的服务器上去找,所以这种机制叫做缓存复制机制,这两台缓存服务器被称为兄弟服务器;;;;缓存服务器在内容共享的时候,彼此之间是可以共享缓存对象的;;虽然缓存服务器是互相共享的,但是并不是所有内容都共享的,是A那边没有的话,到B这边问,B这边有的话,就给A一份(这样子的话,可能会比直接从A缓存中获取数据稍微慢一点),,,,,,,,,所以它其实是尽量的让同一个请求到同一个缓存服务器中去,只有新请求才往新的缓存服务器上,(才重新进行挑选缓存服务器)???马哥讲的含糊其辞

                


LVS总共十种调度方法,四种静态,六种动态

连接数非常大的时候(肯定也要考虑到非活动连接),

LVS默认的调度方法是 WLC ,这是最理想的调度方法,



cookie:http是无状态的http stateless,无法识别同一个用户的两个请求的关系,让服务器端追踪客户端的一种机制,客户端第一次访问服务器的时候,服务器返回一个身份标识信息给客户端,客户端保存在浏览器里面,客户端再次访问服务器时,会把身份标记回送给服务器端,服务器端借此来追踪客户端身份

image.png

sh的调度方法:

directory里面有一张hash表,ip为1的客户端第一次使用A的real server来响应 当ip为1的客户端第二次过来的时候,根据directory中的hash算法(它维持着这张表),ip为1的时候仍然使用第一 次的A的real server来响应

所以它会破坏负载均衡,为何使用sh这种调度方式?比如web网站,用户浏览的网站或加入购物车的商品,通过session(在real server的内存中)结合cookie来保存,所以为了防止session的丢失,那么必须,让它访问以前的那个叫A的 real server;;;;;;;主要目的是 session affinity (会话绑定),能够让session此前的信息继续使用的,

会损坏负载均衡的效果,但是为了session的具体应用,这种机制非常必要

假如一台real server坏了,session会丢失,为了防止session丢失,永久保存session吧,,session共享(session sharing)

如下面图三,可以把A,B,C做成 session共享集群,每个主机的内存中的session会自动同步

如果session能共享,可以不用sh,

(图一)

image.png

(图二)

image.png

(图三)

image.png

image.png


image.png


下图dh的例子,一个用户请求某一资源从A获得,另一个用户请求同样的资源也应该从A缓存服务器获得,

image.png


静态调度 以RR为例

均分1000个请求

过一段时间后,

            rs1:450个在线

            rs2:10个在线

又来了一个新请求,会从rs1开始,然后再rs2      

你会发现rs1忙死了,rs2很空闲 

服务器是不管这个的,不管服务器当前的情况,所以叫做静态方法,

纯粹是根据算法本身进行调度,不考虑服务器已经建立的活动连接和非活动连接的状况

image.png



活动链接: active 用户请求过来了,正在进行传输数据,,,活动连接占据的资源多(大量的数据交换,占据内存空间大)

非活动链接: inactive 连接建立,数据传输已经结束,但尚未断开,(比如有些长连接,此时不获取数据了,但是会话依然没有断开,仍然在线)(只需要维护当前的会话状态就可以,所以很小的内存空间就足够了比如几个K,十几K,几十K)

所以我们分发的时候,得考虑到活动链接与非活动链接的情况,甚至有些情况下我们可以无视非活动连接



LC

image.png



wlc: 

        如果权重为4:1( 或者说  20:5 )

        假设第一个活动连接数是60,非活动连接数300        (60*256+300)/4 = 

        假设第二个活动连接数是20,非活动连接数100        20*256+100  = 

        再来一个新的请求,应该发送给谁?经计算,上面小,请求应该给上面

image.png

image.png



  wlc  ipvs规则自上而下挑        A 与 B 权重为 1:4,

    第一个请求来的话就是A,因为按  ipvs规则自上而下挑,A却不是性能最好的real server服务器


A 与 B 与 C 权重为 1:4:6 ,

   如果 wlc  算法, 第一个请求来的话就是A,因为按 ipvs规则自上而下挑,A却不是性能最好的real server服务器


A 与 B 与 C 权重为 1:4:6 ,

如用 sed 算法(sel算法是对wlc的一点点的改进) 使用 (active+1)*256/weight ,,,,,反正第一次的时候,挑的是性能最好的,第二次的时候,挑的是第二性能好的,,(都乘以256,所以都可以去掉256)第一次挑的是C,第二次挑的是B,前面几个连接的结果是 CBCBCCB

我们发觉前面这几个都没有A


  image.png

image.png

image.png


image.png


那么 nq算法,就是永不排队,当第一个C,第二个B时,第三个就必须为A, 上来就一个必须有一个连接(当然前几个(这里是前三个,因为只有三个 real server)的顺序是可能根据权重来连接),然后再进行计算( 按  sed  ?  )


lblc算法

image.png


lblcr 既想提高命中率,又不破坏负载均衡效果

image.png

lblcr原理图如下

image.png



规划一下lvs 的 nat 的实现

        192.168.10.8 与 192.168.10.9应该一样,但我们有意不一样,这样我们就能看到负载均衡的效果了

以物理机作为客户端来发起请求

image.png


ipvsadm:管理集群服务的命令行工具

ipvs:内核模块 (内核代码 ,内核功能) 编译内核的时候,内核中应该有这个功能,如果没有的话,找别人编译好的符合内核的rpm包装上去或者手动重新编译内核



image.png



先改 director 的值


[root@mail ~]# export LANG=C     #防止乱码,先把语言变成asci编码

[root@mail ~]# setup        #我这里准备修改网卡配置


eth0的配置

image.png


eth1的配置  下图星号表示启用,用空格可以切换, Tab键切换焦点

image.png

image.png




[root@mail ~]# service network restart        #重启网络服务

Shutting down interface eth0:                              [  OK  ]

Shutting down interface eth1:                              [  OK  ]

Shutting down loopback interface:                          [  OK  ]

Bringing up loopback interface:                            [  OK  ]

Bringing up interface eth0:                                [  OK  ]

Bringing up interface eth1:                                [  OK  ]

[root@mail ~]#


[root@mail ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:EC:30:EF

          inet addr:192.168.0.75  Bcast:192.168.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:feec:30ef/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:9389 errors:0 dropped:0 overruns:0 frame:0

          TX packets:2200 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:853569 (833.5 KiB)  TX bytes:395988 (386.7 KiB)

          Interrupt:67 Base address:0x2000


eth1      Link encap:Ethernet  HWaddr 00:0C:29:EC:30:F9

          inet addr:172.16.0.10  Bcast:172.16.255.255  Mask:255.255.0.0

          inet6 addr: fe80::20c:29ff:feec:30f9/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:119 errors:0 dropped:0 overruns:0 frame:0

          TX packets:485 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:19046 (18.5 KiB)  TX bytes:72944 (71.2 KiB)

          Interrupt:67 Base address:0x2080


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

          RX packets:178 errors:0 dropped:0 overruns:0 frame:0

          TX packets:178 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:15564 (15.1 KiB)  TX bytes:15564 (15.1 KiB)


[root@mail ~]#


内核编译的时候有ipvs,那它才有集群的功能



看内核中有没有  ipvs

[root@mail ~]# grep -i 'ipvs' /boot/config-2.6.18-371.el5        #redhat内核编译的时候使用的配置文件

# IPVS transport protocol load balancing support

# IPVS scheduler

# IPVS application helper

[root@mail ~]#

[root@mail ~]# grep -i 'vs' /boot/config-2.6.18-371.el5

CONFIG_IP_VS=m        #定义成模块(module)

# CONFIG_IP_VS_DEBUG is not set

CONFIG_IP_VS_TAB_BITS=12

# IPVS transport protocol load balancing support     #IPVS传输协议加载平衡支持

CONFIG_IP_VS_PROTO_TCP=y    #基于tcp定义集群服务的

CONFIG_IP_VS_PROTO_UDP=y    #基于udp定义集群服务的

CONFIG_IP_VS_PROTO_ESP=y    #ip sek 相关的功能,暂时不用理解

CONFIG_IP_VS_PROTO_AH=y    #ip sek 相关的功能,暂时不用理解

# IPVS scheduler    #ipvs的调度器(调度方法)   IPVS scheduler method

CONFIG_IP_VS_RR=m

CONFIG_IP_VS_WRR=m

CONFIG_IP_VS_LC=m

CONFIG_IP_VS_WLC=m

CONFIG_IP_VS_LBLC=m

CONFIG_IP_VS_LBLCR=m

CONFIG_IP_VS_DH=m

CONFIG_IP_VS_SH=m

CONFIG_IP_VS_SED=m

CONFIG_IP_VS_NQ=m

# IPVS application helper

CONFIG_IP_VS_FTP=m    #还能够支持代理ftp协议的

CONFIG_SCSI_MVSAS=m

CONFIG_MOUSE_VSXXXAA=m

CONFIG_MAX_RAW_DEVS=8192

[root@mail ~]#


找ipvsadmin

image.png

image.png

确保有Cluster里面,因为ipvsadmin本来就是集群

image.png


下面是我的代码

[root@mail ~]# cd /etc/yum.repos.d/

[root@mail yum.repos.d]# ls

CentOS-Base.repo-bak       EMOS-Base.repo-bak       mirrors-rpmforge-testing

CentOS-Base.repo-bak2      cdrom.repo               rhel-debuginfo.repo-bak

CentOS-Debuginfo.repo-bak  mirrors-rpmforge         rpmforge.repo.bak

CentOS-Media.repo-bak      mirrors-rpmforge-extras

[root@mail yum.repos.d]# vim cdrom.repo

[cdrom]

name=RHEL5 CDROM Server

baseurl=file:///media/cdrom/Server

enabled=1

gpgcheck=0

~


我这里没有ipvsadmin怎么办呢?

通过  /node-admin/12400/node-admin/15633 

发觉到是有  ipvsadmin 因为 它是 Cluster 里面

如何配置使用 见  /node-admin/12400 和 /node-admin/15633 



[root@mail yum.repos.d]# yum install ipvsadm        #安装 ipvsadm

image.png


ipvsadm 类似于 iptables 的工具 ,使用方法接近于  iptables  


[root@mail yum.repos.d]# man ipvsadm

Formatting page, please wait...

NAME

       ipvsadm - Linux Virtual Server administration


SYNOPSIS

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

               [-p [timeout]] [-O] [-M netmask]

       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

               [-g|i|m] [-w weight] [-x upper] [-y lower]

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

       ipvsadm -L|l [options]    #查看规则 小写l,大写L是一个意思 专用选项 -n --stats等

       ipvsadm -Z [-t|u|f service-address]

       ipvsadm --set tcp tcpfin udp

       ipvsadm --start-daemon state [--mcast-interface interface]

               [--syncid syncid]

       ipvsadm --stop-daemon state

       ipvsadm -h


DESCRIPTION

       Ipvsadm(8)  is  used  to set up, maintain or inspect the virtual server

       table in the Linux kernel. The Linux Virtual  Server  can  be  used  to

       build  scalable  network  services  based  on  a cluster of two or more

       nodes. The active node of the cluster redirects service requests  to  a

       collection  of  server  hosts  that will actually perform the services.

       Supported features include two protocols (TCP and UDP),  three  packet-

       forwarding methods (NAT, tunneling, and direct routing), and eight load

       balancing algorithms (round robin, weighted round robin,  least-connec-

       tion,   weighted   least-connection,  locality-based  least-connection,

       locality-based least-connection with replication,  destination-hashing,

       and source-hashing).


ipvsadm的主要功能  ipvsadm 就是在 director 上

    1)管理集群服务

            添加: -A (add)    (-A与-E用法差不多)     -t|u|f service-address [-s scheduler]      # -s 后面跟的是调度方法,可省略,默认为wrc

                                            #-t tcp协议的集群服务

                                                         service-address    IP:PORT套接字

                                            #-u udp协议的集群服务

                                                         service-address     IP:PORT套接字

                                            #-f  FirewallMark防火墙标记,简称为FWM,请到ipvs的持久连接再说吧

                                                         service-address         Mark Number 防火墙标记号码,不需要定义地址和端口的

            修改: -E (edit)        # 与 -A的使用格式一样

            删除: -D (delete)           # -t|u|f service-address


举例:把某地址的80端口向外定义成集群服务:

         # ipvsadm -A -t 192.168.0.75:80 -s rr

        这个集群服务背后没有任何 real server

                                            

    2)管理集群服务中RS(real server)

            添加: -a (add)    (-a与-e用法差不多)         -t|u|f service-address -r server-address

                                              [-g|i|m] [-w weight] [-x upper] [-y lower]

                                              # -t|u|f  service-address 第一步中已经定义好了集群服务,这里添加服务器

                                              # -r server-address : (-r 就是  real server的意思)某RS (real server)的地址,在NAT模型中,可使用IP:PORT实现端口映射

                                              # -g|i|m 表示lvs类型 -g(gateway网关)  DR(直接路由);;;     -i(internet跨越互联网) TUN ;;;    -m(masquerade 地址伪装)NAT,如果不指定,默认就是DR模型

                                              # -w weight 定义权重的,,如果算法(上一步的 -s scheduler)不支持权重,加了权重也没意义

            修改: -e (edit)

            删除: -d (delete)        # -t|u|f service-address -r server-address 指定从哪个集群中删除哪个real server

                                             # -t|u|f service-address -r server-address

举例:把某个 real server 服务器增加到集群服务:  (192.168.0.75:80 是directory地址,端口,对外提供服务的) (172.16.0.10 或 172.16.0.10:80是 real server的地址,可以省掉端口吧)

            # ipvsadm -t 192.168.0.75:80 -r 172.16.0.10 -m

            # ipvsadm -t 192.168.0.75:80 -r 172.16.0.11 -m     (172.16.0.11是另一个配置的虚拟主机服务器(real server))

    3)查看

           -L|l 大写或小写l (list):查看ipvsadm定义的规则 

                     -n: 数字格式,与iptables的-n类似,不反解ip地址和端口(显示主机地址和端口)

                     --stats: (statistics的简写,统计信息)

                     --rate: 输出速度信息的 显示每秒连接数,每秒字节数,每秒包个数

                     --timeout:   tcp tcpfin(tcp fin,这里fin指的是结束位) udp 会话的超时时间限定,,,可以自己设定的,可以修改默认的时间长度

                     --daemon: 能够显示进程状态及多播端口

                     --sort: 对于使用-L列出来的集群服务,以及每个集群服务中的 real server作排序的,默认是升序,根据协议,地址,端口作升序

                     -c (--connection): 显示当前ipvs的连接状态的,显示当前有多少个连接,有多少个客户端已经连进来了

        



-Z (--zero): 清空服务的计算器的(把 --stats,--rate 通通清空,重新开始计数)

-C (clear):删除所有集群服务,清空规则的,相当于 iptables 中的 -F


类似于iptables, 规则是在内存中生效的,重启后就没了,

所以要保存一下 iptables是 #service  iptables save 这里 # service ipvsadm save??

-S: 也可以使用-S,这个是专门保存规则的,使用输出重定向进行保存,

        # ipvsadm -S > /path/to/somefile


让保存的规则生效, iptables是  #service  iptables restore??? 这里是  # service ipvsadm restore??或 # service ipvsadm restart

-R: (restore的意思)载入此前的规则....也可以使用这里专门的-R

          # ipvsadm -R  < /path/to/somefile


image.png

image.png

[root@mail ~]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward(调度方法) Weight(权重) ActiveConn(活动连接) InActConn(未活动的连接)

[root@mail ~]#


[root@mail ~]# ipvsadm -L

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@mail ~]# ipvsadm -L -n   #-n以数字形式显示

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@mail ~]#



[root@mail ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@mail ~]# ipvsadm -L -n --stats        # --stats 显示统计信息,统计数据      统计数据/时长=平均速率也就是 --rate 吧

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts(入站报个数)  OutPkts(出站的报个数)  InBytes(入站的字节数)   OutBytes(出站的字节数)  

  -> RemoteAddress:Port

[root@mail ~]#


[root@mail ~]# ipvsadm -L -n --rate

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port                 CPS(每秒的连接数 connection per second)    InPPS(incoming package per second 每秒入站的报文个数)   OutPPS(outcoming package per second 每秒出站的报文个数)    InBPS(incoming bytes per  second 每秒入站的字节数)   OutBPS( outcoming bytes per  second 每秒出站的字节数)  

  -> RemoteAddress:Port

[root@mail ~]#


[root@mail ~]# ipvsadm -L -n --timeout        # tcp tcpfin(tcp fin,这里fin指的是结束位) udp 会话的超时时间限定,,

Timeout (tcp tcpfin udp): 900 120 300

[root@mail ~]#



[root@mail ~]# ipvsadm -L -n --daemon        #没有启动,所以不会显示进程

[root@mail ~]#


[root@mail ~]# ipvsadm -L -n -c

IPVS connection entries

pro expire state       source             virtual            destination

[root@mail ~]#



克隆几个主机吧

马哥克隆主机,他先停掉 10Lab,然后再克隆,他总共克隆了两个

image.png

我的方法如下

1)关机停掉 192.168.0.75

2)

image.png

image.png

image.png

image.png

image.png

总共克隆了两个rhel5-1-42-rs,rhel5-1-52-rs

3)克隆的两个real server有两个网卡,去掉其中一个 Host-only (先使用桥接吧,等装完web服务后,再改为Host-Only吧),并且,配置一下它的ip:

image.png

4)两个 rs (real server) 的ip 地址改下,hostname改下

通过 /etc/sysconfig/network-scripts/ifcfg-eth0 改ip 一个为192.168.0.45, 另一个为192.168.0.55,网关都是指个DIP(directory的那个ip,对外提供服务的ip,,因为这里我们想设的是NAT,rs上面的响应还是从DIP出去的),,然后 serivce network restart 重启网卡 ;rs这里不用配置dns


通过 /etc/sysconfig/network 改主机名hostname 一个为 rs1.magedu.com, 另一个为rs2.magedu.com;;;改主机名后要重启电脑吧


5)调 rs1 rs2的时间

[root@mail ~]# ntpdate 192.168.0.75  (根据 192.168.0.75  来调时间) (要在  192.168.0.75 装上 ntpd 服务,然后直接启动就可以了(# service ntpd start ),,,客户端机器可以定义成任务计划(比如每隔3分钟)来根据它调整时间)


image.png

上面的错,说明本机( 192.168.0.45 )启动了ntp服务器,要关掉? (通过  #netstat -tunlp 查看 123端口,一般是ntpd服务器的)

[root@mail ~]# netstat -tunlp

image.png


image.png


image.png

以上报错,,,, no server suitable for synchronization found

#ntpdate 192.168.0.75 #报错

#ntpdate -u 192.168.0.75  # -u (unprivileged),它的意思是使用没有权限的端口,换句话说是绕过防火墙???

#ntpdate -d 192.168.0.75  #-d 就是 debug ,报详细的错

一,我把ntpd (192.168.0.75 )的那个服务器的iptables 规则全清空(反正使用lvs要清空,要禁用iptables),二,我把rs1 ,rs2的网关加上去 ( #route 发现没有网关,暂时先用网关为 192.168.0.1 ) (#route add defalut gw 192.168.0.1),

三,看看 192.168.0.75 的 ntpd 服务有没有启动 #service ntpd status  不管有没有启动 ,反正再重启一下

如下图成功了

image.png




我们做集群时,要让各节点时间同步,偏差不应超出1秒钟

NTP: ( network time protocol )比如 director 做成时间服务器(或公司里专用的时间服务器),各节点与director来同步时间

NTP服务器   (直接跳过时间快一个小时,一大片时间空白,很多正在运行的服务,这个时间是空白的?我们要调整时间柔和一点,加速,事实上我们不用考虑这个 )


[root@mail ~]# man ntpdate

ntpdate 后直接跟服务器的ip,,,其它选项不用管,-4  -6  表示服务器的协议版本是 ipv4还是ipv6

image.png


下面,马哥是连不上 服务器 192.168.0.254?还是连不上172.16.0.1,所以无法同步,马哥就 #date 然后 #hwclock -s (从硬盘到系统) #hwclock -w 类似的命令 (从系统到硬盘) 最后他看看,,时间差不多,就不同步了

image.png


对负载均衡集群来讲,时间影响不是特别的大,对于高可用集群,时间影响很大


看 /etc/ntp.conf

[root@mail network-scripts]# vim /etc/ntp.conf

image.png

image.png


6)在 rs1,rs2来下载yum的配置文件,装上web server ,telnet-server  (我这里默认 web服务器装好了,telnet-server以后再说)

马哥 下载了 server.repo

image.png


马哥 安装 httpd telnet-server ,因没有网关,添加网关

image.png

下面这一步 成功安装了 httpd telnet-server

image.png

image.png


7)给 rs1 rs2服务器上首页加点内容

# echo "RS1.magedu.com" > /var/www/html/index.html  ,,,加一个rs服务器上是 # echo "RS2.magedu.com" > /var/www/html/index.html   

( 我因为httpd配置的变化,执行的是 echo "RS1.magedu.com" > /www/a.org/index.html 和  echo "RS2.magedu.com" > /www/a.org/index.html 和)

# setenforce 0        #这个好像可以不用执行

# service httpd restart

image.png


8) 在 rs1, rs2 上 执行 # elinks https://localhost/index.html 或者 #curl  https://localhost/index.html  看效果



image.png

# curl -I  https://localhost/index.html   #  -I 只获取首部

image.png

相互获取看看 

在rs1上执行   curl http://192.168.0.55/index.html    

在rs2上执行   curl http://192.168.0.45/index.html


9)改 rs1, rs2的网络连接类型为仅主机 ,ip 地址改一下

 由于 directory 的 第二网卡  (eth1的网卡) 如下图,仅主机(host-only),

image.png

image.png

所以让外界也不能访问 rs1,rs2,, rs1,rs2也要设为仅主机(host-only),即rs1,rs2,也要跟着directory的 eth1类似的配置, rs1的ip为 172.16.0.45 ,网关为 172.16.0.10(就是DIP);;;;rs2的ip为 172.16.0.55 ,网关为 172.16.0.10(就是DIP);;;;


image.png


配置 rs1,(rs2与 rs1类似)

image.png

image.png

image.png


image.png



在 director (两个ip :eth0 的桥接的ip  192.168.0.75, eth1仅主机(Host-Only)的ip 172.16.0.10 )上测一下,看网页能不能打开,

[root@mail network-scripts]# curl http://172.16.0.45/index.html

RS1.magedu.com

[root@mail network-scripts]# curl http://172.16.0.55/index.html

RS2.magedu.com

[root@mail network-scripts]#


10) 增加集群服务

[root@mail network-scripts]# service httpd status # 确保director 上 httpd 服务关闭

httpd is stopped

[root@mail network-scripts]#

[root@mail network-scripts]# ipvsadm -A -t 192.168.0.75:80 -s rr        #添加集群   192.168.0.75是外网可以访问的,-s (schedular)表示调度方法  192.168.0.75:80是 VIP:PORT  ,,,VIP是向外提供服务的IP   -s是 schedular调度方法 rr 指的是轮询

[root@mail network-scripts]#

[root@mail network-scripts]# ipvsadm -a -t 192.168.0.75:80 -r 172.16.0.45 -m        #添加real server ,,,-r 表示 real server -m(masquerade 地址伪装 )表示NAT类型  172.16.0.45后面 应该可以添加:80端口,172.16.0.45是 RIP(real server ip)

[root@mail network-scripts]# ipvsadm -a -t 192.168.0.75:80 -r 172.16.0.55 -m


[root@mail network-scripts]# ipvsadm -a -t 192.168.0.75:80 -r 172.16.0.65 -m

[root@mail network-scripts]#

[root@mail network-scripts]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.0.75:80 rr

  -> 172.16.0.65:80               Masq    1      0          0

  -> 172.16.0.55:80               Masq    1      0          0

  -> 172.16.0.45:80               Masq    1      0          0

[root@mail network-scripts]#


11)访问试试看

windows 上 可以ping 通,不能访问,

image.png


image.png


[root@mail network-scripts]# iptables -L -n      #确保iptables 不能启用,,因为 iptables与ipvs不能一块用的

image.png


[root@mail network-scripts]# cat /proc/sys/net/ipv4/ip_forward        #网卡间的转发没有打开

0

[root@mail network-scripts]#

[root@mail network-scripts]# echo 1 >  /proc/sys/net/ipv4/ip_forward

[root@mail network-scripts]#

由下面,可以看出是不同的主机来响应的,既然是 rr 这种算法,,但是为什么不是 RS1.magedu.com 与 RS2.magedu.com 交替着显示的,我这里刷新时连续的出现 RS1.magedu.com 或 RS2.magedu.com;;;;而且我这个通过浏览器打开会很慢

image.png


[root@mail network-scripts]# netstat -tnlp | grep 80            # director 没有看到 80 端口,是正常的,因为80端口是 ipvs 用来转发的

image.png



[root@mail network-scripts]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.0.75:80 rr

  -> 172.16.0.65:80               Masq    1      0          0

  -> 172.16.0.55:80               Masq    1      1          2

  -> 172.16.0.45:80               Masq    1      1          2

[root@mail network-scripts]#


再另一台服务器 使用 # ab -n 10000 -c 100 http://192.168.0.75/index.html  来进行批量的请求


[root@mail network-scripts]# ipvsadm -L -n --stats        #看看统计信息

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.0.75:80                    60      597      392   119138   116399

  -> 172.16.0.65:80                     20       60        0     3040        0

  -> 172.16.0.55:80                     20      251      159    52299    24253

  -> 172.16.0.45:80                     20      286      233    63799    92146

[root@mail network-scripts]#


[root@mail network-scripts]# ipvsadm -d -t 192.168.0.75:80 -r 172.16.0.65:80  删除不存在rc   172.16.0.65


[root@mail network-scripts]# ipvsadm -E -t 192.168.0.75:80 -s wrr        # -E,表示修改集群, 这里把调度方法改为 wrr (有权重的轮询)


[root@mail network-scripts]# ipvsadm -e -t 192.168.0.75:80 -r 172.16.0.45 -m -w 3    #-e表示修改rs,这里  -m(masquerade 地址伪装 )表示NAT  -w 表示把weight权重改为3                172.16.0.45可以后面加上:80  (冒号80)

[root@mail network-scripts]# ipvsadm -e -t 192.168.0.75:80 -r 172.16.0.55:80 -m -w 1

[root@mail network-scripts]#


为什么 director本机不能访问,难道本机不能通过  NAT 转发???

[root@mail network-scripts]# curl http://192.168.0.75/index.html

curl: (7) couldn't connect to host


再换一个不相干的linux 主机


[root@mail ~]# curl http://192.168.0.75/index.html  

[root@mail ~]# ab -n 10000 -c 100 http://192.168.0.75/index.html  来进行批量的请求

image.png

image.png



在 director 上

[root@mail ~]# ipvsadm -L -n --stats            # 大致172.16.0.45接受的请求是 172.16.0.55的三倍

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.0.75:80                  3170    15922    15525  1215025  1735060

  -> 172.16.0.55:80                    797     4058     3936   323196   427053

  -> 172.16.0.45:80                   2353    11804    11589   888789  1308007

[root@mail ~]#




保存规则 (当然在director电脑上)


[root@mail ~]# service ipvsadm save        #保存规则 的方法 ipvsadm虽然有脚本,但是不是服务,它是用来生成规则的,与iptables差不多

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

[root@mail ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.web        #另一种保存规则的方法 -S (save)

[root@mail ~]#

[root@mail ~]# cat /etc/sysconfig/ipvsadm.web        # 里面是自己写的规则(除了 ipvsadm命令之外,其它的都在这里)

-A -t www.a.org:http -s wrr

-a -t www.a.org:http -r 172.16.0.55:http -m -w 1

-a -t www.a.org:http -r 172.16.0.45:http -m -w 3

[root@mail ~]#


[root@mail ~]# ipvsadm -C            #清空规则 -C (clear)

[root@mail ~]#


[root@mail ~]# ipvsadm -L -n            #没有了

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@mail ~]#


[root@mail ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.web       #恢复规则,载入规则,通过输入重定向  -R (restore 恢复)

[root@mail ~]#

[root@mail ~]# ipvsadm -L -n        #又有了

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.0.75:80 wrr

  -> 172.16.0.45:80               Masq    3      0          0

  -> 172.16.0.55:80               Masq    1      0          0

[root@mail ~]#

[root@mail ~]# ipvsadm -L -c            # -c (connection 连接)  显示的是尚未断开的连接

由下面,好像 45 的连接数量是 55的三倍

image.png

普通分类: