当前位置:   article > 正文

Haproxy高可用、负载均衡集群_haproxy balance roundrobin

haproxy balance roundrobin

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。另外其支持从4层至7层的网络交换,即覆盖所有的TCP协议,换而言之,Haproxy 甚至还支持Mysql的均衡负载。

  HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

  在功能上haproxy通过反向代理方式实现Web负载均衡,和nginx、ApacheProxy、lighttpd、Cheroke等一样。不同点在于,haproxy并不是Web服务器,前面提到的所有带反向代理负载均衡产品,都是Web服务器。简单来说就是,haproxy仅仅是一款负载均衡的应用代理程序,本身不提供Web服务。

  haproxy配置简单,拥有非常不错的服务器健康检查功能,还有专门的系统状态监控页面。当其代理的后端服务器出现故障,haproxy会自动将该服务器剔除,故障恢复后再自动加入。

  下载地址:Releases · haproxy/haproxy · GitHub

(1).haproxy的负载均衡算法

  haproxy的负载均衡算法配置在etc/haproxy.cfg中balance参数,与server参数配合使用。haproxy提供来8种负载均很算法:roundrobin根据权重轮询(动态)、static-rr根据权重轮询(静态)、source根据请求源IP、leastconn最少连接者先处理、uri根据请求的uri、url_param根据请求的url参数、rdp-cookie据据cookie(name)来锁定并哈希每一次请求、hdr(name)根据HTTP请求头来锁定每一次HTTP请求。

  我是没发现动态权重分配和静态权重分配有什么区别。

  详细查看:HAProxy的调度算法_staightChen的博客-CSDN博客_haproxy 权重

  haproxy配置文件参数详细介绍:haproxy配置详尽参数说明(转载以便查询)_wngua的博客-CSDN博客 

(2).实验环境

youxi1  192.168.1.6  负载均衡器(haproxy)

youxi2  192.168.1.7  主机1

youxi3  192.168.1.8  主机2

(3).实验

 1)负载均衡器youxi1上安装配置haproxy

  安装依赖包

1

[root@youxi1 ~]# yum -y install make gcc gcc-c++ openssl-devel

  将下载好的安装包上传到服务器上,解压安装

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

[root@youxi1 ~]# tar -xf haproxy-1.7.9.tar -C /usr/local/src/  //解压

[root@youxi1 ~]# cd /usr/local/src/haproxy-1.7.9/

[root@youxi1 haproxy-1.7.9]# cat README  //找到如下部分

To build haproxy, you have to choose your target OS amongst the following ones

and assign it to the TARGET variable :

  - linux22     for Linux 2.2

  - linux24     for Linux 2.4 and above (default)

  - linux24e    for Linux 2.4 with support for a working epoll (> 0.21)

  - linux26     for Linux 2.6 and above

  - linux2628   for Linux 2.6.28, 3.x, and above (enables splice and tproxy)

  - solaris     for Solaris 8 or 10 (others untested)

  - freebsd     for FreeBSD 5 to 10 (others untested)

  - netbsd      for NetBSD

  - osx         for Mac OS/X

  - openbsd     for OpenBSD 5.7 and above

  - aix51       for AIX 5.1

  - aix52       for AIX 5.2

  - cygwin      for Cygwin

  - haiku       for Haiku

  - generic     for any other OS or version.

  - custom      to manually adjust every setting

[root@youxi1 haproxy-1.7.9]# uname -r  //与上面的信息对照,找到TARGET对应的值

3.10.0-957.el7.x86_64

//与其他的不同,这里使用的make生成的Makefile,不过虽然添加来参数但Makefile里根本没有写上,还得进去改

[root@youxi1 haproxy-1.7.9]# make TARGET=linux2628 PREFIX=/usr/local/haproxy

[root@youxi1 haproxy-1.7.9]# vim Makefile  //修改如下参数,也可以注意下CPU参数

PREFIX = /usr/local/haproxy  //第94行

TARGET = linux2628  //第104行

[root@youxi1 haproxy-1.7.9]# make install

install -d "/usr/local/haproxy/sbin"

install haproxy haproxy-systemd-wrapper "/usr/local/haproxy/sbin"

install -d "/usr/local/haproxy/share/man"/man1

install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1

install -d "/usr/local/haproxy/doc/haproxy"

for in configuration management architecture cookie-options lua WURFL-device-detection proxy-protocol linux-syn-cookies network-namespaces DeviceAtlas-device-detection 51Degrees-device-detection

 netscaler-client-ip-insertion-protocol close-options SPOE intro; do \

