设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站已关闭,不再开放。PC时代已远逝,拥抱云原生时代,拥抱k8s,请移步:https://www.v2k8s.com

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 13788|回复: 14

[haproxy] linux下利用Haproxy和keepalived实现简单负载均衡   [复制链接]

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

签到
476
注册时间
2008-5-19
最后登录
2021-2-28
在线时间
1946 小时
阅读权限
200
积分
59491
帖子
2551
主题
1209
精华
25
UID
1

LT总司令

发表于 2008-9-8 13:47:19 |显示全部楼层
架构拓扑图如下:
haproxy.jpg


haproxy
VIP:  192.168.1.150
Master:192.168.1.10
Slave: 192.168.1.11
之间用keepalived实现HA
webserver1:192.168.1.101
webserver2:192.168.1.102
webserver3:192.168.1.103
webserver4:192.168.1.104

1.下载:
  1. #wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.14.4.tar.gz
复制代码
2.解压安装
  1. #tar  ?zxvf  haproxy-1.3.14.4.tar.gz
  2. #tar zxvf haproxy-1.3.14.4..tar.gz
  3. #mv  haproxy-1.3.14.4  haproxy
  4. #cd haproxy
  5. #make TARGET=linux26   
复制代码
(2.4内核版本 make TARGET=linux24
freebsd  make  TARGET=freebsd
solaris系统  make TARGET=solaris CPU=ultrasparc REGEX=static-pcre)
然后增加一个haproxy用户

3.配置haproxy
vi /etc/haproxy/haproxy.cfg
  1. global
  2.         chroot /var/chroot/haproxy
  3.         daemon
  4.         gid     501
  5.         log 127.0.0.1 local3
  6.         nbproc  2
  7.         pidfile /var/run/haproxy-private.pid

  8.         ulimit-n        65535
  9.         user    haproxy
  10.         maxconn         32000
  11.         spread-checks           4
  12.         tune.maxaccept          8
  13.         tune.maxpollevents      100


  14. defaults askwan
  15.         log     global
  16.         mode    http
  17.         option  httplog
  18.         option  dontlognull
  19.         log 127.0.0.1 local3
  20.         retries 3
  21.         option redispatch
  22.         maxconn 32000
  23.         contimeout      5000
  24.         clitimeout      50000
  25.         srvtimeout      50000


  26. listen  askwan  0.0.0.0:80
  27.         appsession JSESSIONID len 52 timeout 3h
  28.         cookie SRV insert indirect nocache
  29.         mode http
  30.         stats enable
  31.         stats hide-version
  32.         stats uri /haproxy-stats
  33.         stats realm Haproxy\ statistics
  34.         stats auth askwan:askwan
  35.         stats refresh 3s
  36.         monitor-uri /haproxy_test
  37.         balance roundrobin
  38.         option httpclose
  39.         option forwardfor
  40.         option httpchk HEAD /index.html HTTP/1.0

  41.         server server1 192.168.1.101:80 check inter 2000  
  42.         server server2 192.168.1.102:80 check inter 2000
  43.         server server3 192.168.1.103:80 check inter 2000
  44.         server server4 192.168.1.104:80 check inter 2000
复制代码
slave机器上同样配置如斯

下面是监控页面

pic.jpg


