(安西) 发表于 2018-12-28 12:21:13

前端负载及高可用配置(Hproxy+Keepalived)

前端负载及高可用配置(Hproxy+Keepalived)
  拓扑图如下:
http://s3.运维网.com/wyfs02/M00/12/BE/wKiom1MNgV2wnG36AAFE7GdVpLI209.jpg
  为了便于以后的维护与运维,采用了比较简单的技术,但要明白,技术简单只是相对于使用者,开发者简化了用户使用配置,但是功能还是很强大的。对于负载均衡,我们采用haproxy技术,高可用性采用keepalived技术。
  注:Haproxy可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,并且它是免费的。
  Haproxy并没有使用多进程或多线程,而是实现一种事件驱动、单一进程模型,这样就不必受内存等限制,但是通常来说,它的扩展性会比较差。
  Keepalived是一个类似于layer3,4,5交换机制的软件,也就是平常说的第3,4,5层
  交换。
  Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层
  Layer3:keepalived使用layer3的方式工作时,keepalived会定期向服务器群中的服务器发送一个ICMP数据包,所以,layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准
  Layer4:Layer4主要以TCP端口的状态来决定服务器工作正常与否。
  Layer5:Layer5就是工作在具体的应用层,它将根据用户的设定检查服务器程序运行是否正常,如果与用户设定不相符,则会把此服务器从服务器群中剔除。
  Keepalived主要用于RealServer的健康状态检查以及LoadBalance主机和Slave主机之间failover的实现
  Haproxy配置(Master)
  注:本实验只是一个测试环境,对于WEB服务器等只是简单的实现。
  以图中环境连接好服务器,IP等,我们将会以haproxy—keepalived顺序进行配置。
Haproxy服务安装
注:请自行下载所需软件,最好使用最新版本。
注:配置之前要先关闭iptables与selinux
1.更改主机名
我们以10.1.13.231服务器为Keepalived主服务器,命名为Master.KPLD;
10.1.13.232为辅服务器,命名为:slave.KPLD
# cat /etc/hosts
127.0.0.1localhost Master.KPLD localhost4 localhost4.localdomain4
::1      localhost localhost.localdomain localhost6 localhost6.localdomain6
# cat/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=Master.KPLD
2.解压安装haproxy软件包
# tar zxvf haproxy-1.3.20.tar.gz


# tar -zxvfhaproxy-1.3.20.tar.gz
# cd haproxy-1.3.20
# uname -r
2.6.32-279.el6.x86_64      //这里要查看一下内核版本号,安装haproxy的时候,要指定正确版本号的
  # vim Makefile
  64 PREFIX = /usr/local修改为: 64PREFIX = /usr/local/haproxy
  因为解压之后的文件是经过编译过的,有人直接在安装的时候使用—prefix=指明安装路径,我做了几次,发现是不能成功的,所以要想把安装文件放在一个目录下,只能修改Makefile文件
  # make TARGET=linux26   //对应上面的内核版本
  # make install
  # mkdir /usr/local/haproxy/etc   //创建配置文件目录
  # cp -p examples/haproxy.cfg/usr/local/haproxy/etc/    //haproxy源码下有提供配置文件模板,我们只需要copy过去,修改即可
3.Haproxy服务配置
# vim haproxy.cfg
global
       log 127.0.0.1   local0
      log 127.0.0.1   local1 notice
      #log loghost    local0 info
      maxconn 4096
      chroot /usr/share/haproxy
      uid 99
      gid 99
      daemon               //配置haproxy进入后台运行模式
      nbproc 2               //创建2个进程进入deamon模式运行
      pidfile /usr/local/haproxy/haproxy.pid
      #debug
      #quiet


defaults
      log    global
      mode   http       //默认模式mode
      option httplog
      option dontlognull   //自动结束完成的链接
      retries 3
      option redispatch       //当serverid对应的服务器挂掉后,强制定向到其他健康的服务器
      maxconn 2000
      contimeout      5000
      clitimeout      50000
      srvtimeout      50000
      stats uri /haproxy_stats         //访问统计页面的url
      stats realm user \ passwd      //统计页面密码框提示文本
      stats auth haproxy:haproxy       //统计页面用户名与密码
      stats hide-version               //隐藏haproxy版本信息