install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \

done

[root@youxi1 haproxy-1.7.9]# echo $?

0

[root@youxi1 haproxy-1.7.9]# ls /usr/local/haproxy/

doc sbin share  //总共就这三个目录,安装完成后看一下

  手动创建haproxy配置文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

[root@youxi1 haproxy-1.7.9]# mkdir /usr/local/haproxy/etc

[root@youxi1 haproxy-1.7.9]# vim /usr/local/haproxy/etc/haproxy.cfg

global #全局配置

#定义全局的syslog服务器,最多可以定义两个。

#格式log [IP地址] [日志设备] [日志级别]

#日志设备必须是以下24种标准syslog设备之一:

#kern、user、mail、daemon、auth、syslog、lpr、news、uucp、cron、auth2、ftp、ntp、

#audit、alert、cron2、local0、local1、local2、local3、local4、local5、local6、local7

#这里的日志设备要与/etc/syslog.conf中定义的日志收集保持一致。

#日志级别有四种:err、warning、info、debug,默认为info

log 127.0.0.1 local0

maxconn 4096 #最大连接数

chroot /usr/local/haproxy #当前工作目录

uid 99 #所属运行的用户uid,也可以使用user [用户名]

gid 99 #所属运行的用户组id,也可以使用group [组名]

daemon #以后台形式运行haproxy

#启动haproxy进程个数。实际工作中,进程个数一般与CPU核心数一样。这样可以发挥出最大的性能

nbproc 1

pidfile /usr/local/haproxy/run/haproxy.pid #pid文件存放位置

#debug #调试模式,输出启动信息到标准输出。调错时使用

#quiet #静默模式,启动时无输出

defaults #默认设置

log global #应用全局的日志配置

#日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户自己定义

log 127.0.0.1 local3

#工作模式,所处理的协议类型

#参数值可以为http|tcp|health,默认采用http模式

#tcp是4层,http是7层,health只会返回OK

mode http

option httplog #日志类别,记载http日志

#每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现

option httpclose

option dontlognull #不记录空连接产生的日志

#如果后端服务器需要获得客户端真实ip,需要配置此参数,可以从Http Header中获得客户端ip

option forwardfor

option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器

retries 2 #2次连接失败就认为服务器不可用,主要通过后面的check检查

maxconn 2000 #最大连接数

balance roundrobin #负载均衡算法

#haproxy监控页面的访问地址,可通过http://localhost:80/haproxy-stats访问

stats uri /haproxy-stats

timeout connect 5000 #连接超时时间,单位:ms毫秒。等同contimeout

timeout client 50000 #客户端连接超时时间。等同clitimeout

timeout server 50000 #服务器端连接超时时间。等同srvtimeout

mode http

#健康检测,完整格式为option httpchk <method> <uri> <version>

#注意实际工作中测试时,应该下载某一个页面来进行测试,

#因此这个页面应该是个小页面,而不要用首页面。这里是每隔一秒检查一次页面。

option httpchk GET /index.html

frontend http #前端配置,接收请求的端口组,http名称可自定义

bind 0.0.0.0:80 #监听端口,发起http请求到80端口,会被转发到设置的后端ip及端口

default_backend http_back #转发到后端,后端名http_back可以自定义

backend http_back #后端配置,后端名需要与前端配置的保持一致

server s1 192.168.1.7:80 weight 3 check #后端的主机IP、端口和权衡

server s2 192.168.1.8:80 weight 3 check #后端的主机IP、端口和权衡

  上面的uid99,和gid99都是nobody,系统自带的。

1

2

[root@youxi1 haproxy-1.7.9]# id nobody

uid=99(nobody) gid=99(nobody) 组=99(nobody)

  另外,后端服务器配置格式为server [服务器名称] [IP地址:端口号] [参数],参数如下:

1

2

3

4

5

6

7

8

9

10

11

backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server

check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定,如:

inter: 设定监控状态检查的时间间隔,单位为毫秒,默认为2000,也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟

rise:设定检查状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数

fall:设定检查状态检查中,某离线的server从正常状态转换至离线状态需要成功检查的次数

cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,第一次为此值挑选的server将会倍后续的请求所选中,其目的在于实现持久连接的功能

maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其他连接被释放

maxqueue:通过观察服务器的通信状况来判断其健康状态,默认为禁用,其支持的类型有“layer 4”和“layer 7”,“layer 7”仅能用于http代理场景

redir:启用重定向功能,将发往此服务的GET和HEAD请求均以302状态码响应,需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以避免造成循环,例如

  server srv1 192..168.1.202:80 redir http://imageserver.wangfeng7399.com check