附上haproxy启动脚本:
  1. #!/bin/sh
  2. #
  3. # chkconfig: - 85 15
  4. # description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited \
  5. #              for high availability environments.
  6. # processname: haproxy
  7. # config: /etc/haproxy/haproxy.cfg
  8. # pidfile: /var/run/haproxy.pid

  9. # Script Author: Simon Matter
  10. # Version: 2004060600

  11. # Source function library.
  12. if [ -f /etc/init.d/functions ]; then
  13.   . /etc/init.d/functions
  14. elif [ -f /etc/rc.d/init.d/functions ] ; then
  15.   . /etc/rc.d/init.d/functions
  16. else
  17.   exit 0
  18. fi

  19. # Source networking configuration.
  20. . /etc/sysconfig/network

  21. # Check that networking is up.
  22. [ ${NETWORKING} = "no" ] && exit 0

  23. # This is our service name
  24. BASENAME=`basename $0`
  25. if [ -L $0 ]; then
  26.   BASENAME=`find $0 -name $BASENAME -printf %l`
  27.   BASENAME=`basename $BASENAME`
  28. fi

  29. [ -f /etc/$BASENAME/$BASENAME.cfg ] || exit 1

  30. RETVAL=0

  31. start() {
  32.   /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg
  33.   if [ $? -ne 0 ]; then
  34.     echo "Errors found in configuration file, check it with '$BASENAME check'."
  35.     return 1
  36.   fi

  37.   echo -n "Starting $BASENAME: "
  38.   daemon /usr/sbin/$BASENAME -D -f /etc/$BASENAME/$BASENAME.cfg -p /var/run/$BASENAME.pid
  39.   RETVAL=$?
  40.   echo
  41.   [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$BASENAME
  42.   return $RETVAL
  43. }

  44. stop() {
  45.   echo -n "Shutting down $BASENAME: "
  46.   killproc $BASENAME -USR1
  47.   RETVAL=$?
  48.   echo
  49.   [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$BASENAME
  50.   [ $RETVAL -eq 0 ] && rm -f /var/run/$BASENAME.pid
  51.   return $RETVAL
  52. }

  53. restart() {
  54.   /usr/sbin/$BASENAME -c -q -f /etc/$BASENAME/$BASENAME.cfg
  55.   if [ $? -ne 0 ]; then
  56.     echo "Errors found in configuration file, check it with '$BASENAME check'."
  57.     return 1
  58.   fi
  59.   stop
  60.   start
  61. }

  62. check() {
  63.   /usr/sbin/$BASENAME -c -q -V -f /etc/$BASENAME/$BASENAME.cfg
  64. }

  65. rhstatus() {
  66.   status $BASENAME
  67. }

  68. condrestart() {
  69.   [ -e /var/lock/subsys/$BASENAME ] && restart || :
  70. }

  71. # See how we were called.
  72. case "$1" in
  73.   start)
  74.     start
  75.     ;;
  76.   stop)
  77.     stop
  78.     ;;
  79.   restart)
  80.     restart
  81.     ;;
  82.   reload)
  83.     restart
  84.     ;;
  85.   condrestart)
  86.     condrestart
  87.     ;;
  88.   status)
  89.     rhstatus
  90.     ;;
  91.   check)
  92.     check
  93.     ;;
  94.   *)
  95.     echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
  96.     exit 1
  97. esac

  98. exit $?
复制代码
4.在两台haproxy机器上安装配置好keepalived
Keepalived配置
VIP 192.168.1.150
Realserver  192.168.1.10 (MASTER)
RealServer  192.168.1.11 (SLAVER)

分别在两台机器上配置keepalived.conf文件
  1. global_defs {
  2.    notification_email {
  3.      askwan@yahoo.com
  4.    }
  5.    notification_email_from askwan@askwan.com
  6.    smtp_server 192.168.1.3
  7.    smtp_connect_timeout 30
  8.    router_id LVS_DEVEL
  9. }

  10. vrrp_instance VI_1 {
  11.     state MASTER
  12.     interface eth0
  13.     virtual_router_id 51
  14.     priority 100
  15.     advert_int 1
  16.     authentication {
  17.         auth_type PASS
  18.         auth_pass askwan
  19.     }
  20.     virtual_ipaddress {
  21.         192.168.1.150
  22.     }
复制代码
5调试

这个是Master机keepalived调试信息:
  1. Apr 22 08:32:22 db1 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  2. Apr 22 08:32:22 db1 Keepalived: daemon is already running
  3. Apr 22 08:32:24 db1 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  4. Apr 22 08:32:24 db1 Keepalived: daemon is already running
  5. Apr 22 08:32:46 db1 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  6. Apr 22 08:32:46 db1 Keepalived: daemon is already running
  7. Apr 22 08:37:42 db1 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  8. Apr 22 08:37:42 db1 Keepalived: daemon is already running
  9. Apr 22 08:39:34 db1 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  10. Apr 22 08:39:34 db1 Keepalived: daemon is already running
  11. Apr 22 08:41:20 db1 sshd(pam_unix)[6317]: session opened for user root by root(uid=0)
  12. Apr 22 08:41:32 db1 Keepalived: Terminating on signal
  13. Apr 22 08:41:32 db1 Keepalived_vrrp: Terminating VRRP child process on signal
  14. Apr 22 08:41:32 db1 Keepalived: Stopping Keepalived v1.1.15 (04/22,2008)
  15. Apr 22 08:42:03 db1 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  16. Apr 22 08:42:03 db1 Keepalived_vrrp: Using MII-BMSR NIC polling thread...
  17. Apr 22 08:42:03 db1 Keepalived_vrrp: Registering Kernel netlink reflector
  18. Apr 22 08:42:03 db1 Keepalived_vrrp: Registering Kernel netlink command channel
  19. Apr 22 08:42:03 db1 Keepalived_vrrp: Registering gratutious ARP shared channel
  20. Apr 22 08:42:03 db1 Keepalived: Starting VRRP child process, pid=6358
  21. Apr 22 08:42:03 db1 Keepalived_vrrp: Opening file '/usr/local/keepalived/etc/keepalived/keepalived.conf'.
  22. Apr 22 08:42:03 db1 Keepalived_vrrp: Configuration is using : 33290 Bytes
  23. Apr 22 08:42:03 db1 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(7,8)]
  24. Apr 22 08:42:04 db1 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
  25. Apr 22 08:42:05 db1 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
  26. Apr 22 08:42:05 db1 Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
  27. Apr 22 08:42:05 db1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.150
  28. Apr 22 08:42:10 db1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.150