listenwww.rhel.com 0.0.0.0:80
      cookie SERVERID rewrite
      balanceroundrobin
#       balance source               //最好使用这个,可以保证同一台客户机,固定访问一台服务器
      server 192.168.1.10 192.168.1.10:80 cookie 192.168.1.10 check inter 2000 rise 2fall
      server192.168.1.20 192.168.1.20:80 cookie192.168.1.20 check inter 2000 rise 2 fall 5
// 服务器定义,checkinter 2000指检测心中频率,rise指3次正解认为服务器可用,fall 5指失败5次认为服务器不可用,也可设置权值weigth 数字
在配置之后,需要创建一个文件,与配置想对应
# mkdir /usr/share/haproxy
4.日志配置
      # vim /etc/rsyslog.conf      //日志配置文件
添加此两行内容
local0.*/var/log/haproxy.log                //增加local0的日志文件,下同
local1.* /var/log/haproxy.log
  # vim/etc/sysconfig/rsyslog
  修改此行:SYSLOGD_OPTIONS="-r -m 0"
  # servicersyslog restart       //重启日志进程
  重启之后就可以看到/var/log/已经出现了haproxy.log这个文件
5.启动haproxy服务器
#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
可以查看一下进程
# netstat -tulpn | grep haproxy
tcp      0   0 0.0.0.0:100010.0.0.0:*   LISTEN   3451/./haproxy
udp 0 00.0.0.0:49372 0.0.0.0:*                              3451/./haproxy
#
即启动成功
6.开启路由转发功能
# echo "1">/proc/sys/net/ipv4/ip_forward
7.Haproxy(Slave)
Slave的安装与Master的安装是一样的,我们只需要修改Slave的主机名即可,这里不在赘述
配置服务器Web1与Web2
注:httpd服务器只是在此阶段进行测试使用,到后端Nginx服务器搭建之后,此httpd服务器要关闭!
1.修改Web1与Web2主机名
# hostname Web1.KPLD      //如需要可配置成永久主机名
root@Web1 ~]#yum install httpd –y             //安装apache
root@Web1 ~]# echo "Web1.KPLD">/var/www/html/index.html
#service httpd start
      Web2.rhel.com的配置基本一样,需要修改一下主机名,创建index.html网页时更改一下内容
# echo "Web2.KPLD">/var/www/html/index.html
一.测验Haproxy服务是否安装成功
在地址栏中输入Master/Slave的ip地址(这里的Master与Slave是对keepalived高可用所说的,对haproxy负载均衡无关系)
http://s3.运维网.com/wyfs02/M02/12/BE/wKiom1MNgb3SA2VHAABgZq4p_wU711.jpg
点击刷新
http://s3.运维网.com/wyfs02/M02/12/BE/wKioL1MNgZfTDKegAABivgO3a-4957.jpg

因为我们采用的是轮询,所以会在两个服务器之间进行轮询查看.
我们也可以使图形界面查看Haproxy服务下配置的服务器使用状态
http://s3.运维网.com/wyfs02/M00/12/BE/wKiom1MNgb2Bq3A9AADlqOkyMQ4271.jpg