weight: 权重,默认为1,最大值为256,0表示不参与负载均衡

  配置文件参数详细查看:haproxy配置详尽参数说明(转载以便查询)_wngua的博客-CSDN博客

  生成haproxy的启动脚本,改太麻烦了直接复制好了。注意:这是解压目录下的examples/haproxy.init修改来的,不过reload是有问题的。想要reload需要手动输入命令。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

[root@youxi1 haproxy-1.7.9]# vim /etc/init.d/haproxy

#!/bin/sh

# chkconfig: - 85 15

# description: HA-Proxy server

# processname: haproxy

# config: /usr/local/haproxy/etc/haproxy.cfg

# Source function library.

if [ -f /etc/init.d/functions ]; then

  . /etc/init.d/functions

elif [ -f /etc/rc.d/init.d/functions ] ; then

  . /etc/rc.d/init.d/functions

else

  exit 0

fi

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

"$NETWORKING" "no" ] && exit 0

# This is our service name

BASENAME=`haproxy`

BIN=/usr/sbin/haproxy

CFG=/usr/local/haproxy/etc/haproxy.cfg

[ -f $CFG ] || exit 1

PIDFILE=/usr/local/haproxy/run/haproxy.pid

LOCKFILE=/usr/local/haproxy/run/haproxy

RETVAL=0

start() {

  quiet_check

  if [ $? -ne 0 ]; then

    echo "Errors found in configuration file, check it with '$BASENAME check'."

    return 1

  fi

  echo -n "Starting $BASENAME: "

  daemon $BIN -D -f $CFG -p $PIDFILE

  RETVAL=$?

  echo

  [ $RETVAL -eq 0 ] && touch $LOCKFILE

  return $RETVAL

}

stop() {

  echo -n "Shutting down $BASENAME: "

  killproc $BASENAME -USR1

  RETVAL=$?

  echo

  [ $RETVAL -eq 0 ] && rm -f $LOCKFILE

  [ $RETVAL -eq 0 ] && rm -f $PIDFILE

  return $RETVAL

}

restart() {

  quiet_check

  if [ $? -ne 0 ]; then

    echo "Errors found in configuration file, check it with '$BASENAME check'."

    return 1

  fi

  stop

  start

}

reload() {

  if ! [ -s $PIDFILE ]; then

    return 0

  fi

  quiet_check

  if [ $? -ne 0 ]; then

    echo "Errors found in configuration file, check it with '$BASENAME check'."

    return 1

  fi

  $BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)

}

check() {

  $BIN -c -q -V -f $CFG

}

quiet_check() {

  $BIN -c -q -f $CFG

}

rhstatus() {

  status $BASENAME

}

condrestart() {

  [ -e $LOCKFILE ] && restart || :

}

# See how we were called.

case "$1" in

  start)

    start

    ;;

  stop)

    stop

    ;;

  restart)

    restart

    ;;

  reload)

    reload

    ;;

  condrestart)

    condrestart

    ;;

  status)

    rhstatus

    ;;

  check)

    check

    ;;

  *)

    echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"

    exit 1

esac

exit $?

[root@youxi1 haproxy-1.7.9]# chmod +x !$  //添加执行权限

chmod +x /etc/init.d/haproxy

  做一个软连接给启动脚本使用(添加环境变量没有试过),也可以直接复制过去

1

2

3

[root@youxi1 haproxy-1.7.9]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/

[root@youxi1 haproxy-1.7.9]# ll /usr/sbin/haproxy

lrwxrwxrwx 1 root root 31 7月  21 01:28 /usr/sbin/haproxy -> /usr/local/haproxy/sbin/haproxy

  创建pid存放目录,并修改haproxy的所属主

1

2

3

4

[root@youxi1 haproxy-1.7.9]# mkdir /usr/local/haproxy/run

[root@youxi1 haproxy-1.7.9]# chown -R nobody /usr/local/haproxy

[root@youxi1 haproxy-1.7.9]# ll -d /usr/local/haproxy

drwxr-xr-x 7 nobody root 64 7月  21 01:31 /usr/local/haproxy

  配置日志收集文件

1

2

3

4

5

6

7

[root@youxi1 haproxy-1.7.9]# vim /etc/rsyslog.conf

$ModLoad imudp//第15~16行去除注释

$UDPServerRun 514

local7.*  /var/log/boot.log  //这一行是第73行,在这一行下面添加两行

local3.*  /var/log/haproxy.log  //需要与上面的haproxy配置文件对应

