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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

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

拓扑图如下:

wKiom1MNgV2wnG36AAFE7GdVpLI209.jpg

为了便于以后的维护与运维,采用了比较简单的技术,但要明白,技术简单只是相对于使用者,开发者简化了用户使用配置,但是功能还是很强大的。对于负载均衡,我们采用haproxy技术,高可用性采用keepalived技术。

注:Haproxy可提供高可用性、负载均衡以及基于TCPHTTP应用的代理,支持虚拟主机,并且它是免费的。

       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服务安装

注:请自行下载所需软件,最好使用最新版本。

注:配置之前要先关闭iptablesselinux

1.更改主机名

我们以10.1.13.231服务器为Keepalived主服务器,命名为Master.KPLD;

10.1.13.232为辅服务器,命名为:slave.KPLD

[root@localhost ~]# cat /etc/hosts

127.0.0.1  localhost Master.KPLD localhost4 localhost4.localdomain4

::1        localhost localhost.localdomain localhost6 localhost6.localdomain6

[root@localhost ~]# cat/etc/sysconfig/network

NETWORKING=yes

HOSTNAME=Master.KPLD

2.解压安装haproxy软件包

# tar zxvf haproxy-1.3.20.tar.gz


[root@Master ~]# tar -zxvfhaproxy-1.3.20.tar.gz

[root@Master ~]# cd haproxy-1.3.20

[root@Master haproxy-1.3.20]# uname -r

2.6.32-279.el6.x86_64      //这里要查看一下内核版本号,安装haproxy的时候,要指定正确版本号的

          [root@Master haproxy-1.3.20]# vim Makefile        

             64 PREFIX = /usr/local修改为: 64PREFIX = /usr/local/haproxy

因为解压之后的文件是经过编译过的,有人直接在安装的时候使用—prefix=指明安装路径,我做了几次,发现是不能成功的,所以要想把安装文件放在一个目录下,只能修改Makefile文件

      [root@Master haproxy-1.3.20]# make TARGET=linux26   //对应上面的内核版本

      [root@Master haproxy-1.3.20]# make install

      [root@Master haproxy-1.3.20]# mkdir /usr/local/haproxy/etc   //创建配置文件目录

      [root@Master haproxy-1.3.20]# cp -p examples/haproxy.cfg/usr/local/haproxy/etc/    //haproxy源码下有提供配置文件模板,我们只需要copy过去,修改即可

3.Haproxy服务配置

[root@Masteretc]# 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版本信息

listen  www.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

       server  192.168.1.20 192.168.1.20:80 cookie192.168.1.20 check inter 2000 rise 2 fall 5

// 服务器定义,checkinter 2000指检测心中频率,rise3次正解认为服务器可用,fall 5指失败5次认为服务器不可用,也可设置权值weigth 数字

在配置之后,需要创建一个文件,与配置想对应

[root@Master etc]# mkdir /usr/share/haproxy

4.日志配置

     [root@Masteretc]# vim /etc/rsyslog.conf      //日志配置文件

添加此两行内容

local0.*/var/log/haproxy.log                //增加local0的日志文件,下同

local1.* /var/log/haproxy.log

             [root@Master etc]# vim/etc/sysconfig/rsyslog

修改此行:SYSLOGD_OPTIONS="-r -m 0"

              [root@Master etc]# servicersyslog restart       //重启日志进程

重启之后就可以看到/var/log/已经出现了haproxy.log这个文件

5.启动haproxy服务器

[root@Master ~]#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg

可以查看一下进程

[root@Mastersbin]# netstat -tulpn | grep haproxy

tcp        0     0 0.0.0.0:10001  0.0.0.0:*   LISTEN     3451/./haproxy      

udp 0 00.0.0.0:49372 0.0.0.0:*                              3451/./haproxy      

[root@Mastersbin]#

即启动成功

6.开启路由转发功能

[root@Mastersbin]# echo "1">/proc/sys/net/ipv4/ip_forward

7.Haproxy(Slave)

Slave的安装与Master的安装是一样的,我们只需要修改Slave的主机名即可,这里不在赘述

配置服务器Web1Web2

注:httpd服务器只是在此阶段进行测试使用,到后端Nginx服务器搭建之后,此httpd服务器要关闭!

1.修改Web1Web2主机名

[root@localhost~]# hostname Web1.KPLD      //如需要可配置成永久主机名

root@Web1 ~]#yum install httpd –y             //安装apache

root@Web1 ~]# echo "Web1.KPLD">/var/www/html/index.html

[root@Web1 ~]#service httpd start

       Web2.rhel.com的配置基本一样,需要修改一下主机名,创建index.html网页时更改一下内容

[root@Web2 ~]# echo "Web2.KPLD">/var/www/html/index.html

一.测验Haproxy服务是否安装成功

在地址栏中输入Master/Slaveip地址(这里的MasterSlave是对keepalived高可用所说的,haproxy负载均衡无关系)

wKiom1MNgb3SA2VHAABgZq4p_wU711.jpg

点击刷新

wKioL1MNgZfTDKegAABivgO3a-4957.jpg

因为我们采用的是轮询,所以会在两个服务器之间进行轮询查看.

我们也可以使图形界面查看Haproxy服务下配置的服务器使用状态

wKiom1MNgb2Bq3A9AADlqOkyMQ4271.jpg

在更高的版本中,增加了更高级的功能,比如,可以直接下架服务器。

Keepalived服务配置(Master)

我们已经实现在haproxy的负载均衡,但是,我们不可以一下发布两个地址,所以要使用keepalived高可用特性来实现虚拟ip,达到高可用性的目的.