在更高的版本中,增加了更高级的功能,比如,可以直接下架服务器。
Keepalived服务配置(Master)
我们已经实现在haproxy的负载均衡,但是,我们不可以一下发布两个地址,所以要使用keepalived高可用特性来实现虚拟ip,达到高可用性的目的.
1.keepalived的安装
# yum install kernel-devel openssl-devel popt-devel    //安装依赖文件
# tar -zxvf keepalived-1.2.2.tar.gz
# cd keepalived-1.2.2
# ./configure--with-kernel-dir=/usr/src/kernels/2.6.32-279.el6.x86_64/
如果出现以下提示,即为成功
Keepalivedconfiguration
------------------------
Keepalivedversion       : 1.2.2
Compiler               : gcc
Compilerflags         : -g -O2
Extra Lib                : -lpopt -lssl -lcrypto
Use IPVSFramework       : Yes
IPVS sync daemonsupport : Yes
IPVS uselibnl         : No
Use VRRPFramework       : Yes
Use Debugflags          : No
#
# make && make install
# cp keepalived/etc/init.d/keepalived.rh.init/etc/init.d/keepalived                            //copy启动脚本
# chmod +x /etc/init.d/keepalived    //可执行权限
# chkconfig --level 35 keepalived on//在35级别开机启动
# cp keepalived/etc/init.d/keepalived.sysconfig/etc/sysconfig/keepalived                        //copy启动初始化文件
# cp /usr/local/sbin/keepalived /usr/sbin/    //copy启动文件
2.keepalived服务配置
# vim/usr/local/etc/keepalived/keepalived.conf
! ConfigurationFile for keepalived


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
}


vrrp_instanceVI_1 {
    state MASTER
    interface eth2
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
       10.1.13.230
    }
}
  virtual_server 10.1.13.230 80 {
  delay_loop 6
  lb_algo rr
  lb_kind DR
  nat_mask 255.255.255.0
  persistence_timeout 50
  protocol TCP
  

  real_server 10.1.13.231 80 {
  weight 1
  TCP_CHECK {
  connect_timeout 3
  nb_get_retry 3
  delay_before_retry 3
  }
  }
  real_server 10.1.13.232 80 {
  weight 1
  TCP_CHECK {
  connect_timeout 3
  nb_get_retry 3
  delay_before_retry 3
  }
  }
  }
由于在启动脚本/etc/init.d/keepalived的配置中,默认的配置文件为config:/etc/keepalived/keepalived.conf,所以,我们要建立一个链接
# ln -s /usr/local/etc/keepalived/keepalived.conf/etc/keepalived/keepalived.conf
启动keepalived即可
# service keepalived start
Keepalived配置(Slave)
Slave的配置与Master的配置基本相同,只要修改几个方面即可,这里不再贴出完整代码,只写出差异的部分


1.将一处state MASTER 修改为state BACKUP
2.将一处priority 100修改为priority 50
后端NGINX服务器配置
  本公司并无此服务器,公司真正的服务器为IIS,个人不喜欢windows服务器方面,所以测试时没有使用IIS
1.安装依赖软件
# yum install gcc openssl-devel pcre-devel zlib-devel
2.创建Nginx用户
# useradd nginx-s /sbin/nologin
3.解压软件并安装
# tar -zxvfnginx-1.4.2.tar.gz
# cd nginx-1.4.2
# ./configure--user=nginx --group=nginx --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_ssl_module
# make&& make install
注:--user,--group:分别指定启动nginx的帐户与组
--with-http_stub_status_module:安装允许状态模块
--with-http_ssl_module:安装ssl模块
4.启动nginx
#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注:在web1与web2中各做一个主页,web1中内容为Web1.KPLD,web2中内容为Web2.KPLD
5.配置静态路由
由于我们的服务器是内部网络,不能与外部网络相通,但是Keepalived配置时我们使用的是DR模型,所以,当一个请求到达时,是由内部服务器直接返回给客户端,所以,我们必然要保证内部主机可以与外网相连通
在/etc/rc.local中添加如下路由
   route add defaultgw 192.168.200.253
6.除了配置在web服务器上配置IP之外,还需要对内网做SNAT,可在两台Keepalived上做SNAT
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT--to 10.1.13.231-10.1.13.232




  测试Keepalived
