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

osc_sxdofc9c 2020-11-12 12:09:47
nginx haproxy


前端负载及高可用配置(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 ,切换就会成功了


版权声明
本文为[osc_sxdofc9c]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4254929/blog/4714092

  1. [front end -- JavaScript] knowledge point (IV) -- memory leakage in the project (I)
  2. This mechanism in JS
  3. Vue 3.0 source code learning 1 --- rendering process of components
  4. Learning the realization of canvas and simple drawing
  5. gin里获取http请求过来的参数
  6. vue3的新特性
  7. Get the parameters from HTTP request in gin
  8. New features of vue3
  9. vue-cli 引入腾讯地图(最新 api,rocketmq原理面试
  10. Vue 学习笔记(3,免费Java高级工程师学习资源
  11. Vue 学习笔记(2,Java编程视频教程
  12. Vue cli introduces Tencent maps (the latest API, rocketmq)
  13. Vue learning notes (3, free Java senior engineer learning resources)
  14. Vue learning notes (2, Java programming video tutorial)
  15. 【Vue】—props属性
  16. 【Vue】—创建组件
  17. [Vue] - props attribute
  18. [Vue] - create component
  19. 浅谈vue响应式原理及发布订阅模式和观察者模式
  20. On Vue responsive principle, publish subscribe mode and observer mode
  21. 浅谈vue响应式原理及发布订阅模式和观察者模式
  22. On Vue responsive principle, publish subscribe mode and observer mode
  23. Xiaobai can understand it. It only takes 4 steps to solve the problem of Vue keep alive cache component
  24. Publish, subscribe and observer of design patterns
  25. Summary of common content added in ES6 + (II)
  26. No.8 Vue element admin learning (III) vuex learning and login method analysis
  27. Write a mini webpack project construction tool
  28. Shopping cart (front-end static page preparation)
  29. Introduction to the fluent platform
  30. Webpack5 cache
  31. The difference between drop-down box select option and datalist
  32. CSS review (III)
  33. Node.js学习笔记【七】
  34. Node.js learning notes [VII]
  35. Vue Router根据后台数据加载不同的组件(思考-&gt;实现-&gt;不止于实现)
  36. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  37. 【JQuery框架,Java编程教程视频下载
  38. [jQuery framework, Java programming tutorial video download
  39. Vue Router根据后台数据加载不同的组件(思考-&gt;实现-&gt;不止于实现)
  40. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  41. 【Vue,阿里P8大佬亲自教你
  42. 【Vue基础知识总结 5,字节跳动算法工程师面试经验
  43. [Vue, Ali P8 teaches you personally
  44. [Vue basic knowledge summary 5. Interview experience of byte beating Algorithm Engineer
  45. 【问题记录】- 谷歌浏览器 Html生成PDF
  46. [problem record] - PDF generated by Google browser HTML
  47. 【问题记录】- 谷歌浏览器 Html生成PDF
  48. [problem record] - PDF generated by Google browser HTML
  49. 【JavaScript】查漏补缺 —数组中reduce()方法
  50. [JavaScript] leak checking and defect filling - reduce() method in array
  51. 【重识 HTML (3),350道Java面试真题分享
  52. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  53. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  54. [re recognize HTML (3) and share 350 real Java interview questions
  55. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  56. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  57. 【重识 HTML ,nginx面试题阿里
  58. 【重识 HTML (4),ELK原来这么简单
  59. [re recognize HTML, nginx interview questions]
  60. [re recognize HTML (4). Elk is so simple