1.keepalived的安装

[root@Master ~]# yum install kernel-devel openssl-devel popt-devel    //安装依赖文件

[root@Master ~]# tar -zxvf keepalived-1.2.2.tar.gz

[root@Master ~]# cd keepalived-1.2.2

[root@Master 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

[root@Masterkeepalived-1.2.2]#

[root@Masterkeepalived-1.2.2]# make && make install

[root@Masterkeepalived-1.2.2]# cp keepalived/etc/init.d/keepalived.rh.init/etc/init.d/keepalived                            //copy启动脚本

[root@Masterkeepalived-1.2.2]# chmod +x /etc/init.d/keepalived    //可执行权限

[root@Masterkeepalived-1.2.2]# chkconfig --level 35 keepalived on  //35级别开机启动

[root@Masterkeepalived-1.2.2]# cp keepalived/etc/init.d/keepalived.sysconfig/etc/sysconfig/keepalived                        //copy启动初始化文件

[root@Masterkeepalived-1.2.2]# cp /usr/local/sbin/keepalived /usr/sbin/    //copy启动文件

2.keepalived服务配置

[root@Master keepalived-1.2.2]# 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,所以,我们要建立一个链接

[root@Masterkeepalived]# ln -s /usr/local/etc/keepalived/keepalived.conf/etc/keepalived/keepalived.conf

启动keepalived即可

[root@Masterkeepalived-1.2.2]# service keepalived start

Keepalived配置(Slave)

Slave的配置与Master的配置基本相同,只要修改几个方面即可,这里不再贴出完整代码,只写出差异的部分


1.将一处state MASTER 修改为state BACKUP

2.将一处priority 100  修改为priority 50

后端NGINX服务器配置

本公司并无此服务器,公司真正的服务器为IIS,个人不喜欢windows服务器方面,所以测试时没有使用IIS

1.安装依赖软件

[root@localhost~]# 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

注:在web1web2中各做一个主页,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

由于设定的是Masterkeepalived为主服务器,所以可以在Master上查看是否有虚拟地址

[root@Master keepalived]# ip addr

应该能找到如下内容

2: eth2:<BROADCAST,MULTICAST,UP,LOWER_UP> 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来查看配置

     [root@Masterkeepalived]# yum install ipvsadm

使用ipvsadm –L来查看

现在使用虚拟ip地址来查看网页

wKioL1MNggbzC8DMAABo9SFNrqo976.jpg

现在我们来测试一下高可用性,Masterkeepalived stop,看会不会进行vip的转移

Master上关闭keepalived服务,查看Slaveip addr是否出现vip

[root@Master keepalived]# servicekeepalived stop

Slave上查看

[root@Slave ~]# ip addr

2: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> 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

错误三:

[root@Master keepalived-1.2.2]# servicekeepalived start

Starting Keepalived for LVS: /bin/bash:keepalived: command not found

                                                         [FAILED]

解决方法:

[root@Slave ~]# 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 ,切换就会成功了











本文转自 guodong810 51CTO博客,原文链接:http://blog.51cto.com/guodong810/1259983,如需转载请自行联系原作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
22天前
|
缓存 前端开发 JavaScript
前端性能优化:Webpack与Babel的进阶配置与优化策略
【10月更文挑战第28天】在现代Web开发中,Webpack和Babel是不可或缺的工具,分别负责模块打包和ES6+代码转换。本文探讨了它们的进阶配置与优化策略,包括Webpack的代码压缩、缓存优化和代码分割,以及Babel的按需引入polyfill和目标浏览器设置。通过这些优化,可以显著提升应用的加载速度和运行效率,从而改善用户体验。
39 6
|
24天前
|
缓存 监控 前端开发
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第26天】前端工程化是现代Web开发的重要趋势,通过将前端代码视为工程来管理,提高了开发效率和质量。本文详细对比了Webpack和Gulp两大主流构建工具的选择与配置优化,并提供了具体示例代码。Webpack擅长模块化打包和资源管理,而Gulp则在任务编写和自动化构建方面更具灵活性。两者各有优势,需根据项目需求进行选择和优化。
56 7
|
23天前
|
缓存 前端开发 JavaScript
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第27天】在现代前端开发中,构建工具的选择对项目的效率和可维护性至关重要。本文比较了Webpack和Gulp两个流行的构建工具,介绍了它们的特点和适用场景,并提供了配置优化的最佳实践。Webpack适合大型模块化项目,Gulp则适用于快速自动化构建流程。通过合理的配置优化,可以显著提升构建效率和性能。
33 2
|
1月前
|
JavaScript 前端开发 网络架构
|
1月前
|
编解码 前端开发 UED
前端:移动端视口配置
移动端视口配置是指针对移动设备浏览器设置视口的宽度、高度和缩放等属性,以确保网页能根据不同的屏幕尺寸和分辨率进行适配,提供更好的用户体验。合理的视口配置是移动优先设计的关键环节。
|
30天前
|
前端开发 安全 API
前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式
本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。
|
1月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
158 0
|
3月前
|
JavaScript IDE 前端开发
前端开发工具配置 nodejs & git & IDE
前端开发工具配置 nodejs & git & IDE
|
3月前
|
负载均衡 前端开发 应用服务中间件
使用Nginx配置SSL以及部署前端项目
本文介绍了如何使用Nginx配置SSL证书以启用HTTPS,并展示了如何通过Nginx部署前端项目,包括配置SSL证书、设置代理和负载均衡的示例。
118 2
|
3月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
105 0

热门文章

最新文章

下一篇
无影云桌面