由于设定的是Master为keepalived为主服务器,所以可以在Master上查看是否有虚拟地址
# ip addr
应该能找到如下内容
2: eth2: mtu 1500 qdisc pfifo_fast state UP qlen1000
    link/ether 00:0c:29:3a:4d:dd brdff:ff:ff:ff:ff:ff
    inet 10.1.13.231/24 brd 10.1.13.255 scopeglobal eth2
    inet 10.1.13.230/32 scope global eth2               //可以看出,虚拟IP出现。
    inet6 fe80::20c:29ff:fe3a:4ddd/64 scopelink
       valid_lft forever preferred_lft forever
也可以安装ipvsadm来查看配置
      # yum install ipvsadm
使用ipvsadm –L来查看
现在使用虚拟ip地址来查看网页
http://s3.运维网.com/wyfs02/M01/12/BE/wKioL1MNggbzC8DMAABo9SFNrqo976.jpg
现在我们来测试一下高可用性,把Master的keepalived stop,看会不会进行vip的转移
在Master上关闭keepalived服务,查看Slave上ip addr是否出现vip
# servicekeepalived stop
在Slave上查看
# ip addr
2: eth1: mtu 1500 qdisc pfifo_fast state UP qlen1000
    link/ether 08:00:27:a5:0e:93 brdff:ff:ff:ff:ff:ff
    inet 10.1.13.232/24 brd 10.1.13.255 scopeglobal eth1
    inet 10.1.13.230/24 scope global secondaryeth1          //虚拟IP出现
    inet6 fe80::a00:27ff:fea5:e93/64 scope link
      valid_lft forever preferred_lftforever
再通过浏览器查看网页,自行查看。


也是正常的,高可用性也是成功的.
配置排错
  Keepalived配置出现的问题及解决方法
  错误一:
  configure: error:
  !!!OpenSSL is not properly installed on your system. !!!
  !!!Can not include OpenSSL headers files.            !!!
  安装openssl-devel
  yum install openssl-devel
  

  错误二:
  configure: error: Popt libraries isrequired
  安装popt开发包
  yum install popt-devel
  错误三:
  # servicekeepalived start
  Starting Keepalived for LVS: /bin/bash:keepalived: command not found
  
  解决方法:
  # cp/usr/local/sbin/keepalived /usr/sbin/
  

  错误四:
  Ipvs协议不可用
  Dec31 10:51:02 Slave Keepalived_healthcheckers: Registering Kernel netlink commandchannel
  Dec 31 10:51:02 SlaveKeepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
  Dec 31 10:51:02 SlaveKeepalived_healthcheckers: Configuration is using : 14529 Bytes
  Dec 31 10:51:02 Slave Keepalived:Healthcheck child process(19805) died: Respawning
  Dec 31 10:51:02 Slave Keepalived: StartingHealthcheck child process, pid=19807
  Dec 31 10:51:02 SlaveKeepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
  Dec 31 10:51:02 SlaveKeepalived_healthcheckers: Netlink reflector reports IP 10.1.13.232 added
  解决方法:
  手动加载ip_vs模块
modprobe ip_vs
modprobe ip_vs_wrr
  并且加入开机启动
  #cat /etc/rc.local
  /sbin/modprobeip_vs
/sbin/modprobe ip_vs_wrr
  

  

  错误五:
  Master服务器与Slave服务器都出现虚拟IP地址,并用当主服务器断开后,从服务器不能切换,日志显示如下
  Dec 18 22:37:24 localhost Keepalived_vrrp:bogus VRRP packet received on eth1 !!!
  Dec 18 22:37:24 localhost Keepalived_vrrp:VRRP_Instance(VI_1) ignoring received advertisment...
  Dec 18 22:37:25 localhost Keepalived_vrrp:ip address associated with VRID not present in received packet : 10.1.13.230
  Dec 18 22:37:25 localhost Keepalived_vrrp:one or more VIP associated with VRID mismatch actual MASTER advert
  出现这个原因主要是virtual_router_id配置不正确,默认情况下是51,但是有些情况下需要更改,比如修改为:virtual_router_id 60 ,切换就会成功了
  




页: [1]
查看完整版本: 前端负载及高可用配置(Hproxy+Keepalived)