北风留影 发表于 2019-1-2 13:37:06

我的lvs方案实现

http://blog.运维网.com/attachment/201208/230344972.jpg
  主服务器ip
  从服务器ip
  RS1服务器ip
  RS2服务器ip
  Client ip
  Vip:虚拟ip
  200.200.200.30
  200.200.200.40
  200.200.200.10
  200.200.200.20
  200.200.200.111
  200.200.200.100
  网络接口
  网络接口
  网络接口
  网络接口
  网络接口
  模式
  eth1
  eth1
  eth1
  eth1
  eth1
  DR:直接路由
  LVS_M:    eth1:200.200.200.30
  LVS_S:   eth1:200.200.200.40
  RS1 :      eth1:200.200.200.10
  RS2:       eth1:200.200.200. 20
  VIP:       200.200.200.100
  Client:   200.200.200.111
  LVS模式:DR
  ,在DR模式下lvs服务器和真实服务器的网段必须在同一网段下。
  
  LVS_MASTER 配置:
  Lvs的配置
  # yum -y install openssl-devel
  #下载所需要支持的文件
  # ln -sv /usr/src/kernels/2.6.18-164.el5-x86_64/ /usr/src/linux/
  #是内核支持
  [root@lvs_master src]# tar zvxf ipvsadm-1.24.tar.gz
  #解压ipvsadm(ipvsadm是lvs的核心文件)
  [root@lvs_master src]# cd ipvsadm-1.24
  # make;make install
  Keepalive的安装      
  # tar zvxf keepalived-1.1.17.tar.gz
  #解压keepalived文件(这里用keepalive软件来实现lvs的高可用ha,当然也可以使用其它软件来实现同样的功能比如heartbeat)
  # cd keepalived-1.1.17
  # ./configure
  #配置文件
  # cd keepalived-1.1.17
  # make;make install
  #编译安装
  Keepalived的配置
  # cp /usr/local/etc/rc.d/init.d/keepalived   /etc/rc.d/init.d/
  root@lvs_master /]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
  # cp /usr/local/sbin/keepalived /usr/sbin/
  #上面这3步骤的主要目的是复制cp的配件文件到系统相关的目录以使其相关联。
  # mkdir /etc/keepalived/
  #为keepalived创建单独的配置目录
  # vi /etc/keepalived/keepalived.conf
  #keepalived.conf文件默认是不存在的需要我们手工建立.
  ! Configuration File for keepalived
  
  global_defs {
      notification_email {
  #定义keepalived监控联系人或者管理人邮件,这里我们一般不需要配置,因为keepalived的监控和lvs的监控往往通过第三方软件来实现监控,比如nagios,zabbix等软件。
      }
  }
  vrrp_instance VI_1 {
  state MASTER
  #备份服务器改为BACKUP,注意这里的名字是固定的不可随便更改,主的也是必须是MASTER
   interface eth1
      virtual_router_id 1
  priority 100         
  #备份服务器改为90
  advert_int 1
      authentication {
        auth_type PASS
        auth_pass 1234
      }
      virtual_ipaddress {
        200.200.200.100                     #vip地址,虚拟ip地址。
  }
  }
  virtual_server 200.200.200.100 80 { # 虚拟服务器ip
  delay_loop 6
      lb_algo wrr                                    #定义lvs的算法。
  lb_kind DR                                     #定义lvs的算法这里为DR直接路由模式,必须大写。
   protocol TCP
  real_server 200.200.200.20 80 {    #定义真实服务器的ip和提供服务器的端口号
  weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
      }
      real_server 200.200.200.10 80 {
  weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
      }
  }
  # chkconfig -level 23445 keepalived on
  # service keepalived start
  Starting keepalived:                                       [ OK ]
  
  从服务器除了:
  state MASTER                                              #从服务器改为BACKUP
  priority 100                                                   #从服务器改为90以外其他的步骤和主服务器一样。RS1和RS1的配置只需写个脚本(脚本一模一样)就可以了:
  # more lvsdr
  #!/bin/bash
  SNS_VIP=200.200.200.100
  /etc/rc.d/init.d/functions
  case "$1" in
  start)
  /sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
  #/sbin/route add -host $SNS_VIP dev lo:0
  
  echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  #sysctl -p > /dev/null 2>&1
  echo "RealSever Start OK"
  ;;
  
  stop)
  /sbin/ifconfig lo:0 down
  /sbin/route del $SNS_VIP >/dev/null 2>&1
  echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
  echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
  echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
  echo "RealSever Stopped"
  ;;
  *)
  echo      "Usage: $0{start|stop}"
  exit 1
  esac
  exit
  
     为了方便脚本的启动(以命令server lvsdr start的方式)我们建议把脚本cp到/etc/init.d目录下
  # cp lvsdr /etc/init.d/
  # service lvsdr start (启动lvsdr脚本)
  RealSever Start OK
  
      这时候我们通过ip a 命令就可以看到VIP:200.200.200。100被绑定到lo网卡上了。
  # ip a
  1: lo:mtu 16436 qdisc noqueue
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
      inet 200.200.200.100/32 brd 200.200.200.100 scope global lo:0
      inet6 ::1/128 scope host
         valid_lft forever preferred_lft forever
  2: eth0:mtu 1500 qdisc pfifo_fast qlen 1000
      link/ether 00:0c:29:cb:1a:5a brd ff:ff:ff:ff:ff:ff
      inet 192.168.5.92/24 brd 192.168.5.255 scope global eth0
      inet6 fe80::20c:29ff:fecb:1a5a/64 scope link
         valid_lft forever preferred_lft forever
  3: eth1:mtu 1500 qdisc pfifo_fast qlen 1000
      link/ether 00:0c:29:cb:1a:64 brd ff:ff:ff:ff:ff:ff
      inet 200.200.200.10/24 brd 200.200.200.255 scope global eth1
      inet6 fe80::20c:29ff:fecb:1a64/64 scope link
         valid_lft forever preferred_lft forever
  4: sit0:mtu 1480 qdisc noop
      link/sit 0.0.0.0 brd 0.0.0.0
  #
  
  RS2和RS1的配置方式脚本名称相同,我们可以把RS1的脚本直接copy到RS2上面,这里我不再具体讲述。
  回到LVS_M服务器上我们再重新启动keepalived服务然后通过ip a命令会看到如下所示
  # service keepalived start
  Starting keepalived:
  # ip a
  1: lo:mtu 16436 qdisc noqueue
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
      inet6 ::1/128 scope host
         valid_lft forever preferred_lft forever
  2: eth0:mtu 1500 qdisc pfifo_fast qlen 1000
      link/ether 00:0c:29:f7:e3:a4 brd ff:ff:ff:ff:ff:ff
      inet 192.168.5.123/24 brd 192.168.5.255 scope global eth0
      inet6 fe80::20c:29ff:fef7:e3a4/64 scope link
         valid_lft forever preferred_lft forever
  3: eth1:mtu 1500 qdisc pfifo_fast qlen 1000
      link/ether 00:0c:29:f7:e3:ae brd ff:ff:ff:ff:ff:ff
      inet 200.200.200.30/24 brd 200.200.200.255 scope global eth1
      inet 200.200.200.100/32 scope global eth1
      inet6 fe80::20c:29ff:fef7:e3ae/64 scope link
         valid_lft forever preferred_lft forever
  4: sit0:mtu 1480 qdisc noop
      link/sit 0.0.0.0 brd 0.0.0.0v   
  其中红色部分所示就是我们绑定的虚拟ip vip:200.200.200.100了。从服务器LVS_S通过相同方法也会得到同样的结果。这个结果说明我们的操作问题通过client可以进行测试了。为了方便测试我们在RS1 和RS2上安装apache服务器,并且在RS1 和RS2上弄起不同的主页方便测试,我这里的测试主页内容RS1就是rs1了,RS2就是rs2了。
  # yum -y instal httpd
  # echo "rs2" > /var/www/html/index.html
  # service httpd start
  
  测试:
  测试之前我们在master输入命令ipvsadm
  root@lvs_master /]# ipvsadm
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port         Forward Weight ActiveConn InActConn
  TCP 200.200.200.100:http wrr
   -> 200.200.200.10:http          Route   1      0          0         
   -> 200.200.200.20:http          Route   1      0          0
  
  然后我们通过client访问200.200.200.100这个地址