local0.*  /var/log/haproxy.log

[root@youxi1 haproxy-1.7.9]# systemctl restart rsyslog

  启动

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#方法一

[root@youxi1 haproxy-1.7.9]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg

[root@youxi1 haproxy-1.7.9]# ps aux | grep haproxy

nobody    10654  0.0  0.0  12272   808 ?        Ss   01:39   0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg

root      10656  0.0  0.0 112724   996 pts/0    S+   01:40   0:00 grep --color=auto haproxy

#方法二

[root@youxi1 ~]# /etc/init.d/haproxy start

Reloading systemd:                                         [  确定  ]

Starting haproxy (via systemctl):                          [  确定  ]

[root@youxi1 ~]# ps aux | grep haproxy

//两行Message信息提示服务器不可用,因为还没有配置,显示的比较慢,直接<Enter>就可以了

Message from syslogd@localhost at Jul 21 01:43:02 ...

 haproxy[10763]: backend http_back has no server available!

Message from syslogd@localhost at Jul 21 01:43:02 ...

 haproxy[10763]: backend http_back has no server available!

nobody    10763  0.0  0.0  12272   804 ?        Ss   01:42   0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid

root      10766  0.0  0.0 112724   992 pts/0    S+   01:43   0:00 grep --color=auto haproxy

  特别说明reload手动输入命令该怎么做,主要是不停服务重新加载配置文件,平滑过渡

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//首先使用ps aux | grep haproxy查看有几个进程

[root@youxi1 ~]# ps aux | grep haproxy

nobody 7224 0.0 0.0 12272 828 ? Ss 16:57 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid

root 7511 0.0 0.0 112724 996 pts/0 S+ 16:58 0:00 grep --color=auto haproxy

//如果只有一个进程,那么把上面的命令复制一下,追加-sf [pid]

[root@youxi1 ~]# /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf 7224

[root@youxi1 ~]# ps aux | grep haproxy

nobody 7513 0.0 0.0 12272 824 ? Ss 17:00 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf 7224

root 7516 0.0 0.0 112724 996 pts/0 S+ 17:00 0:00 grep --color=auto haproxy

//如果是多个命令,或者不想看PID,也可以复制上面的命令,最佳-sf $(cat /usr/local/haproxy/run/haproxy.pid)

[root@youxi1 ~]# /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf $(cat /usr/local/haproxy/run/haproxy.pid)

[root@youxi1 ~]# ps aux | grep haproxy

nobody 7532 0.0 0.0 12272 824 ? Ss 17:03 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf 7513

root 7534 0.0 0.0 112724 992 pts/0 S+ 17:03 0:00 grep --color=auto haproxy

  添加开机自启

1

2

3

4

5

6

[root@youxi1 ~]# chkconfig --add haproxy

[root@youxi1 ~]# chkconfig --list haproxy

haproxy         0:关    1:关    2:关    3:关    4:关    5:关    6:关

[root@youxi1 ~]# chkconfig haproxy on

[root@youxi1 ~]# chkconfig --list haproxy

haproxy         0:关    1:关    2:开    3:开    4:开    5:开    6:关

  结束所有haproxy,使用killall(不要用killall5,好像会导致断开,可能是我用的有问题吧),如果没有killall使用命令yum -y install psmisc安装

1

2

3

[root@youxi1 ~]# killall haproxy

[root@youxi1 ~]# ps aux | grep haproxy

root      10786  0.0  0.0 112724   996 pts/0    S+   01:44   0:00 grep --color=auto haproxy

  如果防火墙开启来记得添加端口号

1

2

3

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload

success

success

 2)配置后端服务器youxi2和youxi3

  我这边做实验,一切从简。

1

2

3

4

5

6

7

8

9

10

11

[root@youxi2 ~]# yum -y install httpd php

[root@youxi2 ~]# echo youxi2 > /var/www/html/index.html

[root@youxi2 ~]# systemctl start httpd

[root@youxi2 ~]# systemctl enable httpd

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@youxi1 ~]# yum -y install httpd php

[root@youxi1 ~]# echo youxi3 > /var/www/html/index.html

[root@youxi1 ~]# systemctl start httpd

[root@youxi1 ~]# systemctl enable httpd

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

  防火墙启动时记得添加端口号

1

2

3

4

5

6

7

[root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload

success

success

[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload

success

success

 3)测试

  首先查看下监控页面

  然后直接访问负载均衡器

  此时回头看监控页面,可以看出是平均分配的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/303239
推荐阅读
相关标签
  

闽ICP备14008679号