复制代码
可以看到此机此时处于MASTER状态

slave机调试信息
  1. Apr 20 08:43:28 db2 Keepalived: Starting Keepalived v1.1.15 (04/22,2008)
  2. Apr 22 08:43:28 db2 Keepalived_vrrp: Using MII-BMSR NIC polling thread...
  3. Apr 22 08:43:28 db2 Keepalived_vrrp: Registering Kernel netlink reflector
  4. Apr 22 08:43:28 db2 Keepalived_vrrp: Registering Kernel netlink command channel
  5. Apr 22 08:43:28 db2 Keepalived_vrrp: Registering gratutious ARP shared channel
  6. Apr 22 08:43:28 db2 Keepalived: Starting VRRP child process, pid=5857
  7. Apr 22 08:43:28 db2 Keepalived_vrrp: Opening file '/usr/local/keepalived/etc/keepalived/keepalived.conf'.
  8. Apr 22 08:43:28 db2 Keepalived_vrrp: Configuration is using : 36052 Bytes
  9. Apr 22 08:43:28 db2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
  10. Apr 22 08:43:28 db2 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(7,8)]
复制代码
可以看到此机此时处于BACKUP状态

5.测试

地址已经分配完成后,可以开始做测试 测试过程简单 省略了
在HA的测试过程说一下
192.168.1.10宕机后192.168.1.11接管
192.168.1.10恢复后 192.168.1.11移交服务权限10
本方案经过我多次测试基本达到了架构拓扑图中的需求。这样一个简单高可用集群方案搭建完成。

如果文章中有什么不对,你有更好的建议,请联系我 askwan (at)yahoo.cn

更过信息请参阅:
http://haproxy.1wt.eu/
http://www.keepalived.org /

作者:askwan@流年飘飘『AskWan』
地址:http://www.askwan.com/read.php?10
保留文章版权。转载时请勿必以链接形式注明作者和原始出处及本声明!
<-sina_sign,1762622645,2a5b1a59,10->感谢大家对linuxtone的支持!</strong>

Rank: 7Rank: 7Rank: 7

注册时间
2008-11-27
最后登录
2019-3-21
在线时间
208 小时
阅读权限
100
积分
6501
帖子
772
主题
367
精华
4
UID
632

LT同学

发表于 2009-2-10 17:58:52 |显示全部楼层
图呢?曹哥。。。
http://hi.baidu.com/ytjwt/

使用道具 举报

Rank: 1

注册时间
2009-2-20
最后登录
2009-5-22
在线时间
2 小时
阅读权限
1
积分
2
帖子
3
主题
0
精华
0
UID
1522
发表于 2009-2-20 11:17:10 |显示全部楼层
想了解一下如何实现主从ha配置的?
192.168.1.10宕机后192.168.1.11接管
192.168.1.10恢复后 192.168.1.11移交服务权限10

使用道具 举报

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

注册时间
2008-5-19
最后登录
2021-2-28
在线时间
1946 小时
阅读权限
200
积分
59491
帖子
2551
主题
1209
精华
25
UID
1

LT总司令

发表于 2009-2-20 13:08:01 |显示全部楼层
3# pippen