http://blog.运维网.com/attachment/201208/230652364.jpg
  如果看到上图所示,然后再刷新的时刻看到如下所示
http://blog.运维网.com/attachment/201208/230811894.jpg
  这时候说明我们的lvs功能已经成功了。多刷新几次。然后在master上输入ipvsadm命令
http://blog.运维网.com/attachment/201208/230924835.jpg
  通过结果我们能看到。当我们访问100的时候,其中有10次被定向到 了200.200.200.10这关ip上,有11次被定向到了200.200.200.20的服务器上。这就说明lvs已经起到了负载的作用了。下面我们关闭master的keepalived服务。
  # service keepalived stop
  Stopping keepalived:                                       [ OK ]
  然后我们通过client端继续访问100这个虚拟ip我们会发现网页已经访问正常,这里不再做测试。说明keepalived的ha作用也启动了。到目前位置我们已经到底了我们所要的lvs负载加keepalived高可用的目的了。
  会话保持方面的测试:
  lvs自带支持保持会话的功能通过修改相关配置文件来实现,其实很简单。只需在lb kind DR下知道保持会话时间就可以了。
  virtual_server 200.200.200.100 80 {         # 虚拟服务器ip
  delay_loop 6
      lb_algo wrr                                             #定义lvs的算法。
  lb_kind DR
  #定义lvs的算法这里为DR直接路由模式,必须大写。
  persistence_timeout 60
  protocol TCP
  
  相关测试
         为了更加直观的测试我们在真实服务器RS1安装http://blog.运维网.com/attachment/201208/231129181.jpg论坛,真实服务器RS2上安装http://blog.运维网.com/attachment/201208/231223107.jpg
  然后我们通过client访问虚拟ip 200.200.200.100 .当我们访问vip的时候,可能出现上面2个论坛中的任意一个,比如DISCUZ,我们在上面注册个帐号,并且发个帖子这时候我们会发现进行这样的操作是没有任何问题的,而不像我们想象的那样这个时候可能会出现转移到phpwind的现象。这就说明会话保持的作用已经启动起来了。会话保持的时间的配置文件设置相关,比如这里我们设置的时间为60s。
  关于lvs算法的相关研究及测试。
  
  最小连接算法的测试:
  为了测试最小连接我们把其中一台真实服务器的httpd给关掉。然后在cient通过ab压力测试负载。通过结果我们可以看出。RS1的请求数为200.用于RS2的服务器httpd服务已经被我们关闭了所以这里不显示。
http://blog.运维网.com/attachment/201208/231349269.jpg
  下面我们打开RS2服务器的httpd服务。然后通过client进行ab压力测试。
  我们在ipvs服务器上运行ipvsadm命令我们会发现,第二次的请求已经大部分被负载到RS2所在的服务器上了。由于RS2是刚启动的服务器,其原来的连接数目为0。实验说明ls算法已经满足了我们的要求。
http://blog.运维网.com/attachment/201208/231543581.jpg
  rr(轮训)算法的测试。
  我们在client通过ab压力测试命令来测试。
  # ab -c 100 -n 10000 http://200.200.200.100/
  然后我们在lvs上输入ipvsadm命令会看到如下结果。说明每个服务器承受了500的请求。
http://blog.运维网.com/attachment/201208/231651157.jpg
  加权算法的测试:wrr
  # ab -c 100 -n 10000 http://200.200.200.100/
  我们通过在lvs上ipvsadm测试的结果。注意:这里我们10的权重设置的是100,20设置的是10.文件设置位置如下:
  real_server 200.200.200.20 80 {         #定义真实服务器的ip和提供服务器的端口号
   weight 10
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
      }
      real_server 200.200.200.10 80 {
  weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
      }
http://blog.运维网.com/attachment/201208/231800455.jpg



页: [1]
查看完整版本: 我的lvs方案实现