lishenghan 发表于 2018-12-30 08:10:42

使用keepalived搭建高可用的LVS

使用keepalived搭建高可用的LVS-DR集群
  
  一:Keepalived服务概述
keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层、第 4 层和第 5层交换。 Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,戒工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自劢将web 服务器加入到服务器群中,这些工作全部自劢完成,丌需要人工干涉,需要人工做的只是修复故障的web 服务器。
  
  keepalived 理论工作原理
  Layer3,4&7 工作在 IP/TCP 协议栈的 IP 层, TCP 层,及应用层,。
  原理分别如下: Layer3:Keepalived 使用Layer3的方式工作式时,Keepalived 会定期向服务器群中的服务器发送一个ICMP 的数据包(既我们平时用的Ping 程序), 如果发现某台服务的IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP 地址是否有效作为服务器工作正常与否的标准。Layer4: 主要以TCP 端口的状态来决定服务器工作正常与否。如web server 的服务端口一般是80,如果Keepalived 检测到80 端口没有启动,则Keepalived 将把这台服务器从服务器群中删除。Layer7:Layer5 就是工作在具体的应用层了,比Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived 将把服务器从服务器群中剔除。
  
  keepalived作用:
  1.管理VIP    VIP 会在LVS 之间漂移
  2.监控LVS分发器
  运行在主分发的Keepalived会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认
  为主LVS 挂了,开始接手主分发器工作,把VIP 配给自己。
  3.管理RS
  Keepalived会每隔一个时间段去做一次类似于访问的操作如:
  探针:elinks http://192.168.3.64 -dump

  Keepalived的安装与相关配置文件详解
  1:安装ipvsadm软件:
  # rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
  安装keepalived
  # tar zxvf keepalived-1.2.16.tar.gz
  # cd keepalived-1.2.16
  # ./configure --prefix=/usr/local/keepalived
  # make -j 4 && make inatsll
  # /etc/init.d/keepalived start
  # chkconfig keepalived on
  扩展:
  虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。使用组播方式通信。
  VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。
  工作流程如图:
http://s2.运维网.com/wyfs02/M01/8B/3F/wKioL1hIHCyDGzBMAAH3-4QwHW4860.png
  2:相关配置文件详解
  # cd /usr/local/keepalived/etc/
  # ls
  keepalivedrc.dsysconfig
  注释:
  keepalived    #存放着keepalive的主配置文件。
  rc.d         #存放着keepalive的启动脚本文件,
  sysconfig   #存放着keepalive的加载文件,指定其加载主配置文件,才能正常启动
  
  1)主配置文件:
  # ls /usr/local/keepalived/etc/keepalived/keepalived.conf
  /usr/local/keepalived/etc/keepalived/keepalived.conf
  
  # vim /usr/local/keepalived/etc/keepalived/keepalived.conf
  global_defs {
      notification_email {
      acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
     }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  }
  注:
  默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义,发不出邮件,我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。router_id LVS_DEVEL #标识当前节点名字,两个节点的此项需要
  
  vrrp_instanceapache {#定义一个实例,一个集群就是一个实例。VI_1 可以随意改
state MASTER#指定此节点为主节点,备用节点上设置为BACKUP即可
interface eth0#绑定虚拟IP的网络接口
virtual_router_id 51#VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组,以便于广播告诉主2备节点的情况
priority 100#主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1#组播信息发送间隔,两个节点设置必须一样
authentication {#设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {#指定虚拟IP, 两个节点设置必须一样
192.168.1.70
}
  }
  virtual_server 192.168.1.70 80 {#承接上一个配置文件中的定义虚拟IP地址
delay_loop 6 Keepalived#多长时间监测一次RS,真实服务器
lb_algo rr   #分发算法
lb_kind DR DR #模式
        nat_mask 255.255.255.0
        persistence_timeout 50   # 同一IP 50秒内的请求都发到同个real server,这个会影响LVS的rr调度算法,同一IP超过50秒后,再次访问,才会被转发到另一台real server上。
persistence
  
  real_server 192.168.1.62 80 { #配置服务节点1,需要指定realserver的真实IP地址和端口
weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
TCP_CHECK {
connect_timeout 3#表示3秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3#表示重试间隔
connect_port 80 #连接端口
}
  real_server 192.168.1.64 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
  
  3:启动脚本
  # ls /usr/local/keepalived/etc/rc.d/init.d/keepalived
  /usr/local/keepalived/etc/rc.d/init.d/keepalived
  加载文件
  # ls /usr/local/keepalived/etc/sysconfig/keepalived
  /usr/local/keepalived/etc/sysconfig/keepalived
  
  四:实战案例
  实验要求与分析
  使用keepalived实现LVS-DR模式高可用机器名称,
  分析:
  在这种模式下,虚拟IP在某时刻只能属于某一个节点,另一个节点作为备用节点存在。当主节点不可用时,备用节点接管虚拟IP,提供正常服务。
  配置参数:
  节点xuegod63(主节点);节点xuegod61(备用节点);
  虚拟IP192.168.1.70对外提供服务的IP。
  要求默认情况下由节点xuegod63提供服务,当节点xuegod63不可用时,由节点xuegod61提供服务(即虚拟IP漂移至节点xuegod61)。
  一:实验拓扑
http://s5.运维网.com/wyfs02/M02/8B/3F/wKioL1hIHD6ygVifAASoYhpbXdI648.png
  二:实验环境
http://s3.运维网.com/wyfs02/M02/8B/3F/wKioL1hIHHyCBZMjAABJcO4EbNA703.png
  
  三:实验步骤
  配置主LVS_keepalived   xuegod63.cn
  1:建立服务启动脚本,以便使用service命令控制之
  # cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
  # chmod +x/etc/init.d/keepalived
  
  2. 修改/etc/init.d/keepalived
  # vim /etc/init.d/keepalived
  改./usr/local/keepalived/etc/sysconfig/keepalived
  添加: export PATH="$PATH:/usr/local/keepalived/sbin"
  注:#将keepavlied主程序所在路径导入到环境变量PATH中,因为我们使用非默认路径(/usr/local)安装keepalived, 故需要修改几处路径,以保证keepalived能正常启动, 需要修改的文件如下:
  
  3. 修改指定keepalived要加载的keepalive的主配置文件,设置正确的服务启动参数:
  # vim /usr/local/keepalived/etc/sysconfig/keepalived
  改:14KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf"
  
  4. 启动服务与开机启动
  # /etc/init.d/keepalived restart
  # chkconfig keepalived on
  
  5:查看默认
  # ip addr
  2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
      link/ether 00:0c:29:12:f3:74 brd ff:ff:ff:ff:ff:ff
      inet 192.168.1.63/24 brd 192.168.1.255 scope global eth0
      inet 192.168.200.16/32 scope global eth0
      inet 192.168.200.17/32 scope global eth0
      inet 192.168.200.18/32 scope global eth0
      inet6 fe80::20c:29ff:fe12:f374/64 scope link
  
  ---------------------------------------------------------安装完成-----------------------------------------------------------
  
  6:修改配置文件
  # vim /usr/local/keepalived/etc/keepalived/keepalived.conf
  global_defs {
     notification_email {
  root@localhost
     }
     notification_email_from root@localhost
     smtp_server root@localhost
     smtp_connect_timeout 30
     router_id xuegod63
  }
  
  vrrp_instance apache{
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 100
      advert_int 1
      authentication {
        auth_type PASS
        auth_pass 1111
      }
      virtual_ipaddress {
         192.168.1.70
      }
  }
  
  real_server 192.168.1.62 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
  }
  real_server 192.168.1.64 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
  }
  }
  
  注:
  real_server192.168.1.6280{#配置服务节点1,需要指定realserver的真实IP地址和端口,IP与端口之间用空格隔开weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器connect_timeout 3 #表示3秒无响应超时nb_get_retry 3#表示重试次数delay_before_retry 3 #表示重试间隔
  connect_port 80#检测端口}
  默认配置文件中还有两个virtual_server模版,把剩下的都删除了,就可以。
  如:
  virtual_server 10.10.10.2 1358 {。。。}
  virtual_server 10.10.10.3 1358{。。。}
  
  7:测试:
  # ip addr
  2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
      link/ether 00:0c:29:12:f3:74 brd ff:ff:ff:ff:ff:ff
      inet 192.168.1.63/24 brd 192.168.1.255 scope global eth0
      inet 192.168.1.70/32 scope global eth0
  # service keepalived restart
  # 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.1.70:80 rr persistent 50
  注:没有看到realserver,是因为两台realserver没有开启httpd服务。
  
  配置xuegod61为备用LVS
  1:安装ipvsadm软件:
  # rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
  
  2:安装keepalived
  # scp keepalived-1.2.16.tar.gz192.168.1.61:/root/ # tar zxvf keepalived-1.2.16.tar.gz
  # cd keepalived-1.2.16
  # ./configure --prefix=/usr/local/keepalived
  # make -j 4 && make install
  从xuegod63上直接复制对应的配置文件到xuegod61上:
  
  3:建立服务启动脚本配置好,以便使用service命令控制
  # scp /etc/init.d/keepalived 192.168.1.61:/etc/init.d/
  
  4:修改指定keepalived要加载的配置文件,设置正确的服务启动参数:
  #scp /usr/local/keepalived/etc/sysconfig/keepalived 192.168.1.61:/usr/local/keepalived/etc/sysconfig/
  
  5:复制主配置文件
  # scp /usr/local/keepalived/etc/keepalived/keepalived.conf 192.168.1.61:/usr/local/keepalived/etc/keepalived/
  
  6:修改配置文件:
  # vim /usr/local/keepalived/etc/keepalived/keepalived.conf
  ! Configuration File for keepalived
  global_defs {
notification_email {
root@localhost
  }
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id xuegod61#运行keepalived 的机器标示符
  }
  vrrp_instance apache {
state BACKUP#当前LVS 状态为从分发器
interface eth0
virtual_router_id 51
priority90#当前LVS 优先级,备的要比主的小
      advert_int 1
      authentication {
      auth_type PASS
      auth_pass 1111
      }
      virtual_ipaddress {
        192.168.1.70
      }
  }
  7:重启服务:
  # /etc/init.d/keepalived restart
  
  8:测试
  
http://s5.运维网.com/wyfs02/M00/8B/43/wKiom1hIHJ3Q44A1AAA-hKQRleg876.png
http://s5.运维网.com/wyfs02/M00/8B/3F/wKioL1hIHJ3zhgy-AABkPPjWxwo480.png
  

  测试备用节点
  # service keepalived stop
http://s1.运维网.com/wyfs02/M00/8B/43/wKiom1hIHKyAUrkTAAB_bW8I0Ok711.png
  
  查看日志
  # tail -f /var/log/messages
  Dec6 02:34:29 xuegod61 Keepalived_vrrp: VRRP_Instance(apache{) Entering MASTER STATE
  Dec6 02:34:29 xuegod61 Keepalived_vrrp: VRRP_Instance(apache{) setting protocol VIPs.
  Dec6 02:34:29 xuegod61 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.1.70 added
  Dec6 02:34:29 xuegod61 Keepalived_vrrp: VRRP_Instance(apache{) Sending gratuitous ARPs on eth0 for 192.168.1.70
  
  
  
  配置xuegod62为RS1
  
  1:编写脚本把虚拟IP(VIP)绑定到xuegod62的回环网卡上。
  # vim /etc/init.d/lvsrsdr#写入以下内容
  #!/bin/bash
  #description : start realserver
  VIP=192.168.1.70
  source/etc/init.d/functions
  case "$1" in
  start)
  echo " start LVS of RealServer DR"
  /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
  /sbin/route add -host $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
  ;;
  stop)
  /sbin/ifconfig lo:0 down
  echo "close LVS of RealServer DR"
  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 "Usage: $0 {start|stop}"
  exit 1
  esac
  
  2:启动并设置开机自启动:
  # chmod +x /etc/init.d/lvsrsdr
  # /etc/init.d/lvsrsdr start
  # echo '/etc/init.d/lvsrsdr start' >> /etc/rc.local
  # ifconfig
  。。。
  lo:0      Link encap:Local Loopback
  inet addr:192.168.1.70Mask:255.255.255.255
  UP LOOPBACK RUNNINGMTU:16436Metric:1
  
  3:安装apache:
  # yum install httpd -y
  # echo '192.168.1.62' > /var/www/html/index.html
  # service httpd restart
  
  配置xuegod64为RS2
  1:复制脚本:
  # scp /etc/init.d/lvsrsdr root@192.168.1.64:/etc/init.d/
  
  2:启动并设置开机自启动:
   # chmod +x /etc/init.d/lvsrsdr
  # /etc/init.d/lvsrsdr start
  # echo '/etc/init.d/lvsrsdr start' >> /etc/rc.local
  # ifconfig
  。。。
  lo:0      Link encap:Local Loopback
  inet addr:192.168.1.70Mask:255.255.255.255
  UP LOOPBACK RUNNINGMTU:16436Metric:1
  
  3:安装apache:
  # yum install httpd -y
  # echo '192.168.1.64' > /var/www/html/index.html
  # service httpd restart
  
  
  4:测试---负载均衡
  
http://s3.运维网.com/wyfs02/M02/8B/40/wKioL1hILxXC8ZfcAABC-FiTcK8432.png
http://s3.运维网.com/wyfs02/M00/8B/43/wKiom1hILxWhhqNQAABDLixCw0c955.png
  

  
  测试----VIP 192.168.1.70
   http://s1.运维网.com/wyfs02/M01/8B/43/wKiom1hILyHxChLFAABEFKRILmk019.png
  注:这里同一IP地址50S以内,都分配到同一台realserver,等待50秒。
  
   http://s4.运维网.com/wyfs02/M01/8B/43/wKiom1hILzGzMqntAABCwp_FpF4819.png
  测试LVS高可用
  1、测试高可用:
  # /etc/init.d/keepalived stop
  # ipvsadm -L -n#查看ipvsadm资源和VIP已经转到xuegod61上来了
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port         Forward Weight ActiveConn InActConn
  TCP192.168.1.70:80 rr persistent 50
  -> 192.168.1.62:80            Route   1      0          0         
  -> 192.168.1.64:80            Route   1      0          2   
  #ip addr
  。。。
  2: eth0:mtu 1500 qdisc pfifo_fast state UP qlen 1000
  link/ether 00:0c:29:c5:08:33 brd ff:ff:ff:ff:ff:ff
  inet 192.168.1.61/24 brd 192.168.1.255 scope global eth0
  inet 192.168.1.70/32 scope global eth0
  查看日志:
  # tail -f /var/log/messages
  Jul 26 22:00:49 localhost Keepalived_vrrp: VRRP_Instance(apache) Entering MASTER STATE
  2、用客户端访问VIP 网站测试分发,看是否和之前没关闭之前一样正常分发。
  http://192.168.1.70/
  3、测试LVS主恢复正常后,自动从备分发器转到主分发器上。因为备的优先级低。
  # /etc/init.d/keepalived start
  # ip addr
  。。。
  inet 192.168.1.63/24 brd 192.168.1.255 scope global eth0
  inet 192.168.1.70/32 scope global eth0
  inet6 fe80::20c:29ff:fe12:ec1e/64 scope link
  valid_lft forever preferred_lft forever
  # ip addr #没有VIP了。
  。。。
  link/ether 00:0c:29:c5:08:33 brd ff:ff:ff:ff:ff:ff
  
  测试RS容错
  首先查看下lvs 配置ipvsadm -ln可以看到所有RS 服务器地址
  # ipvsadm -L -n
  IP Virtual Server version 1.2.1 (size=4096)
  Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port         Forward Weight ActiveConn InActConn
  TCP192.168.1.70:80 rr persistent 50
  -> 192.168.1.62:80            Route   1      0          30      
  -> 192.168.1.64:80              Route   1      0          2   
  把xuegod62的httpd服务关闭:
  # service httpd stop
  查看:
http://s3.运维网.com/wyfs02/M01/8B/40/wKioL1hIL0GCQGC7AABRdPZPZoc858.png
  # vim /var/log/messages
http://s3.运维网.com/wyfs02/M02/8B/40/wKioL1hIL0rjzONvAADEwFNNZGc490.png
  在将xuegod64启动再次查看日志
http://s5.运维网.com/wyfs02/M01/8B/43/wKiom1hIL12gebtEAABJaKbrJE4229.png
  
  注:打开主LVS 的日志(/var/log/message),使其滚动输出。关闭其中一个RS 服务器网卡,看日志是否提示该IP 机器访问失败,然后是否提示将该机器从LVS 中移除。答案都是提示的。
  使用ipvsadm -ln 可以看到刚才关闭的那台机器的IP 不在列表中了。
  注:当keepalived主从优先级一样时,当主恢复后,还是要回切资源的。第一次建立主从关系时,需要10s左右的认证时间。
  

  排错
  报错信息:
  # ./configure
http://s5.运维网.com/wyfs02/M02/8B/43/wKiom1hIL2rCkaSkAAJs_wjwBm4154.png
  解决办法:由提示可以看到,没有发现gcc cc 编译工具,只需要安装即可。解决方法:
  #yum install gcc gcc-C++
  
  报错信息:http://s5.运维网.com/wyfs02/M00/8B/40/wKioL1hIL3ei5UcGAAM_T0VZpzs466.png
  
  解决方法:内核源码做软链接,查看是否有内核源码
  #ls /usr/src/kernels/
  #yum install kernel-devel ipvsadm
  #ln -s /usr/src/kernels/2.6.32-220.el6.x86_64/ /usr/src/linux
  注:上面ln 软链接时源地址根据系统版本的不同,目录名也不同
  Configure 最后输出说明
   http://s3.运维网.com/wyfs02/M02/8B/43/wKiom1hIL5aTJ6PoAARidxF0RRg839.png
  




页: [1]
查看完整版本: 使用keepalived搭建高可用的LVS