用heartbeat实现吧
<-sina_sign,1762622645,2a5b1a59,10->感谢大家对linuxtone的支持!</strong>

使用道具 举报

Rank: 3Rank: 3

注册时间
2010-5-17
最后登录
2018-1-26
在线时间
5 小时
阅读权限
30
积分
204
帖子
78
主题
0
精华
0
UID
9245
发表于 2010-5-23 23:16:32 |显示全部楼层
学习、收藏,感谢

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82549
帖子
789
主题
41
精华
0
UID
8062
发表于 2010-8-7 17:03:30 |显示全部楼层
曹哥威武!

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-3-10
最后登录
2020-6-27
在线时间
133 小时
阅读权限
90
积分
36439
帖子
65
主题
22
精华
0
UID
12322
发表于 2011-3-13 02:30:28 |显示全部楼层
不能当做教程来用,可惜了!过于笼统,没有说明详细,可以当自己的工作记录

使用道具 举报

Rank: 1

注册时间
2011-3-11
最后登录
2020-5-5
在线时间
8 小时
阅读权限
1
积分
34
帖子
12
主题
1
精华
0
UID
12337
发表于 2011-3-13 23:59:48 |显示全部楼层
记录一下啊。

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-2-23
最后登录
2017-6-12
在线时间
66 小时
阅读权限
90
积分
10349
帖子
45
主题
17
精华
0
UID
12122
发表于 2011-3-14 10:29:31 |显示全部楼层
不错 学习了呀!!!

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-3-24
最后登录
2012-7-23
在线时间
26 小时
阅读权限
70
积分
3767
帖子
45
主题
3
精华
0
UID
8487
发表于 2011-3-24 11:07:15 |显示全部楼层
我在做haproxy+keepalived遇到一个问题,就是如何实现keepalived对haproxy的监测,如果haproxy挂了,master和backup的角色就变换

参考了keepalived的官方示例文件配置#vrrp_script chk_haproxy {

vrrp_script chk_haproxy {
       script "killall -0 haproxy"      cheaper than pidof
       interval 2                       check every 2 seconds
       weight 2
}

track_script {
            chk_haproxy
        }

进行测试,但就是不成功,不知道楼主有整过这个没?

使用道具 举报

Rank: 6Rank: 6

注册时间
2010-9-1
最后登录
2020-6-27
在线时间
26 小时
阅读权限
70
积分
3735
帖子
19
主题
0
精华
0
UID
10272
发表于 2011-3-26 08:32:47 |显示全部楼层
感谢分享,回头好好研究下

使用道具 举报

Rank: 6Rank: 6

注册时间
2008-11-12
最后登录
2019-4-24
在线时间
57 小时
阅读权限
70
积分
4548
帖子
359
主题
1
精华
0
UID
528
发表于 2011-3-26 10:09:36 |显示全部楼层
学习了。收藏。谢谢

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-11-4
最后登录
2014-10-22
在线时间
74 小时
阅读权限
90
积分
14690
帖子
36
主题
0
精华
0
UID
10834
发表于 2011-5-5 17:13:21 |显示全部楼层
不错,挺简单的,谢谢啊。:o

使用道具 举报

论坛元老

北京萍聚

Rank: 8Rank: 8

注册时间
2011-3-16
最后登录
2017-3-15
在线时间
1254 小时
阅读权限
90
积分
124098
帖子
1464
主题
79
精华
0
UID
12402
发表于 2012-4-11 10:23:49 |显示全部楼层
顶起来 好文章!
吴光科,京峰教育创始人,京峰教育Linux Python高薪实战培训,博爱、感恩,帮助真正想改变的人!http://www.jfedu.net

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-11-26
最后登录
2017-9-11
在线时间
627 小时
阅读权限
100
积分
93417
帖子
450
主题
18
精华
1
UID
618
发表于 2012-4-24 10:39:03 |显示全部楼层
coolda 发表于 2011-3-24 11:07
我在做haproxy+keepalived遇到一个问题,就是如何实现keepalived对haproxy的监测,如果haproxy挂了,master ...

很简单呀,,加一个脚本就OK
内容可以简单点
vim check_haproxy.sh
#!/bin/bash
status=`killall -0 haproxy`
if [[ $? != 0 ]];then
/etc/init.d/keepalived stop
fi

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2021-9-28 03:36 , Processed in 0.032615 second(s), 16 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部